C ? C++ ? ocaml ? perl ?
Dans la série des articles sur la vie du Geek, voici ma vision des langages de programmation…
qualités du programmeur
Je vois souvent des gens (pas plus tard qu'hier, sur ce même blog) dire : si tu utilises le langage foo c'est pas surprenant que tu fasses des trucs qui plantent, utilise plutôt bar. Ce genre d'affirmation est souvent fausse. Pour faire un bon programme, il faut avant tout un bon … programmeur. Le langage n'est que l'outil que le programmeur choisira pour implémenter tel ou tel programme.
Et un bon programmeur a entre autres ces qualités :
- en toute chose de la méthode et beaucoup de rigueur ;
- de la persévérance ;
- de l'humilité ;
- de la mémoire ;
- de bons outils.
Un bon programmeur sait écrire un programme C sans memory leak, parce qu'il a appliqué rigoureusement des règles de programmation qu'il s'est crée au fil de son expérience. Un participant régulier de fr.comp.lang.c a en signature :
C is a sharp tool.
Avec C, il est facile de se tirer dans le pied. Et justement, un bon programmeur sait se servir de C, connaît ses pièges et ses forces, et ne se prend pas les pieds dans ses travers. En ce sens, je rejoins beaucoup l'esprit de ce billet de Joel Spolsky.
qualités du code
le langage
Après, bien sur, chaque programmeur a son langage de préférence, que ça soit C++, caml, C, python. Mais ces langages ne font pas le programmeur (même pas ocaml). Même si le mauvais programmeur a bien plus de chances de faire planter un programme qu'il écrit en C, plutôt qu'en ocaml, il n'en écrira pas moins du code incorrect. C'est juste que son code ne fera pas de buffer overflow ou autre faille exploitable en sécurité.
Il est clair que certains langages sont plus propice aux erreurs que d'autres. Perl par exemple, est le langage dont la syntaxe pousse à la faute. Java et tous ses outils auto-générateurs de code est le langage dont la philosophie et la culture veut qu'on fasse des sources avec un nombre de lignes de code et de platrée de trucs inutiles qui dépasse l'entendement. C++ a aussi ce défaut. Chaque langage a ses pièges, et dès qu'on tombe dedans, certes, on n'écrit pas forcément du code qui SEGFAULT, mais on écrit quand même de la merde.
rigueur de la présentation
Vous savez comment je sais si un programmeur est bon au premier abord ? je regarde (j'ai bien dit regarder et pas lire) du code qu'il a écrit. Et je regarde la cohérence de sa présentation. Un bon programmeur sait intuitivement que le plus important en programmation, est d'avoir une présentation cohérente et systématique. Parce que en programmation, ce qui n'est pas habituel, ce qui sort de l'ordinaire, c'est :
- soit un bug ;
- soit quelque chose auquel il faut toujours faire attention, et qui souvent mérite un commentaire.
Quelqu'un qui sait s'astreindre à respecter une indentation propre, un code en moins de 80 colonnes, trier ses fonctions pour minimiser le tas de forward en début de module, utilise des fonctions d'allocation systématiquement pour toutes ses structures (même si c'est une macro sur memset), etc … est une personne qui mettra 10 fois moins de temps à trouver ses bugs qu'un autre, et qui en plus en écrira sans doute moins. Et c'est souvent un bon programmeur. Le mauvais programmeur, c'est celui qui en me lisant, dit «à quoi bon» et hausse les épaules.
illustration
Je vais donner un exemple, pour illustrer de quelle finesse dans la systématisation de la présentation du code il faut descendre: C'est aussi celui qui écrit tantôt:
for (i = 0; i < n; ++i) {
tantôt:
for (i = 0; i <= n - 1; i++) {
a deux problèmes.
Le premier est qu'il ne sait pas se décider entre ++i et i++. Bien sur sémantiquement, dans le cas précédent, ils sont équivalents. Mais ça n'est pas une justification. Lorsque je lis la première version, mon réflexe de programmeur est de me demander “pourquoi ++i ?”. En effet, il se trouve que à mon avis (mais je ne serai pas aussi affirmatif que le reste du billet sur ce genre de choses) l'idiome est i++, à cause de formules idiomatiques du genre :
while (…) {
*p++ = *q++;
}
D'autre part, le programmeur n'est pas d'accord avec lui même sur comment il présente ses intervalles de parcours. [0..n[ ou [0..n-1] ? Vous trouvez ça ridicule ? réfléchissez deux seconde à ce qu'est un buffer overflow, et on en reparle.
Bref, il existe deux présentations valables :
for (i = 1; i <= n; i++) {
ou (et ce ou est exclusif) :
for (i = 0; i < n; i++) {
Et si il faut sortir avec des conditions plus particulières, alors il faut les tester DANS le for, en faisant un break; si besoin.
Pourquoi tout ça ? parce que ça suit la règle de la moindre surprise. Plus le code est prévisible, moins il a de chances de contenir un bug. Si tous vos for sont for (i = 0; i < n; i++) {, pour valider cette ligne, il vous suffit de valider que n est la bonne borne, et ensuite vous pouvez vous concentrer sur le reste du code. Bref, il n'y a qu'une variable à vérifier sur la ligne. Pas toute la ligne.
La présentation systématique du code permet la lecture cursive, et fait que en regardant un code écrit il y a plus de 3 mois, on voit tout de suite quelles parties du code contiennent sa substance, et quelles parties sont de la glue administrative sans intérêt.
Conclusion
Pour moi, un bon programmeur c'est quelqu'un qui a lu ce billet et n'y a rien appris, et trouve ce que je dis d'une évidente banalité. Pas celui qui choisit C++, C ou quoi que ce soit d'autre.

Commentaires
1. Le Wednesday 22 March 2006 à 15:00, par pouype :: site
2. Le Wednesday 22 March 2006 à 15:13, par MadCoder :: site
3. Le Thursday 23 March 2006 à 01:47, par palpatine :: site
4. Le Thursday 23 March 2006 à 09:20, par Jean-Damien
5. Le Thursday 23 March 2006 à 10:11, par MadCoder :: site
6. Le Thursday 23 March 2006 à 12:16, par Jean-Damien
7. Le Thursday 23 March 2006 à 19:04, par palpatine :: site
8. Le Thursday 23 March 2006 à 20:14, par MadCoder :: site
9. Le Friday 24 March 2006 à 07:31, par palpatine :: site
10. Le Friday 24 March 2006 à 10:26, par MadCoder :: site
11. Le Saturday 25 March 2006 à 00:29, par palpatine :: site
12. Le Tuesday 4 April 2006 à 01:20, par Krunch :: site
13. Le Tuesday 4 April 2006 à 08:14, par MadCoder :: site
14. Le Tuesday 4 April 2006 à 15:33, par Krunch :: site
Ajouter un commentaire