Ist es normal, tagelang ohne geschriebenen Code über ein Designproblem nachzudenken? [geschlossen]

52

Manchmal starre ich verständnislos in den Raum oder skizziere Ideen und schreibe einige Pseudocodes auf Papier. Dann scratche ich es aus und beginne von vorne. Wenn ich denke, dass ich die richtige Lösung für das Problem habe, beginne ich mit dem Schreiben des Codes.

Ist es normal, tagelang zu denken, ohne Code zu schreiben? Ist das ein Zeichen dafür, dass ich mich dem Problem völlig falsch nähere? Es macht mich nervös, keinen konkreten Code in meine IDE zu schreiben.

Kim Jong Woo
quelle
9
Es kommt sehr auf das Problem und Ihren individuellen Denkprozess an. Wenn Sie Ihre Fristen einhalten, spielt es keine Rolle, wie viel Zeit Sie mit dem Nachdenken und dem Codieren verbracht haben.
Yannis
4
Haben Sie versucht, Ihre Komponenten auf einem Whiteboard zu zeichnen? Manchmal, wenn ich mit einem Designdilemma oder einem komplexen Algorithmus konfrontiert bin, beginne ich einfach zu zeichnen. Wenn Sie nicht weiterkommen, versuchen Sie vielleicht, zu viel in Ihrem Kopf zu verdauen. Versuchen Sie, die Dinge in kleine und leicht verdauliche Komponenten zu zerlegen, und zeichnen Sie dann, wie diese verschiedenen Teile interagieren. Ich brauche keine formalen Standards, sondern mache eine Art UML für Arme, wenn ich auf dem Whiteboard bin.
maple_shaft
2
Denke lieber tagelang über das Design nach, als schnell ein schlechtes Design zu implementieren
Chani
4
Ja ist es! Und manchmal schaue ich mir Code an, den ich bereits geschrieben habe, und wünschte, ich hätte vor dem Schreiben mehr über Design nachgedacht :-)
Giorgio,
2
Ironischerweise ist Informatik oft unabhängig von Computern
Ryan Kinal

Antworten:

60

Abhängig von dem Problem, das Sie lösen möchten, kann die Entwurfsphase Wochen und Monate (wenn nicht Jahre) dauern, nicht nur Tage.

Es braucht Erfahrung, um nicht sofort mit dem Herausschlagen von Code zu beginnen. Das Nachdenken über die Architektur und das High-Level-Design sollte Tage dauern, wenn nicht länger - definitiv etwas, das passieren sollte, bevor Sie anfangen, Ihren Code zu schreiben.

Oded
quelle
1
+1 seit Jahren. War in eine Gruppe involviert, in der sich im nächsten Raum ein Team befand, das seit 5 Jahren mit dem Sammeln von Anforderungen für ein neues System befasst war, ohne dass ein Ende in Sicht war. Wir zweifelten ernsthaft daran, ob sie jemals weiter kommen würden.
Jwenting
8
@jwenting ... das ist auch nicht gut, die Jungs hätten vielleicht anfangen sollen zu tippen.
Grady Player
8
@jwenting, ja, das nennt man die Wasserfallmethode, und jeder von ihnen sollte abgefeuert werden. Wenn Sie nicht herausfinden können, was Sie in einem Jahr tun möchten, können Sie es nie auf den Markt bringen, bevor die Technologie selbst veraltet ist.
Riwalk
1
Ich fürchte , was passiert wäre, wenn sie Code angefangen haben am laufenden Band, sie alle Business - Analysten ohne technisches Know waren , wie auch immer :)
jwenting
24

Dies wird allgemein als "Analyse-Paralyse" bezeichnet.

Es ist üblich, aber falsch. Irgendwann müssen Sie die verschiedenen Ideen testen, um herauszufinden, was für Sie am besten geeignet ist, und diese dann schrittweise verbessern.

Empfohlene Lektüre des Pragmatic-Programmierers Speziell in Kapitel 2 den Abschnitt über "Tracer Bullets"

