domingo, 29 de diciembre de 2013

Lecciones de un proyecto no proyectado

Hoy se cumplen 10 años desde que PSeInt fue presentado por primera vez en "público". El 29/12/2003 rendí el final de "Programación I", evaluación que incluía mostrar y defender un programa desarrollado por el alumno con lo aprendido en la materia. No tengo ningún registro exacto de cuándo empecé a codificarlo así que tomo esa presentación formal como fecha de nacimiento. Ni se imaginan lo horrible y lleno de bugs que estaba el código, pero como yo no era consiente de ello, se lo vendí a los docentes como si fuera maravilloso, corriendo sin problemas los ejemplos con los que ya lo había probado. Y como en el poco tiempo que dura el examen no se puede ahondar en tantos detalles, los muchos errores escondidos no saltaron a la vista y me fui con una muy buena nota.

Más allá de eso, jamás imaginé que PSeInt seguiría vivo al día de hoy, y mucho menos que iba a cambiar y evolucionar en la forma en que lo hizo. Siempre le vi patas cortas a este proyecto, y eso me privó de explotarlo un poco más, de hacerlo crecer antes, y de utilizarlo para otras cosas, algo que hoy en algún sentido lamento no haber hecho. De eso vengo a contarles en este post. La historia de un proyecto muy querido pero a la vez subvalorado por su desarrollador. Sobre las veces que dejé pasar oportunidades por falta de imaginación, y cómo el tiempo me demostró que siempre se puede hacer algo más. Espero que este post ayude a salvar algún que otro proyecto con potencial de algún lector, que haya quedado escondido en un cajón por su falta de visión a largo plazo.

Primera versión de PSeInt para Windows

Volviendo al principio, si bien la idea del proyecto surgió genuinamente de la pura observación de las clases, también es cierto que desde temprano sabía que me gustaba la programación, y ya olfateaba que me podía gustar la docencia. Así que lo hice y presenté esperando que también pudiera llegar a ser mi carta de presentación, o mi boleto de entrada para una ayudantía en la materia. Eso resultó, tardó un poco en llegar, pero se dio de esa manera. En ese momento, el programa constaba de un editor, muy muy básico, y un intérprete de consola, casi totalmente disociado del editor. Así veía yo que funcionaban los escasos IDEs con los que había trabajado. Además, mi idea esfuerzo original se centraba en el intérprete, la interfaz estaba solo por completitud. El problema era que más allá de corregir los bugs del intérprete y mejorar detalles estéticos del editor, no veía que le quedara mucho por hacer. Por eso dejé pasar oportunidades de trabajar más en PSeInt, y hay dos de ellas particularmente notorias.

Primera versión de PSeInt para GNU/Linux

