web-dev-qa-db-fra.com

Comment gérer la paralysie d'analyse?

Très souvent, je suis coincé lors du choix de la meilleure décision de conception. Même pour les petits détails, tels que les définitions de fonction, le flux de contrôle et les noms de variable, je passe des périodes inhabituellement longues à parcourir les avantages et les compromis de mes choix.

J'ai l'impression de perdre beaucoup d'efficacité en passant mes heures sur des détails insignifiants comme ceux-ci. Même si, je sais au fond de moi que je peux changer ces choses si ma conception actuelle ne fonctionne pas, j'ai du mal à décider fermement d'un choix.

Que dois-je faire pour lutter contre ce problème?

64
Anne Nonimus

Deux règles simples:

  1. Faites la chose la plus simple qui pourrait fonctionner.
  2. Refonte en continu.

Au fur et à mesure que vous commencerez à faire chacune de ces choses, vous aurez l'assurance que vous pouvez prendre des décisions simples maintenant sans compromettre votre capacité à réagir au changement plus tard.

N'oubliez pas que l'épreuvage futur signifie qu'il est facile de modifier le code, et non d'essayer d'anticiper toutes les modifications possibles de votre code.

36
Rein Henrichs

Habituellement, lorsque je ressens cela, cela signifie que je dois essayer:

  1. Levez-vous, promenez-vous et assurez-vous que toute la biologie fonctionne correctement.
  2. Passez à un tableau blanc et dessinez jusqu'à ce que j'aie un sentiment de confiance.
  3. Trouvez un "copain de réclamation de conception" avec qui vous pouvez simplement discuter du problème.

Si le problème concerne la syntaxe et les petits morceaux, alors:

  1. Assurez-vous que, même s'il est laid, il est bien encapsulé quelque part et représente une sorte de cruauté purement locale.
  2. Ajoutez des marqueurs TODO ou simplement des commentaires qui expliquent pourquoi le code vous dérange.
  3. Passez à la tâche suivante.
9
Darien

Il est très facile de se penser inactif. Même si vous parvenez, d'une manière ou d'une autre, à trouver la meilleure solution en ce moment qui pourrait facilement changer avant de terminer le projet, et puis quoi?

Il vaut mieux choisir une solution décente et courir avec, plutôt que de s'asseoir et de tergiverser sur ce que serait la solution meilleure. La meilleure solution est insaisissable et pire, subjective. Si les exigences changent même légèrement, votre solution peut s'avérer pire qu'une solution que vous avez rejetée car elle n'était pas la meilleure à l'époque.

6
Satanicpuppy

J'apprends à éviter la paralysie de l'analyse aussi, donc bravo à nous =) Cela arrive souvent parce que nous voulons faire le "meilleur design". En réalité, "le meilleur" est dans l'œil du spectateur. Ma formule pour éviter la paralysie de l'analyse, est d'appliquer le principe assez bon design. Comment je fais ça? J'apporte des variables comme les contraintes de temps, le calendrier et je me demande quelle est la conception la plus simple qui peut faire le travail (cela ne signifie pas le plus facile) sans compromettre la qualité, mais en même temps, je m'assure que c'est un - testable et a ouvert pour l'extension fermé pour modification (OCP) également. Qu'est-ce que je veux dire par testable et OCP? Eh bien, au lieu de chercher ce que je considérais le mieux, j'ai considéré un design qui peut me dire quand les choses vont mal et essayer de faire juste assez de code qui me permet de refactoriser et d'améliorer plus tard. En outre, essayez de séparer le code qui changera avec le code qui reste le même. La refactorisation devient plus facile, car le code qui n'est pas censé changer est plus sûr de votre avenir, vous ou quelqu'un d'autre.

5
Armando

Que diriez-vous de laisser votre sensation intestinale décider pour l'une des options? Cela devrait aller assez vite et bien combiner avec timeboxing, qui ammoQ aussi proposé . Vous pouvez essayer une limite de 1 minute si les options sont déjà établies, ou de 2 minutes si vous devez d'abord les définir. Ou tout ce qui semble approprié (défini au préalable). Lorsque vous apprenez à écouter votre instinct, votre choix intuitif deviendra plus rapide et meilleur avec la pratique .

