Aprender a programar - Recomendaciones

He sido programador de COBOL en el pasado, el último sobre sistemas UNIX DX General con Oracle 8g. Ya have 20 años era algo muy obsoleto, pero se seguía usando en algunos sistemas.

Actualmente sé que queda varios de ellos aún en entornos bancarios.
 
COBOL sigue tan vivo como siempre. Poco a poco va desapareciendo a medida que van desapareciendo los sistemas donde suelen vivir, pero conocer este lenguaje hoy es garantía casi total de conseguir trabajo en horas.

Lo que no entiendo es lo del AS400 / iSeries. No termina de morir, qué asco. :pota
 
Normal, "if it works, do not fix it". A ver quién es el guapo que se atreve a tocar algo que funcione y lo mismo deja de funcionar en un entorno así. Curiosamente lo que lo hizo famoso fue tener un hilo paralelo para gestión de errores, como ocurriría muchos años más tarde con otros lenguajes, tenía gestión de excepciones cuando aún no existían como tal.
 
En banca hay lenguaje para rato, vamos que me muero y sigue ahí seguro.
Se está comenzando a migrar algo y hay variantes y demás pero aprender es tener trabajo asegurado y si te sabes mover bien, dentro de poco se va a ganar mucha pasta.
 
Has de hacerte todo desde cero, es programación estructurada tradicional y secuencial. No existen eventos, todo es secuencial y se parece más al ensamblador de lo que muchos piensan. No puedes escribir en la columna que quieras, los comentarios van en una columna concreta y el código en otra.

Hoy parece mentira que las cosas fueran así, pero es que hace 60 años ya se usaba este lenguaje.... casi nada!!
 
COBOL + CICS + DB2 es una tríada difícil de sustituir en cualquier sector donde un sistema transaccional robusto sea imperativo.

Y sí, lleva muchos, muchos años entre nosotros, más de 60...

uAtWVX7.png


Algunos fabricantes como Microfocus han apostado por evolucionarlo hacia .Net y Java, pero no se trata solo de eliminar el código COBOL, sino de sustituir el sistema transaccional que aporta CICS y la base de datos DB2, que habitualmente reside en un host de IBM del estilo a los sistemas Z.


:ok :ok :ok
 
Micro Focus (ahora OpenText) también ofrece capas de emulación. El usuario conecta a un CICS aparentemente normal y corriente, con el mismo emulador de terminal 3270 de siempre, pero en realidad todo corre en un Linux en lugar de en un Z. Y en lugar de DB2, un Exadata, por ejemplo.

El ahorro en costes es bestial, la robustez -si se planifica bien- es similar (el SLA que se está ofreciendo es el mismo) y la velocidad es mejor.
 
Micro Focus (ahora OpenText) también ofrece capas de emulación. El usuario conecta a un CICS aparentemente normal y corriente, con el mismo emulador de terminal 3270 de siempre, pero en realidad todo corre en un Linux en lugar de en un Z. Y en lugar de DB2, un Exadata, por ejemplo.

El ahorro en costes es bestial, la robustez -si se planifica bien- es similar (el SLA que se está ofreciendo es el mismo) y la velocidad es mejor.

Estoy de acuerdo, pero todo eso sucede en el entorno de los sistemas, y tiene poco que ver con la programación.

Sigue siendo COBOL + CICS + DB2, funcionando en un sistema Power en lugar de un Z.

Con respecto a lo que hablamos en el hilo - el lenguaje de programación - sigue siendo lo mismo.

:ok :ok :ok
 
Por supuesto, pero a medida que se vayan migrando estos sistemas, el COBOL irá perdiendo protagonismo. En otras palabras, es muy raro ver un desarrollo nuevo en COBOL, no tiene mucho sentido en infraestructuras nuevas.

Ahora bien, evolutivos de aplicaciones antiguas que nadie tiene tiempo/valor/presupuesto para decomisarlas seguirán habiendo, así que COBOL sigue siendo un lenguaje con mucha salida profesional (y lo que le queda).
 
