Wie soll ich ein Projekt planen und starten?

20

Jedes Mal, wenn ich ein Projekt starte, entscheide ich mich in entscheidenden Momenten, die Kernklassen komplett zu ändern und mich in dunkle Fehler zu verwickeln. Ich versuche, im fortgeschrittenen Stadium zu planen und beginne normalerweise mit einem guten Schritt, gehe dann aber an einem anderen Tag dorthin und entscheide, dass ich es 'anders' machen möchte.

Gibt es eine Art Standard, wenn Sie ein Projekt starten, z. B. Klassen zuordnen und mit Komponententests beginnen? Was ist eine gute Konvention, wenn Sie ein mittleres Projekt planen und starten?

Das letzte Projekt, das gestartet wurde, war ein Projektil-Bewegungssimulator - ich weiß, vorhersehbar.

Will03uk
quelle
Wähle ein Design und bleibe dabei. Klingt so, als ob Sie Gründe finden, Ihre Designs zu ändern.
Ramhound
Hat Ihre Frage etwas mit dem Designaspekt des Projekts zu tun oder mit der Tatsache, dass Sie etwas dagegen haben und den gesamten Umfang des Projekts ändern?
Noname
2
@Ramhound: "Wähle ein Design und bleibe dabei" funktioniert perfekt, solange du ein Design auswählst, nachdem du den Code geschrieben und getestet hast.
Kevin Cline
Ich würde vielleicht ein wenig über Designmuster und OO-Design lesen. Es hat mir geholfen. Wenn Sie ein Anfänger sind, würde ich Head First Design Patterns empfehlen.
Darren Young

Antworten:

19

Planen Sie beim Planen nicht alles über die Anwendung im Voraus. Planen Sie in kleinen Schritten. Was ist die absolute Mindestfunktionalität, die Sie benötigen, um die Anwendung zu verwenden? Fang dort an.

Wenn Sie Ihr Projekt starten, codieren Sie nur die absolute Mindestfunktionalität. Stellen Sie beim Codieren sicher, dass Sie guten, sauberen Code mit intelligenter Kapselung schreiben . Dadurch werden Fehler minimiert, die durch spätere Änderungen entstehen.

Ändern Sie diese Mindestfunktionalität, bis Sie damit zufrieden sind. Fügen Sie dann nacheinander neue Funktionen und Verbesserungen hinzu. Konzentrieren Sie sich wieder darauf, guten, sauberen Code mit intelligenter Kapselung zu schreiben.

Wenn Sie in kleinen Schritten planen und sauberen Code schreiben, wird die Anzahl der Änderungen, die Sie tatsächlich vornehmen müssen, minimiert. Bis Sie mit dem Schreiben dieses ersten Features fertig sind, sollten Sie die Muster übernommen haben, auf denen das Fundament Ihrer Anwendung basiert. Wenn es Probleme mit dieser Grundlage gibt, sollten Ihre nächsten Funktionen das Problem schnell aufdecken. Es wird einfacher zu sehen sein, wie sich die Teile integrieren. Die von Ihnen vorgenommenen Änderungen sollten zu diesem Zeitpunkt nur minimale Störungen verursachen.

Mike Cellini
quelle
+1: Dies ist eine Antwort, die ich hinter mich bringen kann. Planen Sie das absolute Minimum und ergänzen Sie den Plan nach Bedarf, fügen Sie jedoch das Minimum hinzu.
Joel Etherton
Einfach, aber das hat sehr gut funktioniert; Vielen Dank.
Will03uk
Könnte selbstverständlich sein, aber Sie sollten auch bei der Planung des Minimums berücksichtigen, dass die Anwendung erweiterbar sein muss. Ich arbeite hauptsächlich an Webprojekten und wenn ich nicht alles durchplanen würde, wäre es ein totales Durcheinander.
Frederik Witte
7

