Facebook Pixel
Searching...
Deutsch
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
A Philosophy of Software Design

A Philosophy of Software Design

von John Ousterhout 2021 196 Seiten
4.21
3k+ Bewertungen
Hören

Wichtige Erkenntnisse

1. Komplexität ist die Wurzel der Herausforderungen im Softwaredesign

Komplexität entsteht durch die Ansammlung von Abhängigkeiten und Unklarheiten.

Komplexität akkumuliert schrittweise. Mit dem Wachstum von Softwaresystemen neigen sie dazu, komplexer zu werden, da sich allmählich Abhängigkeiten zwischen Komponenten und unklare Codeabschnitte ansammeln. Diese Komplexität zeigt sich auf drei Hauptarten:

  • Veränderungsverstärkung: Kleine Änderungen erfordern Modifikationen an vielen Stellen
  • Kognitive Belastung: Entwickler müssen große Mengen an Informationen verstehen, um Änderungen vorzunehmen
  • Unbekannte Unbekannte: Es ist unklar, welcher Code geändert werden muss oder welche Informationen relevant sind

Einfachheit ist das Gegenmittel. Um der Komplexität entgegenzuwirken, sollten Softwaredesigner sich darauf konzentrieren, einfache, offensichtliche Designs zu schaffen, die Abhängigkeiten und Unklarheiten minimieren. Dies umfasst:

  • Modulares Design: Systeme in unabhängige Module unterteilen
  • Informationsverbergung: Implementierungsdetails innerhalb von Modulen kapseln
  • Klare Abstraktionen: Einfache Schnittstellen bereitstellen, die die zugrunde liegende Komplexität verbergen

2. Strategisches Programmieren übertrifft taktische Ansätze

Der beste Ansatz besteht darin, kontinuierlich viele kleine Investitionen zu tätigen.

Langfristiges Denken führt zu besseren Ergebnissen. Strategisches Programmieren konzentriert sich darauf, ein großartiges Design zu schaffen, das zufällig funktioniert, anstatt nur den Code zum Laufen zu bringen. Dieser Ansatz umfasst:

  • Zeit für das Design im Voraus investieren
  • Kontinuierlich kleine Verbesserungen vornehmen
  • Code umstrukturieren, um ein sauberes Design aufrechtzuerhalten

Taktisches Programmieren führt zu technischer Schulden. Während taktische Ansätze kurzfristig schneller erscheinen mögen, führen sie oft zu:

  • Ansammlung von schnellen Lösungen und Hacks
  • Zunehmender Schwierigkeit, im Laufe der Zeit Änderungen vorzunehmen
  • Höheren langfristigen Entwicklungskosten

Durch die Annahme einer strategischen Denkweise können Entwickler Systeme schaffen, die einfacher zu warten und weiterzuentwickeln sind, was letztendlich Zeit und Mühe auf lange Sicht spart.

3. Module sollten tief, nicht flach sein

Die besten Module sind diejenigen, die leistungsstarke Funktionalität bieten und gleichzeitig einfache Schnittstellen haben.

Tiefe schafft Abstraktion. Tiefe Module verbergen erhebliche Implementierungskomplexität hinter einfachen Schnittstellen. Dieser Ansatz:

  • Reduziert die kognitive Belastung für die Benutzer des Moduls
  • Ermöglicht eine einfachere Modifikation der Implementierung
  • Fördert Informationsverbergung und Kapselung

Flache Module fügen Komplexität hinzu. Module mit komplexen Schnittstellen im Verhältnis zu ihrer Funktionalität gelten als flach. Diese Module:

  • Erhöhen die Gesamtsystemkomplexität
  • Legen unnötige Implementierungsdetails offen
  • Erschweren das Verständnis und die Modifikation des Systems

Um tiefe Module zu schaffen, konzentrieren Sie sich darauf, einfache, intuitive Schnittstellen zu entwerfen, die die zugrunde liegende Komplexität abstrahieren. Streben Sie an, das Verhältnis von Funktionalität zu Schnittstellenkomplexität zu maximieren.

4. Gute Schnittstellen sind der Schlüssel zur Verwaltung von Komplexität

Die Schnittstelle zu einem Modul enthält zwei Arten von Informationen: formale und informelle.