Si vous êtes préoccupé par la possibilité de choisir de manière non parfaite, voici quelques réflexions pour y remédier:

  • S'il y avait une option avec un bord clair sur les autres, vous ne vous demanderiez pas laquelle choisir. Donc, par ce raisonnement, chaque fois que vous êtes indécis quant à un choix sur une question pas trop compliquée, cela indique que les options sont globalement tout à fait égales; il n'y a donc pas grand-chose à perdre en optant simplement pour l'un d'entre eux.
  • Cela étant dit, l'intuition n'est pas du tout aléatoire, mais une jolie bonne supposition éclairée pour la solution optimale. Souvent mieux que ce que l'on trouverait grâce à des fouilles sans fin.
  • Pour répondre au perfectionnisme, on pourrait évaluer la rapidité de décision plus élevée que l'optimalité de choix lors de l'évaluation semi-consciente de ses performances. Ce qui est parfaitement logique avec des choix sans importance, mais ce n'est pas anodin à garder à l'esprit.

Bonne chance! :)

3
Aaron Thoma

Je pense que ça part avec un peu d'expérience. La plupart de ma paralysie se produit parce que j'essaie d'imaginer à quoi ressemblera la base de code beaucoup plus loin que nécessaire, donc pour la surmonter, je fais juste la chose la plus simple possible qui fonctionnera et ensuite passer à autre chose. Une fois que le projet a une forme définie, les unités de code répétitif commencent à se démarquer et il est assez facile d'abstraire les modèles répétitifs et de simplifier le code.

2
davidk01

Habituellement, la raison pour laquelle vous ne pouvez pas décider est que la différence est insignifiante ou que vous n'avez pas suffisamment d'informations.

Dans le cas a) Fixez un délai pour proposer des options raisonnables à considérer. Ne décidez pas encore lequel. À la fin du temps, choisissez une (au hasard si aucune préférence claire) des options identifiées et une autre limite de temps. Si aucune décision claire n'est prise à la fin du temps, c'est déjà celle choisie. Commencez à coder et refactorisez si vous vous êtes clairement trompé. Si le patron vous demande pourquoi, dites "J'ai lancé une pièce, vous avez une meilleure solution?"

Dans le cas b) - vous avez besoin de plus d'informations et de vous asseoir sur votre gros gras A .... toute la journée ne va pas vous le fournir. Sortez du mode conception et passez en mode collecte d'informations. Prototypes, poser des questions, lire des revues techniques. Quoi que vous fassiez, ne dormez pas trop longtemps dessus.

1
mattnz

Je souffre du même problème. Pour les petits problèmes, la façon dont j'essaie de le résoudre est de choisir le premier design auquel je pense qui n'est pas stupide. Il ne sert à rien d'essayer de trouver une conception optimale; il est difficile, voire impossible, de raisonner sur toutes les nuances de tout design auquel vous pouvez penser sans l'écrire. Au fur et à mesure que vous codez, vous constaterez que vous pouvez apporter de petites améliorations. Bien fait, je trouve qu'il est assez facile de converger vers une solution raisonnablement bonne de cette façon.

Pour les problèmes plus importants, je pense qu'il est judicieux de réfléchir d'abord à vos options, mais de les fixer dans le temps. Les gros problèmes ont de grands espaces de solution, vous ne pouvez pas évaluer toutes les possibilités, ni essayer.

TLDR; Choisissez une solution raisonnable, améliorez-la au fur et à mesure.

Ceci est également pertinent:

