Comment comprendre un programme COBOL inconnu
La méthode ci-dessous suit huit étapes, dans un ordre qui n'est pas celui du fichier.
Elle part des données plutôt que des instructions, parce que dans un programme COBOL
les noms de fichiers, de tables et de champs portent le métier, alors que la
PROCEDURE DIVISION ne porte que la mécanique.
- Situer le programme avant de l'ouvrir
- Lire l'en-tête sans lui faire confiance
- Commencer par les entrées et les sorties
- Relever les structures de données
- Cartographier les paragraphes avant de lire le code
- Isoler les règles métier
- Chercher les valeurs codées en dur
- Écrire ce qu'on n'a pas pu déterminer
Situer le programme avant de l'ouvrir
Un programme COBOL ne s'exécute jamais seul : il est lancé par un JCL, appelé par un autre programme, ou déclenché par une transaction. Identifier qui l'appelle en dit souvent plus long sur sa fonction que ses trois cents premières lignes.
Trois questions avant d'ouvrir le source. Est-il en batch ou en transactionnel ? S'il est en
batch, quel JCL l'exécute, à quelle étape, et qu'est-ce qui tourne avant et après lui dans
la même chaîne ? S'il est appelé par un autre programme, que reçoit-il en
LINKAGE SECTION ?
Cette dernière question est décisive. La LINKAGE SECTION est le contrat
d'interface du programme : elle dit ce qu'il attend, ce qu'il renvoie, et donc à quoi il
sert. Un programme dont la linkage contient un code retour et un message est presque
toujours un module de validation ou de calcul, pas un traitement de bout en bout.
Lire l'en-tête sans lui faire confiance
Les commentaires de l'IDENTIFICATION DIVISION décrivent l'intention d'origine,
pas le comportement actuel. Sur un programme modifié pendant vingt ans, ils documentent
souvent une version qui n'existe plus.
Ce qui reste utile : le nom du programme, la date de création, et surtout l'historique des modifications quand il est tenu. Une ligne de commentaire datée près d'un bloc de code indique presque toujours une exception métier ajoutée après coup — c'est-à-dire exactement le genre de règle qui n'est écrite nulle part ailleurs.
Traitez tout commentaire comme une hypothèse à vérifier dans le code. Quand un commentaire contredit ce que fait l'instruction en dessous, l'écart lui-même est une information : quelqu'un a modifié le code sans mettre à jour la documentation, et d'autres personnes ont pu s'y fier depuis.
Commencer par les entrées et les sorties
Avant de lire une seule instruction de traitement, listez tout ce que le programme lit et tout ce qu'il écrit. Les noms de fichiers physiques et de tables sont rédigés dans le vocabulaire de l'entreprise, alors que les variables de travail sont rédigées dans celui du développeur.
Quatre endroits à relever, dans cet ordre :
SELECT … ASSIGN TO …dans laFILE-CONTROL: le lien entre le nom logique utilisé dans le code et le fichier réelFDdans laFILE SECTION: la structure de chaque enregistrementEXEC SQL: les tables lues, insérées, modifiées ou supprimées, et les curseurs déclarésOPEN/READ/WRITE/REWRITEdans laPROCEDURE DIVISION: le sens réel de chaque flux
Un détail qui fait gagner du temps : un fichier ouvert en I-O plutôt qu'en
INPUT signale un programme qui modifie des données existantes, donc un
programme dont une erreur ne se rattrape pas simplement en relançant.
Ici, trois informations en cinq lignes : la donnée manipulée est le client, l'accès se fait par clé, et le programme surveille le statut de chaque opération — signe d'un code défensif, donc probablement critique.
Relever les structures de données
Les COPYBOOKS et les niveaux 01 de la WORKING-STORAGE SECTION décrivent le
modèle de données du traitement. Un COPYBOOK partagé est aussi le principal vecteur d'impact :
le modifier affecte tous les programmes qui l'incluent, souvent bien plus qu'on ne l'imagine.
Trois éléments à ne pas manquer dans la DATA DIVISION :
- Les
COPY: notez chaque copybook, il faudra les récupérer pour comprendre les champs - Les niveaux 88 : ce sont des noms de conditions, et donc du vocabulaire métier directement exploitable —
88 CLIENT-INACTIF VALUE "I" "F"vous apprend une règle sans lire une ligne de traitement - Les
REDEFINES: le même emplacement mémoire interprété de deux façons, souvent le signe d'un champ dont le sens dépend d'un contexte non documenté
Un PIC S9(7)V99 COMP-3 n'est pas un simple nombre : le V place
une virgule implicite qui n'existe pas en mémoire, et COMP-3 stocke la valeur
en décimal condensé. Se tromper sur ces deux points fausse toute interprétation d'un
montant, et c'est une des erreurs les plus fréquentes lors d'une reprise ou d'une migration.
Cartographier les paragraphes avant de lire le code
Relevez d'abord la liste des paragraphes et les PERFORM qui les relient, sans
lire leur contenu. Cette carte tient sur une page et donne la structure du traitement en
quelques minutes, là où une lecture linéaire prend des heures et fait perdre le fil.
Concrètement : notez chaque nom de paragraphe, puis pour chacun quels autres paragraphes il appelle. Vous obtenez un arbre. Le paragraphe racine — celui que personne n'appelle — est le point d'entrée. Les feuilles sont les traitements élémentaires. Les paragraphes appelés depuis plusieurs endroits sont les plus sensibles : ce sont eux qu'une modification impacte le plus largement.
Les noms de paragraphes en COBOL sont souvent numérotés par ordre d'exécution
(1000-INIT, 2000-TRAITEMENT, 9000-FIN). Quand la
numérotation est respectée, elle donne gratuitement la séquence. Quand elle ne l'est plus,
c'est le premier indice qu'on est devant un programme qui a beaucoup évolué.
GO TO rompt le flux structuré et rend l'arbre partiellement faux. Repérez-les
tôt : un programme qui en contient beaucoup ne peut pas être compris par sa seule structure
d'appels, il faut suivre le fil d'exécution.
ALTER est pire : il modifie la cible d'un GO TO pendant
l'exécution. La destination réelle n'est alors pas déterminable par lecture statique.
C'est rare et obsolète, mais on en trouve encore, et il faut le signaler explicitement
plutôt que de laisser croire que le chemin est connu.
Isoler les règles métier
Les règles métier d'un programme COBOL se concentrent dans trois types d'instructions :
les conditions (IF, EVALUATE), les calculs
(COMPUTE, ADD, MULTIPLY) et les codes retour.
Tout le reste est de la plomberie : ouverture de fichiers, boucles de lecture, déplacements
de champs.
La bonne unité de travail n'est pas l'instruction mais le bloc : une condition et le calcul qu'elle gouverne forment une règle. Pour chaque règle trouvée, notez systématiquement quatre choses — l'énoncé en français, l'emplacement exact, la donnée d'entrée qui la déclenche, et l'effet observable.
Règle : la prime est majorée de 10 % au-delà de dix ans d'ancienneté. Deux questions restent ouvertes, et il faut les écrire plutôt que de les combler : l'ancienneté est-elle exprimée en années révolues, et pourquoi 10 % — texte réglementaire, accord d'entreprise, ou décision dont plus personne n'a la trace ?
Les codes retour méritent une attention particulière. Un MOVE 04 TO RETURN-CODE
en fin de traitement ne dit rien par lui-même, mais le JCL appelant, lui, teste cette valeur
pour décider si l'étape suivante s'exécute. La règle métier est donc répartie entre deux
fichiers, et elle est invisible si on ne lit que le COBOL.
Chercher les valeurs codées en dur
Tout littéral numérique dans la PROCEDURE DIVISION est une décision métier
figée dans le code. Un taux, un seuil, un plafond, une date pivot : ce sont les éléments
les plus susceptibles de devoir changer, et les plus difficiles à retrouver ensuite.
Où regarder : les clauses VALUE de la WORKING-STORAGE, les
littéraux dans les COMPUTE et les IF, et les tables internes
définies avec OCCURS et remplies par des MOVE successifs — un
barème entier peut y être dissimulé.
Pour chaque valeur trouvée, la question utile n'est pas « que vaut-elle » mais « qui décide de la changer et selon quelle source ». C'est la réponse à cette question qui manque presque toujours, et c'est elle qui bloque le jour où le taux évolue.
Écrire ce qu'on n'a pas pu déterminer
La dernière étape est celle qu'on saute, et c'est la plus utile. Une documentation qui délimite honnêtement ses angles morts vaut mieux qu'une documentation complète en apparence, parce qu'elle indique où il reste dangereux de modifier.
Quatre catégories à lister explicitement :
- Les COPYBOOKS référencés mais absents des sources fournies
- Les
CALLdont la cible est une variable, donc non résolus statiquement - Les valeurs en dur dont l'origine métier est inconnue
- Les dépendances hors code : tables de paramétrage, définitions de transactions, conventions d'exploitation
Pour chacune, notez qui pourrait répondre. C'est ce croisement — la question ouverte et la personne capable d'y répondre — qui mesure réellement la fragilité d'un système, bien plus que le nombre de lignes ou l'âge du code.
- Qui appelle ce programme, et que reçoit-il en entrée
- Quels fichiers et quelles tables il lit, lesquels il modifie
- Quels COPYBOOKS il inclut, lesquels manquent
- L'arbre des paragraphes, et les
GO TOqui l'invalident - Les règles métier, chacune avec son emplacement exact
- Les valeurs en dur, et l'origine de chacune
- Les questions ouvertes, et qui peut y répondre
Combien de temps cela prend-il ?
Sur un programme de deux à trois mille lignes, avec ses COPYBOOKS disponibles, comptez une demi-journée à une journée pour un développeur qui connaît le COBOL mais pas l'application. L'essentiel du temps ne passe pas dans la lecture : il passe à retrouver les fichiers manquants et à identifier qui peut confirmer les règles.
C'est précisément là qu'un diagnostic externe fait gagner du temps — pas en lisant plus vite, mais en produisant d'emblée la liste des questions à poser et en rattachant chaque conclusion à sa preuve dans le code.