Oír Gilipolleces ( Écouter des conneries )
Lundi, 13 septembre 2004
Quelle est la partie la plus dure du travail d’un développeur de software? L’architecture, l’analyse fonctionnelle, la partie technique, la programmation? Non. La partie vraiment dure c’est de devoir écouter des conneries.
Tu reçois un mail de l’IT manager, cet individu qui, selon son curriculum, a “collaboré dans la conceptualisation de projets de convergence” et à été “directeur d’expansion de stratégies de 4ème génération”, et dont le travail consiste à renvoyer les mails des clients aux techniciens et vice versa, et à lire des articles sur Internet pour avoir quelque chose à dire (avec Google et quelques règles d’Outlook la société pourrait économiser 80.000 euros par année). Sujet du mail : “Brainstorming”. Et là tu est déjà baisé (NdT :bien jodido dans le texte).
Le “brainstorming” ou “orage de cerveaux” c’est (ou devrait être) la réunion dans laquelle tout le monde apporte son talent et son expérience pour trouver les solutions idéales aux problèmes. La réalité c’est que dans l’orage de cerveaux, le manager normalement apporte l’orage et toi tu dois apporter le cerveau. Et dans l’orage, comme dans la rivière agitée, les bénéfices sont pour les pêcheurs. Toi tu réfléchis, trouve et modélise des solutions, c’est bien pour ça que tu voulais être ingénieur. Lui il rafle la médaille, c’est bien pour ça qu’il a fait un master en “strategy business trucmuche”.
Alors tu arrives méfiant à la salle de réunion. Il est là, avec le portable, la tasse de café et plein de documents (normalement les mails des clients avec leur conditions, c’est-à-dire le vrai problème, et pas un seul mémo en plus qui puisse indiquer qu’il a passé un peu de temps à chercher une quelconque solution).
Tu sais à quoi tu t’exposes une fois de plus. Il va te demander le typique : “Et maintenant je fais quoi ?” mais sans que tu t’en rendes compte. Par derrière. Comme si t’étais un imbécile. Mais ça ne s’arrête pas là : tu vas être le cobaye sur lequel on va expérimenter les derniers discours appris sur les forums ou dans les “cookbooks”, pour que tu les valides ou les rejettes, les corriges, et en définitive aide ton manager à améliorer cette sagesse superficielle, cet “art de feindre d’avoir raison” (voir Schopenhauer) avec lequel cet individut justifie son salaire exorbitant devant la direction (qui normalement ne sait pas distinguer une sardine et un thon (NdT : eeeuh là je savais pas comment traduire « churras y merinas » alors j’ai improvisé).
Alors tu prends ça comme une affaire personnelle. Il faut expliquer clairement que A ) une sardine est une sardine et un thon un thon, autrement dit qu’une idée est une idée et une connerie, une connerie, et qu’on sait les distinguer; B ) on peut faire de la démagogie en parlant du sexe des anges ou peut-être d’art abstrait, pas de software; C ) on apprend pas dans un forum en une heure ce qui nous a pris quelques bonnes années d’université, quelques autres de boulot, beaucoup de café et autant d’heures supplémentaires; D ) un incapable avec un bouquin n’est pas un ingénieur; E ) Un master, une cravate et un PDA c’est joli, mais ça ne donne pas de bon sens à qui n’en a pas.
La représentation commence. Attachez vos ceintures. Accrochez-vous avec force à vos principes, parce qu’on va vous appliquer le traitement Ludovico ( voir “Orange Mécanique” ). On va vous immobiliser sur une chaise, vous administrer une drogue, accrocher des supports à vos paupières et vous obliger à regarder 2 heures de Power Point. On va vous faire subir des tortures psychologiques avec le double objectif de vous extraire de l’information, et de vous convaincre de réalités alternatives. Ci-dessous je reproduis des fragments réels ( je vous donne ma parole d’honneur ) des réunions avec mon IT manager sur différents projets Java et VB dans lesquels « nous » avons travaillé.
Perle 1 : Hibernate
[manager] On utilise quoi pour la couche de données?
[moi] Utilisons Hibernate
[manager] Il vaut mieux utiliser des Entity Beans
[moi] Pourquoi?
[manager] Les Entity Beans sont J2EE standard, et en plus ils sont dans un pool, Hibernate n’a pas de pool alors il est plus lent.
Quand j’ai voulu lui expliquer l’énormité qu’il avait dit, les idées ont fusé à une telle vitesse dans ma tête que j’ai subi un choc, et que j’ai du aller me chercher un verre d’eau. Je crois que c’est une technique délibérée d’argumentation, qui devrait s’appeler “la connerie est tellement grande qu’elle devient irréfutable”. Si quelqu’un dit que “Deux et deux égale cinq”, on peut argumenter que c’est quatre. Mais si quelqu’un dit que “Deux et deux est une constellation proche d’Alpha Centauri”, on peut seulement répondre “Mais de quoi tu parles!?”, et on peut te répondre “On voit vraiment que tu n’as pas fait un Master trucmuche”.
Perle 2 : Easy Upgrade
Cette fois nous étions réunis avec des clients américains qui avaient acheté notre « application » (pour donner un nom à ce désastre programmé par “un Senior avec 10 ans d’expérience” et que j’ai du maintenir après coup). Le processus d’installation consistait à décompresser un ZIP sur le disque dur et après exécuter un Setup.exe (ça ne marchait pas en installant depuis un CD). Le ZIP contenait les fichiers de la base de données. Chaque fois qu’on leur donnait une nouvelle version, et s’ils ne voulaient pas perdre les anciennes données, il leur fallait renommer l’ancienne base de données, installer la nouvelle version complète (la nouvelle base de données devait être installée obligatoirement, parce qu’une partie de la logique et des ressources de l’application étaient dedans - ne me demandez pas pourquoi, demandez au “Senior”), et ensuite importer quelques tables par scripts (une semaine d’efforts pour que le technicien de la boite japonaise arrive à faire tout ça correctement).
[client] Vous ne pourriez pas simplifier le processus d’installation?
[manager] Si, on va créer un processus d’installation qui au début va faire un « diff » comme avec Source Safe et qui va installer juste les fichiers modifiés ou ajoutés.
Je suis resté là à me demander si cet individu savait que le code source, ça se compile.
Perle 3 : Interfaces magiques
Dans cette réunion, « il » était en train de me demander de faire un portail web (une espèce de caddie d’achats avec les services de l’entreprise), et que, pour économiser du temps, je m’en tienne seulement aux nécessités et spécifications du premier client qu’on avait réussi à rouler.
[moi] Mais, si je crée le portail spécifiquement pour un client, on ne va pas pouvoir réutiliser le code. Tu veux que je modélise la logique de transaction de manière générique, même si ça va me prendre plus de temps?
[manager] Non, on n’a pas le temps.
[moi] Alors quand on aura un deuxième client, on va devoir lui faire un portail différent.
[manager] Non, on va réutiliser celui qu’on va faire.
[moi] Alors, je le fais générique, non? Plus de temps …
[manager] Non, fais-le spécifique, mais en tenant compte qu’on va le réutiliser.
[moi] Voyons, explique-moi avec quelle technique je fais quelque chose de rapide et spécifique, mais réutilisable.
[manager] Fais simplement des interfaces propres.
Je me suis demandé si ça existait, un “Mr.Proper design pattern”. Ensuite je lui ai demandé qu’il m’explique comment faire une logique spécifique qui implémente une interface valide pour tout le monde, et si on arrivait à faire ce miracle (quelque chose comme définir un standard genre JDBC et créer des drivers différents), à la fin on n’allait réutiliser rien d’autre que l’interface (une demi-heure de boulot?), donc ça revenait au même. Son discours de réponse est impossible à reproduire.
Perle 4 : Override autoincremental keys
Cette fois il s’agissait de modéliser une logique de commerce transactionnelle qui opérait sur deux systèmes différents, un workflow et un software de budgets (chacun avec son API). Il fallait les associer de manière à ce que, quand un client sollicite un budget, une nouvelle tâche se créée dans le workflow et un nouveau budget soit associé à celle-ci.
[moi] Eh bien on doit créer une méthode qui commence une transaction, ajoute une tâche au workflow, garde l’ID, puis ajoute un budget, garde l’ID, fasse la relation entre les deux ID dans une base de données et fasse “commit”.
[manager] Pour économiser du temps fais en sorte que l’ID de la tâche et l’ID du budget soient toujours identiques, et comme ça on ne doit pas faire la relation (ça pourrait déjà être la perle nº4, mais non, ça ne s’arrête pas là).
[moi] Même si on pouvait spécifier nous-même les clés, on devrait savoir quels ID on a déjà utilisé pour pouvoir générer les nouveaux, c’est qui est plus coûteux qu’associer deux IDs. Mais en plus les clés on ne peut pas les spécifier nous-même, dans le workflow et les budgets, les clés sont des champs auto-incrémentables.
[manager] Mais il y a un mécanisme dans les Entity Beans qui laisse choisir les clés des registres qu’on rajoute.
Après le choc j’ai commencé à m’imaginer le mécanisme:
EntityBean: InsertTaskWithKey(55)
DataBase:SQLException:KeyViolation
EntityBean:PuisqueJeTeDisQueInsertTaskWithKey(55)
DataBase: Bon D’accord.
Perle 5 : Java Word Parser
Des fois les utilisateurs dudit portail de services uploadent des fichiers en format Word pour que l’entreprise (qui s’occupe principalement de la localisation de contenu) les traduise en différentes langues. On doit pouvoir estimer le coût de la traduction automatiquement pour pouvoir donner un budget au client de façon immédiate. On doit juste compter le nombre de mots du document et le multiplier par le prix par mot établi.
[manager] Comment on peut automatiser les budgets?
[moi] Je dois chercher une librairie java pour parser des fichiers doc, l’intégrer convenablement au portail et créer une fonction qui me rende le nombre de mots.
[manager] On va faire quelque chose plus rapidement. On peut réutiliser les macros de Word que le département d’Evaluation utilise.
Facile. On a juste besoin d’un “Enterprise Word Server” qui marche sur Solaris, qui puisse s’installer en cluster, et auquel on puisse accéder par RMI.
J’espère juste qu’avec ces exemples le monde comprenne ma souffrance. À la prochaine.