Le professeur de céramique a annoncé le jour de l'ouverture qu'il divisait la classe en deux groupes. Tous ceux du côté gauche du studio, a-t-il dit, seraient notés uniquement sur la quantité de travail qu'ils produiraient, tous ceux de droite uniquement sur sa qualité. Sa procédure était simple: le dernier jour de classe, il apportait sa balance de salle de bain et pesait le travail du groupe "quantité": cinquante livres de pots classés "A", quarante livres un "B", etc. Ceux qui étaient notés sur la "qualité", cependant, devaient produire un seul pot - bien que parfait - pour obtenir un "A".

Eh bien, est venu le moment du classement et un fait curieux est apparu: les œuvres de la plus haute qualité ont toutes été produites par le groupe en cours de classement en quantité. Il semble que, tandis que le groupe "quantité" produisait des tas de travail - et apprenait de ses erreurs - le groupe "qualité" avait réfléchi à la perfection et, finalement, n'avait guère plus à montrer pour ses efforts que des théories grandioses et un tas d'argile morte.

de http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html .

1
dan_waterworth

Pour surmonter votre réticence à décider, appliquez timeboxing : réglez un réveil pour qu'il se déclenche en quelques minutes; tourmenter votre esprit jusque-là, mais lorsque l'alarme se déclenche, choisissez la meilleure option que vous avez trouvée jusque-là.

1
user281377

Créez un prototype. N'oubliez pas qu'un prototype est fait pour être jeté, donc peu importe les fonctions, le nom de variable ou même la grande architecture que vous utilisez. Vous venez de le construire pour prouver que cela fonctionne.

Une fois que vous l'avez créé et jeté, je serais prêt à parier que vous auriez plus de facilité à prendre ces décisions.

0
tylermac

Souvent, la meilleure solution est d'essayer d'expliquer votre décision à un collègue. Cependant, comme vous ne voulez pas le faire très souvent, la meilleure chose à faire est de penser sur papier - avec un papier/stylo ou une fenêtre de bloc-notes vide.

Commencez par écrire absolument n'importe quoi - juste pour entrer dans le rythme de l'écriture. Dans une fenêtre de bloc-notes, vous pouvez simplement taper "Je pense sur papier" et ensuite continuer avec un courant de conscience. Après quelques secondes, vous serez au rythme de l'écriture, alors appuyez plusieurs fois sur Entrée et commencez à expliquer votre dilemme.

Énoncez le problème, puis énoncez les solutions possibles, les avantages de chacun, etc.

Bien que cela ne fonctionne pas toujours, le processus de sortie des pensées de votre tête (RAM) et sur des supports externes (le document du bloc-notes) vous donne plus de liberté pour établir de nouvelles connexions et voir la décision sous différents angles.

0
Saqib

Je souffre aussi de ce problème. Ce que je dirais, c'est que vous n'avez pas suffisamment d'incitation à l'achèvement.

Par exemple, lorsque j'écrivais du code de rendu, j'avais une grande incitation à l'achèvement parce que je savais que si je m'y mettais, je verrais le système en action et penser à quel point j'étais génial pour texturer un quad, ou transformer un vert. Mais maintenant que je refactorise (tentative 4, si vous voulez savoir) alors je souffre car c'est beaucoup de travail et même si je termine, je vais juste voir le même vieux quad. Et je ne veux vraiment pas avoir à refactoriser à nouveau et j'en ai marre de voir le même vieux quad à plusieurs reprises, et ce n'est plus une récompense pour moi.

Vous devez le décomposer en composants et vous récompenser pour les avoir finis, même si c'est juste avec des E/S de console qui montrent que cela fonctionne.

0
DeadMG

Je lisais votre question et je pensais les choses dans la ligne des autres affiches: vous n'êtes pas adapté à ce travail; donnez-vous un délai; faites autre chose pendant un moment. Après réflexion, je ne suis pas sûr que les réponses soient vraiment utiles

Le problème avec des problèmes mentaux comme celui-ci est qu'ils ne sont pas faciles à résoudre, ils font partie de vous, et évidemment vous vous souciez (trop peut-être) de votre travail, n'avez pas la confiance nécessaire pour être d'accord avec vous-même, êtes trop inexpérimenté pour considérer que votre premier choix a toujours été le bon, ou insister trop sur le fait de le faire parfaitement. Sinon, pourquoi vous inquiéteriez-vous de ces banalités?!

