TL;DR: La stratégie que j’essaye (et que je te suggère) d’adopter tient en 3 mots très simples : get shit done.
Ça veut dire :
-
T’efforcer à chaque instant de faire le code le plus simple (simple != facile) auquel tu puisses penser pour ajouter une valeur immédiate à ton code du point de vue de l’utilisateur.
-
Préférer rendre ton code testable et écrire des tests automatiques pour les trucs importants, plutôt que chercher le raffinement ou l’élégance dans son design. À choisir, les tests garantissent
que le code fonctionne, et donc qu’il sert à quelque chose, là, tout de suite ; c’est plus important qu’un design pensé pour ce à quoi ton code servira un jour, peut-être, ou pas.
-
Foncer et ne pas avoir peur de faire des erreurs, dès lors que tu tires des leçons de chaque erreur que tu fais.
Parce qu’un code, tu ne connais jamais sa durée de vie. Un projet peut mourir demain. Le but de ton code est d’être utile tout de suite. Même un tout petit peu.
Ok plus en détails :
La qualité du code est un sujet super sensible. Tout le monde a une opinion plus ou moins étendue, plus ou moins partagée sur ce qu’est un code de qualité. Ce que je te conseille, c’est, au lieu de demander quoi ou comment, de revenir au pourquoi.
Pourquoi vouloir un code de qualité ?
Ma réponse serait la suivante (par ordre de priorité) :
- Pour éviter que mon soft ne pète en prod à la tronche du client ou de l’utilisateur.
- Pour ne pas du tout galérer quand je cherche à le débugger.
- Pour ne pas trop galérer si je veux ajouter, modifier ou refaire une fonctionnalité.
- Pour que d’autres que moi puissent bosser dessus.
Des deux premiers points, je déduis qu’un code de qualité est un code testé, ce qui implique qu’il soit testable. Sans être partisan du TDD ni du 100% de coverage, ton code est de qualité si c’est facile d’écrire des tests automatiques sur ses parties les plus critiques, et si ces tests sont écrits et tournent à chaque modif du code. Si c’est chiant d’écrire un test, alors il faut peut-être repenser le code.
Le troisième point demande de l’expérience : il faut éviter que le moindre bout de code dépende de tout le reste de ton programme. Dans l’idéal, tu dois pouvoir le prendre, le récrire, et le rebrancher dans le programme en n’impactant pas (ou très peu) le reste (les tests sus-mentionnés sont d’une aide inestimable pour ça d’ailleurs).
Le dernier point impose que le code soit intelligible et documenté avec des commentaires utiles qui expliquent comment le tout a été pensé et organisé.
Alors bien sûr à tout cela tu vas ajouter des détails, des bonnes pratiques, des design patterns… Qui sont tous sujets au gré du vent et à la mode (quand j’avais 25 ans, on ne jurait que par les design patterns, aujourd’hui on revient de la POO et on aime les choses KISS, hier on créait des frameworks qui faisaient tout et plus encore, aujourd’hui on ne jure presque plus que par le modulaire et le micro-service…). En réalité c’est l’expérience et tes erreurs qui priment : tu feras des erreurs, tu ne peux pas l’empêcher, mais tu peux apprendre de ces erreurs à chaque fois et c’est ça qui compte.
Cela implique aussi un truc important : il ne faut pas tomber dans le travers qui consiste à penser qu’un code doit être parfait du premier coup. Il doit fonctionner et être facile à tester. C’est tout. Inutile de se palucher une semaine sur le design pour deux heures d’implémentation : tu ne peux pas prévoir quand (ni même si) tu auras besoin d’y retoucher. L’attitude intelligente, dans ces conditions, est de faire le minimum d’efforts pour satisfaire les quatre points plus haut.
Alors avec ça, savoir qu’il existe telle classe, tel pattern, telle bibliothèque qui fait le boulot pour toi, c’est complètement secondaire. Quand tu le sais, la seule chose que ça te fait gagner, c’est du temps. Si tu le découvres alors que ton code est déjà fait, c’est pas un drame : tu le gardes sous le coude pour le jour où tu devras y retoucher. C’est inutile de faire une fixation sur ce genre de choses : ce qui compte ce sont les choix que tu fais à partir ce que tu connais à l’instant T, et les leçons que tu tires de leurs conséquences. Si tu passes littéralement tout ton temps à chercher avidement à connaître plus de choses, c’est autant de temps en moins passé à mûrir tes choix et faire les erreurs dont tu as besoin pour avancer.