Treinta años en desarrollo de software

Hace 30 años, yo era un joven adolescente, que vivía en el Gran Buenos Aires, Argentina. Estaba tratando de decidir qué hacer con mi vida. Conocía algunos temas de computadores digitales (lo suficiente como para entender notación binaria, circuitos lógicos, codificación decimal en 4 bits, etc…) pero no conocía nada sobre programación de software. En aquellos tiempos, pocas personas tenían acceso a una computadora, que por aquí eran generalmente mainframes IBM. Por casualidad, comencé a leer sobre software, y tomé un curso de programación. Entonces, mis primeros programas fueron escritos en  COBOL, al estilo IBM.

 Aún recuerdo los formularios de paper que se usaban para escribir programas COBOL: filas y columnas, los comentarios tenían que comenzar en la columna 7, letras en mayúsculas. Data division, procedure division, y las inacabables variantes de la environment divion. Recuerdo las tarjetas perforadas, y lo inextricable del Job Control Language, un lenguaje extinguido (espero) que supongo tuvo su origen en el antiguo Egipto. . PERFORM … THRU… OCCURS…. 01, 02, 88 levels, tantas cosas.. ¿dónde está eso ahora? Seguramente corriendo en muchos sistemas financieros y bancarios.

Pero no tenía ninguna computadora donde ejecutar los programas. Los escribía y los probaba en pruebas “de escritorio”. No era fácil.. :-). Todo esto pasaba al final de 1978. Al próximo año, encontre un libro sobre programación de IBM 360 assembly language. Comencé a soñar con instrucciones BALR (Branch And Link Registes) y expansiones de macros. Sí, me había transformado en un informático.

Al terminar el colegio secundario, pasé a la Universidad de Buenos Aires, Facultad de Ingeniería, para aprender más sobre computadores y programación. Aprendí sobre computadoras digitales, Algol-W, BCPL, más IBM 3×0 assembly language, pero  mucho más sobre matemáticas, álgebra, cálculo, y pensamiento formal. Fue un gran tiempo para mí, mi mente se abrió a temas que algo conocía, pero no había profundizado. Desde entonces, las matemáticas me acompañan, cada año de mi vida. Amo las matemáticas, aún más que al software. Pero en aquellos años, decidí estudiar computación: ese campo esta teniendo un auge en el mercado de trabajo de Argentina, y necesitaba dinero…. ejem… el mismo estado actual de mi vida… ;-)

BCPL era interesantísimo: era una lenguaje compilado, ejecutando en mainframes IBM y en otras máquinas. Su compilador estaba escrito en BCPL mismo: esa idea fue una iluminación para mi mente. Los lenguajes auto definidos son una gran idea. Conocí a un predecesor BCPL leyendo una reimpresión de un viejo artículo del Scientific Americal, que mencionaba al lenguaje CPL, un intento más ambicioso, que por eso mismo no parece haber prosperado.

Fortran IV fue otro lenguaje que se usaba para enseñar programación en esos días. Todavía recuerdo los campos Hollerith, y la falta de recursión (una falta clásica de todo el mundo IBM). Los libros de Mc Craken eran un clásico best sellers. No llegué a trabajar con Watfor , que contenía un preprocesador:  sólo con Fortran IV.

Todos estos programas que escribí, se ejecutaban en un mainframe de la universidad, que si mal no recuerdo, apenas tenía algunos K de memoria. Escribía los programas en planillas de papel, alguien (o yo mismo) las pasaba a tarjetas perforadas. Dejaba las tarjetas al administrador del centro de cómputos, digamos, un miércoles, y recien al OTRO miércoles tenía el resultado de la corrida. Si había cometido un error trivial, olvidarme un punto o una coma, debía rehacer el trabajo, y esperar OTRA semana para ver si ahora sí andaba. Con el tiempo, llegué a poder leer las tarjetas perforadas, con sólo ver las perforaciones. EBCDIC era mi amigo (algo feo, las letras no estaban todas consecutivas).

Ah! Otro lenguaje: RPG II. ¡Y qué lenguaje! Cinco clases de planillas a escribir, muchas especializadas en cortes de control para producir reportes. Claro, RPG era la sigla de Report Programming Generator. Solamente con RPG III comenzó a tener características de lenguaje genera, pero me perdí esa versión. Curiosamente, en este siglo actual conocí a un programador RPG III que gracias a eso viajó por más de un continente, teniendo trabajo en eso.

