Widersprüchliche Programmierempfehlungen in Einklang bringen: Etwas zum Laufen bringen und iterieren vs.


19

Ich bin ein fortgeschrittener Programmierer mit einigen Jahren Berufserfahrung, der sein Masterstudium zur Hälfte abgeschlossen hat. Beim Programmierenlernen habe ich oft zwei scheinbar widersprüchliche Ratschläge gehört.

Der erste Ratschlag war, etwas schnell zum Laufen zu bringen, zu sehen, wie es funktioniert (entweder durch Prototyping oder informelle Tests), die Version zu verbessern, zu sehen, wie es wieder funktioniert, es wieder zu verbessern ... und dann den Zyklus zu wiederholen, bis Sie fertig sind . Dies wird manchmal als "spiralförmige Entwicklung" bezeichnet oder als "frühzeitig loslassen, oft loslassen".

Der zweite Ratschlag war: Überlegen Sie sich wirklich ein Projekt, bevor Sie jemals einen Code schreiben.

Ich hatte Erfolg mit beiden Methoden und würde sagen, dass ich mit jeder Philosophie einverstanden bin.

Aber jetzt fange ich an, komplexere Projekte in Angriff zu nehmen, für deren Fertigstellung ich keine Ahnung habe (wie verteilte Anwendungen und leistungsorientierte Grafikprogrammierung).

Wie gehe ich bei diesen Projekten vor?

Beginne ich gerade mit dem Codieren von ETWAS und lerne währenddessen (Plattformen / Methoden / Sprachen / Architekturen) - oder halte ich mich vom Codieren zurück und recherchiere / lese viel, bevor ich überhaupt die IDE öffne?

Wie kann ich diese widersprüchlichen Programmierempfehlungen in Einklang bringen?


Tun Sie beides gleichzeitig. Iteriere, dokumentiere, iteriere, dokumentiere, iteriere und sobald du einen klaren Plan hast, der funktioniert. Build it: D
Matt D

1
Etwas verwandt ist Kent Becks Essay über "Lass es laufen, dann mach es richtig, VS. Lass es richtig, dann mach es laufen": facebook.com/notes/kent-beck/runright-and-vice-versa/…
Thiago Silva


1
Ich sehe nicht, wie sie widersprüchlich sind. Ich denke zuerst viel nach und lasse dann etwas schnell funktionieren.
Fjarri

Sehr tief. Genau. Mein durchschnittliches professionelles Projekt besteht aus ca. 40 - 50% im Vorfeld der Designarbeit, 10, maximal 15% Codierung und dem Rest zum Testen.
Mawg

Antworten:


20

Ich bin mir nicht sicher, ob es sich widerspricht, vorab über ein Problem nachzudenken oder iterativ vorzugehen. Wie bei vielen anderen Dingen denke ich, sollten Sie sich bemühen, das Gleichgewicht zwischen beiden zu erreichen. Wie findest du das Gleichgewicht? Das lernst du mit Erfahrung und oftmals am besten mit der Zeit (dh mit Dingen, die dir Erfahrung bringen), wenn du es nicht ganz richtig verstehst (oder noch besser: einfach alles falsch machen). Wie Sie bereits betont haben, gibt es das Sprichwort "Schnell loslassen, oft loslassen". Es gibt noch eine ähnliche: "Früh scheitern, schnell scheitern, oft scheitern".

Vorausdenken ist großartig und Sie sollten es unbedingt tun. Aber mit etwas Erfahrung lernen Sie, wann Sie aufhören sollten zu denken und etwas aufzubauen, auch wenn Sie nicht über alle Daten verfügen. Wenn Sie es erstellen, erhalten Sie mehr Einblick in die Problemdomäne und können möglicherweise eine viel bessere Lösung finden. Daher würde ich empfehlen, eine nicht von der anderen auszuschließen, sondern "Kopf denken" zu einem Teil Ihrer Iterationen zu machen, und ich denke, dass Sie im Laufe der Zeit selbst die richtige Antwort auf diese Frage finden werden.