Gut gestaltete Schnittstellen vereinfachen Systeme. Gute Schnittstellen bieten eine klare Abstraktion der Funktionalität eines Moduls, ohne unnötige Details offenzulegen. Sie sollten:

  • Einfach und intuitiv zu verwenden sein
  • Implementierungskomplexitäten verbergen
  • Sowohl formale (z. B. Methodensignaturen) als auch informelle (z. B. hochrangige Verhaltensbeschreibungen) Informationen bereitstellen

Schnittstellen sollten durchdacht weiterentwickelt werden. Bei der Modifikation bestehenden Codes:

  • Berücksichtigen Sie die Auswirkungen auf die Schnittstelle des Moduls
  • Vermeiden Sie es, Implementierungsdetails offenzulegen
  • Streben Sie an, die Abstraktion, die durch die Schnittstelle bereitgestellt wird, aufrechtzuerhalten oder zu verbessern

Durch die Fokussierung auf die Schaffung und Pflege guter Schnittstellen können Entwickler Komplexität verwalten und ihre Systeme modularer und verständlicher gestalten.

5. Kommentare sind entscheidend für die Schaffung von Abstraktionen

Kommentare sind der einzige Weg, um Abstraktionen vollständig zu erfassen, und gute Abstraktionen sind grundlegend für ein gutes Systemdesign.

Kommentare vervollständigen Abstraktionen. Während Code Implementierungsdetails ausdrücken kann, sind Kommentare unerlässlich, um zu erfassen:

  • Hochrangige Entwurfsentscheidungen
  • Begründungen für Entscheidungen
  • Erwartungen und Einschränkungen
  • Abstraktionen, die aus dem Code allein nicht offensichtlich sind

Schreiben Sie Kommentare zuerst. Indem Sie Kommentare vor der Implementierung von Code schreiben:

  • Klären Sie Ihr Denken über das Design
  • Können Sie Abstraktionen frühzeitig bewerten und verfeinern
  • Stellen Sie sicher, dass die Dokumentation immer aktuell ist

Konzentrieren Sie sich auf das Was und Warum, nicht auf das Wie. Gute Kommentare sollten:

  • Dinge beschreiben, die aus dem Code nicht offensichtlich sind
  • Den Zweck und das hochrangige Verhalten des Codes erklären
  • Vermeiden, lediglich zu wiederholen, was der Code tut

Durch die Priorisierung klarer, informativer Kommentare können Entwickler bessere Abstraktionen schaffen und das Gesamtdesign ihrer Systeme verbessern.

6. Konsistente Benennung und Formatierung verbessern die Lesbarkeit

Gute Namen sind eine Form der Dokumentation: Sie machen den Code leichter verständlich.

Konsistenz reduziert die kognitive Belastung. Durch die Etablierung und Einhaltung von Konventionen für Benennung und Formatierung können Entwickler:

  • Den Code vorhersehbarer und leichter lesbar machen
  • Den mentalen Aufwand zur Verständigung des Codes reduzieren
  • Inkonsistenzen hervorheben, die auf Fehler oder Designprobleme hinweisen können

Wählen Sie Namen sorgfältig. Gute Namen sollten:

  • Präzise und eindeutig sein
  • Ein klares Bild des benannten Elements erzeugen
  • Konsistent im gesamten Code verwendet werden

Formatierung ist wichtig. Konsistente Formatierung hilft dabei:

  • Die Struktur des Codes deutlicher zu machen
  • Visuell verwandte Elemente zu gruppieren
  • Wichtige Informationen hervorzuheben

Durch die Beachtung von Benennung und Formatierung können Entwickler die Lesbarkeit und Wartbarkeit ihres Codes erheblich verbessern.

7. Kontinuierliche Verfeinerung ist entscheidend für die Aufrechterhaltung eines sauberen Designs

Wenn Sie eine saubere Softwarestruktur wünschen, die es Ihnen ermöglicht, langfristig effizient zu arbeiten, müssen Sie etwas zusätzliche Zeit im Voraus investieren, um diese Struktur zu schaffen.

