web-dev-qa-db-fra.com

Comment surmonter la programmation par coïncidence?

Dans le livre le programmeur pragmatique , les écrivains mentionnent le programmation par coïncidence Concept. Cela explique ce que c'est, pourquoi il est causé, quels sont les dangers que vous pouvez rencontrer et se compare avec un champ de mine à la mine dans une guerre.

Avez-vous déjà regardé de vieux films de guerre en noir et blanc? Le soldat fatigué avance avec prudence de la brosse. Il y a une clairière à l'avance: y a-t-il des mines terrestres, ou est-ce sans danger pour croiser? Il n'y a aucune indication qu'il s'agit d'un champ de mines - aucun signe de mines, de fil de fer barbelé ou de cratères. Le soldat pousse le sol devant lui avec sa baïonnette et ses ecles, attendant une explosion. Il n'y en a pas. Ainsi, il procède minutieusement à travers le champ pendant un certain temps, poussant et piquant comme il va. Finalement, convaincu que le champ est sûr, il se redresse et marche fièrement en avant, seulement pour être soufflé en morceaux.

Les premières sondes du soldat pour les mines n'ont rien révélé, mais c'était simplement chanceux. Il a été conduit à une fausse conclusion - avec des résultats désastreux.

En tant que développeurs, nous travaillons également dans les champs de mines. Il y a des centaines de pièges à attendre pour nous attraper chaque jour. Se souvenir du conte du soldat, nous devrions nous méfier de tirer de fausses conclusions. Nous devrions éviter la programmation par coïncidence-comptant de la chance et des succès accidentels - en faveur de la programmation délibérément ...

Mais je ne suis pas vraiment satisfait de la façon dont ils décrivent le problème "Comment la surmonter". Ouais, vous devez penser à l'avance avant d'écrire le code, mais comment pratiquer cela? La seule chose à laquelle je peux penser consiste à ajouter des fonctionnalités aux projets open source existants, où vous devez avoir des connaissances sur la "ce que je fais maintenant" et "comment les autres pièces de code travaillent", et ce n'est pas le cas échéant quand vous écrivez vos propres projets.

ÉDITER:

un résumé de vos messages:

  • Ne devinez pas votre prochain mouvement, prouvez qu'il est correct
  • Test de l'unité et refacteur autant que possible, si nécessaire
  • Ajouter des fonctionnalités-Compiler-test souvent
  • Si vous ne pouvez pas expliquer le code à un noob, vous programmez probablement par coïncidence.

BTW, il est difficile d'accepter une réponse, c'est vraiment difficile. Toutes les réponses sont vraiment géniales :)

24
py_script

Il se résume à peu près à ne devinez pas. La plupart des nouveaux programmeurs le font, mais j'ai vu des anciens combattants le faire aussi, car ils pensent que cela permet d'économiser du temps de recherche. Quelque chose ne fonctionne pas, alors vous ajoutez un +1 ou un -1, modifier A true à un false ou inversement, réorganisez quelques états, ajouter ou modifier des retards, modifier les priorités de thread et d'autres petites transformations, testez essentiellement des permutations aléatoires jusqu'à ce qu'il fonctionne.

Cela s'applique principalement à la modification du code existant, mais est également un facteur de nouveau code, car personne ne commence vraiment à partir de zéro. Vous construisez toujours sur les bibliothèques, les systèmes d'exploitation ou au moins d'architectures de processeur.

En d'autres termes, vous n'êtes pas fait jusqu'à ce que vous sachiez Pourquoi Votre solution fonctionne. Le chemin que vous prenez pour y arriver n'a pas beaucoup d'importance. Même des permutations aléatoires peuvent parfois être utiles pour réduire un bug difficile à diagnostiquer, tant que vous prenez le temps après vous demander: "D'accord, le changement fidèle à faux, mais pourquoi?"

42
Karl Bielefeldt

Le commentaire le plus effrayant que j'ai jamais rencontré dans un programme était

Ne touche pas ça. Ça marche. Nous ne savons pas comment et pourquoi, mais ça marche.1

et il est effrayant simplement parce qu'il reconnaît que la pièce de code était le résultat de Programmation par coïncidence.

Pour éviter la programmation par coïncidence, vous devriez pouvoir expliquer (à un collègue, vous-même ou n canard en caoutchouc ) exactement Quoi Le code fait et pourquoi ça marche. Les balles de programmation pour la programmation deviennent principalement de l'aide à adopter dans cet objectif de pouvoir expliquer le code.


1Pour le contexte, ce commentaire est apparu dans le code qui gère les commutateurs contextuels dans un système d'exploitation primitif. Le code avait déjà été en production depuis plusieurs années lorsque je l'ai rencontrée.

16

Pour les nouveaux programmeurs, la partie la plus importante de la surmontée est de bien comprendre ce qu'ils font.

Dans de nombreux domaines, lorsque vous ne savez pas comment faire quelque chose, vous venez d'aller d'essai et d'erreur. Essayer quelque chose; Si cela fonctionne, super, sinon, essayez autre chose.

Dans la programmation, surtout lors de l'utilisation d'une langue qui a le concept de comportement non défini (comme C ou C++), cette approche ne fonctionne tout simplement pas, car le succès n'est plus une décision booléenne. Vous pouvez avoir des choses qui "genre de travail", qui fonctionnent parfois, qui travaillent pour certaines intrants, mais pas d'autres.

J'ai eu l'occasion de nouveaux programmeurs tutored et la tendance à essayer de taper des choses aléatoires à voir si cela fonctionne est courant. Ils taperaient une ligne, puis se tournent vers moi et demandent: "Cela fonctionnerait-il de cette façon?" Bien qu'il soit clair qu'ils n'avaient absolument aucune idée de savoir si cela pourrait.

L'emporter est que, comme un nouveau programmeur, vous devez vraiment être capable d'expliquer ce que fait votre code. Vous devez apprendre à lire le code, pas seulement l'écrire.

(Bien sûr, cela s'applique également aux programmeurs chevronnés, mais mon expérience ici a été principalement avec de nouveaux débutants complets.)

7
Sebastian Redl

Il est beaucoup trop facile à coder, à tester et à corriger "sur la ligne de course". Vous avez des fonctionnalités qui ont donné X & Y, produisent Z. mais si x est corrompu et y n'est pas disponible? Et si vous êtes incapable de produire z? Vous avez constamment à l'esprit ce qui peut se tromper et en faire une note pour le cycle de test.

Gardez vos routines courtes et descriptives - le meilleur code nécessite peu de commentaires (le cas échéant).

La méthode significative, les noms de classe et de variables vont un long chemin à aider à la lisibilité.

Si vous rencontrez une odeur de code, arrêtez-vous. Cette odeur est peu susceptible de disparaître et un petit effort pourrait maintenant vous faire économiser une énorme quantité de chagrin plus tard.

Inclure les tests dans votre processus de développement. Je préconiserais l'utilisation de [~ # ~] bdd [~ # ~ ~] plutôt que TDD car il vous oblige à Décrivez ce que vous visez à réaliser plutôt que de compter aveuglément sur un radeau de tests qui pourraient vous donner un faux sentiment de sécurité.

Résistez à l'envie d'ajouter des fonctionnalités extra cool (à moins que ce soit votre propre projet d'animal de compagnie). Tout code supplémentaire doit être conçu, écrit, testé et maintenu. Si le client/l'entreprise n'est pas requis, vous risquez de devenir un vidange énorme sur vos ressources.

2
Robbie Dee