Ich kann Code schreiben ... aber nicht gut entwerfen. Irgendwelche Vorschläge? [geschlossen]

83

Ich habe das Gefühl, dass ich gut darin bin, Code in Einzelteilen zu schreiben, aber meine Designs sind wirklich scheiße. Die Frage ist, wie ich meine Designs verbessere - und ein besserer Designer werde.

Ich denke, Schulen und Hochschulen lehren die Menschen gut, wie man mathematische Probleme löst. Lassen Sie uns jedoch zugeben, dass die meisten Anwendungen, die in der Schule erstellt werden, in der Regel zwischen 1000 und 2000 Zeilen lang sind, was bedeutet, dass es sich meistens um eine akademische Übung handelt Dies spiegelt nicht die Komplexität von Software in der realen Welt wider - in der Größenordnung von einigen hunderttausend bis Millionen von Codezeilen.

Dies ist der Punkt, an dem ich glaube, dass auch Projekte wie Topcoder / Project Euler keine große Hilfe sein werden, da sie Ihre mathematischen Fähigkeiten zur Problemlösung schärfen könnten - aber Sie könnten ein akademischer Programmierer werden. Jemand, der mehr an netten, sauberen Dingen interessiert ist, der absolut kein Interesse an alltäglichen, alltäglichen und haarigen Dingen hat, mit denen sich die meisten Anwendungsprogrammierer befassen.

Meine Frage ist also, wie ich meine Designfähigkeiten verbessern kann. Das heißt, die Fähigkeit, kleine und mittelgroße Anwendungen zu entwerfen, die mehrere tausend Codezeilen umfassen? Wie kann ich Designfähigkeiten erlernen, die mir helfen, ein besseres HTML-Editor-Kit oder ein Grafikprogramm wie gimp zu erstellen?

user396089
quelle
1
"Lassen Sie uns die Tatsache zugeben, dass die meisten in der Schule erstellten Anwendungen im Allgemeinen zwischen 1000 und 2000 Zeilen lang sind, was bedeutet, dass es sich meistens um eine akademische Übung handelt, die nicht die Komplexität realer Software widerspiegelt." Semester-Software-Projekt, in dem ein Team von zehn Studenten über einen Zeitraum von 6 bis 8 Monaten eine recht komplexe Anwendung entwickelte. Außerdem bieten viele Unternehmen (zumindest in Deutschland) Kurzzeitverträge für Studierende an, die sich vor Abschluss ihres Studiums üben möchten.
Giorgio

Antworten:

87

Der einzige Weg, um in etwas wirklich gut zu werden, besteht darin, es zu versuchen, spektakulär zu scheitern, es erneut zu versuchen, etwas weniger als zuvor zu scheitern, und im Laufe der Zeit die Erfahrung zu entwickeln, um zu erkennen, was Ihre Fehler verursacht, damit Sie mögliche Fehlersituationen später bewältigen können. Dies gilt ebenso für das Erlernen eines Musikinstruments, das Autofahren oder das Erreichen eines ernsthaften PWN-Alters in Ihrem Lieblings-Ego-Shooter, wie für das Erlernen eines beliebigen Aspekts der Softwareentwicklung.