La primera se dio cuando en tercer año, el docente titular de aquella cátedra de Programación I me habló de unas becas para iniciarse en investigación, y de la posibilidad de hacer algo relacionado al PSeInt. Me gustó la idea de la beca, pero como no le veía mucho por hacer al PSeInt traté de inventar algo nuevo. Me presenté a la beca con la excusa de desarrollar y medir el impacto de software educativo para programación, de forma de poder incluir lo que tenía de PSeInt, pero que me diera pié para hacer algo más. En esta oportunidad, podría haber dedicado el año y medio completo de la beca a trabajar sobre el PSeInt, tanto en lo técnico desarrollando, como en lo pedagógico investigando un poco más. Pero no supe en qué. Ahora mirando para atrás sé que quedaba mucho por mejorar:
  • Ahora tengo una opinión más clara sobre el objetivo de utilizar pseudocódigo, desdoblando el aprendizado de la programación en etapas y atacando los problemas de a uno, tal como lo hacemos en la programación real; podría haber trabajado en la mejora y flexibilización del lenguaje y el desarrollo de los perfiles.
  • Ahora veo que la forma en que se presenten y expliquen los errores condiciona mucho la respuesta del estudiante, y con más experiencia veo que hay varias formas de hacerlo; podría haber desarrollado los mecanismos para marcar los errores en tiempo real, y las demás mejoras en la interfaz con que se presentan que llegaron después.
  • Descubrí más tarde la idea de live-coding (gracias a un artículo que en ese momento no estaba escrito), junto con las ventajas que da el hecho de que sólo se implementen en PSeInt algoritmos pequeños, de "juguete", para poder dejar de lado la eficiencia y pensar más en obtener resultados adicionales útiles para el alumno; podría haber aplicado estas ideas en cosas como las que describía en este post y otras más que aún no están implementadas.
  • Ahora veo con otros ojos el uso del diagrama de flujo en la enseñanza, como alternativa fuerte al pseudocódigo, y más pura considerando que la idea del pseudocódigo es eliminar la dificultad del lenguaje sin dejar de lado la formalidad del algoritmo; podría haber trabajado en el editor de diagramas y su interacción con el editor original.
  • Ahora también veo el potencial didáctico de una herramienta de depuración, y he encontrado (inspirado en otros ejemplos como kturtle) formas de simplificar su utilización; podría haber trabajado en la ejecución paso a paso, su versión explicada, y la prueba de escritorio.
  • Cuando PSeInt se empezó a utilizar en otras instituciones, los docentes empezaron a pedir que se puedan crear subprocesos o funciones; podría haber desarrollado eso, ahora sé que se puede explotar aún más la etapa de pseudocódigo llegando a conceptos como modularización, pasaje de parámetros, recursividad, que son fundamentales y todavía independientes del lenguaje.
  • Y como estas ahora se que habrá muchas más que hoy no veo y se irán revelando con el tiempo.

La segunda oportunidad fue cuando tuve que elegir mi proyecto final de carrera. No me animé a utilizar ni PSeInt ni ZinjaI porque no los consideraba todavía lo suficientemente interesantes. Es decir, veía dos herramientas implementadas, andando, pero sin nada que requiriese tanto análisis o diese para escribir un todo un proyecto final de 100 páginas y defenderlo como si fuese algo medianamente novedoso. Parecía más un proyecto que salía por un tubo simplemente aplicando los caminos convencionales, con mucho trabajo y paciencia, pero sin tanta innovación en la idea.

Ahora pienso que podría escribir un libro justificando decisiones de diseño para nada triviales, explicando cómo PSeInt se implementa por partes y la trama de relaciones para que todas las partes funciones en conjunto, comentando trucos de implementación varios en cada módulo, discutiendo las particularidades del parseo del lenguaje que hace este intérprete a diferencia de otros, o las situaciones paradójicas que este sitema de tipos puede generar, analizando las diferencias fundamentales en los requerimientos no funcionales entre un lenguaje didáctico y uno real, y el abanico de posibilidades que eso abre, discutiendo por qué utilizamos pseudocódigo para enseñar  a programar y cómo debería ser este pseudocódigo para que cumpla con esos objetivos, etc. Si hoy volviese a hacer mi proyecto final, lo haría con esto, me divertiría muchísimo porque es de lo que más me gusta, me serviría para que el proyecto crezca y surjan nuevas ideas, lo defendería orgulloso sabiendo que cada bit está ahí por una razón y sin necesidad de ocultar sus fallas y limitaciones (que por supuesto que las hay), y obtendría como resultado una documentación completa y valiosísima, que ahora tal vez solo escriba de forma muy parcial y fragmentada, a cuenta gotas en este blog, como lo he venido haciendo desde hace más de un año.

Aspecto actual de PSeInt

