miércoles, 28 de marzo de 2012

¿Quien es quien? Hoy: ZinjaI

Siguiendo con las presentaciones, toca hablar de ZinjaI (aclaración: la ultima letra es una i, pero en mayúsculas, no una L como parece con muchas fuentes, y lo pronuncio zinyai, por su significado: "ZinjaI is not just another IDE"). ZinjaI es actualmente un IDE (entorno de desarrollo integrado) para programar en C/C++, que debería ser útil tanto para principiantes como para programadores avanzados. Pero originalmente, no iba a ser así.

Todo empezó por un programa de becas que tienen en mi facultad para que alumnos de grado se inicien en investigación. El alumno se presenta con un director y un plan de trabajo para dedicarle algunas horas a la semana durante año y medio a algun proyecto de investigación o relacionado. A cambio recibe, entre otras cosas, una formación básica, una primer experiencia, y un punto más en su CV.  En un momento de mi carrera, el docente titular de las primeras materias de programación, aprovechando lo que ya tenía encaminado con las primeras versiones de PSeInt me ofreció aplicar para una de estas becas, para formalizar ese desarrollo y continuarlo.

Como la parte más importante (el intérprete en sí) de PSeInt ya estaba desarrollada, me puse a pensar qué otra herramienta nueva podría ser de utilidad en el aula. Dado que en nuestra carrera, luego de pseudocódigo pasamos a utilizar C++, lo lógico era pensar en una herramienta para empezar a trabajar con C++. 
En ese momento utilizaban por razones históricas mayormente los IDEs de Borland (Builder 4 y 6, que estaban desactualizados y hasta desmantenidos). Yo por mi parte, sugería utilizar MinGW Developer Studio (uno muy muy básico con una apariencia inspirada en las primeras versiones de Visual C) porque me parecía mucho más simple que los grandes IDEs libres como DevCpp, Code::Blocks, Anjuta, KDevelop, etc., y tenía lo básico que consideraba necesario, además de ser liviano y gratuito. Hacer un nuevo IDE solo por hacerlo, con tantos dando vuelta no era necesariamente la mejor idea, había que incorporar algún elemento distintivo que lo justifique. Y ahí es cuando conocí DDD (Data Display Debugger), una interfaz gráfica para el depurador gdb muy muy potente y con representaciones visuales. DDD es tan potente que se torna complicado para alguien que no está muy familiarizado con gdb, y consideremos que los alumnos que recién empiezan no están familiarizados ni con gdb, ni con el concepto de depuración, ni con C++, apenas si acaban de enganchar los fundamentos del pseudocódigo. Entonces la propuesta era hacer un entorno bien simple en el que el alumno pudiera visualizar gráficamente los datos y ver paso a paso como funciona su programa, como se organizan las cosas en memoria, etc, para entender mejor los algoritmos o sus errores.

Así que quería una especie de depurador gráfico, simple e intuitivo, que cualquiera pudiera entender por su cuenta. Pero para que todo sea simple, el alumno tenía que poder escribir su código directamente ahí, para que el depurador lo compile y ejecute como debe. Entonces el depurador incluiría un pequeño editor, que a su vez llamaría al compilador, etc., y de pronto tenemos más de medio IDE. Por otro lado, más tarde encontré limitaciones en gdb que me hicieron abandonar al menos temporalmente algunas de las ideas originales, por lo que el producto final se transformó cada vez más en un IDE más o menos estándar, pero adaptado para estudiantes, antes que un depurador gráfico. El adaptado para estudiantes implica que su interfaz está en castellano, que para hacer un programa no hace falta crear un proyecto o ni siquiera guardar el archivo, que las opciones básicas que necesita están a mano y no está superpoblado de otras opciones que solo confunden, algunas funcionalidades más particulares como la posibilidad de compartir el código que el docente está desarrollando en su notebook y que los alumnos ven proyectado en una clase directamente desde el IDE para que ellos lo reciban a través de la red, que oculta las diferencias entre plataformas, que simplifica un poco los mensajes de error que arroja gcc, etc.