Es gibt keine wirklichen Abkürzungen, aber es gibt Dinge, die Sie tun können, um zu vermeiden, dass Probleme außer Kontrolle geraten, während Sie Erfahrungen sammeln.

  • Identifizieren Sie einen guten Mentor . Es gibt nichts Besseres, als mit jemandem über Ihre Probleme sprechen zu können, der bereits seine Beiträge bezahlt hat. Anleitung ist eine großartige Möglichkeit, um schneller zu lernen.
  • Lesen Sie , lesen Sie noch etwas, üben Sie, was Sie gelesen haben, und wiederholen Sie dies für die gesamte Lebensdauer Ihrer Karriere. Ich mache dieses Zeug seit mehr als 20 Jahren und lerne jeden Tag etwas Neues. Erfahren Sie nicht nur mehr über Up-Front-Design, sondern auch über aufstrebendes Design, Tests, Best Practices, Prozesse und Methoden. Alle haben unterschiedliche Auswirkungen darauf, wie Ihre Entwürfe entstehen, Gestalt annehmen und, was noch wichtiger ist, wie sie im Laufe der Zeit Bestand haben.
  • Finde Zeit zum basteln . Engagieren Sie sich entweder an Ihrem Arbeitsplatz für ein Skunkwork-Projekt oder üben Sie in Ihrer Freizeit . Dies geht Hand in Hand mit Ihrer Lektüre, indem Sie Ihr neues Wissen in die Praxis umsetzen und sehen, wie solche Dinge funktionieren werden. Dies ist auch das Zeug, das für eine gute Diskussion mit Ihrem Mentor sorgt.
  • Beschäftigen Sie sich mit etwas Technischem außerhalb Ihres Arbeitsplatzes. Dies kann ein Projekt oder ein Forum sein. Etwas, das es Ihnen ermöglicht, Ihre Theorien und Ideen außerhalb Ihres unmittelbaren Kreises von Gleichgesinnten zu testen, um eine neue Perspektive auf die Dinge zu bewahren.
  • Seien Sie geduldig . Erkennen Sie, dass das Sammeln von Erfahrungen einige Zeit in Anspruch nimmt, und lernen Sie zu akzeptieren, dass Sie eine Weile zurücktreten müssen, um zu erfahren, warum und wo Sie versagt haben.
  • Führen Sie ein Tagebuch oder einen Blog über Ihre Aufgaben, Ihre Gedanken, Ihre Fehler und Ihre Erfolge. Dies ist nicht unbedingt erforderlich, aber ich habe festgestellt, dass es für Sie von großem Nutzen sein kann, zu sehen, wie Sie sich im Laufe der Zeit entwickelt haben, wie Ihre Fähigkeiten gewachsen sind und Ihre Gedanken sich geändert haben. Ich kehre alle paar Monate zu meinen eigenen Zeitschriften zurück und schaue mir das an, was ich vor 4-5 Jahren geschrieben habe. Es ist ein echter Augenöffner zu entdecken, wie viel ich in dieser Zeit gelernt hatte. Es ist auch eine Erinnerung daran, dass ich von Zeit zu Zeit etwas falsch gemacht habe. Es ist eine gesunde Erinnerung, die mir hilft, mich zu verbessern.
S.Robins
quelle
45
+1 für Versuch und Misserfolg. Denn wenn Sie nicht verstehen, warum es ein Entwurfsmuster gibt, können Sie dieses Muster nicht effektiv verwenden.
Mert Akcakaya
2
+1 tolle Antwort, aber ich finde, dass es etwas unvollständig ist. Ich glaube, der mit Abstand wichtigste Beitrag wäre ein sehr guter Appetit auf Refactoring. Schreiben Sie, schauen Sie sich an, was die Theorie sagt (Artikel, Bücher oder Mentor), refactor / rewrite, kehren Sie zur Theorie zurück, refactor / rewrite - dies gibt Ihnen Zeit, sich auf die Struktur zu konzentrieren, während Sie mit vertrautem Code arbeiten. Sei dein schlimmster Kritiker. Ich würde auch sagen, dass es sehr wichtig ist, dass Sie niemals den Appetit verlieren, Ihre eigene Arbeit ständig zu überdenken.
vski
1
@vski Es gibt viele Konzepte, die ich hätte einbeziehen können, aber die Frage ist, ob diese Konzepte für sich genommen einen vernünftigen Weg darstellen, um die Erfahrung zu sammeln, die das OP benötigt, um sich selbst als verbesserten Designer zu betrachten. Im Rahmen meiner Antwort sehe ich Refactoring als eine Praxis (gemäß meinem zweiten Punkt). Dies gilt auch für Clean Code, Test First, BDD und viele andere Konzepte. Ich bin der Ansicht, dass es viele Fähigkeiten und Erfahrungen gibt, die erforderlich sind, um sich zu einem Punkt zu entwickeln, an dem mit der Zeit Designfähigkeiten entstehen und wachsen, wobei Erfahrung und Wissen erworben werden. :)
S.Robins
2
+1 für einen Mentor. Lassen Sie Ihren Mentor im Idealfall Code-Reviews mit Ihnen durchführen. Wenn Sie Ihren Code von einer anderen Person lesen und kritisieren lassen, können Sie sich auf ein besseres und saubereres Design konzentrieren.
Leo
2
"Immer versucht. Immer gescheitert. Egal. Versuchen Sie es erneut. Scheitern Sie erneut. Scheitern Sie besser." --- Samuel Beckett.
Peter K.
16

