Extrait de l'émission CPU release Ex0191 : lost + found (fin de saison printemps 2022).
C'est l'une des guerres picrocholines des plus tenaces parmi la gente informatique : doit-on utiliser des espaces ou des tabulations pour faire l'élégante indentation de nos codes source ?
Si vous trouviez les repas de famille avec votre grand-oncle raciste comme étant gavants, vous ne connaissez pas le niveau d'animosité qui peut monter de cette bête question sur la manière de décaler des blocs de code vers la droite. À côté, les dreyfusards et antidreyfusards ne sont pas allés jusqu'à guillotiner un innocent !
Mais cela va se voir que j'ai déjà un avis tranché, et on va couper court pour aller vers le débat du jour.
Commençons par la problématique :
Dans le code source d'un programme, ou dans un format de document basé sur le texte (genre fichier de configuration), quand on intervient dessus, on a besoin d'isoler visuellement les imbrication de blocs. De savoir que telle boucle s'inclut dans telle brique, et que celle-ci se met dans tel bloc.
En plus de sauts de lignes, on utilise un subtil décalage vers la droite de chaque bloc, ce que l'on appelle l'indentation.
C'est un peu comme une citation au sein d'un paragraphe d'un livre. Sauf qu'en informatique, il n'est pas rare d'avoir plus de 4 niveaux d'indentations, et cela peut même aller jusqu'à une vingtaine (des fois pour de mauvaises raisons).
Et toute la question est de savoir comment on effectue cette indentation. Voyons déjà les deux options possibles :
Pour commencer, ␣ l'espace, frontière finie entre deux mots. Du moins, c'est l'usage commun, car les développeurs accumulent des espaces en début de ligne pour ␣␣␣␣décaler le texte vers la droite. Déjà, soyons très précis, on met pas un espace, mais une espace. Oui, en typographie, ce caractère vide mais néanmoins pas sans volume est féminin.
La tabulation ⇥, elle, est une invention de la machine à écrire. Mécaniquement, on a une règle avec des taquets qu'on positionne manuellement en fonction de ses souhaits de retrait. On appuie sur une touche et le chariot avance jusqu'au taquet suivant.
Donc est-ce que la tabulation fait 5 ou 15 espaces ? ben à l'origine, c'était à la liberté de chaque individu, et pas forcément d'une largeur constante : On s'en servait pour écrire rapidement des entêtes de courrier, un retrait de première ligne de paragraphe ou des tableaux dans une facture. C'est avec l'arrivée des premiers terminaux informatiques que sa largeur a été fixée arbitrairement à 8 espaces, pour une largeur d'écran de 80 colonnes. Ce qui fait 10 tabulations, et aucun jeu de mot pour l'immortaliser.
Une largeur fixe qui le restera jusqu'à l'arrivée des premiers éditeurs textes visuels.
La touche tabulation ↹, elle, est devenue dans l'informatique une touche pratique pour faire changer de champ dans un formulaire complexe. Ce qui l'a décorélé du caractère de tabulation, qui est certes un caractère de contrôle, mais un caractère visuel, affichable
jusque-là.
Et justement… la touche tabulation ↹ est fabuleuse dans un navigateur web pour naviguer sur une page, mais le caractère tabulation n'a jamais été définie dans le langage HTML. D'ailleurs, deux espaces consécutifs dans un document HTML sont confondus, c'est une des conséquences pour garder l'indentation du code source HTML non visible à l'utilisation.
Et où les devs trouvent supports de formations, antisèches et autres trucs et astuces qui font professionnel
? Sur Stack Overflow, qui est un site web… et qui donc ne peut gérer la tabulation en affichage et n'utilise donc que des espaces insécables.
Oui, le Ctrl+I est l'oublié du principal langage de présentation de notre époque.
Et dans le code source ?
Les premières indentations de code sont arrivées dans les années 1960s, et la binarité que ce que la wikipedia anglophone qualifie de quasi-guerre de religion
n'est rien à côté de la multitude de règles de mise en forme possibles sur, par exemple, où mettre les accolades { }
.
Alors je le rappelle : le compilateur n'en n'a rien à faire de la présentation du code source, ce ne sont que des rodomontades d'humains sur un concept très vague d'esthétique, de Nombre d'Or ou de T
dans Télérama. À côté, les débats dans l'émission Cross-Over le samedi à midi sur Radio <FMR> sont nettement plus compréhensibles que l'analyse du film « Top Gun Maverick dans le mensuel Cinéma et Psychologie.
Mais entre les humains qui parlent en code avec leur ordinateur, y'a pas de demi-mesures : soit tu utilises des espaces, soit tu mets des tabulations pour bien indenter, mais tu ne fais jamais un mélange des deux. Parce que les deux bords du spectre politique sur le sujet vont te tomber dessus et même se mettre d'accord pour te tapper dessus.
En fait, les ayatollahs de la bonne indentation ont souvent des outils, qu'on appelle abusivement linter
, mais qu'il vaut mieux parler en tant que prettifier
ou beatifier
du code, qui feront en sorte que l'indentation corresponde aux canons de la paroisse chez qui tu es.
Et les règles changent selon les langages, les projets, les équipes et les entreprises !
D'ailleurs, à ce sujet, quelle est la recommandation en fonction des langages de code source ?
- Dans le langage C, il existe de très nombreuses conventions. Celles de Indian Hill, laboratoire de AT&T contributeur au langage C, la recommandation est la tabulation ;
- alors que pour son lointain enfant C#, Microsoft recommande 4 espaces en sa chapelle : une pour Windows, une pour MS-Office, une pour XBox et une pour Azure ;
- En PHP, le guide de bonnes pratiques PSR-2 précise que l'on doit toujours utiliser des espaces, et très exactement 4 espaces, jamais de tabulations ;
- En Java, l'éditeur actuel du langage Oracle recommande des indentations de 4 ou 8 espaces selon le contexte (conditionnelle ou scope), mais se refuse à spécifier une fois pour toutes si ce sont des espaces ou des tabs ;
- En Go, le langage a un outil,
gofmt
, qui utilise des tabulations mais met des espaces pour aligner à l'intérieur de la ligne. Mais en gros, à gauche, c'est des tabulations et donc au centre, y'a des tabs (le fait qu'on enregistre entre deux tours de législatives n'a sritctement rien à voir) ; - Rust a aussi son outil de reformatage maison et impose 4 espaces. Et pas plus de 100 colonnes par ligne ;
- Javascript a de multitudes de recommandations, mais la plus fréquente est d'utiliser des espaces, théoriquement entre 2 et 4, mais en s'alignant sur la parenthèse ouvrante d'une fonction… Je vous laisse deviner le foutoir ;
- et le plus exigeant sur les indentations : Python. Bon alors déjà, si tu mixes espaces et tabulations dans l'indentation, l'interpréteur explose en vol sans t'expliquer la vraie raison. Ensuite, figurez-vous que le créateur du langage Python Guido van Rossum recommande dans sa bulle papale PEP-8 d'utiliser 4 espaces. C'est définitif, parce que y'a qu'une seule
pythonic way
, même si le langage accepte 14 solutions différentes. Bref, faites ce que je dis, pas ce que je fais.
Et dans les faits ?
En 2016, Felipe Hoffa, à l'époque développeur chez Google sur une base big-data, parse 400 000 projets disponibles en open source chez Github, et en a fait des stats pour déterminer quelle convention domine sur 14 téra-octets de code source ouvert.
Spoiler : ce sont les espaces.
Alors je me suis longtemps marré de cette guerre où chacun repasse derrière les autres pour changer les règles, chacun avec son argument le plus oiseux.
Genre selon Stack Overflow, les développeurs qui utilisent les espaces sont mieux payés que ceux qui utilisent des tabulations
, ou quand tu copies colles un code-source à espaces, faut tout ré-indenter
, ou bien au moins, la largeur d'une espace est normée
ou encore selon GreenIT et Shift Project, la tabulation génère moins de CO₂ qu'un code source utilisant des espaces à foison
,
et on va jusque dans les querelles amoureuses, comme ce truculent épisode de la série HBO « Silicon valley » (Bachmanity Insanity, épisode 6 de la 3ème saison), où deux nerds tombent amoureux l'un de l'autre mais dont la scène de rupture sera, vous l'aurez deviné, sur le mode d'indentation de leurs code sources respectifs, sur des projets qu'ils n'ont même pas en commun !!!!
Et d'ailleurs, rien que le thread sur Reddit qui parle de cette scène part immédiatement dans les tours.
Car si le code source est un programme informatique destiné à être écrit, lu et relu par les humains (à quelques exceptions près comme Python et YAML, la machine se fout royalement de l'indentation du source), sa mise en forme tient parfois de l'hubris :
Le code source de mon projet tient dans 80 colonnes de large, et les indentations font 8 espaces, c'est la seule manière de m'assurer que vous ferez pas plus de 4 niveaux d'indentations !
Sauf que si du coup l'équipe utilise des abréviations pour les noms de variables et de fonctions, je me demande si c'est vraiment si lisible que ça. On va se rappeler que la limite des 80 caractères par ligne est due à la largeur des fiches perforées d'IBM en 1928… Et que oui, avoir des lignes moins longues aide à la lisibilité, mais chacun est libre de paramétrer son IDE comme il le sent.
Et puis un jour, je suis tombé sur l'argument imparable, celui qui m'a refait basculer de religion, et peut être définitivement :
C'est l'histoire d'un dev, Chase Moskal, qui arrive en 2018 dans une entreprise où les tabulations sont utilisées. Il commence à pondre du code avec des espaces et à évangéliser sa manière d'indenter. Et là, c'est pas un mais deux autres devs qui viennent le voir pour lui dire que c'est une très mauvaise idée.
L'un utilise une police de caractère gigantesque et sa tabulation fait 1 espace, l'autre utilise une tabulation de 8 espaces. Les deux ont des soucis de vision, et ne peuvent faire autrement. En gros, utiliser les espaces leur rend la vie beaucoup trop compliquée, alors que les tabulations permettent à chacun d'avoir leur confort personnel sans polluer la vie des autres.
Comme le dit tout contrit Chase Moskal sur Reddit :
la constance à travers les environnementsest exactement leur problème : ils ont des besoins différents des votres […]
Depuis ce moment de gène personnelle, je ne peux m'imaginer d'indenter du code avec des espaces avec l'idée préconçue quepersonne avec un handicap visuel n'aura jamais à toucher mon code, car c'est tout simplement ridicule, spécialement dans l'open-source.
Alors oui, j'indente en tabulations, et si la largeur te convient pas, tu re-règles la largeur à ta convenance dans ton IDE.
Texte : Da Scritch
Voix complémentaires : Solarus et Infested Grunt.
Illustration graphique : Indentation du code source de cpu-audio. CC-By Da Scritch.