Design ist ein fortlaufender Prozess. Sauberes Softwaredesign erfordert:

  • Regelmäßiges Refactoring zur Verbesserung bestehenden Codes
  • Kontinuierliche Bewertung von Designentscheidungen
  • Bereitschaft, Änderungen vorzunehmen, während sich das System weiterentwickelt

Investieren Sie in Verbesserungen. Um ein sauberes Design aufrechtzuerhalten:

  • Planen Sie Zeit für Aufräumarbeiten und Refactoring ein
  • Beheben Sie Designprobleme umgehend, bevor sie sich summieren
  • Betrachten Sie jede Codeänderung als Gelegenheit zur Verbesserung des Gesamtdesigns

Balance zwischen Perfektion und Fortschritt. Während Sie nach einem sauberen Design streben:

  • Erkennen Sie an, dass einige Kompromisse notwendig sein können
  • Konzentrieren Sie sich auf inkrementelle Verbesserungen
  • Priorisieren Sie Änderungen, die die größten Vorteile bieten

Indem Sie Design als einen kontinuierlichen Prozess der Verfeinerung betrachten, können Entwickler ihre Systeme sauber und handhabbar halten, während sie wachsen und sich weiterentwickeln.

8. Fehlerbehandlung sollte vereinfacht, nicht verbreitet werden

Der beste Weg, die Komplexität der Ausnahmebehandlung zu beseitigen, besteht darin, Ihre APIs so zu definieren, dass es keine Ausnahmen zu behandeln gibt: Definieren Sie Fehler aus der Existenz.

Reduzieren Sie Ausnahmefälle. Um die Fehlerbehandlung zu vereinfachen:

  • Gestalten Sie APIs so, dass außergewöhnliche Bedingungen minimiert werden
  • Verwenden Sie Standardverhalten, um häufige Randfälle zu behandeln
  • Überlegen Sie, ob Ausnahmen wirklich notwendig sind

Aggregieren Sie die Fehlerbehandlung. Wenn Ausnahmen unvermeidlich sind:

  • Behandeln Sie mehrere Ausnahmen an einem einzigen Ort, wenn möglich
  • Verwenden Sie Ausnahmehierarchien, um die Behandlung verwandter Fehler zu vereinfachen
  • Vermeiden Sie es, Ausnahmen abzufangen, die Sie nicht sinnvoll behandeln können

Gestalten Sie normale Fälle einfach. Konzentrieren Sie sich darauf, den häufigen, fehlerfreien Pfad durch Ihren Code so einfach und offensichtlich wie möglich zu gestalten. Dieser Ansatz:

  • Reduziert die kognitive Belastung der Entwickler
  • Minimiert die Wahrscheinlichkeit, Fehler einzuführen
  • Macht den Code leichter verständlich und wartbar

Durch die Vereinfachung der Fehlerbehandlung können Entwickler robustere und leichter verständliche Systeme schaffen.

9. Allgemein verwendbarer Code ist in der Regel besser als spezielle Lösungen

Selbst wenn Sie eine Klasse auf eine spezielle Weise verwenden, ist es weniger Arbeit, sie auf eine allgemein verwendbare Weise zu erstellen.

Allgemeinheit fördert die Wiederverwendbarkeit. Allgemein verwendbarer Code:

  • Kann auf eine breitere Palette von Problemen angewendet werden
  • Ist oft einfacher und abstrakter
  • Hat tendenziell sauberere Schnittstellen

Vermeiden Sie vorzeitige Spezialisierung. Bei der Gestaltung neuer Funktionalitäten:

  • Beginnen Sie mit einem etwas allgemeineren Ansatz
  • Widerstehen Sie dem Drang, zu früh für spezifische Anwendungsfälle zu optimieren
  • Lassen Sie das Design basierend auf tatsächlichen Nutzungsmustern weiterentwickeln

Balance zwischen Allgemeinheit und Einfachheit. Während Sie nach allgemein verwendbaren Lösungen streben:

  • Vermeiden Sie Überengineering oder das Hinzufügen unnötiger Komplexität
  • Stellen Sie sicher, dass das allgemein verwendbare Design immer noch einfach zu verwenden ist für gängige Fälle
  • Seien Sie bereit, spezialisierte Lösungen zu schaffen, wenn es wirklich notwendig ist