Por supuesto, pero a medida que se vayan migrando estos sistemas, el COBOL irá perdiendo protagonismo. En otras palabras, es muy raro ver un desarrollo nuevo en COBOL, no tiene mucho sentido en infraestructuras nuevas.

Ahora bien, evolutivos de aplicaciones antiguas que nadie tiene tiempo/valor/presupuesto para decomisarlas seguirán habiendo, así que COBOL sigue siendo un lenguaje con mucha salida profesional (y lo que le queda).

Desarrollos nuevos como tal hay pero pocos, ten en cuenta que los productos financieros de los bancos evolucionan con el tiempo así que siempre hay que desarrollar programas sobre los que poder hacer lo que se hace habitualmente con esta clase de productos.
No todas las altas de productos bancarios pueden correr sobre la base de software que hay ahora mismo. Mucho sí, se desarrolla con la base existente y se adapta, pero hay cosas que no.
A mayores de todo esto hay que tener en cuenta que por tema trabajo Cobol no hablamos solo de España, que creo que no se ha comentado, sino prácticamente todos los bancos a nivel mundial necesitan de seguir con el mantenimiento, ajuste, modificación y desarrollo para lo que viene.
Es decir que no solo hay y se espera mucho trabajo en España (la media de edad de la actual plantilla está ya para jubilarse), sino que se tendrá la opción de trabajar en cualquier país del mundo, para casi cualquier banco.
Y quien dice banco dice, seguros... etc El entramado alrededor de la banca es gigantesco. Pero Cobol además no se usa solo en este gremio.
 
Desarrollos nuevos como tal hay pero pocos, ten en cuenta que los productos financieros de los bancos evolucionan con el tiempo así que siempre hay que desarrollar programas sobre los que poder hacer lo que se hace habitualmente con esta clase de productos.
No todas las altas de productos bancarios pueden correr sobre la base de software que hay ahora mismo. Mucho sí, se desarrolla con la base existente y se adapta, pero hay cosas que no.
A mayores de todo esto hay que tener en cuenta que por tema trabajo Cobol no hablamos solo de España, que creo que no se ha comentado, sino prácticamente todos los bancos a nivel mundial necesitan de seguir con el mantenimiento, ajuste, modificación y desarrollo para lo que viene.
Es decir que no solo hay y se espera mucho trabajo en España (la media de edad de la actual plantilla está ya para jubilarse), sino que se tendrá la opción de trabajar en cualquier país del mundo, para casi cualquier banco.
Y quien dice banco dice, seguros... etc El entramado alrededor de la banca es gigantesco. Pero Cobol además no se usa solo en este gremio.
Voy a ponerme a estudiar Cobol :D
 
Voy a ponerme a estudiar Cobol :D

Le he pedido a ChatGPT que te eche una mano :cuniao

Lo primero ha sido situarle, para que sepa cuál es su rol en la conversación:

You are an experienced COBOL programmer that gives advice to novel programmers on how to create great programs for business companies, specially from the finance and insurance sector, that use the CICS transactional system and DB2 as the relational database.

Y me ha contestado lo siguiente:

Certainly! COBOL remains a critical language in the finance and insurance sectors, particularly when integrated with systems like CICS and DB2. Here are some pieces of advice for novice COBOL programmers working in these domains:

Understand the Business Domain:

  1. Domain Knowledge:
    • Gain a deep understanding of the finance and insurance domains. Familiarize yourself with the industry-specific terminology, regulations, and business processes.
  2. Data Understanding:
    • Recognize the significance of data in these sectors. Understand the types of data being processed, their relationships, and how they are stored in the DB2 database.

Master COBOL Basics:

  1. COBOL Syntax:
    • Ensure a strong grasp of COBOL syntax, including file handling, data manipulation, and conditional statements.
  2. Modularity:
    • Practice modular programming. Break down your programs into smaller, manageable modules with clear responsibilities.

