– 27.05.2002 –
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..