lunes, 8 de enero de 2007

oLoop: Diez años después

Este mes es de aniversario. Reorganizando mis archivos encontré el ejemplar de mi tesis para obtener el título de Licenciado en Computación en la Universidad Nacional Mayor de San Marcos, y observé que la fecha decía Enero 1997. Me pareció una coincidencia increible el haber decidido organizar mis documentos justo este fin de semana. Ya son 10 años de vida de este lenguaje de pseudocódigo, al cual bauticé con el nombre de oLoop, y que se ha convertido en una herramienta de enseñanza de algoritmos en mi alma matter (UNMSM) y en la Universidad San Ignacio de Loyola.

Es por ese motivo que a manera de nostálgico pensamiento, los invito a transportarse conmigo a las épocas en que redactaba esa tesis y les adjunto un extracto de la introducción:

"En la actualidad, la programación orientada a objetos ya no es un preciado tesoro que los eruditos de la programación ostentaban con orgullo. El conocimiento de la Programación Orientada a Objetos y Eventos (POO) es hoy una necesidad. El hecho de que un gran porcentaje de las herramientas de desarrollo actuales utilicen programación orientada a objetos nos obliga a no permanecer al margen de esta corriente.

Como bien sabemos el mundo de la computación evoluciona con mayor velocidad que nuestra capacidad de asimilarlo en su totalidad. Mas aún, constantemente surgen nuevas ramas de especialización que estudian en profundidad cada aspecto de este sub-universo. No están muy lejanos (cronológicamente hablando) los tiempos en que un grupo de personas pasaba largas horas en un escritorio, sin más herramientas que lápiz, papel, su creatividad e ingenio para afrontar el reto de crear abstracciones de problemas de su entorno y así definir y especificar soluciones para los mismos. Dada la limitación de recursos del momento (pues eran recursos muy costosos ), su objetivo era crear las soluciones más eficientes, pequenas y rápidas. Hoy en día la escala de prioridades ha cambiado debido a la gran necesidad de soluciones rápidas y preparadas para evolucionar. Los dispositivos de almacenamiento son cada vez más baratos y las computadoras alcanzan velocidades de procesamiento casi inimaginables. Para los programadores aparecieron nuevos retos como las interfaces gráficas para usuario, tecnologías de intercambio de información y conectividad.

La tecnología de objetos a causado que los desarrolladores de aplicaciones adapten su forma de pensar al estilo orientado a objetos (lo cual no necesariamente ha sido fácil). El único elemento que es común en todo momento es la mente humana, esa maravillosa máquina capaz de elaborar en forma simultánea las diversas tareas, entre ellas elaborar una secuencia organizada de pasos para solucionar problemas conocidos como algoritmos .

Las personas que han vivido y siguen viviendo el proceso de transformación habrán pagado el precio de reeducar sus mentes a una nueva forma de pensar . En algunos casos esto ha sido hecho de la forma inadecuada o sólo se ha cambiado de etiqueta, pero para algunos "todo vale" con tal de hacer sentir al mundo que "conocen programación orientadas a objetos".

Lo cierto es que si nos encontramos ansiosos de aprender y evitar que nuestro conocimiento no se resuma a conocer una herramienta, debemos concentrarnos en elaborar abstracciones en base a objetos sin dejarse dominar por el poder de seducción de lo "visual". Pero en la actualidad no tenemos herramientas para describir nuestro pensamiento orientado a objetos. Sólo contamos con herramientas para especificar algoritmos estructurados, inclusive la bibliografla actual sobre algoritmos sólo trata de algoritmos estructurados. La falta de dicho tipo de herramientas no facilita la enseñanza de programación para los niveles de pre-grado. Los profesores deben adoptar sólo los criterios impuestos por algún lenguaje o herramienta en particular, lo cual como bien sabemos genera
cierta dependencia del mismo.

