Évitez le codage de fantaisie. Plus le code est compliqué, plus il y a de bogues. Habituellement, sur les systèmes modernes, un code clairement écrit sera rapide et assez petit.
Utilisez les bibliothèques disponibles. Le moyen le plus simple de ne pas avoir de bogues lors de l'écriture d'une routine utilitaire est de ne pas l'écrire.
Apprenez quelques techniques formelles pour les choses les plus compliquées. S'il y a des conditions compliquées, clouez-les avec un stylo et du papier. Idéalement, connaissez certaines techniques de preuve. Si je peux prouver que le code est correct, il est presque toujours bon, sauf pour les gros bugs, stupides et évidents, faciles à corriger. Évidemment, cela ne va que jusqu'à présent, mais parfois vous pouvez formellement raisonner sur des choses petites mais compliquées.
Pour le code existant, apprenez à refactoriser: comment apporter de petites modifications dans le code, souvent à l'aide d'un outil automatisé, qui rendent le code plus lisible sans changer le comportement.
Ne faites rien trop vite. Prendre un peu de temps à l'avance pour bien faire les choses, pour vérifier ce que vous avez fait et pour réfléchir à ce que vous faites peut être rentable plus tard.
Une fois que vous avez écrit le code, utilisez ce que vous avez pour le rendre bon. Les tests unitaires sont excellents. Vous pouvez souvent écrire des tests à l'avance, ce qui peut être une excellente rétroaction (si cela est fait de manière cohérente, il s'agit d'un développement piloté par les tests). Compilez avec les options d'avertissement et faites attention aux avertissements.
Demandez à quelqu'un d'autre de regarder le code. Les révisions de code formelles sont bonnes, mais elles peuvent ne pas être à un moment opportun. Les requêtes Pull, ou similaire si votre scm ne les prend pas en charge, permettent des révisions asynchrones. La vérification des contacts peut être un examen moins formel. La programmation par paires garantit que deux paires d'yeux regardent tout.