Es scheint, dass Ihre Planung nicht hilft. Kein Wunder, denn Sie haben nicht genug Erfahrung, um einen realisierbaren Plan aufzustellen. Die Lösung ist einfach. Hör auf so viel zu planen. Akzeptieren Sie einfach, dass Sie den Code schreiben und neu schreiben werden, während Sie gehen. Das ist in Ordnung, denn der Code ist bis auf Ihre Zeit kostenlos. Wenn Sie eine UI-Anwendung schreiben, beginnen Sie einfach mit einem leeren Fenster und fügen Sie nacheinander etwas hinzu, bis Sie fertig sind. Wenn Sie mehr Erfahrung haben, werden Ihre Projekte schneller gehen. Sich Sorgen zu machen, weil Sie den Code ändern, ist wie ein Musikstudent, der sich Gedanken über alle in der Praxis verschwendeten Noten macht.

Kevin Cline
quelle
2
+1 wenn es sich nur um kleine persönliche Projekte handelt. Das häufige Ändern und Umschreiben von Code in diesen Projekten ist auch ein gutes Zeichen: Dies bedeutet, dass der Entwickler über bessere Ansätze oder Möglichkeiten nachdenkt, um dasselbe Problem zu lösen. Problematisch wäre es, beschissenen Code zu schreiben und nie wieder darüber nachzudenken.
Arseni Mourzenko
4

Niemand weiß wirklich, was das beste Design sein wird, bis er eine bestimmte Menge davon codiert hat. Das Geheimnis eines guten Designs ist es daher, zu erkennen, dass Ihr erster Entwurf zwangsläufig nicht optimal ist, und kleinere Teile früher und häufiger neu zu schreiben . Anstatt ein fast vollständiges Programm zu verschrotten, schreiben Sie Zeilen oder Funktionen oder Klassen neu, sobald Sie deren Mängel erkennen.

Gute erfahrene Programmierer verstehen es normalerweise auch nicht gleich beim ersten Entwurf. Was mit der Erfahrung einhergeht, ist die Fähigkeit, ein schlechtes Design früher zu erkennen und schneller umzuschreiben.

Karl Bielefeldt
quelle
3

Meiner Erfahrung nach verschwindet dieses Problem, wenn Sie mehr Erfahrung haben - Sie bekommen ein Gefühl dafür, was funktioniert und was nicht. Darüber hinaus können durch eine gute Verkapselung die Kosten für Designänderungen gesenkt werden. Je dichter Ihre Module gekapselt sind, desto günstiger ist ein späterer Wechsel. Betrachten Sie es als eine hervorragende Motivation, Ihre Klassen getrennt zu halten.

DeadMG
quelle
1

Das Entwerfen einer Anwendung hat zwei Aspekte. Der erste entscheidet, was Ihre Anwendung kann. Die zweite ist das Entwerfen, wie es geht. Änderungen an den Funktionen sind sehr wichtig und abhängig vom Reifegrad der Anwendung (und der Richtungsänderung der Anwendung) werden am besten als Umschreibung und nicht als Überarbeitung angegangen.

Der zweite Aspekt ist das Wie. Mithilfe von Unit-Tests und agilen Entwicklungsmethoden können Sie die Auswirkungen einer Änderung der Ausführung einer bestimmten Funktion durch Refactoring minimieren. Ein Teil des Lernens, wie man diese Techniken wirksam einsetzt, ist das Üben, Üben, Üben.

Ich gebe den Rat, den ich immer wieder gegeben habe. Wählen Sie ein Haustierprojekt. Schreiben Sie es nach besten Kräften. Lernen Sie etwas Neues und wenden Sie das Gelernte an, um Ihre Herangehensweise an die Entwicklung dieses Projekts zu verbessern.

Beginnen Sie beispielsweise mit einer Aufgabenliste. Machen Sie es einfach ... machen Sie sich zunächst keine Sorgen über den Datenbankspeicher. Lass es einfach funktionieren. Bauen Sie jetzt auf diesem Fundament auf. Vielleicht möchten Sie MVVM und WPF lernen ... Sie wissen bereits, wie Sie die ToDo-Liste im Arbeitsspeicher implementieren, sodass Sie ein Problem weniger haben, das Sie lösen müssen. Jetzt möchten Sie festlegen, dass mehrere Benutzer ihre Aufgabenlisten aus einer Datenbank laden können. Sie haben im Speicher und in der getrennten Präsentation gelöst, sodass Sie sich auf das Erlernen des Datenzugriffs konzentrieren können. Von dort aus können Sie die Anwendung erweitern, um ein komplexeres Domänenmodell (z. B. den Wechsel von einer Aufgabenliste zu einer Projektmanagementlösung), eine Webschnittstelle oder sogar die Ausführung auf einem mobilen Gerät zu erhalten. Der Schlüssel zu dieser Arbeit besteht darin, etwas auszuwählen, das von Ihnen erreicht werden kann, an dem Sie den Fortschritt messen und das Sie im Laufe der Zeit weiterentwickeln können.