Leverage CICS Features:

  1. Transaction Design:
    • Understand the transactional nature of CICS. Design your programs with a focus on transactions, ensuring atomicity and consistency in data processing.
  2. Error Handling:
    • Implement robust error-handling mechanisms within your CICS programs. Be mindful of rollback procedures to maintain data integrity.

Database Interaction with DB2:

  1. SQL Proficiency:
    • Master SQL, especially focusing on the subset used with DB2. Understand how to perform queries, updates, and transactions efficiently.
  2. Database Design:
    • Learn the basics of database design. Understand the importance of normalization and how it impacts performance and data integrity.

Performance Optimization:

  1. Indexing:
    • Comprehend the significance of indexes in DB2. Design and use indexes appropriately to enhance query performance.
  2. Batch Processing:
    • While COBOL programs in CICS are typically online, also understand batch processing. Optimize your batch programs to handle large volumes of data efficiently.

Testing and Debugging:

  1. Transaction Testing:
    • Develop comprehensive test cases for CICS transactions. Test not only the normal flow but also edge cases and error scenarios.
  2. Debugging Tools:
    • Familiarize yourself with debugging tools available in your development environment. Efficient debugging is crucial for identifying and fixing issues promptly.

Stay Updated:

  1. Technology Updates:
    • Stay informed about updates in COBOL, CICS, and DB2. Technology evolves, and new features may provide more efficient solutions to common problems.
  2. Security Awareness:
    • Be aware of security concerns in the finance and insurance sectors. Ensure that your programs adhere to security best practices.

Documentation:

  1. Clear Documentation:
    • Document your code thoroughly. This is crucial for maintenance and for colleagues who may need to understand or modify your code in the future.
Remember, programming in the finance and insurance sectors demands precision and reliability. Building a solid foundation in COBOL, CICS, and DB2, along with a keen understanding of the business domain, will help you create programs that meet the high standards required in these industries.


Luego le he pedido que escriba un pequeño programa que haga un cálculo de importe medio de hipoteca y días hasta el vencimiento por sucursal bancaria con este prompt:

Write a small COBOL program that opens a customer mortgages file, read all its records sequentially, get the bank office code and the loan end date and total amount for each mortgage and calculates the average remaining days and amount, classified by bank office code.

Y me ha soltado esto:

Insertar CODE, HTML o PHP:
IDENTIFICATION DIVISION.
PROGRAM-ID. MortgageAnalysis.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CUSTOMER-RECORD.
   05 WS-BANK-OFFICE-CODE   PIC X(4).
   05 WS-LOAN-END-DATE      PIC 9(8).
   05 WS-LOAN-AMOUNT        PIC 9(7)V99.
   05 WS-REMAINING-DAYS     PIC 9(4).
   05 WS-REMAINING-AMOUNT   PIC 9(9)V99.
 
01 WS-TOTAL-DAYS            PIC 9(10) VALUE 0.
01 WS-TOTAL-AMOUNT          PIC 9(11)V99 VALUE 0.

01 WS-COUNTER               PIC 9(3) VALUE 0.

01 WS-AVG-DAYS              PIC 9(5)V99.
01 WS-AVG-AMOUNT            PIC 9(10)V99.

01 WS-BANK-OFFICE-CODE-PREV PIC X(4).

01 FILE-STATUS              PIC X(2).

FILE SECTION.
FD CUSTOMER-MORTGAGES-FILE.
01 CUSTOMER-RECORD.
   05 CM-BANK-OFFICE-CODE  PIC X(4).
   05 CM-LOAN-END-DATE     PIC 9(8).
   05 CM-LOAN-AMOUNT       PIC 9(7)V99.

01 FILE-STATUS-RECORD.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILE-STATUS-CODE    PIC XX.

PROCEDURE DIVISION.
MAIN-PROCESS.
   OPEN INPUT CUSTOMER-MORTGAGES-FILE.

   PERFORM READ-RECORD UNTIL FILE-STATUS-CODE = '10'.

   CLOSE CUSTOMER-MORTGAGES-FILE.

   DISPLAY 'Average Remaining Days: ' WS-AVG-DAYS.
   DISPLAY 'Average Remaining Amount: ' WS-AVG-AMOUNT.

   STOP RUN.

