Estuve aprendiendo sobre La fenomenología del espíritu de Hegel con el curso hecho por Darin McNabb y publicado en youtube. Mientras Darin avanza por esta obra intrincada, fui apropiándome de las ideas y traduciéndolas a mi oficio: desarrollo de software.
Al inicio, Hegel habla sobre cosas particulares, sobre el tiempo, el ahora y el aquí. Cómo vemos pasar esas experiencias particulares y al intentar asirlas se nos escapan. Cómo el ahora que vivimos ahorita se convierte en el antes al intentar comprenderlo o tan sólo reconocerlo. Todo ahora en nuestra mente ya pasó, y así vemos cómo el tiempo se compone de una hilera de ahoras pasados y ahoras que aún no han ocurrido y el yo es ese proceso que va por cada uno, en orden. Esta contradicción de la idea del ahora y su reconocimiento como un antes constante, realizan una síntesis tras la dialéctica y surgen entonces ideas universales que van más allá de las cosas particulares y únicas, la sucesión del tiempo es así una superación del concepto del "ahora".
Hegel también, a lo largo de esta obra, ubica todos sus estadíos de la conciencia, que se van superando entre sí, en la historia de la filosofía.
Esto me provocó la idea de ubicar mis analogías con la programación también en la historia del desarrollo de software.
En primer lugar, la programación es diferente a la conciencia. Esta noción sencilla debe desarrollarse por completo, pero temo enfrentar una pregunta tan fundamental con tan poco conocimiento. Intentemos acercarnos desde la igenuidad y la ignorancia, armados tan sólo con lo que tengo a la mano de mi conciencia. La programación no es lo mismo que la conciencia, pero no creo que sea ajena a la conciencia. Tengo la noción de que la programación es un estado avanzado de conciencia. Cuando la conciencia se enfrenta al mundo e intenta asimilarlo, va tomando ese viaje que Hegel describe, desde cosas particulares, luego a universales, a esencias internas, escepticismo improductivo, fuerzas y atracciones, y así. Eventualmente la conciencia se da cuenta de que la percepción de mundo es construida por ella misma y que al interpretar el mundo se está viendo a sí misma. Eventualmente llega a la idea del amo y el sirviente, siendo el sirviente el que trabaja y produce para otro y el amo el que consume lo producido y domina al otro. Pienso que aquí es donde entraría la programación.
La programación es una actividad ejecutada por el programador. El programador produce código que será ejecutado en una computadora satisfaciendo algún requerimiento, muchas veces, de otra persona. A veces el programador produce código para su comunidad (software libre) y otras veces para sí mismo, pero la mayoría de veces, será código hecho para otras personas. La programación es un acto de creación principalmente, aunque en buena parte es un acto de reorganización. Pasa mucho que al programar se parte de ideas ya establecidas, de frameworks ya desarrollados, de lenguajes de programación que han sido perfeccionados a lo largo del tiempo y el código ha de correr dentro de un entorno de un sistema operativo ya desarrollado por otras personas. La programación no suele ser una actividad individualista, aún cuando se trate de código privativo. Los programadores sabemos muy bien que hay todo un ecosistema(s) y una sociedad en la cual nuestro código cumple una función colectiva (por mucho que ignorantes como Margaret Thatcher rebuznen burradas como "la sociedan no existe"). Por lo tanto programar implica un estado de conciencia que va más allá del individualismo ingenuo y primitivo. Un programador que no utiliza herramientas recientes de su entorno para programar va a producir pésimo código. Hay excepciones, claro. Como cuando se programa un firmware que debe ser muy óptimo y por lo tanto no se puede utilizar frameworks.
Por eso la programación se ubica después del amo y el sirviente, pero ya ha superado mucho esa estructura básica de sirvientes dominados y amos dominantes. De hecho en la programación el amo y el sirviente se contradicen. Los programadores organizamos buena parte del mundo digital. A menudo, como programador, me encuentro con el inmenso poder de decidir cómo organizar conocimiento, procesos, registros, humanos mismos. La programación no sólo organiza código que se va a ejecutar en una computadora. Organiza los sistemas humanos que van a depender de ese software. Si un programador hace un sistema rígido y con poca mantenibilidad, va a limitar el sistema humano que depende de ese software. Los programadores de facebook y twitter organizan la manera en que compartimos contenido en la red. Los programadores de youtube han desarrollado algoritmos que deciden qué videos recomendarnos y con eso pueden dominar la cultura a un nivel nunca antes visto. Programar nos da poder. Esto es tan sólo parte de la dialéctica del amo y el sirviente. No es que estos dos sean opuestos y peleen. La dialéctica de estos dos es mucho más avanzada cuando los sirvientes se convierten en dominantes debido a sus actividades creadoras y los amos se convierten en súbditos al consumir sólo aquello que les proveen, al perder poder sobre la organización del mundo y sobre los medios de producción. De tal manera que un programador como Mark Zuckerberg puede convertirse en billonario (de los billones gringos $1e9) en apenas unos cuantos años desarrollando uno de los sistemas más importantes en la actualidad para organizar humanos, sus expresiones cotidianas y sus relaciones sociales.
Bogdanov tendría también mucho que decir al respecto, con su tectología. Él habla mucho sobre la organización del conocimiento y de las actividades humanas. Habla del desbalance de poder entre los organizadores y los organizados. Entonces tenemos a la programación en una dialéctica avanzada de relaciones sociales de trabajo y explotación y de organizados y organizadores.
Al ser un acto de creación, la programación contiene dentro de sí todo un desenvolvimiento dialéctico que ingenuamente podríamos comparar con la fenomenología del espíritu, o al menos intentarlo. Y justamente aprender a programar es otra autopista de desesperación, tal como el camino que toma la conciencia para llegar al conocimiento. Pero es una autopista diferente, no hacia el conocimiento sino hacia la capacidad de creación de reglas lógicas que reproducen al ser ejecutadas procesos que fueron requeridos por una necesidad (o capricho, que talvez es lo mismo) humana. No es crear cualquier cosa, tirar pincelazos contra un lienzo en blanco o arrojar un polock sin sentido. Es un proceso cuidadoso, frustrante, iterativo, sisífico, interminable, dialéctico. El software siempre puede seguirse desarrollando por que todo cambia todo el tiempo. Cuando se ha especializado demasiado, llega el momento de deshecharlo y reemplazarlo por nuevo software hecho tomando como base otras premisas más adecuadas al "ahora" contextual. Y uno como programador podría estar todo el tiempo aprendiendo sin nunca realmente llegar a terminar de aprender a programar. Aquellos que dejan de aprender es por que se volvieron administradores, jefes o maestros y se dirijen a la jubilación. Una auténtica autopista a la desesperación.
En el camino al conocimiento el sujeto quiere acceder al objeto, que está en el mundo sensible. En la programación, el sujeto (programador) quiere que el mundo sensible acceda a una idealización en su conciencia, que a su vez está determinada por la idealización en la conciencia de otro (el que encargó desarrollar el software). Así como en un juego de teléfono descompuesto, los requerimientos del software son consensuados y definidos. Luego el programador debe comprender esas ideas y crear algo que las reproduzca en el mundo físico. Eso es, aparentemente. Aunque aquí en realidad no es el mundo físico sino digital (diría virtual, pero en la filosofía lo virtual significa aquello que no es actual, y el software y su ejecución sí es actual, aunque allí talvez hay mucho más que se puede decir y que puede ser abordado después).
Hablemos un poco del mundo digital. Este ha sido construido por muchos humanos programadores hasta llegar a ser lo que es. Producto de esfuerzos colectivos históricos. Lo que nosotros vemos frente a nuestros ojos es siempre una simulación de ventanas, papeles, cestos de basura, nubes, botones, acciones como arrastre, pulsaciones, destrucción, creación, nacimiento y muerte, sobreposición, cortar, pegar y copiar. Simulación que evoca el mundo físico (a propósito para que nos sea familiar e intuitivo y por lo tanto fácil de usar) y justamente esa simulación es lo que usualmente genera frustración cuando la computadora no hace lo que uno espera que haga con base en nuestras experiencias en el mundo físico.
El mundo digital está construido sobre el mundo físico. Los componentes electrónicos, los transistores, el electromagnetismo, etc construyen un mundo absolutamente lógico, determinista, construido sobre 1s y 0s. A pesar de estar fundamentado en máquinas parciales binarias conectadas entre sí muy sencillas, el mundo digital se ha vuelto sumamente complejo y como humanos nos resulta difícil predecirlo y mantenerlo estable.
Nos atrae mucho el mundo digital, acaso por que en este se puede acceder directamente a los objetos. O al menos esa es la visión del programador, quien es el gurú de este mundo. Tal como Neo en La Matrix puede ver las cosas tal y como son (cuando ve los símbolos verdes cayendo) y por lo tanto puede acceder a los objetos sin esa desesperación de la conciencia que se da con el mundo sensible físico. En el mundo digital podemos acceder a los 1s y 0s, en un modo de debug. Esta experiencia sublime no es experimentada por muchos usuarios no expertos de las computadoras. A menudo se ve a usuarios comunes pelear con las computadoras, frustrados por que un documento aparentemente no es lo que se esperaba, o por que un botón no hace lo que ellos piensan que debería hacer. Ese tipo de frustraciones que se ven con el mundo físico, en donde es frustrante intentar acceder a los objetos físicos pero encontrarse con que es imposible un acceso inmediato. Pero para el programador es muy sencillo ver que ese botón hace exactamente aquello para lo que fue programado, o que tal archivo es un enlace simbólico a otro, o quizás está comprimido y debe ser descomprimido para acceder al objeto inmediatamente. No siempre ocurre esta dicha para los programadores. A menudo también vemos programadores muy frustrados por que cierto conjunto de código, reglas lógicas, no hacen lo que se supone que deben hacer. A veces por errores en las herramientas, sistemas operativos o hardware, pero la mayoría de las veces por errores propios, paralogismos de la creación lógica. Así que no siempre somos Neo en La Matrix. Muchas otras veces, somos simples usuarios comunes, sin acceso inmediato al conocimiento digital, debido a que no estamos usando sistemas conocidos a fondo o por fallos (glitches) en el mundo digital o su sustrato, mundo físico.
Historicamente, el mundo digital no comenzó como lo que conocemos hoy. Sin embargo, muchas analogías de la historia computacional pueden apreciarse. Vemos vestigios históricos, fósiles conceptuales en el mundo digital. Los niños nos preguntan qué significa la cajita del ícono de "Guardar" documentos pues no conocieron los diskettes. Nos recuerdan hasta el cansancio que los errores en el software se llaman "bugs" por que los insectos se metían en las computadoras gigantes de la antigüedad (dinosaurios extintos de los que quedan algunas osamentas) y producían fallos. Las ventanas fueron introducidas por Xerox hace ya mucho tiempo, y aún hoy las llamamos así y son un concepto fundamental de la experiencia digital (aunque con la hegemonía de las aplicaciones web, estamos dejando de lado a las ventanas por las pestañas del explorador web). La experiencia del mundo digital hace apenas 30 años era totalmente diferente y cada vez va simulando más experiencias cotidianas del mundo físico y también va inventando experiencias nunca antes vistas a modo de realidad aumentada/disminuida. La historia de la computación y por lo tanto de la programación no coincide muy bien con el camino a aprender a programar. Hoy en día tenemos muchas comodidades para ello y no experimentamos ni la mitad del sufrimiento por el que pasaron los primeros programadores y programadoras para hacer avanzar el mundo digital.
El artista guatemalteco Danny Marín mencionó en una presentación de arte que las computadoras preceden a los avances vistos en los últimos dos siglos atribuidos a Babbage y Pascal. Dice que las primeras computadoras fueron los telares que ya automatizaban la fabricación de patrones en telas mediante placas perforadas u otros métodos de configuración de esas máquinas.
Para terminar esta introducción puedo concluir que: En el proceso de conocer el sujeto intenta acceder al objeto en el mundo físico mediante la razón, mientras que programar es el proceso en el que un sujeto construye una idea (dada por los requerimientos) en el mundo digital (que está construido sobre el mundo físico) para que otros sujetos (colectivismo) accedan a esa idea hecha fenómeno tangible y, ojalá, inmediato, todo esto mediante la capacidad de programar (análoga a la razón). Así el análisis de la programación en analogía con La fenomenología del espíritu de Hegel, muestra casi un opuesto a la actividad de razonar para conocer.
Falta también pensar en la programación como arte, sus implicaciones en estética tanto internamente (el código bello) como externamente, el software deseado por los usuarios finales, como poesía racional. De esto sé muy poco aún pero tengo por seguro que hay mucho por decir.
Puede que tenga errores en este desarrollo y me queda aún mucho por leer y pensar. Sin embargo dejo aquí este borrador y espero ver qué piensan otros sobre esta aproximación.