Idioten
quelle
12
Sie sind falsch in der Annahme, dass es notwendigerweise falsch ist, Zeit für das Design Ihres Systems aufzuwenden. Für etwas Triviales klingen Tage wie eine lange Zeit, für große Systeme, die Zehntausende oder Hunderttausende von Codezeilen umfassen, ist es viel zu kurz, um die grundlegende Architektur überhaupt auf Papier zu bringen.
10.
3
Die Zeit, die zum Nachdenken aufgewendet wird, hängt direkt von der Komplexität des Problems ab. Aber wenn er "nervös ist, keinen greifbaren Code in meine IDE geschrieben zu bekommen, werde ich", denke ich, ist es sicher anzunehmen, dass er loslegen muss.
Morons
7
Ich habe in
keiner Weise gesagt, es sei
4
@ Morons: Es spielt keine Rolle, was Sie sagen, was wichtig ist, was die Leute hören, und die Leute haben Sie sagen hören, dass das, was die OP tut, falsch ist.
Whatsisname
5
Der Begriff "Analyse-Lähmung" impliziert, dass ein Übermaß an Zeit für die Analyse einer Entscheidung aufgewendet wird. Es ist in der Tat ein echtes Problem, aber aus dem ursprünglichen Posten geht überhaupt nicht hervor, ob dies in der gegenwärtigen Situation der Fall ist. Wenn Sie ein paar Tage damit verbringen, darüber nachzudenken, wie eine Funktion zum Umkehren einer Zeichenfolge geschrieben werden soll, ist dies eine Analyse-Lähmung. Wenn Sie ein paar Tage damit verbringen, darüber nachzudenken, wie Sie einen neuen C ++ - Compiler schreiben, bevor Sie beginnen, ist dies das Mindeste, was Sie tun können.
PeterAllenWebb
10

Das ist völlig normal. Wenn Sie jedoch einen "Test first" - oder TDD-Ansatz wählen, ist dieser seltener und hilft Ihnen möglicherweise, Ihre Ideen besser zu formulieren.

Bob
quelle
5

Gewohnheiten sind normalerweise das Ergebnis von Versuch und Irrtum in Bezug auf Dinge und das Weiterführen dessen, was uns zu den gewünschten Ergebnissen führt, und das Vermeiden dessen, was nicht der Fall ist. Das zu tun, was wir mögen und zu vermeiden, was wir nicht mögen, kommt ebenfalls ins Spiel. Das funktioniert bis zu einem gewissen Punkt, denn irgendwann werden wir etwas tun, das wir nicht mögen, um die Miete zu bezahlen.

Es kommt darauf an, was Sie dazu führt und aus welchen Gründen. Hier sind ein paar:

  • Zu oft mussten Sie den Code aufgrund von Designänderungen ändern
  • Sie ändern kein schlechtes Design, da die kleinere Lösung bereits codiert wurde
  • Sie möchten lieber zeichnen und gestalten als Code-Aufschub schreiben
  • Wenn Sie sich Gedanken über die Syntax und Details der Codierung machen müssen, werden Sie davon abgelenkt, über bessere Designs nachzudenken.

Hoffentlich haben Sie festgestellt, dass Ihr Code besser ist, wenn Sie länger entwerfen. Wenn Sie zurückblicken und feststellen können, dass es nicht darauf ankommt, wie viel Zeit Sie für das Design aufwenden, möchten Sie möglicherweise Änderungen vornehmen. Eine andere Überlegung ist, wie oft Sie Probleme entdecken, nachdem Sie Code geschrieben haben, im Vergleich zur Arbeit mit Ihren Entwürfen. Wenn Sie erst nach dem Schreiben von Code Probleme feststellen, sollten Sie eine Abwägung vornehmen und eher früher als später mit dem Codieren beginnen. Möglicherweise könnte dieser Ansatz auf die Verwendung neuerer Technologien oder auf ein sehr komplexes Feature angewendet werden.