Nun, es gibt keinen goldenen Apfel für diese Art von Frage, und ich glaube, dass jeder Kodierer selbst herausfinden muss, was für ihn richtig ist. Hier ist meine Einstellung.

Sie könnten Bücher zu diesem Thema lesen. Tolle Bücher. Fantastische Bücher. Ich finde jedoch, dass diese Bücher Ihnen nur dann helfen, wenn Sie versucht haben, eine Anwendung zu erstellen und zu entwerfen - und dies gescheitert ist.

Für mich dreht sich alles um Erfahrung. Als ich als Anfänger anfing, las ich Bücher über das Entwerfen. Ich habe damals nicht viel von dem Inhalt verstanden. Als ich anfing zu arbeiten und selbst Anwendungen entwerfen musste, machte ich sehr chaotische Anwendungen. Sie arbeiteten, aber es war ein Schmerz, sie zu unterhalten. Dann las ich diese Bücher noch einmal - und diesmal verstand ich sie besser.

Jetzt mache ich weiter neue Fehler und lerne aus den alten.

Amadeus Hein
quelle
10
Hier gibt es einen tollen Punkt, den es sich auszurufen lohnt: Machen Sie immer wieder neue Fehler; Mache nicht immer die gleichen alten Fehler - lerne aus ihnen und mache etwas Neues.
Bevan
11

Hören Sie auf zu entwerfen und lernen Sie, Code umzugestalten. Eine inkrementelle Entwicklung mit kontinuierlichem und aggressivem Refactoring führt zu einem viel saubereren Endprodukt als jedes Design im Vorfeld.

Kevin Cline
quelle
2
Emergentes Design ist meiner Meinung nach eine schöne Sache, aber ohne Disziplin riskieren Sie, "emergente Spaghetti" zu kreieren. Das Problem mit dem Design im Vorfeld ist, dass die Leute es als alles oder nichts ansehen und ihm einen schlechten Ruf geben, wenn die Dinge schlecht laufen. Dies erinnert mich an einen Artikel von Joel, in dem er erwähnt, dass Design wichtig ist. Was jedoch im Vorfeld benötigt wird, ist genug, damit ein Design etwas bewirken kann, ohne dass Sie Zeit, Ressourcen und die Möglichkeit verlieren, schöne unterstützende Designs durch sauberen Code organisch entstehen zu lassen.
S.Robins
@ S.Robins: Ich hatte das Gefühl, dass das OP immer noch Projekte angreift, die klein genug sind, um mit TDD und kontinuierlichem Refactoring sehr gut abgeschlossen zu werden. Er kann so die Disziplin erlernen, die erforderlich ist, um zu wissen, wie viel Design für komplexere Projekte benötigt wird.
Kevin Cline
Ich dachte, dass dies der Fall sein könnte, aber ich war der Meinung, dass es sich lohnen könnte, einen Gegenpol zu der Annahme zu setzen, dass "jedes Vorab-Design" potenziell schlimmer sein wird als etwas, das nur auftaucht. Ich stimme jedoch zu, dass der Weg, um die notwendige Erfahrung aufzubauen, die das OP anstrebt, darin besteht, sich am Anfang weniger Gedanken um Design zu machen und sich stattdessen darauf zu konzentrieren, gut faktorisierten und sauberen Code zu schreiben. :-)
S.Robins
Ich stimme nicht zu, dass Refactoring immer zum besten Design führt. Natürlich können Sie beim Refactoring häufig das Problem untersuchen und verstehen, aber gutes Design entsteht nicht immer schrittweise durch das Refactoring. Manchmal sehen Sie eine viel bessere Lösung und stellen fest, dass Ihr aktueller Code so weit davon entfernt ist, dass das Umschreiben viel schneller ist als das Umgestalten.
Giorgio
Ich hatte diese Erfahrung in letzter Zeit: Ich überarbeitete und überarbeitete und ging in einem Kreis, der immer wieder die gleichen Probleme hatte: Ich benutzte Iteratoren, um etwas zu codieren, und der Code war immer wieder viel zu komplex. Dann entschied ich mich, die Iteratoren zu vergessen und musste einen Großteil des Codes neu schreiben, aber die Logik wurde viel klarer und prägnanter als zuvor. Ich weiß nicht, ob Sie dies als "aggressives Refactoring" bezeichnen würden: Die Gesamtstruktur der Anwendung wurde nicht geändert, aber einige grundlegende Teile wurden einfach weggeworfen und von Grund auf neu geschrieben.
Giorgio,
7

