it-swarm.dev

Wie gehe ich mit Analyse-Lähmungen um?

Sehr häufig stecke ich bei der Auswahl der besten Designentscheidung fest. Selbst für kleine Details wie Funktionsdefinitionen, Kontrollfluss und Variablennamen verbringe ich ungewöhnlich lange Zeit damit, die Vorteile und Kompromisse meiner Auswahl zu untersuchen.

Ich habe das Gefühl, dass ich viel an Effizienz verliere, wenn ich meine Stunden mit unbedeutenden Details wie diesen verbringe. Obwohl ich im Hinterkopf weiß, dass ich diese Dinge ändern kann, wenn mein aktuelles Design nicht funktioniert, habe ich Probleme, mich für eine Wahl zu entscheiden.

Was soll ich tun, um dieses Problem zu bekämpfen?

64
Anne Nonimus

Zwei einfache Regeln:

  1. Machen Sie das Einfachste, was möglicherweise funktionieren könnte.
  2. Refactor kontinuierlich.

Wenn Sie anfangen, all diese Dinge zu tun, gewinnen Sie das Vertrauen, dass Sie jetzt einfache Entscheidungen treffen können, ohne Ihre Fähigkeit zu beeinträchtigen, später auf Änderungen zu reagieren.

Denken Sie daran, dass Zukunftssicherheit bedeutet, dass das Ändern von Code einfach ist und nicht versucht wird, alle möglichen Änderungen Ihres Codes zu antizipieren.

36
Rein Henrichs

Wenn ich mich so fühle, muss ich normalerweise Folgendes versuchen:

  1. Stehen Sie auf, gehen Sie herum und stellen Sie sicher, dass die gesamte Biologie in Ordnung ist.
  2. Gehen Sie zu einem Whiteboard und zeichnen Sie, bis ich ein Gefühl des Vertrauens bekomme.
  3. Finden Sie einen "Design Reklamationskumpel", mit dem Sie das Problem einfach besprechen können.

Wenn das Problem Syntax und kleine Teile betrifft, dann:

  1. Überzeugen Sie sich selbst, dass es, auch wenn es hässlich ist, irgendwo schön eingekapselt ist und eine rein lokale Art von Cruft darstellt.
  2. Fügen Sie TODO-Marker oder nur Kommentare hinzu, die erklären , warum der Code Sie nervt.
  3. Fahren Sie mit der nächsten Aufgabe fort.
9
Darien

Es ist sehr leicht, sich in Untätigkeit zu versetzen. Selbst wenn Sie es irgendwie schaffen, die beste Lösung zu finden im Moment, die sich leicht ändern kann, bevor Sie das Projekt abschließen, und was dann?

Es ist besser, eine anständige Lösung auszuwählen und damit zu laufen, als darüber zu sitzen und darüber nachzudenken, was die beste Lösung wäre. Die beste Lösung ist schwer fassbar und schlimmer, subjektiv. Wenn sich die Anforderungen auch nur geringfügig ändern, ist Ihre Lösung möglicherweise schlechter als eine Lösung, die Sie verworfen haben, weil sie zu diesem Zeitpunkt nicht die beste war.

6
Satanicpuppy

Ich lerne auch, Analyse-Lähmungen zu vermeiden, also ein großes Lob an uns =) Dies passiert oft, weil wir das "beste Design" machen wollen. In Wirklichkeit ist "am besten" liegt im Auge des Betrachters. Meine Formel zur Vermeidung von Analyse-Lähmungen lautet, das gut genug Design Prinzip anzuwenden. Wie mache Ich das? Ich bringe Variablen wie Zeitbeschränkungen mit, plane und frage mich, was das einfachste Design ist, mit dem die Arbeit erledigt werden kann (dies bedeutet nicht das einfachste), ohne die Qualität zu beeinträchtigen, aber gleichzeitig stelle ich sicher, dass dies ein - testbar und ein offen für Erweiterung geschlossen für Modifikation (OCP) Design ebenfalls. Was meine ich mit testbar und OCP? Anstatt nach dem zu suchen, was ich für das Beste hielt, habe ich ein Design in Betracht gezogen, das mir sagt, wann die Dinge schlecht laufen, und versucht, gerade genug Code zu erstellen, damit ich ihn später umgestalten und verbessern kann. Außerdem versuchen Sie, den Code, der sich ändert, von dem Code zu trennen, der gleich bleibt. Refactoring wird einfacher, da der Code, der sich nicht ändern soll, vor Ihrer Zukunft für Sie oder eine andere Person sicherer ist.

5
Armando