Michael Brown
quelle
0

Nach meiner Erfahrung dauert der Systemaufbau oft genauso lange oder länger als die eigentliche Codierung. Wenn Sie "Vorausplanung" sagen, was planen Sie dann eigentlich? Vielleicht gehen Sie altmodisch und verwenden Sie eine der bewährten Entwurfsmethoden. Oder gehen Sie in die alte Schule und schreiben Sie den Pseudo-Code, bevor Sie den eigentlichen Code schreiben.

Ich denke, Sie müssen sich fragen, warum Sie Dinge in entscheidenden Momenten ändern, anstatt sich an den ursprünglichen Plan zu halten. War der ursprüngliche Plan fehlerhaft? Oder hatten Sie einen aufschlussreichen Moment, der Ihnen einen besseren Weg zeigte, Dinge zu tun? War es eigentlich besser oder nur anders?

Brian
quelle
0

Wenn Sie an Erfahrung gewinnen, müssen Sie weniger oft umschreiben / scratchen und von vorne beginnen. Notieren Sie sich das Problem, das Sie lösen möchten. Schreiben Sie vage Klassenbeschreibungen auf, von denen Sie glauben, dass Sie sie benötigen, und schreiben Sie auf, wie sie interagieren müssen. Machen Sie sich ein Bild davon, wie alles funktionieren wird, und programmieren Sie dann. Verbringen Sie nicht jede Menge Zeit damit, jede Eigenschaft, Methode Ihrer Klassen, aufzuschreiben. In dieser Phase versuchen Sie, die 50-KB-Fuß-Ansicht dessen zu erhalten, was Sie tun sollen. Wenn Sie mit dem Codieren beginnen und mehr Details aufschreiben müssen, gehen Sie zum Programmieren. Wenn nicht einfach mit dem Codieren beginnen.

Ominus
quelle
0

Der Grund, warum Sie das so schwierig finden, ist, dass Sie eine Idee haben, aber Sie haben nicht wirklich eine vollständige Vorstellung davon, was Sie wollen. Wenn Sie ein eigenes Projekt durchführen und Sie keinen Kunden haben, der Ihnen sagt, was er möchte, liegt es an Ihnen, Ihr eigener Kunde zu sein. Versetzen Sie sich in die Lage des Kunden und erstellen Sie eine unmögliche Wunschliste.

Mit anderen Worten, wenn Sie anfangen , entwerfen Sie NICHTS !!! .

Sobald Sie eine große Liste der Aufgaben haben, die das System ausführen soll, priorisieren Sie alles und entscheiden Sie, welche Mindestfunktionalität ein Basissystem haben soll. Dies kann eine einzelne Grundfunktion oder ein ganzer Bildschirm sein, aber es muss etwas sein, von dem Sie glauben, dass es für den Kunden nützlich genug ist, um es zu testen.

Also, Merkzettel der Funktionen + Grundprioritäten = Anforderungen .

Wenn Sie das alles haben, erstellen Sie ein Design auf höchstem Niveau. Setzen Sie sich und überlegen Sie, was Ihr System benötigt, um die ersten Prioritäten in Betrieb zu nehmen. Ändern Sie Ihre Meinung, wenn Sie möchten, aber hier können Sie Code oder eine Systemkonfiguration hinzufügen, um mehr über die Möglichkeiten zu erfahren. Gehen Sie nur so weit, um Ihre Grundidee eines Entwurfs zu bestätigen.

Dh: JETZT können Sie dem Drang Ihrer Designer nachgeben .

Sobald Sie fertig sind, beginnen Sie mit der Implementierung Ihrer Funktionen. Erstellen Sie für jedes Feature eine grundlegende Funktionsspezifikation. Dies kann so einfach wie eine Sammlung von Featureanweisungen sein. Handlungskarten, wenn Sie möchten. Auf diese Weise können Sie Ihre Idee ein wenig weiterentwickeln und eine Reihe von Anweisungen erstellen, die zur Spezifikation werden , mit der Sie Ihre Implementierung testen und vergleichen.

