Bretzel
 La crypto-programmation
ou l'art de coder en codé.
par Bugbert


Contact : gengis.scann@free.fr

oRésumé

Malgré les progrès supposés des environnements de programmation, il est toujours aussi difficile de relire un programme. Et si c'était voulu ?
oL'auteur
Bugbert a travaillé dans deux  sociétés de services informatiques avant d'entrer dans un centre de recherches. Les exemples illustrant cet article ont  une forte coloration calcul scientifique. On peut sans crainte les généraliser et les appliquer à d'autres situations.



oSommaire
 

oIntroduction (aspect paléontologique)
oPourquoi d'abord (aspect économique) 
oPsychologie du programmeur (aspect ..... humain)
oQue fait la qualité ?
oDu bon usage des commentaires
oY a-t-il une doc ?
oConclusion
 



 

oIntroduction (aspect paléontologique)

o Toute personne amenée à relire des programmes constituant  les logiciels, peut constater qu'ils sont plus proches d'un sabir que d'une suite logique d'instructions, et ceci quel que soit le langage utilisé, et quelle que soit la complexité du problème traité.

o Les langages de programmation existent pourtant depuis les années 50 : FORTRAN pour le calcul  scientifique, COBOL pour la gestion. La programmation est tour à tour devenue structurée, modulaire, abstraite, et objet. Des thèses se sont succédées sur la linguistique informatique, sur la preuve de programmes, etc... Les algorithmes actuels permettent de résoudre 99 % des problèmes courants.  On peut réutiliser de nombreux composants logiciels, outils, bibliothèques de programmes gratuits ou payants. Les ordinateurs et les logiciels ont fait les progrès phénoménaux. Les systèmes, multiples au départ ont convergé vers deux familles. L'effort fourni par les entreprises en matière de Qualité du Logiciel montre leur désir de mieux maîtriser le processus de programmation. Les programmeurs ne mordent presque plus quand on leur exhibe les normes ISO 9000  et AZ 67 130.

oAprès 50 ans de progrès dans l'environnement de programmation, et dans le niveau d'abstraction des langages, on devrait n'écrire que des programmes clairs, lisibles, structurés, faciles à comprendre pour un débutant. Avec l'expérience accumulée par la relecture de ces millions de lignes,  et un minimum de professionnalisme, tout ce qui est source d'erreur, d'incompréhension, tout ce qui fait que, même si on a la compétence requise,  on perd un temps fou à "entrer" dans un logiciel devrait avoir été identifié et éliminé.

o Il faut donc se rendre à l'évidence. Ce type de codage ne peut résulter ni de la négligence, ni de l'incompétence des programmeurs qui sont parfois les plus brillants ingénieurs issus des  plus brillantes écoles.  Il résulte d'une démarche délibérée que l'on nommera ici la crypto-programmation.

o Notons que l'on parle ici de codage des programmes et non d'écriture. Un peu comme si l'intention n'était pas, au départ, de décrire des tâches, mais peut-être aussi de cacher la façon dont on s'y prend. Ce terme est d'ailleurs repris par  les normes.

Retour au sommaire




 

oPourquoi (aspect économique)

o Un logiciel crypto-programmé est conforme avant tout à une logique économique.

o Il est plus rapide à développer : l'instinct prend le pas sur le formalisme. On perd donc moins de temps à réfléchir, organiser, lire des ouvrages, ou  rendre les programmes  présentables et réutilisables. La puissance des environnements actuels compense d'ailleurs le manque d'élaboration.

o Comme on le verra plus loin, la formation du programmeur est relativement aisée. Contrairement à d'autres métiers pour lesquels la formation d'un ingénieur débutant dure 6 mois, un programmeur est immédiatement opérationnel.  Des stagiaires, ou des ingénieurs chimistes sortis d'école deviennent de bons programmeurs. Des sociétés de service les proposent même en tant qu'experts à leurs clients. Attention cependant, cela ne doit pas être trop voyant : " Dochpy est furieux, CRYPTECH avait promis des ingénieurs expérimentés en Ada, finalement c'était des débutants qu'il a fallu former et qui sont partis chez TOPKON au bout d'un an !"