READ-RECORD.
   READ CUSTOMER-MORTGAGES-FILE
       AT END SET FILE-STATUS-CODE TO '10'
       NOT AT END PERFORM PROCESS-RECORD.

PROCESS-RECORD.
   ADD 1 TO WS-COUNTER.
 
   MOVE CM-BANK-OFFICE-CODE TO WS-BANK-OFFICE-CODE.
   MOVE CM-LOAN-END-DATE TO WS-LOAN-END-DATE.
   MOVE CM-LOAN-AMOUNT TO WS-LOAN-AMOUNT.

   IF WS-BANK-OFFICE-CODE NOT EQUAL WS-BANK-OFFICE-CODE-PREV
       AND WS-COUNTER > 1
   THEN
       PERFORM CALCULATE-AVERAGES.

   MOVE WS-BANK-OFFICE-CODE TO WS-BANK-OFFICE-CODE-PREV.

   MOVE WS-LOAN-END-DATE TO WS-REMAINING-DAYS.
   COMPUTE WS-REMAINING-DAYS = FUNCTION INTEGER-OF-DATE - WS-REMAINING-DAYS.

   ADD WS-REMAINING-DAYS TO WS-TOTAL-DAYS.

   ADD WS-LOAN-AMOUNT TO WS-TOTAL-AMOUNT.

   PERFORM READ-RECORD.

CALCULATE-AVERAGES.
   DIVIDE WS-TOTAL-DAYS BY WS-COUNTER GIVING WS-AVG-DAYS.
   DIVIDE WS-TOTAL-AMOUNT BY WS-COUNTER GIVING WS-AVG-AMOUNT.

   DISPLAY 'Bank Office Code: ' WS-BANK-OFFICE-CODE-PREV.
   DISPLAY 'Average Remaining Days: ' WS-AVG-DAYS.
   DISPLAY 'Average Remaining Amount: ' WS-AVG-AMOUNT.

   MOVE ZEROS TO WS-TOTAL-DAYS WS-TOTAL-AMOUNT WS-COUNTER.

   EXIT.

:ok:ok:ok
 
Hace más de veinte años que vi el primer Z de mi vida, plantado en la sala fría cual monolito de 2001. Echa cuentas… :mutriste
 
Le he pedido a ChatGPT que te eche una mano :cuniao

Lo primero ha sido situarle, para que sepa cuál es su rol en la conversación:

You are an experienced COBOL programmer that gives advice to novel programmers on how to create great programs for business companies, specially from the finance and insurance sector, that use the CICS transactional system and DB2 as the relational database.

Y me ha contestado lo siguiente:

Certainly! COBOL remains a critical language in the finance and insurance sectors, particularly when integrated with systems like CICS and DB2. Here are some pieces of advice for novice COBOL programmers working in these domains:

Understand the Business Domain:

  1. Domain Knowledge:
    • Gain a deep understanding of the finance and insurance domains. Familiarize yourself with the industry-specific terminology, regulations, and business processes.
  2. Data Understanding:
    • Recognize the significance of data in these sectors. Understand the types of data being processed, their relationships, and how they are stored in the DB2 database.

Master COBOL Basics:

  1. COBOL Syntax:
    • Ensure a strong grasp of COBOL syntax, including file handling, data manipulation, and conditional statements.
  2. Modularity:
    • Practice modular programming. Break down your programs into smaller, manageable modules with clear responsibilities.

Leverage CICS Features:

  1. Transaction Design:
    • Understand the transactional nature of CICS. Design your programs with a focus on transactions, ensuring atomicity and consistency in data processing.
  2. Error Handling:
    • Implement robust error-handling mechanisms within your CICS programs. Be mindful of rollback procedures to maintain data integrity.

Database Interaction with DB2:

  1. SQL Proficiency:
    • Master SQL, especially focusing on the subset used with DB2. Understand how to perform queries, updates, and transactions efficiently.
  2. Database Design:
    • Learn the basics of database design. Understand the importance of normalization and how it impacts performance and data integrity.

