Si
tal ciencia existe, o está a punto de
existir, ello tendrá tremendas
repercusiones para la filosofía de la
ciencia y para la imagen que el ser humano
tenga de sí mismo. De cualquiera de los dos
modos que se vea, se trata de un asunto
trascendente para la ciencia del
conocimiento. Tradicionalmente se habla de
las "ciencias duras" (las
matemáticas, la física, la biología) y
las "ciencias suaves" (las
ciencias sociales, básicamente). Voy a
sostener que esta distinción ha comenzado a
perder sentido por obra de la existencia
misma de las computadoras. Pero esta vez no
es porque las ciencias suaves se hayan hecho
duras -como las ciencias especulativas se
han transformado en empíricas- sino,
curiosamente, porque las ciencias duras se
están haciendo suaves. Quiero referirme
concretamente a la informática, que es la
única ciencia dura que conozco
suficientemente.
LA
COMPUTADORA, ¿NUNCA SE EQUIVOCA?
A
una primera época en el desarrollo de la
informática, digamos que es su época
clásica, en que todo es proporcionado y
apolíneo corresponden aforismos como
"La computadora nunca se equivoca; solo
el programador, que es humano, lo hace"
-es decir errare humanum est-. Es la época
de la computadora gigante, muy impresionante
en su tamaño, pero fundamentalmente simple
en su arquitectura y en su programación; el
gran tamaño esconde un poder muy reducido,
se trata de la "calculadora de
cuarto" que difiere solo en tamaño de
la calculadora de bolsillo. Tales
computadoras solo tenían una fracción del
poder de cómputo y de la complejidad de
arquitectura de muchas de las
microcomputadoras existentes hoy, por
ejemplo la computadora con que escribo este
artículo.
Tengo
ante mí un volumen de la revista ACM
Computing Surveys donde se describe lo que
será muy pronto la arquitectura estándar
de la maquinaria de cómputo: el sistema
operativo distribuido, es decir, una
máquina virtual cuya unidad funcional
frente al usuario esconderá una
multiplicidad de microprocesadores
(equivalentes a las actuales computadoras)
conectados por medio de una red local.
Encuentro el artículo interesante por
razones que no tienen que ver directamente
con la técnica informática. La mayor de
ellas me ha reforzado en la convicción de
que estamos ante el advenimiento de la
computadora falible, de la computadora que
se equivoca por las mismas causas que el
cerebro se equivoca, a saber: su misma
complejidad. Errare complexum est.
Si
una computadora consiste en un solo
procesador -o unidad lógica- y su
respectiva memoria, un fallo del procesador
paraliza a la computadora, no la hace
equivocarse. Pero si la computadora es una
sociedad de computadoras conectadas por una
red (como serán todas las computadoras del
cercano mañana), si uno de los procesadores
deja de funcionar, la computadora no se
para, simplemente se degrada, ... o se
equivoca. Toda suerte de equívocos y malos
entendidos pueden entonces suceder. Por
ejemplo, uno de los procesadores que debía
recibir un mensaje del procesador afectado
podría seguir trabajando como si el
procesador dañado hubiera cumplido su
función, pero con información incompleta.
Si por ejemplo la computadora dañada debía
enviar un mensaje indicando haber recibido
un mensaje anterior (una transferencia de
fondos, tal vez) y ese acuse de recibo nunca
llega, el procesador destinatario puede
decidir que el mensaje nunca fue recibido y
enviar de nuevo el mensaje original; esta
vez el mensaje lo recibe un procesador de
reemplazo que ha sustituido al procesador
dañado, pero lo recibe con un atraso que
posibilita la inscripción por ejemplo de
una doble transferencia de fondos.
Además,
aun suponiendo que todos los procesadores
funcionen bien, la computación en paralelo
puede ocasionar extraños efectos, muy
difícilmente evitables; un típico ejemplo
es el bloqueo recíproco, cuando cada uno de
dos procesadores se pone a esperar que el
otro procesador desocupe un recurso que
necesita para finalizar una operación, por
ejemplo el acceso a cierta parte de un disco
de almacenamiento de datos o a algún lugar
de una memoria compartida. Las consecuencias
de un tal bloqueo, o de otras situaciones
parecidas, son impredecibles, y los
resultados de la computación global pueden
muy bien resultar incorrectos.
CIENCIAS
"SUAVES" Y CIENCIAS
"DURAS"
Ante
esta clase de problemas, y algunos otros que
mencionaré en seguida, los científicos de
la informática están comenzando a
comportarse de manera muy inesperada: los
científicos de la informática han
encontrado soluciones a los problemas que
plantea la computación distribuida, en la
sociología, en la ciencia administrativa y
hasta en la ciencia política. La diferencia
entre las ciencias duras y las ciencias
suaves comienza a desaparecer cuando se
aplican soluciones de las ciencias sociales
a los problemas estrictamente
computacionales y comienza a surgir una
sociología de las computadoras.
Un
sistema operativo es un programa fundamental
que se ejecuta directamente sobre la
arquitec- tura electromecánica de la
computadora y ofrece al usuario o usuarios
de esta toda clase de servicios necesarios,
como acceso a unidades de almacenamiento de
datos en discos, acceso a aparatos de
impresión, etc. En realidad, es un programa
bastante elaborado una de cuyas principales
responsabilidades es la administración de
los recursos de cómputo y su oportuna
puesta a disposición del usuario o
usuarios. Cuando, como en los sistemas
distribuidos a que me vengo refiriendo, los
procesadores son varios, entre los cuales se
distribuyen distintas operaciones
independientes para ser ejecutadas en
paralelo -lo que indiscutiblemente aumenta
la eficiencia del sistema- las
responsabilidades del sistema operativo se
complican hasta lo indecible.
Manejar
la adjudicación de recursos sin tener
información exacta sobre el estado global
del sistema es muy difícil. Y esa
información exacta es prácticamente
imposible de tener si varios procesadores
trabajan simultáneamente a la velocidad de
la electricidad enviándose mensajes
recíprocamente y alterando el estado de la
memoria compartida por medio de procesos
mutuamente independientes.
LA
IMPORTANCIA DE LA REDUNDANCIA
Cuando
algo muy serio está en juego en la vida
social -piénsese en el caso de una
enfermedad grave o de una crisis nacional-
normalmente se recurre al concurso de varios
solucionadores de problemas que operen
simultáneamente: en el caso de la
enfermedad, llamamos a esta solución
"junta de médicos"; en el caso de
la crisis nacional, la llamamos "junta
de notables"; en el caso computacional,
la llamamos simplemente redundancia. Durante
su ejecución, un programa se pone a
"correr" simultáneamente en un
cierto número de máquinas, en paralelo.
Cada vez que un proceso termina, las
máquinas comparan sus resultados; si
coinciden, no hay problema; pero si
difieren, las máquinas recurren a un
procedimiento para dirimir los conflictos
muy bien experimentado: las máquinas votan,
y la solución que obtenga la mayoría de
los votos será el resultado que todas las
máquinas tomen como dato para sus cómputos
en los módulos siguientes. Claramente, se
trata de la importación de un método
social para la solución de problemas
informáticos.
LA
JERARQUÍA SOCIAL
Uno
de los problemas más serios que puede
enfrentar un sistema operativo distribuido
es el de asignar el trabajo requerido entre
los distintos procesadores que forman el
sistema. El problema es muy similar al de
distribuir el trabajo entre los componentes
humanos de una gran organización. La
solución estándar en estos casos es
organizar a los trabajadores de una manera
jerárquica. La solución computacional es
organizar a los procesadores como se
organiza a la gente en la gran corporación,
el ejército, la universidad, o cualquiera
otra de las jerarquías del mundo social.
Algunas máquinas se declararán obreros y
otras administradores. Por cada grupo de un
cierto número de obreros se asignará una
máquina administradora (el jefe de
departamento) con la tarea de supervisar
quién está ocupado y quién no.
Las
cuestiones normales en una jerarquía humana
surgen también en una jerarquía
informática: ¿qué pasa cuando un jefe de
departamento deja de funcionar? Una
solución es promover a uno de los
subordinados directos para llenar el puesto
vacante. El escogimiento podrán hacerlo los
subordinados mismos, o los iguales del
"difunto", o -en sistemas más
autocráticos- el jefe del procesador
descartado.
Todas
estas son por supuesto decisiones
políticas. Si se quiere evitar tener un
solo administrador (vulnerable) en la
cúspide de la jerarquía, es posible
decapitar el sistema y poner en la cumbre a
un comité de máquinas en las que resida la
autoridad suprema. Cuando un miembro del
politburó funciona mal, los restantes
miembros promueven a alguien del nivel
inferior como repuesto. Puede haber también
soluciones anarquistas, donde nadie tiene
autoridad final, y lo interesante del caso
es que tales sistemas pueden funcionar, por
lo menos tan bien como los de autoridad
centralizada. En esos sistemas todos los
problemas se resuelven por intercambio de
mensajes y, por supuesto, por la
disposición de los distintos elementos a
asumir las posiciones vacantes cuando ello
resulte necesario para el funcionamiento del
sistema, tal como ellos lo ven. Por
supuesto, puede haber colisiones, pero
existen soluciones para resolver conflictos
sin que haya un árbitro de la disputa.
LA
HETERARQUÍA
Un
ejemplo interesante de solución de
conflictos sin intervención de un árbitro
se presenta en la transmisión de mensajes
por medio de una red local del tipo ethernet.
En este tipo de red las estaciones están
todas conectadas por un simple cable
coaxial, el mismo que se usa para instalar
una antena de televisión. Cualquier
estación puede poner en cualquier momento
una señal en el cable, y esta señal es
oída por todas las otras estaciones. Si dos
o más estaciones trasmiten al mismo tiempo,
ocurre una colisión, es decir, los mensajes
se interfieren unos a otros y llegan a su
destino adulterados. Como la estación que
envía también está oyendo, al no
reconocer su mensaje sabe que ha fracasado
en su intento y que tiene que reenviar su
mensaje. Esto ocurre pocas veces, por lo que
tiene un impacto insignificante en el
rendimiento de la red. Para reducir la
probabilidad de colisiones, la estación que
falló espera un ratito antes de volver a
trasmitir; si se produce una nueva
colisión, espera el doble, y así
sucesivamente hasta tener éxito. Este
sistema de resolución de conflictos es
perfectamente eficaz, y no difiere mucho del
que se usa en la conversación normal, sin
director de debate, para evitar que la gente
hable al mismo tiempo. Vemos aquí un caso
de una buena solución a un problema
computacional que se inspira en un modelo
social: la conversación humana normal.
EL
DOBLE EFECTO EN LAS CIENCIAS SOCIALES Y EN
LA INFORMÁTICA
En
su libro La miseria del historicismo, Karl
Popper introduce el concepto del "doble
efecto" en la dinámica social. Según
este concepto, todo acto social produce dos
efectos: uno deseado, que es el propósito
del acto, y otro no deseado -pero
inevitable- que debe ser soportable para el
actor si el acto ha de realizarse en
absoluto. De este concepto saca Popper su
conclusión de filosofía de la ética en el
sentido de que el objetivo último de la
moral es disminuir lo más posible el mal
general en vez de maximizar la felicidad del
mayor número, como postulaban los
utilitaristas. Uno tendría que esperar que
esta doctrina del doble efecto, típica de
las sociedades humanas, se aplicara también
a los sistemas de cómputo desde el momento
en que estos comiencen a ser
"sociales"; y así es, en efecto.
Para
comprobarlo, analicemos el caso de un grupo
de procesadores que trabajan en paralelo en
la solución de un problema complicado. Así
como desde el punto de vista del hardware
(la parte física de la máquina) la
computadora se descompone en procesadores,
cada uno independiente de los otros, desde
el punto de vista del software (la parte
intelectual de la máquina) el programa se
descompone en procesos independientes. Para
"correr" el programa, diversos
procesos tendrán que ejecutarse en otros
tantos procesadores; por razón de la misma
limitación en el número de procesadores,
pero también porque algunos procesos son
prerrequisito de otros, los procesos irán
siendo asignados a los procesadores
consecutivamente; pero para maximizar la
eficiencia, se procurará que un buen
número de procesos se ejecuten
paralelamente.
La
decisión estratégica de cómo lograr la
mejor asignación de procesos a procesadores
y la mejor distribución de la ejecución
entre un arreglo secuencial y un arreglo
paralelo constituye el problema de la
asignación de recursos. Si tomamos en
cuenta que los distintos procesos, por ser
parte de un programa integral que soluciona
un mismo problema, tienen que comunicar
entre sí para enviarse datos y resultados,
pareciera que los procesos que comunican
frecuentemente deberían ejecutarse
simultáneamente. Así, Ousterhout sugiere
que los procesos que trabajan juntos se
asignen a diferentes procesadores para que
puedan "correr" en paralelo. Pero
otros investigadores no están de acuerdo:
Chow y Abraham, por ejemplo, consideran que
los procesos que trabajan juntos deben
ponerse en la misma máquina, para reducir
los costos de la comunicación. Se ve
claramente aquí que si pretendemos aumentar
la eficiencia por la computación en
paralelo, el sistema se degrada por los
requerimientos de la comunicación; pero si
queremos disminuir esos requerimientos, el
sistema se hace más lento porque la
computación debe hacerse secuencial. Un
ejemplo típico del doble efecto de Popper.
Pero
todavía hay más: un tercer grupo de
investigadores, por ejemplo Stankovik y
Sidhu consideran que la estrategia
fundamental debe ser velar porque ningún
procesador esté sobrecargado mientras otros
permanecen ociosos. Para estos autores,
balancear las cargas es la estrategia
razonable, tomando en cuenta que en sistemas
complejos de hecho no sabemos nada sobre los
detalles del comportamiento del sistema en
cada ejecución concreta. En la ejecución
de esta estrategia, se pueden presentar
efectos secundarios muy graves, pues hacer
migrar un proceso de un procesador a otro
implica una serie de acciones muy costosas:
hay que interrumpir su ejecución, para lo
cual deben guardarse muchos ítemes de
información que permitan volver a ponerlo
en ejecución en el punto en que estaba al
llegar al nuevo procesador. En la práctica,
lo que se recomienda es más bien dejar los
procesos que están ejecutándose llegar a
su fin en el procesador en que se
encuentren, pero crear los nuevos procesos
solamente en las máquinas menos cargadas;
solución que recuerda los métodos para
desburocratizar una institución: no nombrar
nuevo personal para llenar las vacantes que
se produzcan, en vez de despedir personal.
En resumen, los objetivos de maximizar la
producción, minimizar el tiempo de
respuesta y uniformar las cargas entran en
conflicto. Toda solución al mismo implica
una transacción: de igual tipo que las
transacciones sociales o políticas.
UN
BOOMERANG EPISTEMOLÓGICO
Una
vez que los modelos han sido aplicados con
éxito a la informática, puede darse un
efecto boomerang sobre las ciencias humanas,
las cuales pasan a beneficiarse de las
mismas técnicas informáticas que ellas
inspiraron. Es decir, la misma técnica, al
ser refinada y hecha mucho más rigurosa en
su versión computacional, puede ser
retomada en aplicaciones directamente
sociales. Veo innumerables aplicaciones de
esta tesis en las disciplinas sociales, pero
muy especialmente en la ciencia
administrativa y en la ciencia política.
Tomemos
algunos de los casos analizados antes. Creo
que la sociología, la ciencia política y
la administración pueden beneficiarse de
los análisis computacionales sobre bloqueos
recíprocos o sobre organización,
reparación y funcionamiento de jerarquías.
Igualmente, la sociología y la ciencia
política tienen mucho que aprender de la
forma en que se analizan y deciden las
transacciones entre objetivos en conflicto
para maximizar la satisfacción o, como
diría Popper, minimizar la insatisfacción.
Otra
área muy fecunda de reflexión es la
teoría de la redundancia, sobre todo si se
combina con la consideración de su
complementaria la teoría de la
programación estructurada. En efecto,
ciertos problemas por su naturaleza, admiten
ser descompuestos en subproblemas,
supuestamente más fáciles de resolver que
sus progenitores; este es el origen de los
expertos, tanto en la vida social real como
en el reino de la informática. Cuando
existe un conocimiento claro sobre una
materia, cuando el problema es un problema
bien formado, lo procedente es descomponerlo
en sus distintos aspectos y pasar los
subproblemas a la consideración de los
respectivos expertos. La famosa
"comisión especial", a la que
suelen mandarse los asuntos difíciles, es
un caso claro de esta metodología
informática, por la que el asunto se divide
en sus partes y cada parte la asume el
proceso especializado correspondiente.
Contrasta con esto el caso del problema no
bien formado, para cuya solución no se
puede articular ninguna experticia
determinada. En este caso lo que corresponde
convocar no es al "comité de
expertos" o "comisión
especial" sino más bien a la
igualmente famosa "junta de
notables", en la que reina no la
descomposición de saberes especializados,
sino la redundancia de saberes de sentido
común..
