12 abril 2014

Vamos a ver quien me para



Estoy muy cómodo haciendo clases, aunque no me gusta ni me onviene hablando en plata, es divertido jugar al guru por un par de meses, además me refresca recuerdos y conocimientos muy queridos de los años en que empecé a programar.

Comparto con el Dr. Chuck esa idea de que la programación es una actividad creativa y fascinante, sin embargo es el único profesor universitario de computación que he conocido que piensa así, la mayoría de los profesores son unos verdaderos brutos que reproducen su ideología nefasta sobre generaciónes de estudiantes de computación. Si yo hubiese estudiado Ingeniería de Sistemas no habría soportado ni un solo semestre. Por culpa de esos tipos y su ideología los que se dedican a eso son llamados computines, que es sinónimo de alguien limitado, lineal y de pensamiento mecánico.

Desgraciadamente los brutos son indispensables en programación, porque los computadores son brutos y es mucho más útil tener programadores capaces de seguir normas y protocolos mecánicamente que tener tipos creativos, los creativos pueden ser muy dañinos en un equipo de trabajo porque tienden a escribir código fuera de norma, que nadie más entiende. Este embrutecimiento del trabajo del programador, alentado por el fanatismo de algunos profesores universitarios que se convirtieron en canutos cuando apareció la programación orientada a objetos, ha sido muy triste, pero indispensable para hacer programas complicados donde trabajan cientos de personas al mismo tiempo.

Menos mál que todavía queda una ventanita de luz para micro aplicaciones hechas por una sola persona, son cada vez menos pero todavía quedan y hay campo para la creatividad, la diversión y los lenguajes permisivos. Así es como ha aparecido Python y Ruby on Rails, que son de la misma filosofía que el Basic y hoy en algunas universidades, donde el estándar es C++ y Java, se estudian como "programación avanzada", que increible vuelco.

Yo tuve un enamoramiento violento con la programación en 1969, cuando leí un artículo en Mecánica Popular sobre los computadores y mostraban un ejemplo de código en Fortran, lo copié y lo estuve revisando por mi cuenta durante años, hasta que lo entendí al revés y al derecho. En 1982, cuando tuve mi primer curso de programación en la Universidad ya tenía completamente internalizada la forma de pensar en Fortran, escribí buen código desde el primer día.

Un par de años empecé a trabajar vendiendo programas en CA-Basic: inventarios, contabilidad, cuentas corrientes eran mis caballitos de batalla y empecé a acumular una biblioteca enorme de subrutinas de código de propósito general que eran mi maletín de gásfiter. Creo que todos los que trabajábamos en eso por esos años ya habíamos inventado intuitivamente todo lo importante de la Teoría de Objetos, menos la jerigonza y las analogías absurdas con la Teoría de Conjuntos, que al final solo sirven para que los profesores reprueben a los que les caen mal.

En 1982 iba caminando por calle Maipú, al llegar a Luis Schmidt y se me ocurrió la idea más brillante que he tenido en mi vida y era la solución a un problema que me tenía atascado por más de un año. En esos años se usaban archivos secuenciales para guardar los datos y los chorizos  de datos separados por coma no solo eran enredados de manejar sino terriblemente lentos en equipos con 32 KB de memoria y CPU Z80 como los computadores que yo programaba, era imposible programar un sistema que rebajara el inventario en tiempo real desde la caja, que era mi sueño en esa época.

Ese día lo vi en mi imaginación, como un golpe eléctrico se me ocurrió el concepto de archivo relacional con todos sus detalles, de un golpe, vi clarito hasta la rutina para llenar de espacios para dejar los string de largo fijo, en esos años todo había que codificarlo. Ni siquiera existía el visi-calc, el concepto de un archivo relacional lo inventé, junto con los métodos de acceso, la búsqueda binaria era un algoritmo estándar pero la idea de usar un índice en memoria también se me ocurrió junto con todo eso. Me sentí un pequeño Einstein.

Claro que todo eso ta se había inventado antes, en 1960, en el Jet Propulsion Laboratory un tipo ya había inventado el concepto de base de datos y vendió la idea a Ashton-Tate para el mítico programa Dbase, que fue el rey de los métodos de almacenamineto de datos desde fines de los 80s. Pero en Chile no se de nadie que tuviese idea de eso, menos los que trabajaban como yo, en las empresas, no haciendo clases an la universidad. Cuando conocí el Dbase casi me caigo muerto, era mi idea pero totalmente implementada, diablos.