Performance Optimization:

  1. Indexing:
    • Comprehend the significance of indexes in DB2. Design and use indexes appropriately to enhance query performance.
  2. Batch Processing:
    • While COBOL programs in CICS are typically online, also understand batch processing. Optimize your batch programs to handle large volumes of data efficiently.

Testing and Debugging:

  1. Transaction Testing:
    • Develop comprehensive test cases for CICS transactions. Test not only the normal flow but also edge cases and error scenarios.
  2. Debugging Tools:
    • Familiarize yourself with debugging tools available in your development environment. Efficient debugging is crucial for identifying and fixing issues promptly.

Stay Updated:

  1. Technology Updates:
    • Stay informed about updates in COBOL, CICS, and DB2. Technology evolves, and new features may provide more efficient solutions to common problems.
  2. Security Awareness:
    • Be aware of security concerns in the finance and insurance sectors. Ensure that your programs adhere to security best practices.

Documentation:

  1. Clear Documentation:
    • Document your code thoroughly. This is crucial for maintenance and for colleagues who may need to understand or modify your code in the future.
Remember, programming in the finance and insurance sectors demands precision and reliability. Building a solid foundation in COBOL, CICS, and DB2, along with a keen understanding of the business domain, will help you create programs that meet the high standards required in these industries.


Luego le he pedido que escriba un pequeño programa que haga un cálculo de importe medio de hipoteca y días hasta el vencimiento por sucursal bancaria con este prompt:

Write a small COBOL program that opens a customer mortgages file, read all its records sequentially, get the bank office code and the loan end date and total amount for each mortgage and calculates the average remaining days and amount, classified by bank office code.

Y me ha soltado esto:

Insertar CODE, HTML o PHP:
IDENTIFICATION DIVISION.
PROGRAM-ID. MortgageAnalysis.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CUSTOMER-RECORD.
   05 WS-BANK-OFFICE-CODE   PIC X(4).
   05 WS-LOAN-END-DATE      PIC 9(8).
   05 WS-LOAN-AMOUNT        PIC 9(7)V99.
   05 WS-REMAINING-DAYS     PIC 9(4).
   05 WS-REMAINING-AMOUNT   PIC 9(9)V99.
 
01 WS-TOTAL-DAYS            PIC 9(10) VALUE 0.
01 WS-TOTAL-AMOUNT          PIC 9(11)V99 VALUE 0.

01 WS-COUNTER               PIC 9(3) VALUE 0.

01 WS-AVG-DAYS              PIC 9(5)V99.
01 WS-AVG-AMOUNT            PIC 9(10)V99.

01 WS-BANK-OFFICE-CODE-PREV PIC X(4).

01 FILE-STATUS              PIC X(2).

FILE SECTION.
FD CUSTOMER-MORTGAGES-FILE.
01 CUSTOMER-RECORD.
   05 CM-BANK-OFFICE-CODE  PIC X(4).
   05 CM-LOAN-END-DATE     PIC 9(8).
   05 CM-LOAN-AMOUNT       PIC 9(7)V99.

01 FILE-STATUS-RECORD.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILLER               PIC X.
   05 FILE-STATUS-CODE    PIC XX.

PROCEDURE DIVISION.
MAIN-PROCESS.
   OPEN INPUT CUSTOMER-MORTGAGES-FILE.

   PERFORM READ-RECORD UNTIL FILE-STATUS-CODE = '10'.

   CLOSE CUSTOMER-MORTGAGES-FILE.

   DISPLAY 'Average Remaining Days: ' WS-AVG-DAYS.
   DISPLAY 'Average Remaining Amount: ' WS-AVG-AMOUNT.

   STOP RUN.

READ-RECORD.
   READ CUSTOMER-MORTGAGES-FILE
       AT END SET FILE-STATUS-CODE TO '10'
       NOT AT END PERFORM PROCESS-RECORD.

