- En 2016, la fonctionnalité d’upload de photos géolocalisées d’une app mobile React Native échouait uniquement dans la bêta Android, sans pouvoir être reproduite en local sur Android ni sur iOS, et le problème a été traqué pendant une semaine
- La bêta Android ne renvoyait aucun retour d’erreur malgré l’échec de l’upload d’image, et chaque nouveau build envoyé sur le Play Store prenait environ 1 heure, ce qui ralentissait la validation des hypothèses
- Comparé à des cas en embarqué, en matériel, en chimie ou en médecine vétérinaire, le débogage logiciel apparaît bien plus rapide et bien plus observable
- La cause réelle était une différence d’une seule lettre : le type MIME de l’image était écrit
"jpg", alors que l’extension du fichier pouvait être.jpg, mais que le type MIME devait être"jpeg" - Un environnement de développement où l’on peut utiliser facilement des logs, l’observation en temps réel, un débogueur et des expériences répétées à faible coût relève presque d’un grand privilège au regard des boucles de retour d’autres métiers
Upload de photo qui échoue uniquement dans la bêta Android
- La fonctionnalité de photos géolocalisées d’une app mobile React Native semblait prête pour une sortie le lundi, mais après le déploiement de la bêta Android, les images ne s’uploadent pas
- Les tests Android en local et la bêta iOS fonctionnaient normalement, ce qui ne permettait pas d’identifier immédiatement l’origine de l’échec
- Même après avoir renvoyé une version améliorant la gestion des erreurs, l’échec de l’upload se produisait toujours sans aucun retour
- Envoyer une nouvelle itération sur le Play Store prenait environ 1 heure, et il fallait attendre la mise à disposition du build tout en préparant l’hypothèse suivante
Des boucles de retour plus longues dans d’autres métiers
- Un ingénieur en embarqué déploie une mise à jour de firmware sur des équipements distants, puis se retrouve avec des nœuds qui ne répondent plus
- Pour comprendre la cause, il faut récupérer le matériel et l’analyser
- Dans certains cas, il faut des mois pour découvrir ce qui s’est mal passé
- Un ingénieur hardware constate qu’un nouveau matériel déployé à distance peut ne révéler un défaut de conception qu’après avoir traversé plusieurs saisons
- Il reçoit les anciens équipements par courrier et intègre les correctifs à la génération suivante du produit
- Il existe un cas où l’ajout d’aérations pour réduire la chaleur a créé un bug encore pire, parce que les ouvertures étaient assez grandes pour que des frelons y fassent leur nid
- Des tests en laboratoire sont possibles, mais la validation finale se fait malgré tout sur le terrain
La manière d’accepter l’échec
- Le CEO se souvient qu’à l’époque où il était chimiste en préparation de thèse, il menait des expériences grâce à un important financement destiné à des produits chimiques coûteux, mais qu’au bout de plusieurs semaines, le résultat semblait avoir échoué à cause d’une erreur expérimentale
- Il n’a pas réussi à comprendre ce qui s’était mal passé, ni à répondre à la question de ce qu’il ferait différemment pour éviter de répéter la même erreur
- Malgré cela, il a obtenu un second financement, et cette expérience est devenue un exemple de leadership empathique qui aide quelqu’un à se relever après un échec
Le cas vétérinaire montre un risque bien plus élevé
- Une amie vétérinaire examine un chien âgé et malade et recommande une radiographie au propriétaire, qui la refuse à cause du coût
- Sans radiographie, le mieux qu’elle puisse faire est de palper l’abdomen du chien depuis l’extérieur, et elle sent un gros objet
- Ce qui a été retiré par chirurgie était un épi de maïs, mais faute de radiographie, il n’était pas possible de savoir avec certitude si c’était l’unique problème
- Le lendemain, le chien est mort, et contrairement aux problèmes de lancement d’une app mobile, les échecs dans d’autres métiers peuvent réellement engager la vie ou la mort
Le bug d’une lettre et le privilège des outils de débogage
- Le vendredi matin, une incohérence entre la documentation Android et la base de code est apparue, et la cause du problème qui durait depuis une semaine était un seul caractère
- Le type MIME de l’image était défini sur
"jpg", alors qu’en réalité il devait être"jpeg", même si le fichier était enregistré en.jpg - Les développeurs logiciels peuvent regarder en profondeur des processus complexes, surveiller le fonctionnement en temps réel, produire des logs, arrêter l’exécution avec un débogueur et examiner ce qui se passe
- Ces capacités sont peu coûteuses et rapides, et permettent de répéter des expériences plusieurs fois par jour en quelques clics
- Le logiciel peut être aussi important et avoir autant d’impact que d’autres métiers, mais les développeurs travaillent dans un environnement où ils ont de bonnes raisons d’être reconnaissants pour les outils de débogage dont ils disposent
1 commentaires
Avis de Hacker News
Une histoire presque allégorique sur ce qui distingue le génie logiciel des autres métiers — ou, pour le dire en plaisantant, des « vrais » métiers.
J’aime aussi cette version plus courte et spirituelle : un ingénieur logiciel, un ingénieur matériel et un chef de service se rendent à une conférence en Suisse quand, sur une route de montagne escarpée, les freins lâchent, la voiture percute la glissière en descendant et s’arrête miraculeusement.
Le chef de service propose de tenir une réunion pour définir une vision, une mission et des objectifs, puis de résoudre le problème central par l’amélioration continue ; l’ingénieur matériel propose de démonter les freins avec un couteau suisse pour les réparer.
L’ingénieur logiciel dit : « Avant de faire quoi que ce soit, repoussons la voiture en haut et voyons si ça se reproduit. »
En même temps, le grand inconvénient du génie logiciel, c’est aussi qu’il traite des abstractions. Tout bouge, jusqu’aux fondations.
http://thecodelesscode.com/case/154
Le fait d’avoir ce pouvoir ne rend pas l’ingénieur logiciel ridicule ou irréaliste.
L’ingénierie de l’espace numérique donne des capacités de débogage qui relèveraient du miracle dans les domaines physiques. Si vous voulez fabriquer 10 exemplaires du même objet et les tester de 10 façons différentes, c’est littéralement CTRL+C, CTRL+V. J’aimerais voir un mécanicien faire ça.
J’en ai vraiment assez des plaintes du genre : les ingénieurs logiciels ne sont pas de « vrais ingénieurs », et il suffirait de faire beaucoup plus de grandes réunions de conception en amont et énormément de planification.
Si les autres disciplines d’ingénierie travaillent ainsi, ce n’est pas parce qu’elles sont beaucoup plus professionnelles que nous, ni parce que cette méthode est meilleure, mais parce qu’elles n’ont pas d’autre choix. Une fois un hôtel terminé, on ne se rend pas compte qu’il faut relever le plafond de 15 cm pour tout démolir et reconstruire.
Si l’on pouvait exécuter
ceilingHeight += 6, cliquer sur « Rebuild », voir l’hôtel se reconstruire pendant que des tests unitaires automatisés vérifient aussi l’accessibilité, le tout pour un coût total de 2,82 dollars, ils le feraient évidemment eux aussi.Il faut arrêter avec le complexe d’infériorité. Nous faisons de l’ingénierie avec des outils dont les ingénieurs civils et mécaniciens du monde réel ne peuvent même pas rêver, et il est normal que les processus en soient profondément différents.
Bien sûr, il arrive que l’on n’applique pas assez de processus à un problème. Mais si vous pensez que c’est un problème propre à la programmation, je vous prescrirais volontiers quelques heures de https://www.imdb.com/title/tt4788946/.
Ce n’est pas une question de supériorité : si l’un de ces critères manque, vous ne faites pas de l’ingénierie. D’après mon expérience, la plupart du développement logiciel ne remplit aucun des quatre. Ce n’est pas forcément une mauvaise chose, mais la plupart du développement logiciel n’est pas de l’ingénierie.
Cela ne veut absolument pas dire que l’ingénierie est supérieure au développement.
C’est comme la différence entre sculpter l’argile et sculpter le marbre. Si vous faites une erreur dans l’argile, il suffit de la retravailler rapidement ; si vous retirez du marbre une partie qu’il ne fallait pas enlever, il faut commander un nouveau bloc.
Importer les méthodes de la sculpture sur marbre dans le monde de l’argile ne ferait de vous qu’un très mauvais sculpteur d’argile, ou au minimum un sculpteur très inefficace.
Il n’y a pas non plus grand intérêt à déterminer laquelle, entre l’argile et le marbre, produit une sculpture plus précieuse. Les deux ont leur place dans la société.
ceilingHeight += 6dans le monde réel.Aujourd’hui encore, j’ai modélisé et imprimé un objet, puis je me suis rendu compte qu’une partie aurait gagné à être plus épaisse d’environ 1 mm. Trente secondes plus tard, la version 2 partait vers l’imprimante.
C’est vraiment incroyable. J’ai hâte que ce genre de chose soit aussi répandu que les imprimantes papier.
https://www.youtube.com/watch?v=NPVT2lvMvOk
Au cours de ma carrière, il est arrivé plusieurs fois qu’une erreur se produise, mais dans un silence total, et que tout le monde se retrouve bloqué. Pas de sortie d’erreur, rien.
Dans bon nombre de ces cas, la cause était une bibliothèque tierce de bas niveau qui faisait
catch (e) {}. Le premier cas que j’ai rencontré au début de ma carrière m’a servi de bonne leçon, et désormais je ne laisse jamais passer une erreur comme si de rien n’était. Au minimum, je la journalise.Le logiciel que vous écrivez aujourd’hui pourra être utilisé dans cinq ans, dans un environnement que vous n’imaginez absolument pas.
Trente ans plus tard :
/* X systems I modul body I 14.09.1990 */void xxvcda(int *addr, int sizeof)Il ne connaissait même pas la fonctionnalité du langage qui permet de relancer une nouvelle exception à partir de l’ancienne pour préserver le contexte de la trace de pile. C’est amusant. Au moins, ce n’est pas du code de mon travail principal ; mais mon travail principal a aussi ses propres sources d’amusement.
DRF avalait l’erreur de validation et ne renvoyait qu’une erreur générique, sans aucun indice ; au final, j’ai dû descendre moi-même dans les couches et ajouter du logging pour comprendre ce qui se passait.
Un ami physicien citait souvent Rutherford : « toute science est soit de la physique, soit de la philatélie »
Ce qu’il voulait dire, c’est que la physique, contrairement aux mathématiques ou à l’informatique, a une manière d’être vérifiée par la réalité physique
Son domaine était celui des champs magnétiques extrêmes : on fabriquait d’immenses bobines de cuivre, on y faisait passer assez de courant pour les faire fondre, puis on déclenchait des explosifs autour de la bobine afin de rendre, pendant un très bref instant, le champ magnétique central plus intense que tout ce que l’humanité avait jamais produit, avant que des milliers de degrés de cuivre liquide ne soient projetés et que tout l’appareil soit détruit
Dans ce genre d’environnement de travail, une erreur ou une erreur de calcul signifie que des gens peuvent mourir très vite et de façon atroce. Il n’était donc pas d’accord quand des doctorants en mathématiques, dont le pire dommage possible était d’avoir de la poussière de craie sur leur pull, se qualifiaient eux-mêmes de scientifiques
Autrement dit, soit elle cherche à comprendre la dynamique de son objet, soit elle se contente de collecter des faits intéressants et de nommer les objets d’intérêt
Pour ceux qui s’intéressent à une carrière de super-vilain mais ne savent pas par où commencer : c’est comme ça qu’on fabrique un vrai EMP
[1] https://en.m.wikipedia.org/wiki/Explosively_pumped_flux_comp...
Après ce genre d’incident, j’aimerais toujours qu’il y ait une action corrective en amont. Avec une journalisation et un reporting d’erreurs appropriés, il n’aurait pas fallu une semaine pour corriger ça
La bibliothèque qui a reçu le type MIME incorrect
image/jpgaurait dû lever une exception, crasher ou au moins écrire un gros message dans les logs. Je me demande si l’auteur original a signalé un bug à cette bibliothèqueAvait-il les accès permettant de confirmer ou d’infirmer que les uploads d’images arrivaient réellement côté serveur ? Pourquoi l’upload fonctionnait-il dans l’environnement de test mais pas dans la version publiée de l’app ? Qu’est-ce qui était différent dans l’environnement de test ?
En théorie, Shawn aurait dû avoir assez d’accès, soit pour faire tourner lui-même le serveur, soit pour demander de l’aide à quelqu’un capable de diagnostiquer pourquoi l’upload échouait silencieusement, afin de répondre assez vite à la question : « l’upload réussit, alors pourquoi l’image n’apparaît-elle pas ? »
À mon avis, la leçon bien plus importante que « le type MIME de l’image était
jpgalors qu’il fallaitjpeg», c’est pourquoi ça marchait en test mais pas en production. Plus que le bug lui-même, le vrai sujet est de savoir pourquoi l’environnement rendait ce bug difficile à trouverDans mon cas, une appli desktop dysfonctionnait gravement sans que l’erreur soit inscrite dans les logs. Ce n’est qu’au bout de quelques jours que j’ai découvert que les descripteurs de fichiers étaient épuisés, et que log4net ne pouvait pas non plus écrire de logs s’il n’arrivait pas à obtenir un descripteur de fichier. La solution consistant à annuler une petite correction de bug était simple, mais la vraie correction a été de personnaliser log4net pour qu’il garde toujours le fichier de log ouvert. Ainsi, même si l’application épuise tous les descripteurs de fichiers, les erreurs sont quand même enregistrées
Le silence n’est pas l’objectif. Trop de développeurs pensent que le silence est l’objectif, mais le véritable objectif est l’exactitude. S’il n’y a pas d’erreur, il faut être silencieux ; mais s’il y a une erreur qui affecte l’utilisateur, il doit y avoir une grosse boîte d’alerte rouge
Je pense que les développeurs devraient apprendre à aimer les messages d’erreur. Un message d’erreur bien rédigé révèle rapidement la cause et fait gagner beaucoup de temps à tout le monde
Si ce développeur a appris à afficher plus souvent des messages d’erreur à l’avenir, c’est un très bon résultat
Ça me rappelle un ancien collègue qui disait souvent : « On n’est pas en train de construire un système de contrôle aérien. » Il voulait dire que les erreurs ne mettaient pas des vies en jeu
À l’époque, nous faisions des jeux, mais cette phrase s’appliquait aussi à presque toutes les applis CRUD que j’ai écrites
À part ça, je demande souvent à d’autres responsables techniques seniors, surtout des Director, VP et CTO : « Quelle est l’erreur la plus coûteuse que vous ayez commise ? » Si vous êtes ingénieur junior, c’est quelque chose qu’il faut absolument faire un jour
Beaucoup de dirigeants techniques de haut niveau peuvent raconter des histoires à 100 000 à 1 million de dollars. J’ai même vu quelqu’un faire perdre plusieurs millions de dollars sur un projet et être promu juste après. Il est important de comprendre pourquoi c’est possible, et même pourquoi cela peut être une bonne chose
La frustration provoquée par un jeu buggé peut se traduire dans la vraie vie par de la violence au volant ou des disputes à cris. Des gens se sont suicidés parce qu’un ordinateur leur avait envoyé une facture erronée. Des entreprises ont coulé parce qu’un logiciel avait perdu des données précieuses
Des gens ont aussi été assassinés à cause d’applications de réseaux sociaux qui semblaient anodines, et des incitations au massacre ont été organisées sur Twitter. Certaines personnes ont été victimes de harcèlement et d’agressions à cause d’informations révélées par Pokemon Go
Le logiciel a un pouvoir réel. Sinon, il n’y aurait aucune raison d’en écrire
J’ai déjà travaillé sur des logiciels capables de faire perdre des données précieuses, et je travaille maintenant sur un logiciel qui pourrait provoquer une inondation en cas de dysfonctionnement
Il faut avoir un peu plus de fierté dans son travail
En tant qu’ingénieur logiciel, j’ai plutôt aimé le débogage. Parce que cela me faisait utiliser des compétences et une façon de penser différentes de celles nécessaires pour concevoir et implémenter
Bien sûr, cela ne veut pas dire que le débogage n’est pas stressant. Quand je développais le logiciel du commutateur téléphonique 5ESS d’AT&T, on avait une démo, et dans le labo de test il n’y avait qu’une seule ligne téléphonique configurée pour notre fonctionnalité
Après plusieurs tentatives, le logiciel ne fonctionnait toujours pas, et j’étais stressé à vérifier tout ce qui était possible, tout en étant convaincu que le logiciel était correct. Au final, j’ai demandé au technicien du labo de vérifier la ligne, et il s’est avéré que la seule ligne configurée était, d’une manière ou d’une autre, déconnectée. Un stupide problème matériel
Déboguer des systèmes distribués dans le cloud est exponentiellement plus horrible que quand on peut lancer tous les services en local, et même ce système distribué local est largement pire que lorsqu’on peut déboguer le problème dans un seul programme
Un vrai débogueur rend aussi le débogage bien meilleur. Je n’ai jamais compris les gens qui s’en tiennent exclusivement au débogage à coups de
printfou à un vrai débogueur. Utiliser les deux apporte un gain énorme. De bonnes fonctions de traçage méritent aussi d’être soulignées ici, car quand elles sont disponibles, elles sont bien meilleures que le débogage auprintfÀ mes débuts en programmation, j’associais beaucoup trop d’émotion inutile au fait de ne pas savoir pourquoi quelque chose se produisait, puis j’ai fini par accepter la boucle « attends, pourquoi ça fait ça ? Je ne sais pas… ah, attends… waouh, la raison pour laquelle ça ne marchait pas est vraiment logique ! », et par intégrer le fait qu’arrivé au bout, on se sent bien
Désormais, l’état d’ignorance en lui-même ne peut être gâché que par les attentes et les comportements des autres. Avec le temps, j’ai appris qu’il faut gérer très fermement les choix de langage, d’architecture, etc., pour rendre ce processus simple et rapide
À ce stade de ma carrière, il est beaucoup plus facile de convaincre en amont qu’AWS Lambda est un mauvais choix en matière de performances, de coût total, de débogabilité et de vitesse de développement, que de convaincre plus tard qu’il y a une bonne raison pour laquelle « corriger ce seul problème » prend autant de temps
La fin m’a fait rire. Pas plus tard qu’hier, j’ai résolu un problème qui nous empoisonnait depuis trois ans dans l’entreprise, et chez nous la cause était la lettre A
Pendant ces trois dernières années, quelqu’un effectuait une correction manuelle en ajoutant et retirant des données, et c’était devenu une partie de son travail. Il avait même mis un événement récurrent dans son calendrier pour faire le ménage régulièrement. Des millions de clients dépendaient de cette seule personne pour que le bon forfait data soit appliqué à leur ligne mobile
On peut imaginer le chaos s’il oubliait ou partait en congé
Au final, la cause était
if $line->status == STATUS_ACTIVE: d’un côté c’étaitActive, de l’autreactive. Aucun chien n’a été blessé, mais une quantité incalculable d’argent a disparu au fil des annéesCe pauvre type n’est plus indispensable. C’est à moitié une blague. Le logiciel est censé rendre le travail plus efficace, mais j’ai tendance à aussi regarder les motivations humaines
J’ai particulièrement souffert en remplissant des champs HL7 sur Mac. Il me semble que le caractère
’saisi sur un clavier Mac n’était pas compatible avec toutes les versions de HL7, ou ne convenait pas à la destination à laquelle HL7 était transmisC’est un vieux souvenir, mais une différence entre des mots comme
o’clocketo′clockavait cassé la distribution de rapports de radiologie. Cela a duré des années avant d’être repéréHN affiche le
’différemment de ce que j’ai saisi, mais c’est toujours le même caractère. C’est assez drôle, puisque la moitié du problème était justement qu’on ne voyait pas la différence pendant le débogageSTATUS_ACTIVEétait mal défini dans une partie du code ?Il y a toujours le risque que quelqu’un corrige « gentiment » la faute
refererenreferrerdansHttpHeader::REFERRER. Mais cette faute est figée dans le standard HTTP, donc faire ça casse complètement le logiciel. C’est la faute de Phillip Hallam-Baker, à l’époque du CERNL’anecdote du nid de guêpes me parle beaucoup
Le propriétaire de notre immeuble de bureaux a installé à l’extérieur du bâtiment une interface à écran tactile permettant d’appeler les différents accueils et de déverrouiller la porte. Il a fait ça parce qu’il n’y avait pas de réceptionniste pouvant voir la porte
L’appareil a tenu six mois avant de commencer à très mal fonctionner. La cause était qu’ils avaient installé sur la façade est du bâtiment cette interface qui était, en pratique, une grosse tablette Android noire
À partir du milieu du printemps, elle recevait chaque jour assez de soleil pour surchauffer, ce qui a endommagé l’électronique tactile et une partie du matériel de l’écran
Dans le type de logiciel que je produis, je n’ai pas à me soucier de la charge thermique
La compagnie ferroviaire avait publié sur Twitter : « Il y a eu une forte congestion sur la ligne passant par Lewisham en raison de problèmes de départ causés par une forte lumière du soleil »
Elle avait aussi expliqué que le soleil bas d’hiver éclairait les moniteurs de départ, empêchant les conducteurs de les voir
Le message « J’ai enfin trouvé. C’était à cause de la lettre “E” » est amusant
Les bogues les plus simples et les plus petits sont souvent les plus difficiles à trouver. Ce matin encore, j’ai perdu une heure ou deux à traquer une erreur off-by-one
La cause était un
index + 1que j’avais oublié de modifier pendant un refactoring