Como esto era, a mis ojos, un desarrollo más que una investigación, planteamos la investigación como excusa para el desarrollo. Propusimos investigar el impacto que este tipo de herramientas tiene en los alumnos y cómo mejorarlo, comparando los resultados académicos en dos cursos similares, uno que utilice el software y otro que no. Cuando llegó el momento de evaluar esto, el desarrollo de ZinjaI estaba todavía verde así que no se pudo sacar grandes conclusiones, pero respecto al pseudocódigo, resumiendo mucho, observamos que servía para mejorar el rendimiento del alumno que estaba en el límite entre aprobar y desaprobar la materia, pero que no tenía impacto alguno sobre el alumno que la promocionaba con notas altas.

Las limitaciones de gdb no son específicamente problemas de gdb, sino más bien características del diseño C++. Hay una una idea que heredo desde PSeInt y es que si voy a hacer algo que el alumno va a usar para intentar entender, tengo que hacerlo bien o no hacerlo, porque si mi programa lo hace mal (y no avisa), estoy contribuyendo a confundir al alumno, a que lo aprenda mal como lo hace mi programa, o al menos a generarle dudas sobre algo que estaba bien y que le harán perder tiempo (está claro que en la realidad no logro respetar esta idea al 100%, pero intento). Por ejemplo, cuando en DDD inspecciono un puntero, aparece en el área de dibujo un cuadradito con la dirección de memoria. Cuando hago doble click sobre el puntero, aparece otro cuadradito con el contenido al cual apunta, y una flecha del primero hacia el segundo, similar a lo que un docente dibuja en el pizarrón cuando lo explica en clases. Pero si tengo dos punteros que apuntan a la misma dirección y hago doble click sobre los dos, por cada uno aparece un nuevo cuadradito con el contenido apuntado, en lugar que apuntar los dos al mismo (o al menos así era cuando lo probé). Esto confunde, porque los dos cuadraditos nuevos deberían ser uno, ya que ese contenido no está dos veces en memoria, y no puedo modificar un dato apuntado sin alterar el otro. Corregir esto implica llevar un registro de todas las direcciones de todas las variables involucradas para detectar cuando deben ser las mismas. No solo podría ser lento, sino que en algunos casos rebuscados no encontré como pedirle a gdb la dirección que necesito para saber si alguien le está apuntando. Otro ejemplo sería el uso de arreglos dinámicos, no hay una forma fácil y no intrusiva de saber cuantos elementos tiene un arreglo generado con new inspeccionando la memoria. Esta información está en memoria (sino el programa no podría destruir los elementos al hacer el delete []), pero de una forma que es dependiente de cada compilador, de cada sistema operativo, de las opciones de compilación en sí mismas, y por lo tanto, difícil de encontrar y poco fiable (peor aún con malloc). Por esto, lo que iba a ser un depurador gráfico con olor a IDE, terminó siendo un IDE con un depurador no tan gráfico (pero sí con algunas pocas representaciones más piolas que las estándar, como las de tablas), sólo que haciendo énfasis en la I de IDE para adaptarla a las necesidades del aula y distinguirla de las demás.

Siguiendo con la historia de ZinjaI, como era un IDE que yo había hecho, que conocía al detalle, y que podía modificar a gusto, comencé a usarlo para mis trabajos reales, para proyectos más serios que un ejercicio en una clase de práctica. Y a medida que lo iba usando cada vez más, iba necesitando agregarle cosas, siempre tratando de no perturbar la sencillez inicial, pero ganando en potencia con cada nueva versión. Finalmente, tengo un IDE que se presenta como básico y simple (o al menos eso pretendo), pero que permite armar grandes proyectos, interactuar con herramientas externas, manejar configuraciones complejas, depurar aprovechando casi toda la potencia de gdb, etc. Hoy en día sigue siendo una cuenta pendiente mejorar aún más la interfaz para la depuración, algo que es a mi criterio increíblemente útil como herramienta didáctica, pero que muchísimos alumnos (aún alumnos avanzados y hasta docentes a veces) desconocen y en consecuencia no valoran.