Cry Havoc, lass die Hunde von ... Code ausrutschen !!

Implementieren Sie von dort aus Ihre Tests entsprechend Ihren Spezifikationen und schreiben Sie dann für jeden Test Ihren Code. Erstellen, "freigeben" und dann mit der nächsten Funktion wiederholen, bis das Projekt vollständig genug ist.

Es kommt wirklich auf die Erfahrung an, aber dieser Ansatz, den ich gefunden habe, ist eine einfache Formel, die Ihnen hilft, sich auf das zu konzentrieren, was getan werden muss, anstatt sich in einen endlosen Zyklus des Aufschiebens zu verstricken, weil Sie versuchen, allzu viel zu tun Einmal.

S.Robins
quelle
0

Nachdem Sie die Grundlagen ausgeführt haben, z. B. die Projektziele festgelegt, Ihre Anforderungsliste erstellt und alle Schnittstellen zu externen Systemen gesperrt haben.

Dann müssen Sie für jede Benutzerinteraktion einen Anwendungsfall oder eine "Story" erstellen. Es wurden Bände darüber geschrieben, was einen "guten" Anwendungsfall oder eine gute Geschichte ausmacht, und es gibt viele Variationen. Anwendungsfälle sind das effektivste Designtool, auf das ich gestoßen bin. Sie helfen dabei, fehlende Funktionen zu erkennen und unnötige Anforderungen zu eliminieren, und reduzieren Ihr Design auf das Wesentliche. Wie ich bereits sagte, variieren die Methoden, aber die meisten Praktiker sind sich einig über:

  • prägnanter einfacher englischer Text.
  • "Goal Driven" funktioniert am besten, dh "Monkey gets a grape" ist besser als "Monkey Pushes red button".
  • technische Terminologie verbieten. Keine "Pulldowns", "Textfelder". Ein guter Anwendungsfall sollte unabhängig von einer Schnittstellentechnologie sein. Sie sollten in der Lage sein, einen Anwendungsfall für ein HTML-basiertes System zu übernehmen und ihn für ein sprachaktiviertes System zu verwenden, ohne den Anwendungsfall selbst zu ändern. (Dies ist sehr schwer zu tun, aber es lohnt sich!).
  • Versuchen Sie, die Wortanzahl Ihres ersten Entwurfs um 50% zu reduzieren, und vermeiden Sie unnötige Schritte und Redewendungen.

Dann können Sie Ihre Hauptklassen angeben:

UML - Universal Modeling Language. Ist das Standardwerkzeug zum Entwerfen von Klassen. Sie geben die öffentlichen Member und Methoden jeder Klasse an und verknüpfen sie in einem übersichtlichen grafischen Modell.

In Verbindung mit Sequenzdiagrammen und Datenmodellen können Sie Ihr Design überprüfen und verbessern, bevor eine Codierung stattfindet.

James Anderson
quelle
0

Konzentrieren Sie sich auf das Ergebnis, das Sie erzielen möchten, und wägen Sie die potenziellen Gewinne aus dem Erlernen / Ausprobieren neuer Implementierungen ab. Dabei besteht die Gefahr, dass Sie auf einer Straße landen, die Sie wieder auf den ersten Platz bringt.

In dem Fall, dass Sie wieder auf dem ersten Platz landen, ist nicht alles verloren, weil Sie Erfahrung gesammelt haben.

Wenn Sie eine Frist haben (es klang, als würden Sie zum Spaß programmieren), dann ist dies wirklich schwierig. Wenn Sie fortwährend in eine Richtung gehen, riskieren Sie, im Laufe der Zeit veraltete Methoden zu verwenden. Wenn Sie immer wieder in die andere Richtung gehen, riskieren Sie die Konsequenzen einer langsameren Produktion (eine variabel langsamere Rate, abhängig von den Ergebnissen Ihrer Lernabenteuer).

Früher habe ich durch die Arbeit gebrannt und Dinge Jahr für Jahr schnell erledigt, und dann wurde mir eines Tages klar, dass ich in meinen Fähigkeiten nicht mehr auf dem neuesten Stand war.

Aaron Anodide
quelle