Messages étiquettés génération de code

De la qualité naît la satiété

Les techniques de néo-management en vogue depuis les années 80 cherchent à tout prix à faire du personnel une ressource comme les autres. C’est-à-dire que les travailleurs doivent être aussi souples et interchangeables qu’une gomme ou un boulon. Dans le domaine du développement logiciel, une méthode pour arriver à cet objectif discutable est de focaliser le travail des développeurs non plus sur le produit demandé par le client, mais sur l’outil de production qui permettra effectivement de satisfaire le client mais aussi les prochains, et à moins cher que si cet outil n’existait pas (mais facturé autant, bien entendu) Ainsi, on n’a besoin de moins en moins d’experts techniques et de plus en plus de travailleurs moins qualifiés pour un produit de qualité équivalente. C’est le progrès, et bien logique. Un compilateur ne fait ni plus ni moins que ça : il génère du code assembleur que peu maîtrisent à partir d’un langage plus facile d’accès, et donc pour lequel on trouvera plus de main d’oeuvre moins essentielle.

L’intéressant là-dedans, est de voir la communication associée du middle management (Petits Chefs en français) pour justifier des dépassements financiers ou le génie dont a su faire preuve l’entreprise. Enfin, plutôt dont ils ont su faire preuve, quand on les écoute. La métrique fondamentale, c’est le nombre de lignes de code générées.  Plus il y en a, mieux c’est. Forcément : l’investissement dans le coût de développement de l’outil de génération est d’autant mieux amorti qu’on s’en sert beaucoup. Et cela rend encore plus judicieux l’investissement initial. Toutes les lignes que l’on génère, c’est autant de lignes que l’on n’a pas à écrire à la main, donc de développeurs à payer. Générer des lignes, c’est améliorer la productivité des équipes.

Tout ceci est complètement vrai, toutes choses étant égales par ailleurs. Ce qui n’est bien entendu pas le cas ici. On oublie (volontairement) au moins une chose : la qualité du code généré n’est pas la même. Pire, elle n’est pas contrôlée sur le long terme. L’architecte a prévu un schéma de génération, qui se défend totalement lors des premiers usages de l’outil. Plus le projet avance, plus il y a de choses à faire entrer dans le générateur, et donc il en sort de plus en plus de code. Peut-être que le schéma de génération initial ne s’applique plus quand on génère trois fois plus de code qu’initialement prévu ? Tout le monde s’en moque. Je dirais même qu’il ne vaudrait mieux pas que ça se sache. Ça fait déjà quatre mois qu’on dit générer 85% du code, on va pas faire s’effondrer cette métrique en dépensant des sous qui plus est ! Et l’équipe serait mécaniquement moins productive. Non, non et non, le schéma de génération, aussi mauvais soit-il devenu, ne doit pas être amélioré.

Aussi malhonnêtes soient-ils, je n’ai jamais vu aucun Petit Chef demander à ce que l’on dégrade encore plus le schéma de génération pour générer 200 lignes quand on en générait 100. Pourtant cette stratégie ferait clairement leur beurre. Mais sont-ils simplement capables d’avoir cette (une ?) idée ?

Tags:

Qui fait deux fois naufrage ne doit pas s’en prendre à la mer

Il y a fort à parier que vous vous soyez déjà frotté à la pierre philosophale du développement logiciel : la génération automatique de code. Ça c’est une vraie bonne idée de manager moderne ! Un développeur, ça coûte des sous, ça geint, c’est lent, mais alors, vraiment, ça fait du code tout sale, qui colle aux doigts, qui marche moyennement d’ailleurs, de façon tellement médiocre qu’il doit aussi écrire des tests qui vont avec, tests qu’il va également falloir valider… Vous le voyez le serpent qui se mord la queue et qui coûte des sous ? Du code généré automatiquement, c’est trop mieux : pas besoin de tests en face, juste un bouton à appuyer et des milliers, voire des millions de lignes de code viendront remplir les disques durs automagiquement ! Le code généré a forcément raison : s’il y a malgré tout un bogue, ce sont les entrées du générateur qui sont moisies (modèle UML, spécifications, conception, que sais-je ?) En plus, ça augmente la productivité de toutes ces sales faignasses au regard bovin qui constituent la masse salariale. Alors, elle est pas belle la vie ?

Disons, oui et non. Il y a généralement deux stratégies :

  1. génération préliminaire de code, puis maintenance manuelle des pièces (comprendre fichiers) générées ;
  2. génération systématique de code à partir des entrées.

La première est souvent très pratique et permet de mettre en place une grosse architecture en place rapidement, mais peut mal vieillir, surtout si la génération a lieu bien avant que les entrées ne soient mûres. La seconde est bien plus pernicieuse, donc amusante au quotidien : les développeurs n’ont plus à maintenir le code opérationnel, mais uniquement les entrées. Ça, c’est la théorie. En pratique, ni le générateur, ni les entrées ne sont mûres. Par entrées j’entends les entrées pures du générateur citées plus haut, mais aussi potentiellement l’architecture, la plateforme, etc. Pourtant les impératifs du projet restent ce qu’ils sont : on corrige, on ajoute et on avance, rapidement s’il-vous-plaît. Alors, autant sans générateur toute la capacité de modification d’un composant se concentre à un seul niveau (le code opérationnel), autant avec, on en obtient trois : les entrées, le générateur … et le code généré bien entendu ! Et c’est l’entropie de l’univers qui se félicite, la complexité de gestion vient de gagner deux facteurs d’échelle, comme ça.

Un générateur de code doit produire du code humainement maintenable et débogable.

Il sera toujours temps de discuter toutes les stratégies de génération dans d’autres articles, mais le fondamental ci-dessus ne doit jamais être oublié. Que faire de millions de lignes de code auxquelles on ne comprend rien ? Comment modifier manuellement et rapidement du code généré (si si, ça peut s’avérer intéressant à petites doses) si le générateur duplique, triple les références aux mêmes choses sous différentes formes ? Un générateur de code, même certifié, ne fait que ce qu’on lui demande : il transpose des idées depuis un formalisme vers un autre. C’est un outil, et comme tel, il doit aider et non contraindre. De la même manière que vous pouvez comprendre ce que vous lui donnez à manger (diagramme UML et consorts), vous devez comprendre facilement le code produit.

Tags: ,