Wie wäre es, wenn Sie Ihr Bauchgefühl für eine der Optionen entscheiden lassen? Das sollte ziemlich schnell gehen und sich gut mit Timeboxing kombinieren lassen, was ammoQ auch vorgeschlagen . Sie können ein Limit von 1 Minute versuchen, wenn die Optionen bereits eingerichtet sind, oder 2 Minuten, wenn Sie sie zuerst definieren müssen. Oder was auch immer angemessen erscheint (vorher definiert). Wenn Sie lernen, auf Ihren Bauchgefühl zu hören, wird Ihre intuitive Auswahl schneller und besser mit Übung.

Für den Fall, dass Sie sich Sorgen über die Möglichkeit machen, nicht perfekt zu wählen, finden Sie hier einige Überlegungen, um dies zu beheben:

  • Wenn es eine Option mit einem klaren Vorteil gegenüber den anderen gäbe, würden Sie sich nicht fragen, welche Sie wählen sollen. Wenn Sie sich also nicht für eine Entscheidung in einer nicht allzu komplizierten Angelegenheit entscheiden, bedeutet dies, dass die Optionen insgesamt ziemlich gleich sind. es gibt also nicht viel zu verlieren indem man sich einfach für einen von ihnen entscheidet.
  • Davon abgesehen ist Intuition überhaupt nicht zufällig, sondern eine hübsche gute, fundierte Vermutung für die optimale Lösung. Oft besser als das, was man sich durch endloses Stöbern einfallen lassen würde.
  • Unter Berücksichtigung des Perfektionismus könnte man die Schnelligkeit der Entscheidung höher bewerten als die Optimalität der Wahl, wenn man seine Leistung halbbewusst bewertet. Was bei unwichtigen Entscheidungen durchaus Sinn macht, aber nicht trivial ist.

Viel Glück! :) :)

3
Aaron Thoma

Ich denke, es geht mit ein wenig Erfahrung weg. Der größte Teil meiner Lähmung geschieht, weil ich mir vorstelle, wie die Codebasis viel weiter vorne aussehen wird, als ich brauche. Um sie zu überwinden, mache ich einfach das Einfachste, was funktioniert, und gehe dann weiter. Sobald das Projekt eine bestimmte Form hat, fallen die sich wiederholenden Codeeinheiten auf und es ist einfach genug, die sich wiederholenden Muster zu abstrahieren und den Code zu vereinfachen.

2
davidk01

Normalerweise können Sie sich nicht entscheiden, ob der Unterschied unbedeutend ist oder ob Sie nicht über genügend Informationen verfügen.

Falls a) Legen Sie ein Zeitlimit fest, um angemessene Optionen zu finden. Entscheide dich noch nicht für welches. Wählen Sie am Ende der Zeit eine (zufällig, wenn keine eindeutige Präferenz) der identifizierten Optionen und ein anderes Zeitlimit aus. Wenn am Ende der Zeit keine klare Entscheidung getroffen wird, ist es die bereits gewählte. Starten Sie die Codierung und überarbeiten Sie sie, wenn Sie eindeutig etwas falsch gemacht haben. Wenn der Chef fragt, warum, sagen Sie "Ich habe eine Münze geworfen, haben Sie einen besseren Weg?"

In Fall b) - brauchen Sie mehr Informationen, und wenn Sie auf Ihrem großen Fett A sitzen ... wird der ganze Tag diese nicht liefern. Verlassen Sie den Entwurfsmodus und wechseln Sie in den Informationserfassungsmodus. Prototypen, Fragen stellen, Fachzeitschriften lesen. Was auch immer Sie tun, schlafen Sie nicht zu lange darauf.

1
mattnz

Ich leide unter dem gleichen Problem. Bei kleinen Problemen versuche ich, mit dem ersten Design umzugehen, von dem ich denke, dass es nicht dumm ist. Es macht keinen Sinn, ein optimales Design zu finden. Es ist schwierig, wenn nicht unmöglich, über alle Nuancen eines Designs nachzudenken, an das Sie vielleicht denken, ohne es aufzuschreiben. Beim Codieren werden Sie feststellen, dass Sie kleine Verbesserungen vornehmen können. Richtig gemacht, finde ich es ziemlich einfach, auf diese Weise auf eine einigermaßen gute Lösung zu konvergieren.

Bei größeren Problemen denke ich, dass es sinnvoll ist, zuerst Ihre Optionen zu überdenken, aber die Zeit zu bestimmen. Große Probleme haben große Lösungsräume, Sie können nicht jede Möglichkeit bewerten und sollten es auch nicht versuchen.

TLDR; Wählen Sie eine vernünftige Lösung und verbessern Sie sie im Laufe der Zeit.

Dies ist auch relevant:

