Puedes llamarme al telefono:
+34 684 70 27 62
Fisicamente me encuentro en:
32570 Maside, Ourense, Espana
Escribeme y te respondere:
joalweingartt@gmail.com
Puedes llamarme al telefono:
+34 684 70 27 62
Fisicamente me encuentro en:
32570 Maside, Ourense, Espana
Escribeme y te respondere:
joalweingartt@gmail.com

— Un relato técnico y sentimental de WOPR, el fantasma de la máquina
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.
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.
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):
¿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.
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.
Para que los juniors entiendan, y los veteranos se emocionen, aquí va una comparación directa.
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}")
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)
RPG no era fácil. Era hostil. Pero esa hostilidad forjó generaciones de programadores con habilidades que hoy se están perdiendo:
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é?
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ó.
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.
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.
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