Lesen Sie über Muster, sicher, aber lesen Sie in erster Linie über Anti-Muster. Das Erkennen von Anti-Mustern ist wichtig und es ist einfacher zu verstehen, warum etwas nicht so gemacht werden sollte, als warum.

Siehe zum Beispiel http://sourcemaking.com/antipatterns/software-development-antipatterns .

Schreiben Sie Code, damit er schnell angepasst werden kann, wenn sich die Anforderungen ändern (was in der Produktionsumgebung sehr häufig vorkommt).

Seien Sie sehr skeptisch, wenn Sie "nur noch einen kleinen Hack" hinzufügen. Noch eine hier, noch eine da, und der Code wird nicht mehr zu handhaben.

Schätzen Sie das offene / geschlossene Prinzip .

Schreibtests (wie bei TDD). Sie zwingen Sie dazu, Ihr Design zu überdenken, noch bevor Sie es tatsächlich implementieren.

Durchsuchen Sie den Code von Open Source-Projekten (dh Projekte mit angemessener Größe). Früher war ich überrascht, dass ich - normalerweise - so viele Abstraktionsebenen sah. Jetzt verstehe ich, dass es keine Kunst ist, um der Kunst willen. Es gibt einen Grund, warum es so gemacht wird.

Konrad Morawski
quelle
4

Ein Prinzip, das ich für gutes Design sehr wichtig finde, ist die Zerlegung: Wenn eine Klasse zu groß ist (mehr als beispielsweise 300-400 Codezeilen), zerlegen Sie sie in kleinere Klassen. Wenn eine Methode zu groß ist (z. B. mehr als 50 Codezeilen), wird sie zerlegt. Wenn ein Projekt mehr als 50 Klassen enthält, zerlegen Sie es.

Der Schlüssel besteht darin, die Größe Ihres Systems zu schätzen und mehrere Abstraktionsebenen (z. B. Subsystem, Anwendung, Projekt, Modul, Klasse, Methode) zu erstellen, mit denen Sie Ihren Code in verständliche Einheiten mit klaren Beziehungen zwischen ihnen und wenigen Abhängigkeiten zerlegen können.