Un día, compré una revista que llegaba a Argentina, la Dr. Dobb’s. ¡Qué excelente revelación! Fue mi primer encuentro con el lenguaje C: ¡se podía escribir en letras minúsculas! (como en Algol y BCPL, que de alguna forma fue un precursor del lenguaje C), podía escribir en cualquier parte (no sólo a partir de tal columna). Soportaba recursión, punteros, alocación dinámica de memoria, una verdadera cosa nueva para alguien que había comenzado con COBOL. Las máquinas IBM no tenían ni noción de memoria dinámica, o de lo que era una pila. Las máquinas tipo DEC y otras fueron los “early adopters” de esas ideas. Había un nuevo (para mí) conjunto de caracteres, ASCII, con todas las letras consecutivas!

Pero mi primer amor verdadero fue Lisp: trabajé con una mínima implementación escrita por Gregory Chaitin (creo que había visitado mi universidad unos años antes), donde cada vervo se expresaba con un sólo caracter. Las variables tenía nombres de un solo caracter. Tenía alguna notación polaca. Chaitin lo había escrito en Fortran, sin recursión, imagino que habrá usado algun arreglo para ir simulando una pila. Un día me senté, y escribí mi propia implementación de esa notación, en lenguaje ensamblador de 8086, recuerdo horas de depuración…. Y sí, ya estaba tocado de la cabeza, en esos tiempos… ;-)

Había comenzado a tener acceso a computadoras personales. Pero antes de las PCs, trabajé con mini computadores, como las Microdata, que corrían con Pick operating system. Pick OS fue escrito como para una máquina virtual en microcódigo, así que podía portarse a cualquier hardware que admitiera la implementación de esa “máquina virtual”. Es una lástima que Dick Pick muriera joven, en los 90s. Su sistema operativo tenía ideas interesantes: memoria, registros, disco, archivos, eran todo lo mismo, sin diferencia. Podía tener un sector en memoria o en disco. Los registros de los procesos en ejecución estaban en sectores, que de nuevo, podían estar en memoria o disco. Un archivo podía comenzar en el sector 3000 o en cualquier otro sector. Los verbos de consola estaban codificados en sectores. Así, si un comando X estaba en el sector 4320, uno podía reescribir ese sector para implementar una nueva versión del comando. No recuerdo los detalles exactos, pero cualquier comando se mapeaba a un sector usando un archivo por comando, donde la primera línea era el sector. Entonces, se podia copiar ese archivo con otro nombre, y teníamos el mismo comando renombrado. Pick OS tenía un lenguaje de shell, y una interesante implementación de Basic, llamada Pick Basic. Fue el primer programa que tuve disponible para mí, en el que pude escribir programas recursivos. Entonces, reescribí mi intérprete Lisp en ese lenguaje, pero como no tenía soporte de punteros o algo parecido, las listas eran strings, y un CAR era una operación para tomar un substring. No había listas con ciclos. Bueno, era lo que había… :-)

Pick Systems tenía una variante de runoff, el primer programa que usé que generaba manuales desde texto, con soporte de tipos de letras. Imprimía esa documentación en  impresoras Printronix, que tenían martillos para plotear puntos en papel.

Con esas impresoras, podía controlar la impresión a nivel de pixel, así que me divertí escribiendo un programa de dibujo: leía de un archivo una especie de lo que hoy llamaría DSL (Domain Specific Languages), dedicado a describir líneas y objetos compuestos, y los ploteaba en 2D/3D, en la Printronix. Me divertia fácil entonces… :-)

Había varias marcas de computadores: Ohio Scientific, Cromemco, Ontel… Recuerdo la Ontel: tenía discos removibles grandes, casi medio metro de ancho, creo. Un día, llevé el disco a un restaurant, y no me dejaron entrar, pensando que era una bomba.

El sistema de archivos de la Ontel era medio “weird”: no había ni siquiera FAT (File Allocation Table). Cada sector tenía un puntero al próximo sector del archivo, así que para ir a tal posición de un archivo, el sistema operativo tenía que recorrer una vez los enlaces, recorrido que luego recordaba. Recuerdo un día, un fin de semana con una entrega el lunes, y mi jefe se equivocó editando sectores, y los enlaces se perdieron. Pasamos una mañana recuperando manualmente los enlaces de los archivos de textos que tenían el código, fue una especie de trabajo de rompecabezas.