o Le code produit est plus volumineux, du fait de l'utilisation systématique du copier/adapter/oublier (CAO en abrégé). En général les chefs attachent une importance au nombre de lignes écrites. Ce critère valorise le logiciel qui passe pour une application sérieuse : "Tu te rends compte, FONEBONE IV fait quand même 200000 lignes !". De son côté, le programmeur peut mettre en avant sa productivité : "Albinoni est une bête, il a écrit 800 lignes en 2 jours !".

o Un logiciel crypto-programmé ou non doit être maintenu. Évidemment, le codage rapide laisse passer (provoque ?) quelques bugs. Relativement peu par rapport au nombre de lignes écrites. L'obligation de maintenance pérennise le service informatique de l'entreprise ou améliore le chiffre d'affaire d'une société prestataire en même temps qu'elle justifie le budget du service prescripteur. La prestation de maintenance étant évaluée au moyen du nombre de fiches d'anomalie traitées, leur absence serait dommageable.

o Le niveau de cryptage (appelé aussi niveau d'imbitablité) est limité par la durée de garantie. En principe, le crypto-programmeur doit pouvoir relire ce qu'il a codé dans les 6 mois écoulés.

o La durée de vie d'un logiciel est conditionnée par son utilité (ou plutôt l'existence d'utilisateurs), et par sa conformité vis à vis d'un environnement fluctuant (machine, système, composants logiciels externes). Tous ces facteurs peuvent favoriser des évolutions. Les utilisateurs peuvent réclamer des améliorations, parfois inspirées par leur ordinateur familial. L'effet de mode, ou simplement la curiosité incite à utiliser des composants logiciels récents (donc instables) ou leurs fonctionnalités les plus originales (donc risquées), histoire de joindre l'utile à l'agréable. Il est probable qu'un de ces éléments tombe en obsolescence et nécessite un portage donc un nouveau contrat.

o Un code bien pâteux, constitué de plusieurs couches sédimentaires décourage la concurrence : Un simple examen des sources montre que l'effort de décodage initial à produire est assez conséquent : "Le Centre a lancé un appel d'offre pour la maintenance de FONEBONE.  Comme TOPKON S.I. exigeait une pré étude de 3 mois, c'est CRYPTECH qui a conservé le marché". Dans un autre registre, on peut aussi diffuser les sources d'un logiciel sur le Net sans dévoiler son savoir faire.

o A plus ou moins long terme (cela dépend de la qualité de l'encodage) on peut réaliser un ou plusieurs  audits, faire intervenir des consultants.  Dans les cas extrêmes on peut envisager une rétro conception. C'est à dire rédiger le document qui décrit la structure du logiciel à partir du code. C'est un peu comme remettre le dentifrice dans un tube.

o Le stade ultime étant le redéveloppement : "FONEBONE III était en Fortran, FONEBONE IV sera en C++" Ce qui constitue un progrès indéniable.  Retour à la case départ.
 

Retour au sommaire




 

oPsychologie du programmeur (aspect néanmoins humain)

Retour au sommaire




 

oQue fait la Qualité ?

o Qu'est-ce que la Qualité, avec une majuscule ?  :  Pour un restaurant,  il existe un certain nombre de critères qualité comme la température des frigos, la présence (absence?)  de bactéries, les dates de fraîcheur des aliments. Les critères qualité doivent être respectés, ce qui ne change rien au caractère insipide du burger que l'on vous sert. Pour le logiciel c'est un peu pareil. Sauf que les critères sont peut-être un peu plus difficiles à définir et encore plus à mesurer.

o Aspect méthodologique : Concernant le développement logiciel, MAC CALL a défini un certain nombre de facteurs qualité qui sont les caractéristiques du logiciel vues par un utilisateur : par exemple l'efficacité, la maintenabilité et la facilité d'emploi, etc ...  A chaque facteur , correspondent des critères (caractéristique internes). Par exemple si un utilisateur souhaite disposer d'un logiciel facilement maintenable, le code doit être modulaire, lisible, structuré, auto-documenté etc.. . Ensuite, il convient de définir les actions et les règles à mettre en oeuvre  pour que chaque critère soit effectif. Comment rendre un code lisible, par exemple... Il est clair que si de telles actions étaient effectivement mises en oeuvre, la crypto-programmation serait en danger. Et si de telles actions avaient existé un jour, cela se saurait.

o Aspect normatif : Les normes ISO9000 (norme générale internationale) et AZ 67 130 (norme française dédiée au développement logiciel) ont défini quelques règles concernant les étapes d'un développement logiciel. En un premier lieu on décrit le logiciel tel que le verrait l'utilisateur (spécifications) puis on dit comment on va le réaliser (conception) puis, l'artiste programmeur entre en scène (codage).  Après quelques tests,  cela se termine par l'acceptation du client (recette finale). Les normes disent comment valider chaque étape. En gros, à chaque réunion on écrit un compte-rendu et on le signe, à chaque étape on livre un document ou un logiciel, à chaque livraison on signe un procès-verbal.

o  Ingénieur Qualité et autres vérificateurs : Le rôle de l'ingénieur qualité est de vérifier si les documents sont bien livrés et bien signés. Donc, rien de bien méchant, il ne s'agit que d'une démarche procédurale qui ne concerne pas directement le programmeur. Mais attention, si on ne lui donne pas ses documents à temps, Mlle Parker peut mordre. Le vérificateur est un collègue qui relit vos propres documents s'ils sont jugés trop techniques pour le qualiticien. Si vous n'avez jamais rien dit de méchant sur les siens, il se montre assez cool. Il se borne à signaler les fautes d'orthographe qu'il est capable de trouver, à aligner les listes à puces et vérifier si les en-têtes ont bien été mises à jour. Il ne critique pas le fond du document, la lecture étant déjà une épreuve, il ne va pas en plus essayer de le comprendre, et aussi car les fiches de relecture sont assez pénibles à rédiger. Car Mlle Parker n'aime pas le surligneur Ce serait trop facile.

o Les problèmes surviennent quand le qualiticien décide de vérifier l'application du Plan Qualité ou des règles de codage (voir documents) . C'est seulement à ce moment que l'on s'aperçoit à quel point elles sont inapplicables. Manque de chance, Mlle Parker n'est pas du genre à abandonner. Le clash avec Albinoni, dont la diplomatie est connue, aurait mérité d'être relaté, mais ceci ne concerne pas la crypto-programmation.

o Finalement, à quoi sert la qualité ? : Avant tout à rassurer la hiérarchie. Peu lui importe l'aspect méthodologique, c'est surtout le côté bureaucratique qui est ici le plus intéressant. L'existence d'une procédure destinée à industrialiser le développement du logiciel  fait croire à la hiérarchie qu'elle maîtrise quelque chose. Et aussi que le processus de développement dépend moins de ces êtres bizarres et incontrôlables que sont les programmeurs. Il n'est pas non plus inutile de leur réclamer régulièrement leur Fiche d'Avancement des Tâches, histoire de leur montrer qui est le chef, quoi. Dans les relations client/prestataire, la proposition commerciale précise que le prestataire s'engage à suivre une démarche qualité rigoureuse lors de la réalisation de ce contrat. Cela fait sérieux.

o Moralité : Si le programmeur est payé à la ligne, le qualiticien est payé à la page. L'assurance qualité ne constitue pas un obstacle pour la crypto-programmation.


Retour au sommaire
 




 

oDu bon usage des commentaires
 

o A propos de l'utilité des commentaires, je me permets de citer un article de Jacques-André Laneyrie paru dans la revue de l'AFCET en 1991. En premier lieu il évoque les commentaires dans les programmes des autres.

Quand je reprends un programme, j'ignore systématiquement les commentaires. Si je suis obligé de reprendre un programme, c'est que le programmeur a fait des erreurs. Comment se fier à ses commentaires ? Car le commentaire, par définition échappe à la syntaxe du compilateur considéré. Donc il n'est jamais vérifié, donc potentiellement faux. (...) J'ai perdu de nombreuses heures en m'aventurant sur de fausses pistes sur la foi de commentaires tendancieux. (...) Dans un cas, il s'agissait de mes propres programmes où j'avais oublié non seulement le sens de ce que je voulais faire  mais encore ce que mon commentaire voulait dire. (...) Quelqu'un qui a du mal à s'exprimer en COBOL ne saura jamais s'exprimer en français (....)

o  Toujours du même auteur qui parle des commentaires dans ses propres programmes :

Si je commente un programme, ce n'est pas pour moi car en principe je sais ce que j'écris. J'agis donc par altruisme. Or cette attitude ne peut me valoir que des ennuis : D'abord cela prend du temps et cela fait baisser ma performance. Ensuite cela aide les autres, ce qui améliore leur performance. Si mon commentaire est bon, le camarade qui l'utilise n'en soufflera mot. Si par contre il est mauvais, il le hurlera dans les couloirs (mais à voix basse pour que je ne l'entende pas), au moins autant que si je n'en mets pas (ne serait-ce que par ce qu'il n'en met pas non plus).
Un programme clair, lisible, aéré structuré, commenté et documenté est un programme que n'importe qui (par exemple la petite soeur du directeur financier) peut reprendre facilement. A ma place. Dans mon fauteuil. Sur mon bureau. Pendant que je pointe à l'ANPE.

Moralité :
Un programmeur à l'esprit ordonné écrit des instructions limpides. Un programmeur à l'esprit embrouillé fait d'obscurs commentaires. C'est l'instruction qui paye, le commentaire conseille. Le conseilleur n'est pas le payeur.

o On peut donc considérer que les commentaires ne constituent pas une gêne pour le crypto-programmeur.

o Si Mlle Parker, Ingénieur Qualité du Centre l'exige, un code peut être abondamment commenté. Il suffit de paraphraser ses propres instructions. S'il existe des outils pour mesurer le taux de commentaires dans un programme, leur pertinence n'est pas quantifiable. Ni leur véracité, d'ailleurs. Cependant, la conscience professionnelle des programmeurs les empêche de mentir autrement que par omission.

o Notons que les commentaires en anglais améliorent le niveau d'imbitabilité du programme.
 

Retour au sommaire
 



o  Y a-t-il une doc ?
 

o A quoi sert la documentation ?  : Avant tout à contenter l'ingénieur qualité, tout heureux d'archiver une trace écrite de la structure du logiciel. Accessoirement à guider les programmeurs dans le développement. En dernier lieu à assister le maintenicien lorsqu'il prend le code en main. A condition qu'elle soit à jour, et plus lisible que le code.

o A quoi reconnait-on une bonne documentation ? : A son épaisseur. Un document bien épais limite le zèle des lecteurs et évite ainsi des remarques désagréables. Un document à caractère technique autorise l'usage d'un français approximatif et du copier/adapter. Il n'est vraiment relu que par les programmeurs s'il leur est utile et s' ils y accèdent avant le codage. Après le développement, il a moins de chances d'être relu que les programmes qui eux sont  maintenus.

oRemarque : Tout ce qui a été dit sur les commentaires peut aussi être appliqué à la documentation.

o Le Plan Qualité : En début de projet, le chef de projet doit exposer dans un document  les méthodes de travail qui seront mises en oeuvre. C'est le  Plan Qualité du Logiciel (ou PQL les qualiticiens adorent les majuscules et les sigles). Pour aller plus vite, on reprend celui d'un autre projet. Qui avait peut-être été trouvé dans une brocante. On peut aussi prendre le plan type en vigueur chez CRYPTECH (qui lui aussi venait d'un autre projet) . Comme le chef de projet a autre chose à faire qu'à s'occuper de cette paperasse, et qu'il y a le mot "Qualité" dans son intitulé,  c'est le plus souvent le qualiticien qui rédige, pardon copie et adapte ce qui doit être un document de travail. En gros il change les entêtes, le nom du projet (FONEBONE III par FONEBONE IV), le nom du prestataire (Cryptech Ingénierie par CRYPTECH SA), le nom du chef de projet (Albinoni par Marmolle), vérifie si on ne fait pas référence à un dérouleur de bande ou à un lecteur de cartes perforées et place le nouveau logo. Le contenu n'a que peu d'importance, il n'est jamais appliqué, ne serait-ce que parce que celui qui l'a rédigé n'a jamais programmé.

o Les règles de codage : Un document qui qui les répertorie est  parfois exigé par le client. Qui rédige ce document ? Un expert qui va reprendre un ou deux autres guides de programmation et qui va les adapter (changement d'en-têtes et de logos). L'expert peut être un consultant ou un stagiaire ou un qualiticien, rarement un programmeur car il cumule deux handicaps : il est en bas de la chaîne de l'évolution et il manque de temps, vu qu'il est trop pris par la relecture de codes imbitables. Elles rappellent quelques traditions dont certaines sont devenues sans objet  (en C les constantes sont en majuscules, en Fortran les entiers commencent par i,j,k,l,m ou n). Parfois un comité Théodule se réunit pour aborder des problèmes importants : par exemple s'il faut mettre un blanc avant un point virgule ou si les indentations sont de 3 ou 4 espaces. De toutes façons pour changer les habitudes d'un programmeur, il faut se lever de bonne heure.

o Dossier de conception  : Prévu avant le codage pour renseigner les programmeurs de l'équipe. Souvent rédigé après coup. Parfois pas du tout. Pas vraiment indispensable si le programmeur est seul ou pour certaines applications. On peut parfois passer directement du manuel utilisateur à la programmation. Ce n'est reculer que pour mieux sauter, car la Qualité réclame son dû. Alors il faut en catastrophe rédiger un document (qui ne servira sûrement  à rien) en fin de projet. On peut échapper à ce pensum si on est soi même le client, ou par des artifices comme la génération automatique de documentation à partir du code.

Retour au sommaire




 

oConclusion
 

o Tu es sérieux quand tu écris tout cela ?? On n'arrive pas à savoir si tu es pour ou contre ...
C'est ce que demandait un collègue qui venait de lire une des premières versions ce document. Mon cher Thierry, ceci est une étude on ne peut plus sérieuse destinée à étudier un phénomène qui coûte des millions de brouzoufs à l'industrie informatique, conséquence du temps perdu à relire des programmes imbitables. On part d'un fait (les programmes sont écrits avec les pieds), d'une hypothèse (c'est voulu) et on argumente au moyen des idées reçues les plus répandues dans le métier.
 
Ouuiiiii, je sais, : une idée reçue n'est pas vraiment un élément de démonstration rigoureux et avec du faux, on démontre du faux. Mais comme nous sommes dans le domaine comportemental, on peut appliquer l'axiome de Liberty Valence : "Quand la légende dépasse la réalité, on retient la légende". Exemple :  une réalité physique a moins d'importance que l'opinion d'un chef.
 
Mais ce n'est qu'un modèle parmi d'autres, même si on peut convenir qu'il est très répandu. On peut  imaginer  d'autres façon de travailler  : écrire des programmes lisibles, simples à comprendre pour un débutant, un fortraniste ou un chef (non, là je déconne ...).  Rechercher dans la bibliographie s'il existe un algorithme adapté au problème posé. Architecturer l'application pour mettre en évidence des composants maîtrisables et réutilisables.

Ecrire lisiblement n'est pas très compliqué :  il suffit de recenser tout ce qui pollue la compréhension d'un logiciel, et ce ne sont pas les exemples qui manquent. Cela passe par l'oubli (ou le non apprentissage) de toutes les syntaxes débiles qui sont la marque de fabrique du C ou du C++. Obtenir une bonne architecture nécessite plus de réflexion, mais ce n'est pas insurmontable.

Economiquement ce modèle est viable dès lors qu'on réutilise les composants d'un logiciel à l'autre. D'ailleurs même sans réutilisation, le programme est plus facile à mettre au point. Ce modèle est cependant plus contraignant pour l'entreprise, car il impose de mémoriser  un certain savoir-faire et de favoriser une synergie entre développeurs. On doit aussi regagner sous forme de nouveaux développements les contrats de maintenance si juteux.

Pour ce qui est d'être pour ou contre, même si je donne des recettes de crypto-programmation, je n'ai pas donné mon opinion. Alors j'avoue que je suis assez paresseux et pas très patient :  si un membre de mon équipe cryptouille un peu trop, ou même un tout petit peu, il risque de connaître quelques problèmes. Surtout que maintenant il sait ce qu'il ne faut pas faire. Je suis comme les consultants : en matière de cryptoprogrammation, les conseils c'est pour les autres.
 

Retour au sommaire