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?
Deux règles simples:
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.
Habituellement, lorsque je ressens cela, cela signifie que je dois essayer:
Si le problème concerne la syntaxe et les petits morceaux, alors:
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.
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.
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:
Bonne chance! :)
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.
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.
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 .
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à.
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.
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.
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.
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.
Voici une stratégie qui combine les suggestions de Rein Henrichs (commencez simplement, refactorisez) et ammoQ (timeboxing):
x
, puis l'affiner en string
, puis name
jusqu'à ce que le temps soit écoulé.userHandle
Avantages possibles de cette approche:
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.