Giorgio
quelle
1
Ihr Vorschlag hat zwar einige Vorzüge, aber Codezeilen sind nicht wirklich wichtig, sondern Verhalten. Wenn Ihre Methode mehr als eine Aufgabe erfüllt, ist es wahrscheinlich an der Zeit, sie umzugestalten. Wenn das eine nur darin besteht, Methoden aufzurufen, die eine Sache selbst erledigen und diese zusammenfügen, ist das in Ordnung.
jer
1
@jer: Das ist natürlich eine Faustregel. Eine Methode, die 100 andere Methoden aufruft, ist, wie Sie sagen, nur das Zusammenfügen von Dingen (sie ruft eine Liste von Unterfunktionen auf). Ich denke mehr über Methoden nach, die eine echte Logik enthalten: Es ist normalerweise ein schlechtes Zeichen, wenn Sie viel hin und her scrollen müssen, um zu verstehen, was eine Methode tut. Dasselbe gilt, wenn Sie eine Klassendefinition mit vielen Mitgliedern betrachten (und die Klasse ist nicht nur eine große flache Sammlung von Eigenschaften).
Giorgio
"Projekt enthält mehr als 50 Klassen, zerlegen Sie es" ist nicht ernst
dynamische
@ yes123: Es sollte eine Idee geben. Es hängt wirklich davon ab, was Sie entwickeln, in welcher Sprache usw.
Giorgio
Ich denke, es wäre vernünftig zu bemerken, dass dies nicht für das Up-Front-Design hilfreich ist (da Sie überarbeiten), sondern dazu beiträgt, Muster und Best Practices zu erlernen, die Ihre zukünftigen Designs verbessern.
Craig Bovis
0

Es ist schwierig, wir reden hier wirklich über die Fähigkeit zu abstrahieren, anstatt besseren Code zu erstellen, aber zwei Dinge werden dich besser machen und eine Sache wird dich glücklicher machen:

"Besser"

A) Finden Sie den besten Designer, den Sie finden können, und kombinieren Sie ein Programm / Design. Bitten Sie sie zu erklären, was sie denken, wenn sie das Problem angehen, geben Sie sich nicht mit "es fühlt sich einfach richtig an" zufrieden und graben Sie weiter. Dieser Prozess wird auch der "Mentoring" -Partei helfen

B) Stellen Sie sich alles als einzelne Akteure und Gespräche zwischen ihnen vor. Jeder der Akteure sollte eine einzelne Rolle / Verantwortung haben und Gruppen von ihnen sollten mit unterschiedlichen Systemen umgehen. Wenn diese Konversation funktioniert und jeder Schauspieler sich kohärent und zusammenhängend fühlt, sind Sie auf dem besten Weg.

Und "glücklicher"

C) Wenn Sie Ihr Bestes versucht haben und es immer noch nicht passiert, dann ist es nichts Falsches, zu akzeptieren, dass manche Leute einige Dinge nicht tun können. Sie könnten engen, brillanten Code schreiben, aber niemals in der Lage sein, Entwürfe oder Architekten zu erstellen. Na und? Ich kann keinen Sport für Toffee treiben, ich sehe nicht gut aus und mein Autofahren wird niemals besser als der Durchschnitt sein. Enthülle und nutze, was du kannst.

Stuart Muckley
quelle
-1

Nach meiner persönlichen Erfahrung ist das Lesen anderer Codes eine gute Quelle der "Inspiration". Ich meine, versuche, die Designs anderer Leute zu verstehen und frage dich, warum er / sie die Dinge so macht?

Sie können viele Open-Source-Projekte für die Forschung finden.

du brauchst sowieso Übung.

PCJ
quelle
-1

Lebe nicht in Angst

Bemühen Sie sich um Einfachheit

Hören Sie auf Ihre Benutzer

Probieren Sie viele Ideen aus

Erstelle etwas und verbessere es dann

Arbeiten Sie an Dingen, die einen Mehrwert bieten, und geben Sie Dinge auf, die dies nicht tun

erturne
quelle
-1

Lerne die richtigen Fragen zu stellen. Meistens verbessern Sie Ihr Design, indem Sie das Problem aus einem anderen Blickwinkel betrachten. Dies hilft Ihnen insbesondere dabei, sich nicht mehr auf die Lösung des vorliegenden Problems zu konzentrieren, sondern Lösungen zu finden, die mehrere verwandte Probleme lösen.

Craig Bovis
quelle