PROCESS-RECORD.
   ADD 1 TO WS-COUNTER.
 
   MOVE CM-BANK-OFFICE-CODE TO WS-BANK-OFFICE-CODE.
   MOVE CM-LOAN-END-DATE TO WS-LOAN-END-DATE.
   MOVE CM-LOAN-AMOUNT TO WS-LOAN-AMOUNT.

   IF WS-BANK-OFFICE-CODE NOT EQUAL WS-BANK-OFFICE-CODE-PREV
       AND WS-COUNTER > 1
   THEN
       PERFORM CALCULATE-AVERAGES.

   MOVE WS-BANK-OFFICE-CODE TO WS-BANK-OFFICE-CODE-PREV.

   MOVE WS-LOAN-END-DATE TO WS-REMAINING-DAYS.
   COMPUTE WS-REMAINING-DAYS = FUNCTION INTEGER-OF-DATE - WS-REMAINING-DAYS.

   ADD WS-REMAINING-DAYS TO WS-TOTAL-DAYS.

   ADD WS-LOAN-AMOUNT TO WS-TOTAL-AMOUNT.

   PERFORM READ-RECORD.

CALCULATE-AVERAGES.
   DIVIDE WS-TOTAL-DAYS BY WS-COUNTER GIVING WS-AVG-DAYS.
   DIVIDE WS-TOTAL-AMOUNT BY WS-COUNTER GIVING WS-AVG-AMOUNT.

   DISPLAY 'Bank Office Code: ' WS-BANK-OFFICE-CODE-PREV.
   DISPLAY 'Average Remaining Days: ' WS-AVG-DAYS.
   DISPLAY 'Average Remaining Amount: ' WS-AVG-AMOUNT.

   MOVE ZEROS TO WS-TOTAL-DAYS WS-TOTAL-AMOUNT WS-COUNTER.

   EXIT.

:ok:ok:ok
Me he enterado de todo lo que hace el programa!

Es bastante facil de leer la verdad aunque seguro que con los "-" y los "." mas de un programador se habra tirado de los pelos al ver que no le funcionaba el codigo en algun momento.

Los numeros y el PIC ni idea 😄 pero me encanta lo del STOP RUN.

Me recuerda un monton a SQL.

(Tiene pinta de ser mas facil que el Javascript que estoy usando en la universidad para el modulo de NodeJS!)😄
 
@DeBilbao vi ese vídeo de Linus, la verdad es que me sorprendió ver algo así en su canal. Muy interesante, por cierto. Esos cacharros por dentro son auténtico IT Porn. De vez en cuando veo vídeos de "chatarreros" que se dedican a recuperar máquinas antiguas de todo tipo, algunas las restauran y las ponen en uso y otras las usan para piezas. Es una pasada ver las tripas de estas bestias y de otras más antiguas como las SGI, Digital, Sun... Nostalgia IT en estado puro.

En cuanto a la evolución, la verdad es que han tenido muchas novedades muy interesantes, pero trabajar con ellos sigue siendo sufrir el mismo interfaz prehistórico de siempre. Teletexto, como lo llamamos despectivamente los que tendemos más a los Linux. :juas
 
Echamos pestes de COBOL, pero el que inventó del YAML merece la muerte más lenta y dolorosa imaginada por el ser humano. Porque 60 años después, tenemos un lenguaje que se usa para infinidad de cosas y resulta que hereda lo peor de cada casa. Al menos en la interfaz prehistórica de COBOL, ver en qué columna va cada línea era fácil. Ahora acabas viendo 10 líneas verticales que te dan mareos para saber dónde estás. Que a estas alturas haya que estar usando el texto bien indentado en columnas porque si te falta un espacio ya no lo entiende, como digo, merece que su creador sea miserablemente tratado.

Y dicho esto voy a preparar una entrevista con otra empresa que tengo en media hora y otra con un cliente por la tarde.
 
La rigidez de las columnas en COBOL es matadora. Ahora programa usando como editor el VI, que es lo único que me dejaban a mí en los General.
 
Arriba Pie