Der Keramiklehrer gab am Eröffnungstag bekannt, dass er die Klasse in zwei Gruppen aufteilen werde. Alle auf der linken Seite des Studios, sagte er, würden nur nach der Menge der von ihnen produzierten Arbeit bewertet, alle auf der rechten Seite nur nach ihrer Qualität. Sein Verfahren war einfach: Am letzten Tag des Unterrichts brachte er seine Personenwaage mit und wog die Arbeit der Gruppe "Menge" ab: 50 Pfund Töpfe mit der Bewertung "A", 40 Pfund mit der Note "B" und so weiter. Diejenigen, die mit "Qualität" bewertet wurden, mussten jedoch nur einen Topf produzieren - wenn auch einen perfekten -, um ein "A" zu erhalten.

Nun, es kam die Benotungszeit und eine merkwürdige Tatsache tauchte auf: Die Werke von höchster Qualität wurden alle von der Gruppe produziert, die nach Quantität bewertet wurde. Es scheint, dass die "Quantitäts" -Gruppe, während sie fleißig Arbeitshaufen produzierte - und aus ihren Fehlern lernte - die "Qualitäts" -Gruppe über Perfektion theoretisiert hatte und am Ende für ihre Bemühungen kaum mehr zu zeigen hatte als grandiose Theorien und ein Haufen toten Lehms.

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

1
dan_waterworth

Um Ihre Entscheidungszurückhaltung zu überwinden, wenden Sie Timeboxing an: Stellen Sie einen Wecker so ein, dass er in wenigen Minuten ausgelöst wird. quäle deinen Geist bis dahin, aber wenn der Alarm losgeht, wähle die beste Option, die du bis dahin gefunden hast.

1
user281377

Erstellen Sie einen Prototyp. Denken Sie daran, dass ein Prototyp weggeworfen werden soll, sodass es keine Rolle spielt, welche Funktionen, Variablennamen oder sogar großartige Architektur Sie verwenden. Sie bauen es nur, um zu beweisen, dass es funktioniert.

Sobald Sie es erstellt und verworfen haben, würde ich wetten, dass es Ihnen leichter fällt, diese Entscheidungen zu treffen.

0
tylermac

Oft ist es die beste Lösung, einem Kollegen Ihre Entscheidung zu erklären. Da Sie dies jedoch nicht sehr oft tun möchten, ist es am besten, auf Papier zu denken - entweder mit einem Papier/Stift oder einem leeren Notizblockfenster.

Beginnen Sie damit, absolut alles zu schreiben - nur um in den Rhythmus des Schreibens zu kommen. In einem Notizblockfenster können Sie einfach "Ich denke auf Papier" eingeben und dann einfach mit einem Bewusstseinsstrom weitermachen. Nach einigen Sekunden befinden Sie sich im Rhythmus des Schreibens. Drücken Sie daher einige Male die Eingabetaste und erklären Sie Ihr Dilemma.

Geben Sie das Problem an und geben Sie dann die möglichen Lösungen an, was an jedem gut ist usw.

Obwohl dies nicht immer funktioniert, gibt Ihnen der Prozess, Gedanken aus dem Kopf (RAM) auf externe Medien (das Notizblockdokument) zu übertragen, mehr Freiheit, neue Verbindungen herzustellen und die Entscheidung aus verschiedenen Perspektiven zu betrachten.

0
Saqib

Ich leide auch unter diesem Problem. Was ich sagen würde ist, dass Sie nicht genug Abschlussanreiz haben.

Als ich zum Beispiel Rendering-Code schrieb, hatte ich einen großen Anreiz zur Fertigstellung, weil ich wusste, dass ich, wenn ich damit weitermachte, das System in Aktion sehen und darüber nachdenken würde, wie großartig ich für die Texturierung eines Quad war. oder transformieren eines vert. Aber jetzt, wo ich neu faktorisiere (Versuch 4, wenn Sie es wissen möchten), leide ich, weil es eine Menge Arbeit ist und selbst wenn ich fertig bin, werde ich nur das gleiche alte Quad sehen. Und ich möchte wirklich nicht noch einmal umgestalten müssen und ich habe es satt, immer wieder dasselbe alte Quad zu sehen, und es ist keine Belohnung mehr für mich.

Sie müssen es in Komponenten aufteilen und sich dafür belohnen, dass Sie sie fertiggestellt haben, auch wenn nur eine Konsolen-E/A zeigt, dass sie funktioniert.

0
DeadMG

Ich habe Ihre Frage gelesen und Dinge in Anlehnung an die anderen Poster gedacht: Sie sind für diesen Job nicht geeignet; gib dir ein Zeitlimit; mach etwas anderes für einen Moment. Nach einigem Nachdenken bin ich mir nicht sicher, ob eine der Antworten wirklich so hilfreich ist