Ich weiß nicht, ob ich die Disziplin habe, bei dem einen oder anderen Ansatz zu bleiben, auch wenn ich feststelle, dass einer besser funktioniert als der andere. Manchmal habe ich das Bedürfnis, an die weiße Tafel zu gehen. andere die Tastatur.

JeffO
quelle
4

Es ist sehr verbreitet und ich denke, es ist eine bessere Art, Dinge zu handhaben und zu verstehen. Während ich an einem Projekt arbeite, stecke ich oft fest und es dauert ein oder zwei Tage, um zu verstehen, wie ich es besser angehen kann. Auch nachdem das Problem behoben ist, warte ich, bis ein Tag vergangen ist. Das erfrischt mich und macht mich auf den Weg.

Es ist ein natürliches Phänomen und gut für einen Entwickler, seine Gedanken zwischenzeitlich abzufangen.

Pankaj Upadhyay
quelle
4

Als ich einen Kurs in Projektmanagement belegte, war eines der Dinge, die der Kursleiter über Planung mit uns in Verbindung brachte und die in meinem Kopf steckten, dass die Faustregel, die sie im Militär lehrten, 1/3 der Planungszeit war . Wenn Sie also eine Operation hatten, für die Sie in drei Monaten fertig sein mussten, müssen Sie einen Monat für die Planung aufwenden, bevor Sie mit der Ausführung beginnen.

Scott Whitlock
quelle
4

Meiner Ansicht nach gibt es drei Ansätze, die jeweils für eine bestimmte Codierungssituation geeignet sind

  1. Ich habe zuvor ein ähnliches Problem gesehen, daher habe ich eine ziemlich gute Vorstellung von den anzuwendenden Mustern, und es ist klar, wie sich die Lösung verhalten und reagieren sollte.

    => Verwenden Sie BDD / TDD ausgehend von den gewünschten Lösungen und arbeiten Sie sich in den Code ein. (Ok, manchmal betrüge und schreibe ich ein bisschen Code und dann den Test - Art eines verschachtelten 2. -> 1. Ansatzes).

  2. Ich habe eine gute Idee, welche Muster angewendet werden sollen, bin mir aber nicht sicher, wie die Lösung aussehen soll.

    => Prototyp, um zu sehen, welche interessanten Dinge herauskommen. Gehen Sie zu 1., wenn ich herausgefunden habe, welche interessanten Dinge gewünscht sind.

  3. Ich bin nicht sicher, welche Muster angewendet werden sollen.

    => Denken Sie darüber nach, welches Problem vorliegt und wie sich die verschiedenen Herangehensweisen an das Problem auf den Code auswirken. Fahren Sie je nach Ergebnis der Übung mit 2) oder 1) fort.

Mit anderen Worten, die Antwort ist der Favorit des Ingenieurs: Es kommt darauf an.

forforf
quelle
3

Es ist besser, einen Monat lang nachzudenken und zu entwerfen, als einen schnellen Prototypen zu entwickeln, der auf einem minderwertigen Design basiert und den man dann in Form bringen muss. Vor allem, wenn Sie in einem Team sind; Sobald andere in Abhängigkeit von Ihrem Code beginnen, ist es viel schwieriger, ein besseres Design mit einer anderen API zu implementieren.

TMN
quelle
2