Maintenant, j'ai des problèmes similaires, mais pas tellement avec le code .. généralement c'est ce qu'il faut avoir pour le dîner .. pizza ou curry .. hmm ... pizza mais le curry est sympa, mais ai-je l'impression d'être un curry, la pizza est moins chère , mais alors vous obtenez plus de curry, mais ... et ainsi de suite. :)

J'ai donc pensé - pourquoi je n'ai pas de problèmes similaires avec le codage, et je pense que c'est simplement parce que j'ai un ensemble de modèles que j'utilise régulièrement. Si j'ai besoin d'une définition de fonction, c'est facile .. ce sera dans la même veine que toutes les autres définitions de fonction que j'ai jamais codées. Si j'ai besoin d'un flux de contrôle, je décide d'abord si j'ai besoin d'une boucle for ou d'une boucle while, puis je crée le même ancien code que j'ai utilisé la dernière fois, j'avais besoin de l'une de ces choses. La même chose vaut pour tout, est-ce que je veux une file d'attente? Bien sûr - permet de couper et coller mon code de file d'attente "standard" (filtré du dernier projet sur lequel j'ai travaillé, ou de tout autre dont je me souviens avoir utilisé l'une de ces choses). Résultat final ... Je ne m'inquiète que pour de nouvelles choses, et pour être honnête, c'est un plaisir.

Donc, mon conseil est de commencer à construire une bibliothèque d'extraits de code - je les envoyais par courrier électronique à moi-même et les mettais dans un dossier mais tout ce avec quoi vous travailliez était le mieux - et ensuite vous commenceriez à savoir quoi faire à chaque fois. Vous irez toujours à l'ancien code que vous avez écrit et éliminerez le problème, prêt pour le problème suivant. Vous constaterez que vous deviendrez un développeur beaucoup plus rapide (sérieusement, c'est le seul moyen d'augmenter la productivité du programmeur) et, espérons-le, vous trouverez du temps pour les éléments amusants, pas les trucs tristes au jour le jour que vous avez déjà résolus plusieurs fois plus de.

Bien sûr, la dernière partie de tout ce qui est important aussi - plus vous avez de travail, moins vous avez de luxe à réfléchir.

0
gbjbaanb

Voici une stratégie qui combine les suggestions de Rein Henrichs (commencez simplement, refactorisez) et ammoQ (timeboxing):

  1. Donnez-vous un délai assez strict pour une première solution qui fonctionne. Par exemple. 30 secondes pour un nom de variable. Vous pouvez d'abord trouver quelque chose comme x, puis l'affiner en string, puis name jusqu'à ce que le temps soit écoulé.
  2. Ensuite, passez à d'autres tâches pendant un certain temps, par exemple 10 minutes.
  3. Ensuite, accordez-vous une autre plage horaire pour améliorer encore votre décision, par exemple à userHandle

Avantages possibles de cette approche:

  • la connaissance d'y revenir plus tard peut faciliter le lâcher prise du problème pour l'instant
  • tout en poursuivant d'autres tâches, vous pouvez simplement trouver une bonne solution satisfaisante sans fouiller longtemps
  • après avoir lâché prise après l'étape 1 et être dans le flux de l'étape 2 , il peut être facile de garder l'étape 3 très rapide, comme vous veulent continuer avec l'étape 2, et donc heureusement choisir une solution décente et l'accepter
0
Aaron Thoma

Quand j'ai fait la recherche et qu'il ne me reste pas de meilleur choix clair, je me donne un délai (généralement 5 minutes) pour en choisir un, puis continuez avec. Même lorsque vous rencontrez des obstacles, à ce stade, il n'y a aucune garantie, vous n'auriez pas atteint un obstacle égal en prenant une décision différente. Je ne peux pas penser à un moment où j'ai regretté ma décision.

0
John MacIntyre