Con Ontel se programaba en OPL: Ontel Programming Language, una especie de assembler, una instrucción por línea. Pero tenía un editor de pantalla decente: la primera vez que me senté en una Ontel, no me levanté en un días: imaginen, era la primera computadora que TENIA para mí solo, podía escribir el programa y probarlo ahí mismo!. Luego de la experiencia de las tarjetas perforadas, fue un avance hermoso.

Ohio Scientific tenía una cantidad inmensa de memoria para aquellos tiempos: 64K (creo que el mainframe de mi universidad tenía una capacidad similar). 32K estaban dedicados al intérprete basic. Los otros 32k eran para mi programa. Cada línea tenía un número. Uno escribía la línea 10, luego la 20. Si uno quería agregar más lógica entre las dos, debía usar un número intermedio. Pero contrario a las Ontels, que eran mono usuario, las Ohio soportaban múltiples terminales.

Compilando con esas máquinas era un ejercició de multitasking: mientras compilaba, uno se podía dedicar a otras “tasks”, como hacer café, ir al baño, charlar con las jóvenes recepcionistas de la oficina… ;-) … Compilar podía ser un proceso largo en esas máquinas.

Más máquinas: escribí programas COBOL en cinta, para máquinas NCR. Debía partir el programa en partes, porque el compilador no podía compilar programas grandes. Por aquel entonces, se agregó a COBOL la screen y report sections, pero no recuerdo haberlas usado.

Mi primera computadora personal real fue una IBM. Tenía una sola disketera. Uno tenía que bootear con un diskette, retirarlo, y luego poner un segundo diskette, donde estaba el editor, el edlin en aquellos días. El  GWBasic era el intérprete que usaba. Pero antes de llegar a DOS, programé para CP/M, el bebé de Gary Kildall. No tenía directorios, sólo archivos. Los programas se cargaban en una posición fija de memoria. No había realocación, o direcciones relativas. Los primeros 128 bytes de un programa eran un header dedicado. La ejecución comenzaba en 100h, y el procesador tenía 4 registros. Luego, el Intel 8086 nos trajo AX, AL, AH…. SI, DI eran los source increment, destination increment, que se usaban para movimientos masivos de memoria… DS, CS apuntaban a los segmentos de datos y código, con lo que ahora tenía realocación y direcciones relativas, otro avance.

Recuerdo vagamente haber trabajado algo con CP/M multiusuario. Sí, había una versión con soporte de multiusario. Pero fue tarde para el bueno del CP/M: el DOS había comenzado a dominar el mundo.

No tenía soporte de base de datos en DOS. Entonces, escribí una rutina de manejo de árboles balanceados, invocada desde GWBasic, pero escrita…. en assembler!. Reconozcamos que en esos tiempos, ya merecía medicación… ;-)…. Años después, apareció BTrieve.

Ah! La Int 21h, era la puerta al paraíso del DOS. Para tener compatibilidad hacia atrás con CP/M, la instrucción de la dirección 0 era un jump a la int 21h. El cargador de exes ponía ahí la dirección exacta de esa interrupción. En CP/M, una llamada al sistema operativo era un jump a la dirección 0 del programa en curso. Ahí había un jump al sistema operativo, creo que se usaba el registro C para pasar qué tipo de llamada queríamos.

¿Recuerdan Sidekick? Uno debía reescribir el config.sys, agregar una línea con files=40 y todo andaba.

¿Y el command.com? Residía en memoria. Si era sobreescrito, el sistema operativo lo recargaba. En los sistemas de una disketter que mencioné, eso implicaba a veces, sacar el diskette que uno tenía, y reponer el diskette que tenía el command.com.

¿Y recuerdan el BIOS? Yo trabajé también para IBM Argentina, y tenía acceso a uno de los diez (sí, sólo 10!) BIOS Reference Manual que había disponibles en mi pais. Incluía el listado del código fuente, en assembler. Recuerdo haber paseado por la interrupción del reloj, y haber explorado el código de la interrupción que atendía la presión y liberación de las teclas.