El problema no sólo se presenta en los entornos académicos. En los centros de desarrollo de software que desean aplicar los conceptos de la orientación a objetos, se corre el riesgo de duplicar esfuerzos cuando se cambia de herramienta de desarrollo, pues al no haber una documentación expresada en un lenguaje claro y libre de peculiaridades de algún lenguaje o herramienta, obliga a un proceso de regresión hasta un nivel de abstracción adecuado para la migración a la nueva herramienta.

Es por estas razones básicamente que hemos optado por definir y especificar un lenguaje de pseudocódigo para implantar algoritmos orientados a objetos y eventos. Con el presente trabajo deseamos presentar una herramienta que permita aprender y aplicar en forma natural el estilo de programación orientada a objetos.

Para esto nos proponemos las siguientes metas:

  • Definir las estructuras gramaticales simplificadas para redactar un algoritmo en forma clara y comprensible:
      • Especificación de comportamiento lógico.
      • Declaración de Clases y Objetos
      • Gestión de excepciones.
      • Tratamiento de eventos.
  • Definir una biblioteca de clases que contenga las mínimas necesarias para crear nuestras soluciones.
  • Definir un conjunto de eventos predefinidos que contemplen los más representativos de las interfaces gráficas actuales.
  • Definir un conjuntos de excepciones predefinidas que contemplen las principales coindiciones de error en un algoritmo.
  • Proporcionar un pequeño conjunto de ejemplos con diferentes grados de complejidad que demuestren el uso del lenguaje de pseudocódigo.
El trabajo está organizado en cuatro capitulos, de los cuales los capitulos I y II nos preparan para poder tratar con mayor soltura los capitulos siguientes. De manera complementaria incluimos tres apéndices que engloban criterios importantes que es recomendable tomar en consideración.

En el Capitulo I, Conceptos fundamentales, hacemos una revisión de los aspectos más importantes de la programación orientada a objetos y hacemos un primer contacto con los conceptos de algoritmo, pseudocódigo y programación orientada a eventos.

El Capitulo II, Lenguajes de programación orientados a objetos, tiene por fin comentar de manera muy general los criterios de implantación de algunos lenguajes de programación orientados a objetos (C++ , Object Pascal y Java).

En el Capitulo III, Lenguaje de pseudocódigo orientado a objetos y eventos, nos dedicamos a presentar la propuesta de lenguaje de pseudocódigo, ilustrándolo con diagramas que explican las reglas de construcción de sus sentencias.

El Capitulo IV , Ejemplos de uso del lenguaje de pseudocódigo, aplica el lenguaje especificado en el capitulo anterior en algunos ejemplos de diferente complejidad.

El Apéndice A, Sugerencias para la escritura de pseudocódigo, tiene por finalidad ofrecer algunos criterios que pueden ser de utilidad al elaborar pesudocódigo, producto de la experiencia personal y la revisión de documentación sobre el tema.

El Apéndice B, Criterios para la creación de sub-clases, presentamos algunos de los indicios que nos pueden servir de pista para concluir que se necesita aplicar el concepto de herencia.

El Apéndice C, Beneficios y costos de la herencia, presenta de manera general los principales beneficios y costos que afecta a nuestros programas cuando a éstos se les aplica la herencia.

El éxito de aplicar éste lenguaje en los entornos antes mencionados dependerá de la decisión de los usuarios de abandonar la tendencia a depender de un lenguaje de programación y su capacidad de abstracción para identificar adecuadamente clases en un universo dado. Esperamos que el presente trabajo sirva de aporte para los interesados en este apasionante tema. Mientras más nos preocupemos en sentar bases sólidas para asimilar y aplicar mejor el conocimiento sobre el desarrollo de software, estaremos en mejores condiciones para transmitirlo a otros y así participar en forma activa en el proceso de evolución de la industria de producción de software nacional."

Es muy cierto que no debemos vivir de recuerdos, sin embargo es algo bueno y sano creo yo, atesorar algunos buenos recuerdos (los malos no son mas que lastre del que debemos luchar constantemente por liberarnos lo más pronto posible) que nos estimulen aún más a vivir y crear. Nuestro presente siempre alberga esa fuerza, y con ello debería ser suficiente, pero una ayuda extra nunca está demás.