Tal vez por eso siempre he tenido antipatía por las bases de datos relacionales, ¡me robaron la idea!, no, hablando en serio hay muchas cosas que no me gustan de las bases de datos que, igual que la OOP, han creado una ideología fanática sobre el modelamiento de datos. No me gusta el principio del ocultamiento de los datos, creo que es una equivocación y la seguridad debiese estar basada en la criptografía sobre archivos de texto planos, no en grabar datos en un formato propietario inaccesible para el programador.

El año 2005 conversaba con Stephen Gutknecht, un genio de la programación que trabajó mano a mano con Wosniak y tuvo su propia empresa de software por años. Le decía que la programación ya no me gustaba por el fanatismo exagerado hacia la OOP y el modelamiento de datos, recuerdo que en ese año me dijo que no me preocupara porque esas cosas se estaban revirtiendo, las bases de datos estaban volviendo al texto plano gracias a una cosa nueva para mi en esos años, llamada XML, tenía tremenda razón.

Bueno, de cosas malas sale algo bueno. Las clases me despertaron el interés dormido que tenía por hacer la segunda parte de mi curso Visual Basic Para Oficinas. La primera parte fue extremadamente básica pero entrega prácticamente todas las herramientas que se necesitan para empezar a programar en VBA, sin embargo tiene una sola aplicación. La segunda parte a mi modo de ver, debe tener una aplicación práctica.

Por los años que pasé programando me di cuenta de algo que es muy bonito: cosas que parece que no tuviesen nada que ver entre si son análogas y cuando uno va viendo unidad en cosas dispersas, simetrías, ve todo más lindo. En tantos años de hacer programas en empresas e instituciones con cientos de aplicaciones distintas, me di cuenta que todas las aplicaciones en que he trabajado y contienen datos siguen uno de los tres modelos: el modelo de agenda, el de inventario o el de cuentas corrientes. Son estructuras que se encuentran más allá de sus aplicaciones obvias.

Por ejemplo en el control del flujo de caja estructuralmente es identico a una cuenta corriente, los deudores cambian por cuentas de gastos o ingresos, etc. y así, está lleno de simetrías de esa clase. Así es que partí enseñando eso antes de enseñarles a programar y aprovecharé también que sea mi primera clase para el nuevo curso VBA Práctico: Inventarios y Cuentas Corrientes. Ya empecé, vamos a ver ahora quien me para.