16 comentarios:

  1. Sos un maestro... Bué obvio, veo que sos profe, -> que grande que sos. Totalmente agradecido por la herramienta. Gratis y encima Argentino (por momento pienso que estás en pedo en meterle tantas pilas, por otro lado te leo, y veo tu parte docente, y te entiendo). Pregunta, supongo entonces que tenés que ver con Ninja. Puede ser? Si es así otras felicitaciones. Si sirve de algo yo valoro totalmente semejante herramienta. Si sirve de algo, me peleé (virtualmente) con Eclipse (pq tenía problemas en la instalación), y descubrí Zinja, y la verdad, estoy re-contento. Desde CABA, saludos y un millón de gracias. (Repito, sos un grande).

    Simón Templar (No comments)

    ResponderEliminar
    Respuestas
    1. hola como puedo hacer para ayudarte a desarrollarlo,me gustaria diseñar algunos iconos.si estas interesado hablame por facebook te dejo el link....https://www.facebook.com/ariel.gimenez.9883

      Eliminar
  2. Gracias por los comentarios, pero si por Ninja te referís a Ninja IDE, no, no tienen nada que ver más allá de la "coincidencia" del nombre. Ninja creo que es más nuevo, y alguna vez intenté ponerme en contacto con el desarrollador pero nunca recibí respuesta.

    ResponderEliminar
  3. NINJA-IDE es para el lenguaje Python =(

    Zaskar me gustaría que en tu sitio web renombradas Zinjai a

    ZINJAI-IDE seria una nomenclatura mas estandar

    ResponderEliminar
  4. ... Se me olvidaba NINJA-IDE tiene un tema de fondo NEGRO, que bien se miraría así ZINJAI-IDE, le da una apariencia mas cool.

    http://ninja-ide.org/about/

    ResponderEliminar
  5. Coincido con Simón Templar, sos un groso!
    Meses traté de acostumbrarme a codeblocks (ide que utilizan el la universidad) y nunca pude familiarizarme. El solo hecho de depurar me daba fiebre. Lleno de opciónes, en inglés...

    Antes de ir a la universidad utilicé un tiempito a pseint, me ayudó a comprender cosas básicas, luego , ya estudiando, utilizabamos diagramas de flujo. En cuanto a programar ejercisios me acordé de zinjai por ser simple, sin necesidad de guardar antes, facilidad en depuración, y miles de &cétera y la verdad que es excelente.

    Seguro ya te mande este mensaje, perdoname lo pesado, pero la verdad que estaría muy bueno si pones Zinjai en los repositorios de debian, ubuntu, mint, &c. de esta manera mucha gente podría conocer las ventajas de este ide, además de ser un tanto automática la instalación.

    Ah, y gracias por responderme el correo sobre ese bug de cadenas : )!

    Saludos desde Buenos Aires.
    Lucas

    ResponderEliminar
    Respuestas
    1. Me gustaría mucho que ZinjaI y PSeInt aparezcan en los repositorios, pero nunca me puse a leer detenidamente cómo hacerlo. Imagino que cada distro tendrá su tipo de paquete que deberá construirse siguiendo ciertas normas, respetando formatos, nomenclaturas, con su manera de seleccionar e indicar dependencias, su organización en el sistema de archivos, sus canales para proponerlo para que aparezca en los repositorios, sus mecanismos de actualización (del paquete en el repositorio, no del lado del usuario), algunas cuestiones de licencia, etc. Tengo que interiorizarme más sobre los detalles de esos procesos; la distribución que uso ni siquiera tiene un gestor de paquetes con manejo de dependencias. Por otro lado, la "instalación" ahora creo que es muy simple, así que si bien esto está en mi lista de cosas por hacer, no está tan alto en las prioridades.

      Eliminar
    2. Hola. Ante todo, felicitarte por el excelente programa ZinjaI. Louso desde el 2012, y la verdad, lo he recomendado para que lo usen otros compañeros de mi carrera.
      Ahora, tengo una crítica o sugerencia para realizar. Siempre trabajé en Windows, pero, ahora, estoy dando mis primeros pasos en Linux. Instalé el LinuxMinst, y he intentado instalar el ZinjaI en el. Jamás un programa me había dado tantos dolores de cabeza. Hace horas que estoy intentando hacerlo andar y esto no funciona. He busscado ayuda en Internet, pero veo que la cominudad Linux no es demasiado cooperativa. Simplemente te tiran un "buscalo en repositorios" (que andá a saber de que se trata), o "es fácil, ./zinjai" y listo. Lo cierto es que desde hace horas, lo único que he logrado es tener una ventana abierta llamada: zinjai-I64-20150209.tgz (read only) y un motón de errores incomprensibles que me han hecho resetear dos veces mi equipo. Pregunto: Che... Cuesta tanto hacer un instalador que al final te deje un iconito en el escritorio?

      Eliminar
    3. El primer lugar para consultar sobre esto es el foro del mismísimo ZinjaI (https://sourceforge.net/p/zinjai/discussion/ayuda_es/).

      El tgz que distribuyo en GNU/Linux es más o menos equivalente a un .zip o .rar en Windows. Debería ser trivial descomprimirlo en alguna carpeta y ejecutar el archivo "zinjai" que encuentre ahí dentro. Las instrucciones exactas para hacerlo desde la consola están en la pag de descarga. Desde el entorno gráfico no hay instrucciones porque depende de qué entorno use cada uno. De todas formas, esto hay que hacerlo solo una vez, después de la primera ejecución crea automáticamente los accesos directos.

      No hago un instalador gráfico, porque eso dependería de bibliotecas, y las bibliotecas varían de una distro a otra. Con el tgz me ahorro esos problemas (digamos que es como lo que en windows ahora llaman un "portable").

      En cualquier caso, si aún no pudo instalarlo, lo mejor sería entrar al foro y detallar cómo intentó hacerlo y cuales son los errores que observa.

      Eliminar
    4. OK, muchas gracias por la respuesta. Entraré al foro y veré que puedo lograr.

      Gracias nuevamente y saludos...

      Juan Mario

      Eliminar
  6. Buenas!
    Soy estudiante y desarrollador Python, la historia me identifica mucho ya que también desarrollé un Entorno de Desarrollo para la facultad en donde estudio[0]. Me he guiado mucho de ZinjaI!
    Un abrazo!

    [0]: http://github.com/centaurialpha/edis

    ResponderEliminar
  7. hola, primero que nada las felicitaciones correspondientes por el IDE, soy nuevo en esto de la programacio, ya que es una materia en la carrera que curso, pero resulta que el profesor es un poco "cuadrado" por asi decirlo, quisiera saber si tienes algun tutorial para gente como yo, paso a paso y facil de entender sobre c++ y zinjai, gracias... saludos desde uruguay (maurogb85@gmail.com)

    ResponderEliminar
    Respuestas
    1. Hay muchos tutoriales de C++ en Internet, pero la verdad es que no tengo ninguno en especial apuntado como para recomendar. En cualquier caso si buscan, recomiendo buscar tutoriales de C++, y evitar los que se presenten como tutoriales de ZinjaI, Visual, Codeblocks, o cualquier otra herramienta. Y además, esquivar también los que empiezan por C, para luego pasara a C++- Por otro lado un buen punto de partida puede ser un buen libro (es mucho más común encontrar un tutorial berreta que un libro berreta). En particular a mi me gustaron mucho el de Thinking in C++ de Eckel (que se encuentra facil traducido al castellano), y el Principles And Practices, de Stroustroup. El primero es genial principalmente en cuanto a la orientación a objetos, pero es viejo, sobre C++98/03. El segundo es más completo y tiene ediciones actualizadas a C++11.

      Eliminar
  8. Si no les molestan los tutoriales en inglés (Con acento Hindú), estos estan bastante bién comenzando desde principiante hasta conceptos intermedios y un tanto avanzados

    https://www.youtube.com/watch?v=3fwKlU9AwSY

    ResponderEliminar
  9. hola como puedo hacer para ayudarte a desarrollarlo,me gustaria diseñar algunos iconos.si estas interesado hablame por facebook te dejo el link....https://www.facebook.com/ariel.gimenez.9883

    ResponderEliminar
    Respuestas
    1. No uso facebook, pero supongo que sos quien escribió preguntando por algo similar por el foro, podemos comunicarnos por ahí.

      Eliminar