Durch die Bevorzugung allgemein verwendbarer Designs können Entwickler flexiblere und wartbare Systeme schaffen, die besser in der Lage sind, zukünftige Anforderungen zu bewältigen.

10. Schreiben Sie Code für die Lesbarkeit, nicht für die Schreibfreundlichkeit

Software sollte für die Lesbarkeit und nicht für die Schreibfreundlichkeit entworfen werden.

Priorisieren Sie die langfristige Wartbarkeit. Beim Schreiben von Code:

  • Konzentrieren Sie sich darauf, es zukünftigen Lesern leicht verständlich zu machen
  • Vermeiden Sie Abkürzungen oder clevere Tricks, die den Zweck des Codes verschleiern
  • Investieren Sie Zeit in die Schaffung klarer Abstraktionen und Dokumentationen

Gestalten Sie den Code offensichtlich. Streben Sie an, Code zu schreiben, der:

  • Schnell mit minimalem mentalen Aufwand verstanden werden kann
  • Klare und konsistente Benennungskonventionen verwendet
  • Eine logische und leicht nachvollziehbare Struktur hat

Refaktorisieren Sie für Klarheit. Überprüfen und verbessern Sie regelmäßig bestehenden Code:

  • Suchen Sie nach Möglichkeiten, komplexe Abschnitte zu vereinfachen
  • Zerlegen Sie lange Methoden in kleinere, fokussierte Teile
  • Beseitigen Sie Duplikationen und Inkonsistenzen

Durch die Priorisierung der Lesbarkeit über die Schreibfreundlichkeit können Entwickler Systeme schaffen, die einfacher zu warten, zu debuggen und im Laufe der Zeit zu erweitern sind. Dieser Ansatz erfordert möglicherweise anfangs mehr Aufwand, zahlt sich jedoch in reduzierter langfristiger Komplexität und verbesserter Teamproduktivität aus.

Zuletzt aktualisiert:

Rezensionen

4.21 von 5
Durchschnitt von 3k+ Bewertungen von Goodreads und Amazon.

Eine Philosophie des Software-Designs, 2. Auflage erhält gemischte Kritiken. Viele loben die Einsichten zum Umgang mit Komplexität und das Entwerfen tiefgehender Module, während andere die Betonung auf Kommentare und die mangelnde Tiefe in bestimmten Bereichen kritisieren. Die Leser schätzen die klare Sprache und die praktischen Ratschläge, insbesondere für weniger erfahrene Entwickler. Allerdings empfinden einige erfahrene Programmierer das Buch als zu grundlegend oder sind mit bestimmten Empfehlungen nicht einverstanden. Der Fokus des Buches auf objektorientierte Programmierung und die akademische Perspektive wird hervorgehoben, wobei sich manche mehr vielfältige Sprachbeispiele und praxisnahe Anwendungen wünschen.

Über den Autor

John Ousterhout ist ein renommierter Informatiker und Professor an der Stanford University. Er ist vor allem bekannt für die Entwicklung der Tcl-Skriptsprache und des Tk-Grafikbenutzeroberflächen-Toolkits. Ousterhout hat bedeutende Beiträge zu verteilten Betriebssystemen, Dateisystemen und Speichersystemen geleistet. Seine Forschung und Lehre konzentrieren sich auf Softwaredesign und das Management von Komplexität. Als Autor von „A Philosophy of Software Design“ schöpft Ousterhout aus seiner umfangreichen akademischen und industriellen Erfahrung, um wertvolle Einblicke in effektive Praktiken der Softwareentwicklung zu geben. Sein Werk betont die Bedeutung strategischer Programmierung und das Design von Systemen, die die Komplexität minimieren.

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Ratings: Rate books & see your ratings
Unlock Unlimited Listening
🎧 Listen while you drive, walk, run errands, or do other activities
2.8x more books Listening Reading
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Jan 25,
cancel anytime before.
Compare Features Free Pro
Read full text summaries
Summaries are free to read for everyone
Listen to summaries
12,000+ hours of audio
Unlimited Bookmarks
Free users are limited to 10
Unlimited History
Free users are limited to 10
What our users say
30,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Settings
Appearance
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →