Wo finde ich Entwurfsübungen, an denen ich arbeiten kann? [geschlossen]

16

Ich halte es für wichtig, meine Fähigkeiten zur Problemlösung weiter zu trainieren. Das Schreiben meiner eigenen Mini-Projekte ist eine Möglichkeit, aber eine andere besteht darin, online gepostete Probleme zu lösen. Es ist einfach, interessante Programmier-Quiz online zu finden, bei denen clevere Algorithmen zum Lösen eingesetzt werden müssen - Project Euler ist ein bekanntes Beispiel.

In vielen realen Projekten hat das Design der Software jedoch - insbesondere in den Anfangsphasen - große Auswirkungen und kann in späteren Phasen nicht so einfach angepasst werden wie einfache Algorithmen. Um diese Fähigkeiten zu verbessern, suche ich nach einer Sammlung von Designproblemen.

Wenn ich "Design" sage, meine ich das abstrakte Design einer Softwarelösung - zum Beispiel, welche Module es geben wird und welche Abhängigkeiten zwischen ihnen bestehen, wie die Daten im Programm fließen werden, welche Art von Daten im System gespeichert werden müssen Datenbank usw. Bei Entwurfsproblemen handelt es sich um diejenigen Probleme, die in der Anfangsphase eines Projekts unbedingt zu lösen sind. Bei der Lösung handelt es sich jedoch um ein Whiteboard-Diagramm ohne eine einzige Codezeile.

Natürlich gibt es für diese Art von Problemen keine einzige richtige Lösung, aber ich bin besonders zufrieden mit jedem Ort, an dem auch Vor- und Nachteile der typischen Lösungen angezeigt werden, die zur Lösung des Problems verwendet werden könnten.

Eiche
quelle

Antworten:

7

Wie wäre es mit Code Kata . Ich habe ein paar davon gemacht, und es macht Spaß, sie zu machen, und sie sind so herausfordernd, dass es immer etwas zu lernen gibt.

Die Kommentare für jede der Kata enthalten in der Regel genügend Informationen, um Antworten auf alle Fragen zu geben, bei denen Sie nicht weiterkommen.

Alan
quelle
Das erste ist sicherlich ein Designproblem, aber ich hatte das Gefühl, dass die anderen viel mehr Code-orientiert sind. Ich werde es noch einmal anschauen, danke!
Oak
3

Beginnen Sie mit dem klassischen Designproblem: KWIC.

David Parnas verwendete KWIC als Beispiel in seinem klassischen Aufsatz über Modularität: Zu den Kriterien für die Zerlegung von Systemen in Module , die wahrscheinlich alle 10 Jahre gelesen werden sollten.

KWIC, für Schlüssel-Wort in Zusammenhang , ist eine einfache Indizierung und Sortierung von Problem , wo Sie in Textzeilen lesen, und drehen Sie dann jede Zeile basierend auf Schlüsselwörtern (zB ohne „die“, „mit“) und fügte hinzu , jede Verschiebung ein Liste Sie dann sortieren. Die Idee ist, dass die Verwendung von KWIC nützlich wäre, um einen Index für ein Buch zu generieren. Zur Zeit seines klassischen Artikels sagte Parnas, dass ein erfahrener Programmierer es in ein bis zwei Wochen lösen könnte, aber Yannis 'Gesetz besagt, dass es jetzt in ein bis zwei Stunden erledigt werden kann . [Betriebssysteme und Standardbibliotheken sind viel besser geworden.]

Lesen Sie Parnas 'Zeitung durch und sobald Sie wissen, was das KWIC-Programm tun soll, schreiben Sie Ihre eigene als Entwurfsübung. Lesen Sie dann den Rest des Papiers, in dem zwei verschiedene Designs behandelt werden: Beide sind modular aufgebaut, aber einer erreicht, dass Informationen ausgeblendet werden, während der andere dies nicht tut.

Wenn Sie das KWIC-Beispiel kennen, werden Sie andere Software-Designpapiere zu schätzen wissen, die es verwenden. Zum Beispiel zeigt Michael VanHilst in seinem Artikel Decoupling Change from Design eine wirklich interessante Designtechnik unter Verwendung von C ++ - Vorlagen. Und solange es sich um C ++ - Vorlagen und -Design handelt, lesen Sie das Papier zu Synthesizing Objects von Czarnecki und Eisenecker .

Ab KWIC gibt es weitere klassische Beispiele wie das Spacewar-Beispiel , das in mehreren Sprachen wie Python und AspectJ portiert / neu gestaltet wurde .

Natürlich kann jedes Programm als Entwurfsübung verwendet werden, aber KWIC und Spacewar sind Beispiele, bei denen Sie verschiedene Alternativen betrachten können.

Macneil
quelle
Betreff: Ihre Klarstellung ... Ich spreche hier hauptsächlich von der White-Board-Ebene des Designs. Es lohnt sich jedoch auch, sich auf die Code-Ebene zu beschränken, da Sie feststellen können, dass viele Ihrer Design-Lösungen Fehler aufweisen, die das Ausdrücken erheblich erschweren.
Macneil
1

Ich habe solche Dinge gehört, die als "Programmierkatas" bezeichnet werden. Kata ist ein Kampfkunstbegriff für eine Form oder Sequenz von Bewegungen, die immer wieder bis zur Perfektion geübt wird. Wenn Sie in der Sprache Ihrer Wahl nach Katas suchen, werden Sie bestimmt etwas finden. :)

Josh Earl
quelle
1

Ich stimme dir zu, dass Katas und Euler nett sind, um Algorithmen zu entwerfen und das Codieren zu üben - vielleicht kannst du sie erweitern, ein wenig kreativ sein und ein System entwerfen, das sich mit einem der Probleme befasst.

Ich arbeite zum Beispiel daran, die Probleme von Euler nicht nur zu lösen, um die schnellste und kürzeste Antwort zu finden, sondern sie auf verteilte Weise zu lösen - ich möchte eine Reihe von Erlang-Knoten einrichten, um eines der Probleme anzugehen. Das bedeutet natürlich, dass ich herausfinden muss, wie ich das Problem in einzelne Abschnitte aufteilen und sie über ihren Fortschritt berichten und die Ergebnisse zusammenfassen lassen muss (alles in einer funktionalen Sprache, in der ich kein Experte bin).

Vielleicht können Sie ein System entwerfen, um eines dieser Probleme als Geschäftslösung zu lösen - wie können Sie dafür sorgen, dass mehrere "Kunden" gleichzeitig auf Ihr Problem zugreifen können, und die Interaktionen auf Client- und Service-Ebene entwerfen , etc.

Es geht darum, kreativ zu sein und Spaß zu haben.

Watson
quelle