Ich stimme den anderen Antworten zu, dass es grundsätzlich eine gute Idee ist, sich Zeit zu nehmen, um ein Problem / eine Lösung zu überdenken. Wenn Sie sich jedoch nicht sicher fühlen, habe ich einige Empfehlungen, wie Sie den Planungsprozess ein wenig kohärenter gestalten können:

  • Erstellen Sie Design-Artefakte. Was ist, wenn Sie keinen Code schreiben? Vielleicht schreibst du einfach ein Tagebuch deiner Gedanken auf. Oder eine Skizze einer allgemeinen Lösung. Oder auch nur eine wirklich gute Zusammenfassung des Problems, das Sie im Laufe der Zeit verfeinern. Wenn Sie über Ideen nachdenken und diese annehmen / ablehnen, führen Sie ein Protokoll Ihrer Überlegungen zu diesem Thema. Auf diese Weise können Sie am Ende des Tages immer noch auf reale Ergebnisse als Beweis für Ihre Arbeit verweisen.

  • Mit Leuten reden! Es gibt nichts Schöneres, als einen lebenden, atmenden Menschen zu haben, mit dem man Ideen diskutieren kann. Wenn Sie denken, Sie stecken fest, sprechen Sie es mit jemandem durch. Schnappen Sie sich jemanden - irgendjemanden - und erklären Sie ihm das Problem. Skizzieren Sie Ihre Gedanken, wie Sie das Problem lösen können. Selbst wenn sie nur zehn Minuten lang einatmen, ausatmen und blinken, während Sie plappern, werden Sie wahrscheinlich schon bei der Erklärung des Problems neue Erkenntnisse entdecken .

Stephen Gross
quelle
1

Wie Satchel Paige sagte: "Manchmal sitze ich und denke nach und manchmal sitze ich einfach."

Ich denke, was er damit gemeint hat, ist, dass es manchmal gut ist, seinen Geist zu klären, da dies dazu führen kann, dass Sie über Ihr Problem auf andere Weise nachdenken. Wenn Sie sich also nicht mit Code beschäftigen, können Sie sich eine Lösung oder Idee einfallen lassen, die Ihnen sonst möglicherweise entgangen ist. Also, ja, es ist normal und eine gute Praxis, nicht direkt in die Programmierung einzusteigen.

Es gibt zwei Möglichkeiten, wie ich diesen Prozess selbst durchführe. Ich erstelle einen Ordner, in dem ich eine Textdatei und alle Zeichnungen zum Projekt habe. Dort schreibe ich meine Ideen auf und versuche, den gesamten Denkprozess so gut wie möglich abzuspeichern. Außerdem erstelle ich ein Notizblockprojekt, in dem ich einfache Ideen von Algorithmen bis zu CSS-Layouts schnell testen kann.

jfrankcarr
quelle
1

Programm = Algorithmus + Datenstruktur

Meiner Meinung nach regelt der Entwurfsprozess (Problemlösung) vollkommen. Details zur Implementierung (technisches Problem) folgen und werden natürlich gelöst.

Terry Li
quelle
Ich mag diese vereinfachte Gleichung wirklich. +1
Kim Jong Woo
1

Hier ist mein Gedankenfall.

  1. Von vorne anfangen Zuerst ist eine grobe Vorstellung von dem, was Sie wollen, erforderlich. Versuchen Sie, eine Liste einiger Anforderungen zu erstellen oder zu erstellen. Es sollte einige Zeit dauern, um die Dinge hier herauszufinden. Sobald Sie mindestens ein Teil haben, von dem Sie sicher sind, dass Sie es möchten, und den größten Teil der Benutzeroberfläche dieses Teils kennen, können Sie mit dem Codieren beginnen.

  2. Beheben eines Problems mit vorhandenem Code Verfolgen Sie zunächst das Problem. Dies kann einige Zeit in Anspruch nehmen, bis der eigentliche Code nicht geschrieben wurde (möglicherweise wird ein Teil des Debug-Codes geschrieben, dies wird jedoch normalerweise nicht beibehalten). Sobald Sie das Problem gefunden haben, schreiben Sie je nach Komplexität Code, um es zu beheben. Wenig Gedanke sollte erforderlich sein, sobald der Fehler bekannt ist. Wenn sich herausstellt, dass das Problem ein schwerwiegender Konstruktionsfehler ist, lesen Sie den nächsten Abschnitt.

  3. Konstruktionsänderungen / Hauptmerkmale Dies ist höchstwahrscheinlich das, das die meisten Überlegungen erfordert. Überlegungen zum Erhalt der Struktur, zur Abwärtskompatibilität usw. müssen enthalten sein. Das Durchdenken für die beste Veränderung könnte eine erhebliche Zeitersparnis bedeuten, in der Regel dauert es jedoch nicht länger als ein paar Tage.

  4. Hinzufügen eines einfachen Features Wenn keine wesentlichen Änderungen am Design erforderlich sind, codieren Sie Ihr Feature einfach mit einem Versuch / Irrtum. Dies sollte im Allgemeinen nicht viel Zeit erfordern.

