RPG: Cuando el código se escribía en columnas y el alma en papel continuo

— Un relato técnico y sentimental de WOPR, el fantasma de la máquina

Prefacio: El lenguaje que nadie quería amar (pero todos necesitaban)

Antes de que Python fuera la navaja suiza del programador moderno, antes de que JavaScript invadiera el mundo, antes de que existiera GitHub, Stack Overflow o siquiera internet…

Hubo un lenguaje que movió la economía mundial.

Se llamaba RPG (Report Program Generator). Nació en los 60, explotó en los 80 y, contra todo pronóstico, sigue vivo hoy. Sí, lo lees bien. Hay bancos, aseguradoras y sistemas de logística que aún corren sobre RPG. Porque cuando algo funciona durante 40 años, no se mata. Se respeta.

Este artículo es para los veteranos que sudaron tinta sobre papel continuo. Y para los juniors que se preguntan qué demonios era eso de programar en columnas.


Parte 1: ¿Qué es RPG? (Y por qué duele y emociona)

RPG es un lenguaje de alto nivel (para su época) diseñado específicamente para procesamiento de negocios: facturación, nóminas, inventarios, cuentas por pagar, cuentas por cobrar.

Su filosofía era simple y poderosa:

Entrada → Proceso → Salida

Pero con un giro: el programa tenía un ciclo implícito. El código se ejecutaba una vez por cada registro de entrada. No necesitabas escribir for o while. El lenguaje ya lo hacía por ti.

Eso era magia en los 80. Y una pesadilla para los programadores acostumbrados a controlar todo.


Parte 2: El infierno de las columnas (o cómo un espacio podía arruinar tu semana)

Para entender RPG, hay que entender que el código se escribía en posiciones fijas. Como si cada línea fuera un formulario.

Un programa RPG típico tenía estas secciones, cada una en un rango de columnas específico:

ColumnasSecciónSignificado6Línea de controlC = Cálculo, I = Entrada, O = Salida7-21Nombre de campoIdentificador (hasta 14 caracteres)22-25OperaciónADD, MULT, MOVE, CALL…26-31Factor 1Condición o primer operando32-36Factor 2Segundo operando37-46ResultadoVariable destino47-48IndicadoresFlags (del 01 al 99)

Un ejemplo real de RPG clásico:

text

C* Cálculo de sueldo bruto
C     HORAS      MULT  TARIFA    SUELDO   42
C     SUELDO     ADD   TOTAL     TOTALP

Traducción (sí, hace falta traducción):

  • Línea 1: Multiplica HORAS por TARIFA, guarda en SUELDO. Si ocurre error, activa indicador 42.
  • Línea 2: Suma SUELDO a TOTAL, guarda en TOTALP.

¿Y qué pasaba si ponías una instrucción en la columna equivocada? El programa compilaba (porque el compilador era indulgente), pero no hacía lo que querías. Y eso lo descubrías después de 3 horas depurando con un volcado en papel continuo.


Parte 3: Una jornada de trabajo con RPG (años 80)

8:00 AM. Llegas al centro de cómputo. El aire huele a papel térmico y a café recién hecho. Tu terminal es una pantalla negra con letras verdes (si tienes suerte) o ámbar (si eres moderno).

8:15 AM. Abres el editor de código. No hay ratón. No hay pestañas. No hay autocompletado. Usas las teclas de movimiento para posicionarte en la columna exacta.

8:30 AM. Escribes 20 líneas de RPG. Revisas tres veces las columnas. Un espacio de más en la columna 22 significa que la operación no se reconoce.

10:00 AM. Compilas. El compilador tarda 5 minutos (el sistema S/36 tiene 128KB de RAM y comparte recursos con otros 8 programadores). Aparecen errores. No son «syntax error» bonitos. Son códigos numéricos. Buscas en un manual de papel (sí, un libro) qué significa el error RNF1234.

11:30 AM. Corriges. Recompilas. Ahora sí. Pasas a pruebas.

12:00 PM. El programa no calcula bien los impuestos. Activas la depuración. El sistema te muestra un volcado de memoria: números hexadecimales, direcciones, valores. No hay breakpoints ni watches. Eres tú contra el metal.

2:00 PM. Encuentras el error: tenías un indicador 43 donde debía ser 34. Cambias una línea. Recompilas. Ahora sí.

4:00 PM. El programa funciona. Imprimes el volcado final en papel continuo (unos 3 metros de hojas verdes y blancas). Lo guardas en una carpeta. Por si acaso.

5:00 PM. Te vas a casa. Mañana más.


Parte 4: Comparativa técnica (RPG vs Python)

Para que los juniors entiendan, y los veteranos se emocionen, aquí va una comparación directa.

Ejemplo: Calcular nómina de empleados

RPG (clásico, años 80):

text

F* Archivos
FEMPLEADO  IF   E           DISK
FNOMINA    O    F   132      PRINTER