La experiencia me ha hecho revalorar el proyecto desde su potencial didáctico y su impacto, repensar el uso del pseudocódigo en el aprendizaje, descubrir nuevos desafíos para su implementación, crecer como programador, y conocer un montón de colegas docentes ganando también algunos amigos en el proceso. De ninguna manera me ha hecho experto en todas esas cosas que decía antes que podría haber escrito en el proyecto final de carrera. Sí está claro que tengo más experiencia, y solo en comparación con lo que sabía antes ahora soy un genio. Pero la misma experiencia me mostró que siempre hay más, mucho más, que no siempre tengo la capacidad de verlo, así que es probable que el proyecto siga evolucionando, y que en el futuro deba tirar, repensar y rehacer cosas que ahora me parecen muy bien hechas. Y seguramente escribiré por aquí comentando lo mal que resultaron algunas ideas o decisiones, qué me llevo a darme cuenta, o cuál es la solución aparentemente elegante con que lo resuelvo en ese momento.

De aquella beca y ese intento de hacer algo nuevo salió ZinjaI, así que no puedo decir que haya sido una oportunidad desperdiciada, sino todo lo contrario. De mi proyecto final alternativo surgieron algunos de mis primeros ingresos, y  la posibilidad de iniciar el posgrado que ahora estoy tratando de completar, así que también tuvo su lado muy muy positivo. No me puedo quejar, pero me queda esa idea clara de que me falta visión, que me anima a seguir con entusiasmo en estos proyectos esperando descubrir de a poco qué cosas nuevas o interesantes podré hacer o aprender con ellos en el futuro. Hay mucho por hacer y aprender, porque como digo siempre, a programar sólo se aprende programando. Lo bueno es que ahora sé un poco mejor por dónde buscar y tengo un antecedente concreto como ejemplo y motivación para pensar que siempre va a quedar algo interesante por hacer.

5 comentarios:

  1. @zaskar_84
    Soy ingeniero en Sistemas de Información, docente de algunas materias de introducción a la programación y activo usuario de PSeInt para la enseñanza.
    Dejo aquí algunos comentarios y opiniones:
    - Algunos elementos que se podrían intentar incluir en PSeInt:
    - Estrucuras de datos compuestas tipo registros (como struct en C o RECORD en Pascal)
    - Funciones para la lectura/escritura de archivos
    - Un posible objetivo a mediano/largo plazo podría ser la incorporación a PSeInt de características de la Programación Orientada a Objetos (Clases, Diagramas UML), poniendo principalmente el foco en la transición desde la Programación estructurada que es sin duda uno de los cambios más difíciles de asimilar para los alumnos.
    - Por otra parte, comento que no están actualizadas las novedades del último release en el sitio http://pseint.sourceforge.net/index.php?page=cambios.php

    ResponderEliminar
  2. PSEINT es el mejor aplicación para iniciarse en la programación informática, estoy de acuerdo con los puntos anteriores mencionados, en especial soporte de registros, como lo hace una aplicacion existente, de este modo lo superaría y seria invatible

    +1

    ResponderEliminar
  3. La verdad considero una herramienta bastante interesante y didáctica a la hora de inicializarse en un lenguaje de programación.
    me sirvio mucho en el momento de comprender la metodología

    ResponderEliminar
  4. Es la madurez profesional que ahora le permite valorar más a PSeInt y lo considero normal. Para la empresa con la cual trabajo hace 9 años en desarrollos en Oracle Formas y el lenguage Oracle PL/SQL, existe la código con esa antigüedad aun funcionando y cuando he tenido de revisarlo o capacitado a nuevos diseñadores y desarrolladores veo que algunas dicisiones de diseño/desarrollo no fueron tan afortunadas y que se hubiese podido excribir el código de una manera más elegante y tal vez posiblemente más eficiente dado que dominno mejor el lenguage.

    ResponderEliminar
  5. Descrubrí el PSeInt a raíz que en el colegio donde estudia mi hijo el profesor de informática lo está utilizando y quedé maravillado de la existencia de tal herramienta y más en español.
    Cuando ingresé a la Univesida por allá en 1981, me eseñaron programación en papel con "Karel el robot" y posteriormente con Algol

    ResponderEliminar