Nur ein kleines Beispiel. Neulich hatte ich mit einer Entscheidung für das Software-Design zu kämpfen. Im Nachhinein war es relativ trivial, aber ich hatte zwei Alternativen und es schien, als würden beide funktionieren. Ich ging immer wieder auf die Vor- und Nachteile der einzelnen Punkte zurück und überlegte dann meine Entscheidungen. Rückblickend ist es ein bisschen peinlich, wie viel Zeit ich damit verbracht habe, nachzudenken. Dann sagte ich mir, f # @ k it! Und anstatt eines der Designs zu verwenden, habe ich einfach Code gehackt und alles Gute, was Sie über gutes Design lernen, vollständig ignoriert. Ich habe das Feature in ca. 45 Minuten zum Laufen gebracht. Dann ging ich zurück, schaute meinen Code an und überarbeitete ihn in etwas Solides und etwas, für das ich mich nicht schämen würde, in die Quellcodeverwaltung einzuchecken. Der lustige Teil ist, dass, nachdem ich den Hack zum Laufen gebracht habe, "

Eine andere Sache würde ich speziell für Probleme empfehlen, mit denen Sie jetzt konfrontiert sind (dh große, komplexe Aufgaben, die sich abzeichnen). Anstatt Dinge in Serie zu machen, mache sie parallel. Brechen Sie Ihren Tag in Stücke auf, in denen Sie recherchieren und dann anhalten, umschalten und eine Weile codieren, zumindest in Teilen des Projekts, die keine vollständigen Unbekannten sind. Auf diese Weise bleiben Sie in der Nähe des Codes und erhalten eine bessere Perspektive, und Sie werden nicht durch den Versuch ausgebrannt, zu viele Informationen zu schnell zu absorbieren. Zumindest für mich ist es nach ein paar Stunden Recherche gut, das Gehirn Dinge verdauen zu lassen, Aufgaben zu wechseln und für eine Weile etwas anderes zu tun. Dann kommen Sie zurück zu mehr Forschung.


Ich würde hinzufügen: Codierung starten, wenn es wirklich notwendig ist. Wenn es keine Probleme gibt, sollte man nicht mit dem Codieren beginnen.
Tassisto

5

Es gibt bestimmte Entscheidungen, die im Voraus getroffen werden müssen.

Machst du eine Webanwendung? Dann müssen Sie wissen, wie die Gesamtarchitektur aussehen wird. Architekturen wie MVC definieren bereits, wie Ihre großen Funktionsteile aussehen werden (z. B. Routing, Controller, Modelle, Serviceschichten, Kommunikationsprotokolle usw.). Das alles von Grund auf neu zu erfinden wird ein langer Weg sein, unnötig und wahrscheinlich schlechter als das, was bereits erfunden wurde.

Schreiben Sie eine Anwendung, die eine Sammlung von Objekten oder Daten umfasst? Dann müssen Sie wissen, welche Arten von Datenstrukturen für Ihr bestimmtes Szenario am besten geeignet sind und welche Leistungsmerkmale sie aufweisen. Benötigen Sie eine schnelle Suche? Wie wäre es mit bestellten Datensätzen? Funktioniert eine In-Memory-Sammlung, oder benötigen Sie eine leistungsfähigere Datenbank? Sie können nicht einfach mit dem Codieren beginnen, ohne diese Entscheidungen zu überdenken. Wenn Sie die falsche Wahl treffen, müssen Sie von vorne beginnen.

Das heißt, sobald die technologischen Entscheidungen getroffen sind, haben Sie Freiheit innerhalb des von Ihnen festgelegten Rahmens. Das Ziel ist es dann, flexibel, iterativ und (ich wage zu sagen) agil genug zu bleiben, damit Sie sie mit einem Minimum an Aufwand unterbringen können, wenn der Kunde seine Meinung über das ändert, was er will.