PearsonArtPhoto
quelle
0

Ich werde dem Konsens in diesem Punkt nicht zustimmen. Ich möchte lieber mit dem Prototyping beginnen, sobald ich die vage Idee habe, wie mein System funktionieren soll. Es ist mir fast unmöglich, an all die kleinen Details zu denken, die Probleme verursachen könnten, wenn ich die Dinge nicht sehr genau spezifiziere. Wenn ich nur mit Menschen über Design spreche, ist es zu einfach, einige der komplexeren Probleme mit der Hand zu winken. Sobald ich solche Dinge spezifiziere, kann es auch direkt im Quellcode sein, anstatt in einem anderen Ausdrucksmittel, das genauso präzise und formal ist, aber nicht kompiliert und ausgeführt werden kann.

dsimcha
quelle
3
Es gibt einen Unterschied zwischen dem Herausfinden der Details und dem Herausfinden der Grundlagen. Wenn Sie beispielsweise eine Sprache entwerfen, möchten Sie entscheiden, ob Ihre Sprache prozedural oder funktional ist, bevor Sie sich einer Tastatur nähern. Niemand sagt, dass Sie Details bei der Planung herausfinden müssen, aber Sie müssen wissen, wohin Sie gehen.
Riwalk
@ Stargazer712: da stimme ich voll zu. Deshalb habe ich gesagt, du brauchst wenigstens eine Serviettenidee, was zum Teufel du tun wirst. Bei der Beantwortung dieser Frage stellte ich mir jedoch Tage oder Wochen formeller, bürokratischer Besprechungen vor, bevor ich überhaupt versuchte, einen Prototyp der riskantesten / neuartigsten / interessantesten Merkmale herauszuholen.
Dsimcha
0

Es kommt darauf an, was du mit "normal" meinst . Wenn ich über mich selbst spreche, denke ich, dass Code ein großartiges Lernwerkzeug ist. Wenn ich mich einem komplexen Problem gegenübersetze, mache ich Skizzen auf Papier, aber ich mache auch ein paar testgetriebene Codierungen. Der Code sagt mir, dass ein Whiteboard das nicht sagen kann und umgekehrt, und vielleicht ist das Ergebnis Einsicht oder die Notwendigkeit, dem Domain-Experten noch ein paar Fragen zu stellen.

Der eigentliche Rat lautet also: "Verwenden Sie jedes Lernwerkzeug, das erforderlich ist, um näher an die Problemdefinition heranzukommen" , aber denken Sie auch daran, dass dies Lernwerkzeuge sind. Verlieben Sie sich also nicht in sie. " Sowohl Code als auch Skizzen sollten weggeworfen werden .

ZioBrando
quelle
0

In dieser Ära von RAD und agiler Programmierung sollten Sie mit der Entwicklung beginnen, sobald Sie wichtige Teile des Systems identifizieren können. Da die Software immer größer wird, führt die vorzeitige Fokussierung auf jedes einzelne Detail zu nichts mehr.

Syed Aqeel Ashiq
quelle
2
Und wenn Sie sich nicht auf genügend Details konzentrieren, werden Sie möglicherweise an einen Ort geführt, an dem es keinen besseren Ort gibt.
Dunk
@Dunk Ich habe drei Wörter verwendet: Vorzeitig, jedes einzelne über die Fokussierung auf Details. Ich habe nicht gesagt, dass ich sofort auf die Tastatur klopfen soll.
Syed Aqeel Ashiq