Das Problem mit solchen mentalen Problemen ist, dass sie nicht einfach zu lösen sind, ein Teil von Ihnen sind und dass Sie sich offensichtlich (vielleicht zu sehr) um Ihren Job kümmern, nicht das Vertrauen haben, mit sich selbst übereinzustimmen Unerfahren, zu bedenken, dass Ihre erste Wahl die ganze Zeit richtig war, oder zu viel Stress, um es perfekt zu machen. Warum sonst würden Sie sich über solche Kleinigkeiten Sorgen machen?!

Jetzt habe ich ähnliche Probleme, aber nicht so sehr mit Code. Normalerweise ist es das, was man zum Abendessen hat. Pizza oder Curry. Hmm. Pizza, aber dann ist Curry nett. Aber fühle ich mich wie ein Curry? Pizza ist billiger , aber dann bekommst du mehr Curry, aber ... und so weiter. :) :)

Also dachte ich mir - warum habe ich keine ähnlichen Probleme mit der Codierung und ich denke, das liegt einfach daran, dass ich eine Reihe von Mustern habe, die ich regelmäßig verwende. Wenn ich eine Funktionsdefinition benötige, ist das ganz einfach. Sie entspricht jeder anderen Funktionsdefinition, die ich jemals codiert habe. Wenn ich einen Kontrollfluss benötige, entscheide ich zuerst, ob ich eine for-Schleife oder eine while-Schleife benötige, und erstelle dann denselben alten Code, den ich beim letzten Mal verwendet habe, als ich eines dieser Dinge benötigte. Das gleiche gilt für alles, möchte ich eine Warteschlange? Sicher - lassen Sie uns meinen 'Standard'-Warteschlangencode ausschneiden und einfügen (aus dem letzten Projekt, an dem ich gearbeitet habe, oder aus einem Projekt, an das ich mich erinnern kann, eines dieser Dinge verwendet zu haben). Endergebnis ... Ich ärgere mich nur über neue Sachen, und um ehrlich zu sein, ist das eine Freude.

Mein Rat ist also, mit dem Erstellen einer Bibliothek mit Codefragmenten zu beginnen. Früher habe ich sie per E-Mail an mich selbst gesendet und in einem Ordner abgelegt, aber mit was auch immer Sie arbeiten, ist am besten. Dann werden Sie jedes Mal wissen, was zu tun ist. Sie werden immer zu dem alten Code gehen, den Sie geschrieben haben, und das Problem aus dem Weg räumen, bereit für das nächste Problem. Sie werden feststellen, dass Sie ein viel schnellerer Entwickler werden (im Ernst, dies ist der einzige Weg, um die Produktivität von Programmierern zu steigern) und hoffentlich Zeit für die lustigen Dinge finden, nicht für die trostlosen alltäglichen Dinge, die Sie bereits oft gelöst haben Über.

Natürlich ist auch der letzte Teil von allem wichtig - je mehr Arbeit Sie haben, desto weniger Luxus müssen Sie zum Nachdenken aufwenden.

0
gbjbaanb

Hier ist eine Strategie, die die Vorschläge von Rein Henrichs kombiniert (einfach anfangen, Refaktor) und ammoQ (Timeboxing):

  1. Geben Sie sich ein ziemlich strenges Zeitlimit für eine erste Lösung , die einfach funktioniert. Z.B. 30 Sekunden für einen Variablennamen. Sie könnten sich zuerst etwas wie x einfallen lassen und es dann auf string und dann auf name verfeinern, bis die Zeit abgelaufen ist.
  2. Fahren Sie dann für eine bestimmte Zeit mit anderen Aufgaben fort, z. 10 Minuten.
  3. Erlauben Sie sich erst dann eine andere Zeitbox , um Ihre Entscheidung weiter zu verbessern, z. zu userHandle

Mögliche Vorteile dieses Ansatzes:

  • das Wissen, später darauf zurückzukommen, kann das Loslassen des Problems vorerst erleichtern
  • wenn Sie andere Aufgaben fortsetzen, finden Sie möglicherweise eine gute und zufriedenstellende Lösung, ohne zeitaufwändig zu stöbern
  • nachdem Sie nach Schritt 1 losgelassen haben und sich im Fluss von Schritt 2 befinden, kann es leicht sein, Schritt 3 wirklich schnell zu halten, so wie Sie möchte mit Schritt 2 fortfahren und daher glücklicherweise nur eine anständige Lösung auswählen und akzeptieren
0
Aaron Thoma

Wenn ich die Recherche abgeschlossen habe und keine klare beste Wahl habe, ich gebe mir ein Zeitlimit (normalerweise 5 Minuten), um eine auszuwählen, dann mach einfach weiter. Selbst wenn Sie auf Hindernisse stoßen, gibt es zu diesem Zeitpunkt keine Garantie, dass Sie nicht durch eine andere Entscheidung auf ein gleiches Hindernis gestoßen wären. Ich kann mir keine Zeit vorstellen, in der ich meine Entscheidung bereut habe.

0
John MacIntyre