Wie machst du das? Meistens Erfahrung. Wie schon jemand sagte, ist Erfahrung das, was Sie direkt nach Bedarf bekommen. Wenn Sie jedoch den erfolgreichen Entwurfsentscheidungen anderer folgen (wie sie in den Plattformen, Bibliotheken und anderen Tools des Handels enthalten sind), können Sie daraus lernen und Ihr Risiko verringern.


1

Ich sehe die beiden nicht als sich gegenseitig ausschließend an.

Wie bei jeder Art von Projektmanagement benötigen Sie sowohl eine langfristige Vision als auch kurzfristige Ziele.

Ohne das erstere verschwenden Sie beispielsweise Zeit mit Funktionen, die möglicherweise gar nicht verwendet werden, und ohne das letztere verbringen Sie den ganzen Tag damit, darüber nachzudenken, wie Sie die perfekte Anwendung erstellen, ohne Ihr Projekt zu beenden.

Wie oft veröffentlichen Sie / etc. hängt von der spezifischen Methodik ab, die Sie verwenden.

Was Sie erforschen müssen, hängt davon ab, was Sie wissen und was nicht.


1

"Iteration" und "Durchdenken" sind kein Widerspruch, sondern ergänzen einander.

Sogar an ihren Extremen reflektieren sie zwei Wege, um zum gleichen Ort zu gelangen.

  • Das Extrem der Iteration sind tausend Affen, die an tausend Tastaturen herumschlagen. Wenn Sie genügend Zeit haben, erhalten Sie möglicherweise etwas, das den Anforderungen entspricht.
  • Das Extrem von "durchdenken" ist ein Wasserfall-Ansatz. Wenn Sie Glück haben, haben sich die Anforderungen seit Beginn des Projekts bis zur Bereitstellung des Codes nicht dramatisch geändert. Oder Sie haben nur eine Analyse-Lähmung und nichts geliefert.

Sie müssen die Domäne und das Problem verstehen, bevor Sie mit dem Codieren beginnen. Dies ist der Teil "Denk drüber nach". Im Idealfall sehen Sie von Anfang bis Ende, wie das Problem gelöst werden kann.

Möglicherweise sehen Sie jedoch nur große Teile dieses Pfades und erst recht nicht jeden Zwischenstopp auf dem Weg. Hier kommt die Iteration ins Spiel. Sie können durch Versionen der Anwendung iterieren und Feedback einholen, um:

  • Identifizieren Sie die Straßensperren, die in den unteren Detailebenen auftreten
  • Sehen Sie sich das Feedback der Stakeholder an, um die trüben Bereiche im Pfad auf hoher Ebene zu klären.

Die lateinische Wurzel der Entscheidung bedeutet "abschneiden". Durch Iteration können Sie entscheiden, was in der Praxis funktioniert, anstatt nur in der Theorie, und durch Iteration können Sie die anderen Optionen herausschneiden, die nicht durchführbar sind.

Sie müssen also das Problem durchdenken, um zu verstehen, was Sie tun werden. Dann müssen Sie jedoch die Versionen der Anwendung durchlaufen, um die Idee tatsächlich in tatsächlichen Code umzuwandeln.


0

Meine Faustregel: Wenn Sie einen Teil des Problems nicht vollständig verstehen, müssen Sie einen Schritt zurücktreten und es vollständig durchdenken. . Wenn es sich im Grunde genommen um eine Sammlung von Problemen handelt, die Sie zuvor gelöst haben, und Sie nur herausfinden müssen, wie Sie in diesem speziellen Fall alles am besten zusammenfügen können, wiederholen Sie den Vorgang.

Ganz ehrlich, das ist keine feste Regel. Ich denke wirklich, dass Sie für jedes Projekt eine Mischung aus beidem machen müssen. Wie viel Sie wahrscheinlich jeweils tun, hängt hauptsächlich davon ab, wie nah das Projekt an einem Projekt ist, das Sie bereits in der Vergangenheit abgeschlossen haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.