7 comentarios:

  1. Hola Tomás, justo ahora estaba revisando papers sobre Artificial Intelligence y Artificial Creativity. Eso que tú dices, que los llamados computines son personas medias cuadradas que solo se dedican a repetir rutinas quizás venga de que están formados por el enfoque simbólico de la cognición: dado un set de símbolos el computador las manipula según un set de instrucciones que posee. Pero por otro lado, existen teorías que respaldan la creencia que el uso de algoritmos puede ser adaptativo según el contexto por lo que la cognición puede ser conectitiva: por ejemplo las Artificial Neural Networks y los algoritmos genéticos. Por ahora recuerdo que Campbell hace décadas comenzó a investigar sobre la epistemología evolutiva: la creativad podría surgir perfectamente de un modelo computacional que consistiría en una etapa de "blindness" seguida por una etapa de "evaluation". Por ahora he leído algunos papers de Simonton sobre el tema de la creatividad evolutiva como modelo computacional.

    http://www.chrest.info/Fribourg_Cours_Expertise/Articles-www/IV%20Expertise%20et%20societe/Creativity%20as%20blind%20variation%20-%20target-Simonton.pdf

    http://www.cogsci.msu.edu/DSS/2012-2013/Simonton/2011RGPCampbellBVSR.pdf


    Saludos

    ResponderBorrar
  2. Que buena Ricardo, me voy a leerlos ahora. Sabes que a mi me tocó ver esta transformación de la profesión del programador en primera fila, en los años 70-80 se pensaba que los programadores tenían que ser muy creativos y también muy inteligentes, con capacidad para concentrarse y resolver problemas complicados pero eso llevó a un desorden enorme y a medida que los programas crecían en complejidad la cosa se ponía inmanejable.

    Cuando apareció Windows 95 -que fue un hito en computación, el primer SO visual que funcionaba bien- ya estaba consolidado el modelo "divide y vencerás", con miles de trained monkeys programando pequeñas cajas negras de procesos simples. Si no hubiese sido por las ideas de las capas, las cajas negras, los objetos, la estandarización estricta de los flujos de trabajo y los lenguajes no permisivos, nunca hubiesemos tenido el software que conocemos hoy, claro que el precio fue convertir la programación en algo muy aburrido y mecánico.

    Recuerdo en los años 80 cuando Japón sacó su iniciativa nacional de desarrollar la inteligencia artificial, todos alucinábamos con los sistemas expertos, los algoritmos evolutivos y los sistemas que aprtenden,, pero los computadores no parecen muy buenos para eso y lo de los japoneses murió sin pena ni gloria.

    Yo varias veces he pensado que lo de la inteligencia artificial no es gran cosa`, mucho as extraordinario sería lograr la "estupidez artificial", si pudiésemos hacer máquinas realmente estúpidas, es decir que acierten y se equivoquen de manera impredecible, sería un avance tremendo, pero estamos re lejos de eso.

    Lo otro es que el aprendizaje tiene una parte mecánica y otra parte loca, la parte mecánica puede ser relativamente sencilla (memorizar, evaluar probabilidades, acumular experiencia) y hay muchos algoritmos de aprendizaje que hacen eso mejor que las personas: juegan ajedrez, enrutan los paquetes de Internet, etc. pero el aprendizaje humano tiene un componente x, con un poco de locura y estupidez que no puede ser simulada ni siquiera con eventos aleatorios, y ese es el aprendizaje importante que permite por ejemplo decidir si le creemos o no a otra persona. Me voy a ver los artículos ahora!

    ResponderBorrar
  3. Que buena Ricardo, me voy a leerlos ahora. Sabes que a mi me tocó ver esta transformación de la profesión del programador en primera fila, en los años 70-80 se pensaba que los programadores tenían que ser muy creativos y también muy inteligentes, con capacidad para concentrarse y resolver problemas complicados pero eso llevó a un desorden enorme y a medida que los programas crecían en complejidad la cosa se ponía inmanejable.

    Cuando apareció Windows 95 -que fue un hito en computación, el primer SO visual que funcionaba bien- ya estaba consolidado el modelo "divide y vencerás", con miles de trained monkeys programando pequeñas cajas negras de procesos simples. Si no hubiese sido por las ideas de las capas, las cajas negras, los objetos, la estandarización estricta de los flujos de trabajo y los lenguajes no permisivos, nunca hubiesemos tenido el software que conocemos hoy, claro que el precio fue convertir la programación en algo muy aburrido y mecánico.

    Recuerdo en los años 80 cuando Japón sacó su iniciativa nacional de desarrollar la inteligencia artificial, todos alucinábamos con los sistemas expertos, los algoritmos evolutivos y los sistemas que aprtenden,, pero los computadores no parecen muy buenos para eso y lo de los japoneses murió sin pena ni gloria.

    Yo varias veces he pensado que lo de la inteligencia artificial no es gran cosa`, mucho as extraordinario sería lograr la "estupidez artificial", si pudiésemos hacer máquinas realmente estúpidas, es decir que acierten y se equivoquen de manera impredecible, sería un avance tremendo, pero estamos re lejos de eso.

    Lo otro es que el aprendizaje tiene una parte mecánica y otra parte loca, la parte mecánica puede ser relativamente sencilla (memorizar, evaluar probabilidades, acumular experiencia) y hay muchos algoritmos de aprendizaje que hacen eso mejor que las personas: juegan ajedrez, enrutan los paquetes de Internet, etc. pero el aprendizaje humano tiene un componente x, con un poco de locura y estupidez que no puede ser simulada ni siquiera con eventos aleatorios, y ese es el aprendizaje importante que permite por ejemplo decidir si le creemos o no a otra persona. Me voy a ver los artículos ahora!

    ResponderBorrar
  4. Mi amigo Luggren, ingeniero químico, aseguraba haber inventado el motor eléctrico un par de clases antes de que su profesor se lo explicara.
    El escritor Macedonio Fernández leyó un cuento una vez y se dio cuenta enseguida de que lo habían plagiado. El plagiador lo había escrito un par de siglos antes que él - un vil truco de un verdadero tramposo.
    Y yo mismo aseguro haber desarrollado la Fórmula de Winter-Carp varias páginas antes de que el Manual para Ingenieros Azucareros me la explicara en detalle. El Mundo, por supuesto, jamás me lo reconoció.

    ResponderBorrar
  5. Exactamente Ulschmidt, las cosas no tienen por que ser inventadas una sola vez, es seguro que la rueda la inventaron muchas veces antes que se popularizara de manera totalmente independiente. El cálculo en su desarrollo formal fue inventado casi en paralelo por Newton y Liebnitz. Muchas cosas se inventan casi simultáneamente porque son necesidades que aparecen y quedan flotando entre las pèrsonas. Me consta por ejemplo que nuestro amigo Leus inventó el concepto del blog antes de que este apareciera en los noventas con su idea de "e-publish" que en ese tiempo no la tenía prácticamente nadie.

    En fin, ya que no tenemos el billete por los relacionales, por el blog ni por la Fórmula de Winter-Carp, solo nos queda el gusto de saber que ya se nos había ocurrido a nosotros mucho antes que a casi todos.

    ResponderBorrar
  6. Tomás, es un tema bien complejo, pero se puede decir que los modelos de creatividad ponen como etapa necesaria la "evaluación" del resultado y en la etapa actual de la AI aún no logran hacerlo. Ya tenemos algoritmos capaces de "pattern recognition" y "machine learning" tan potentes que son capaces de crear obras que ya se exponen en museos o componer música a la manera de Bach, Mozart, Beethoven etc. Sin embargo, no logran ser "concientes" de su propia obra por lo que no son capaces de evolucionar sus procesos. O sea, logran pasar el test de Turing, pero no el problema de la Chinese Room de Searle.

    Esto se podría explicar con los tipos de creatividad "computable" que ha investigado Margaret Boden. Existirían 3 tipos de creatividad, las dos últimas en torno al "espacio conceptual": 1) creatividad combinatoria, que no es más que la combinación de elementos ya creados para lograr una iteración novedosa; 2) creatividad exploratoria, donde se exploran las variantes disponibles dentro de los límites de un espacio conceptual; y 3) creatividad transformacional, donde el creador puede trastocar los mismos límites del espacio conceptual donde se mueve, muchas veces por asociación con otros dominios o espacios disímiles. En este último tipo de creatividad encontramos las revoluciones científicas, tecnológicas o artísticas. Y es donde topa la AI: los computadores no logran aún tener un sentido de self-awareness que les permita apreciar o evaluar lo que han creado en aras de mejorar su performance.

    Saludos

    ResponderBorrar
  7. Que temazo Ricardo, obviamente yo solo puedoo hablar a nivel de opinología porque la IA es una de las cosas que menos conozco y que menos he leído, muny interesantes tus aportes.

    Por ejemplo eso que hay creatividad que es computable y otra que no es, claro, hay cierta creatividad más o menos trivial (o que se va haciendo trivial con los computadores, antes no era nada trivial) que consiste en combinar de la mejor manera yo ya sabido o usar prueba y error, eso probablemente lo pueden hacer las máquinas y el problema debe ser más que nada capacidad y velocidad de proceso.

    Pero la cratividad relevante es esa del tipo que no tiene idea como diablos se le ocurrió y logra hacer algo que lógicamente no es capaz de hacer.

    Cuando Mozart decía que veía las sinfonías completas "gleich alles suzammen" todo junto de un golpe, o como los savant o como a cualquiera de nosotros muchas veces se nos ha prendido la ampolleta en cosas menos trascendentes. La creatividad del subconsciente o algo así.

    El otro día leí de un método para enseñar a tocar música dejando que toque el subconsciente, el tipo decía que solo tocamos bien cuando dejamos de pensar y yo al menos estoy seguro que toco mal cuando pienso, cuando traté de filmar unas clases de teclado me equivocaba 10 veces más que lo normal, no solo por nervios sino porque estaba pensando. Parece que pensar hace mal a veces.

    ResponderBorrar

"Send me a postcard, drop me a line
Stating point of view
Indicate precisely what you mean to say
Yours sincerely, wasting away
Give me your answer, fill in a form
Mine for evermore
Will you still need me, will you still feed me
When I'm sixty-four"