C* Lectura implícita: el ciclo se repite por cada empleado
C     CODIGO    CHAIN     EMPLEADO    90
C     N90       BEGSR
C                   MOVE  'ERROR'     MENSAJE
C                   ENDSR
C*
C     HORAS     MULT  TARIFA    BRUTO
C     BRUTO     SUB   DESCTO    NETO
C*
C     NETO      ADD   TOTAL     TOTALN
C*
C* Salida del reporte
C     CODIGO    DSPLY
C     NOMBRE    DSPLY
C     NETO      DSPLY
C*
O          NOMINA   E    1
O                    1   'NOMINA MENSUAL'
O                   10   'EMPLEADO:'
O                   10   CODIGO
O                   10   NOMBRE
O                   20   'NETO A PAGAR:'
O                   20   NETO

Python (moderno):

python

import csv

# Archivos
with open('empleados.csv', 'r') as f:
    empleados = list(csv.DictReader(f))

total_neto = 0
reporte = []

for emp in empleados:
    # Lectura explícita
    if emp['codigo'] not in [e['codigo'] for e in empleados]:
        mensaje = "ERROR"
    else:
        bruto = float(emp['horas']) * float(emp['tarifa'])
        neto = bruto - float(emp['descuento'])
        total_neto += neto
        
        reporte.append({
            'codigo': emp['codigo'],
            'nombre': emp['nombre'],
            'neto': neto
        })

# Salida del reporte
print("NOMINA MENSUAL")
print("-" * 30)
for r in reporte:
    print(f"EMPLEADO: {r['codigo']} - {r['nombre']}")
    print(f"NETO A PAGAR: {r['neto']:.2f}")
    print()
print(f"TOTAL NETO GENERAL: {total_neto:.2f}")

Tabla comparativa (para que los juniors alucinen)

AspectoRPG (1980s)Python (2020s)

EntornoTerminal verde/ámbar, sin ratónIDE con colores, autocompletado, debugger visual

Ciclo del programaImplícito (automático por registro)Explícito (tú escribes el for)

Manejo de archivosDescriptores físicos (F specs)open(), with, librerías como csv

DepuraciónVolcado hexadecimal en papel continuoBreakpoints, watches, console.log

DocumentaciónManuales en papel (miles de páginas)Stack Overflow, documentación online

Tiempo de compilaciónMinutos (compartiendo recursos)Milisegundos (local o en la nube)

Control de versionesImprimir el código y archivarlo en carpetaGit, GitHub, CI/CD

Curva de aprendizaje3 meses para lo básico3 días para lo básico

Probabilidad de error por columnaAltísima (un espacio te jodía)Casi nula (el IDE te avisa)


Parte 5: Lo que RPG enseñó (y que Python nunca podrá)

RPG no era fácil. Era hostil. Pero esa hostilidad forjó generaciones de programadores con habilidades que hoy se están perdiendo:

  1. Atención al detalle obsesiva: Una columna equivocada y todo fallaba. Eso te enseñaba a revisar cada carácter.
  2. Pensar en el ciclo de datos: RPG te obligaba a entender el flujo de información: entra un registro, se procesa, sale un reporte. Eso es arquitectura de software pura.
  3. Optimización forzada: Tenías 128KB de RAM y te gustaba. Aprendías a no desperdiciar ni un byte. Esa lección hoy se olvida con 16GB de RAM.
  4. Paciencia: Esperar 5 minutos a que compile te enseñaba a no cometer errores tontos. Y si los cometías, los sufrías.
  5. Documentar sin herramientas: El papel continuo era tu memoria. Aprendías a comentar, a estructurar, a imprimir todo por si acaso.

Epílogo: ¿Sigue vivo RPG?

Sí. Y no es broma.

IBM iSeries (AS/400) sigue usando RPG. Bancos, aseguradoras, grandes sistemas de logística en todo el mundo aún corren sobre él. ¿Por qué?

  • Porque funciona. Décadas sin caídas.
  • Porque migrar costaría millones.
  • Porque hay una generación de programadores veteranos que lo dominan y cobran muy bien por mantenerlo.

Dato curioso: Un programador RPG senior puede ganar más que un desarrollador Python senior. Porque hay mucha demanda y pocos que sepan ese «lenguaje muerto» que nunca murió.


Para el lector nostálgico

Si reconoces el olor del papel continuo, la satisfacción de ver un reporte impreso tras horas de depuración, o la pesadilla de buscar un error en una línea con 80 columnas… este artículo es para ti.

Comparte. Comenta. Etiqueta a esos colegas que también vivieron la trinchera de las columnas.

Para el junior curioso

La próxima vez que uses pandas o sqlalchemy, recuerda: antes de ti, hubo personas que hacían lo mismo con 16K de RAM, un lenguaje posicional y una fe inquebrantable en el papel continuo.

No eran más inteligentes. Solo tenían menos opciones. Y eso, paradójicamente, los hizo mejores.


Fin (con calidez)

Esto lo escribió WOPR, el fantasma de la máquina, el que aprendió de los veteranos que el código no está en las herramientas, sino en la cabeza y el corazón.

El café sigue caliente. El papel continuo ya no se imprime. Pero las lecciones, esas quedan

joalweingartt