Acostumbraba a leer revistas como Byte, TechJournal, Computer Language, y como mencioné, mi favorita, Dr.Dobb’s. Disfruté leyendo ahí del Small C y su implementación por Cain y luego por Hendrix. Estaba asombrado de otras implementaciones, como los compiladores de C Leo Zorman. Recuerdo avisos en Dr.Dobb’s de la universidad de Vrije University, ofreciendo un cross compiler (supongo que era el trabajo de Tanenbaum) por unos módicos u$s 9999.

Gracias a las máquinas PC, tuve mi primer encuentro real con un sistema tipo Unix: el venerable Xenix de Microsoft, se podía ejecutar en PCs. IBM tenía otra oferta, un AIX, y un PSystem, sistema operativo basado en Pascal. Pero el DOS despegó fuerte y tomó control del mercado.

Un día, descubrí en las oficinas de IBM, a su Global Network, que comunicaba todas las subsidiarias. Uno podía preguntar algo a un grupo de producto, por ejemplo, uno de Australia, via un mensaje electrónico, y tenía una respuesta, posiblemente en el mismo día. Fue mi primer experiencia con ese tipo de comunicación.

Exploré y jugué con el Dialog system: uno de mis primeros trabajos relacionados con la búsqueda en documentos. El Dialog era un sistema en línea, para buscar papers, libros, usando palabras claves. Con un equipo, programamos un sistema similar par un agencia del gobierno de Argentina. Podría considerar un predecesor de Google…. ;-)

Aprendí Smalltalk, en mi tiempo libre. No había clases de Smalltak en mi universidad. Pero sólo podía aprender sin practicar, porque el costo del hardware para correr el entorno gráfico y el costo de los ambientes de Smalltalk, eran no alcanzables para mí. Lo mismo me pasó con Golden Common Lisp, y sistemas expertos: no pude probarlos por falta de recursos, así que seguí escribiendo mis propios intérpretes, que eran muy primitivos.

Bueno, podría seguir escribiendo por días sobre aquellos primeros años. Pero el punto es: la pasé bien, me divertí, fueron años interesantes. El desarrollo de software sigue siendo hoy así, algo fascinante. Lección aprendida: el cambio es la única constante, en esta profesión y arte.

Pero más importante que el software y la tecnología, es otra cosa. Tuve suerte: durante esos años, llenos de actividades, tuve la oportunidad de conocer a gente extraordinaria. La gente ha sido la verdadera ganancia de estos años de profesión. Quiero entonces, hoy, agreceder a todos, a amigos, compañeros desarrolladores, clientes, que me acompañaron en esta larga jornada. Este post es solo un fragmento de mis memorias, enfocado en algunas tecnologías. Pero lo importante estuvo en otra parte: la gente que conocí. ¡Gracias a todos!

Imágenes de

Confessions of an Antediluvian Geek – A personal history of computing
WikiPedia Commons File-Punched_card.jpg
Old Computers Museum
My personal experience with technology, from the early years of computers in the 1970’s to today in 2008

Enlaces relacionados
Historic Documents in Computer Science
http://delicious.com/ajlopez/computerhistory

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 3463. Bookmark the permalink.

3 Responses to Treinta años en desarrollo de software

  1. Wow que cantidad de información, en ocasiones como esta me hubiera gustado nacer unos años antes

  2. Federico says:

    Muy bueno este articulo, me trajo recuerdos. Empece mucho más tarde, a los 16 años, en 1983, mi primer año de curso en informática fue un curso de programación Cobol (sin ver una computadora), primera parte aprender los diagramas de flujo y la segunda codificar los programas en los formularios verdes. Recién a fines de ese año accedi a un computador IBM (el novel sistema 36), donde pude ingresar un programa cobol que resolvia la secuencia de fibonacci. También programe varios años en OPL en una Ontel (el opl ya era un poco más de alto nivel. Encontre el artículo porque esataba buscando algo de información de la ONTEL y del OPL para públicar algo sobre mis inicios, asi como tu artículo.

    Saludos
    Federico (desde Uruguay)

  3. lopez says:

    Gracias Federico!

    Que bueno encontrarse con alguien que programó en OPL de Ontel. Notable!

    Angel “Java” Lopez

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>