Aus Versehen bin ich auf folgendes Zitat von Linus Torvalds gestoßen:
"Schlechte Programmierer sorgen sich um den Code. Gute Programmierer sorgen sich um Datenstrukturen und ihre Beziehungen."
Ich habe in den letzten Tagen darüber nachgedacht und bin immer noch verwirrt (was wahrscheinlich kein gutes Zeichen ist), daher wollte ich Folgendes diskutieren:
- Welche Interpretation ist möglich / sinnvoll?
- Was kann daraus gelernt werden?
programming-practices
quotations
beyeran
quelle
quelle
Antworten:
Es könnte hilfreich sein, darüber nachzudenken, was Torvalds kurz zuvor gesagt hat:
Was er sagt ist, dass gute Datenstrukturen den Code sehr einfach zu entwerfen und zu warten machen, wohingegen der beste Code schlechte Datenstrukturen nicht ausgleichen kann.
Wenn Sie sich über das Git-Beispiel wundern, ändern viele Versionskontrollsysteme ihr Datenformat relativ regelmäßig, um neue Funktionen zu unterstützen. Wenn Sie ein Upgrade durchführen, um die neue Funktion zu erhalten, müssen Sie häufig ein Tool ausführen, um auch die Datenbank zu konvertieren.
Als DVCS zum ersten Mal populär wurde, konnten viele Leute nicht herausfinden, was mit dem verteilten Modell passiert, das Zusammenführungen so viel sauberer macht als eine zentralisierte Versionskontrolle. Die Antwort ist absolut nichts, außer verteilte Datenstrukturen hatte zu viel besser sein, um eine Hoffnung auf Arbeit überhaupt zu haben. Ich glaube, dass zentralisierte Zusammenführungsalgorithmen inzwischen aufgeholt haben, aber es hat ziemlich lange gedauert, da ihre alten Datenstrukturen die Art von Algorithmen einschränkten, die sie verwenden konnten, und die neuen Datenstrukturen eine Menge vorhandenen Codes zerstört haben.
Im Gegensatz dazu haben sich die zugrunde liegenden Datenstrukturen trotz einer Explosion von Features in Git kaum verändert. Sorgen Sie sich zuerst um die Datenstrukturen, und Ihr Code wird natürlich sauberer.
quelle
Algorithmen + Datenstrukturen = Programme
Code ist nur der Weg, um die Algorithmen und Datenstrukturen auszudrücken .
quelle
Dieses Zitat ist einer der Regeln in "Die Kunst der Unix-Programmierung", die Torvalds 'Stärke als Schöpfer von Linux ausmacht, sehr vertraut. Das Buch finden Sie hier online
Aus dem Buch ist das folgende Zitat, das erklärt, was Torvalds sagt.
quelle
int**
. Das sollte Sie davon überzeugen, dass Daten tatsächlich NICHT offensichtlich sind. es wird nur so, indem den Daten eine Bedeutung beigemessen wird. Und diese Bedeutung ist im Code.Code ist einfach, es ist die Logik hinter dem Code, die komplex ist.
Wenn Sie sich Gedanken über Code machen, bedeutet dies, dass Sie diese Grundlagen noch nicht kennen und wahrscheinlich auf dem Komplex verloren gehen (dh Datenstrukturen und ihre Beziehungen).
quelle
Code is easy, it's the logic behind the code that is complex
, was hat er gemeint?"Um die Antwort von Morons ein wenig zu erweitern, besteht die Idee darin, dass das Verstehen der Einzelheiten des Codes (Syntax und in geringerem Maße Struktur / Layout) so einfach ist, dass wir Tools erstellen, die das können. Compiler können alles verstehen, was über Code bekannt sein muss, um daraus ein funktionierendes Programm / eine funktionierende Bibliothek zu machen. Ein Compiler kann die Probleme der Programmierer jedoch nicht lösen .
Sie könnten das Argument noch einen Schritt weiter führen und sagen: "Es gibt jedoch Programme, die Code generieren." Der generierte Code basiert jedoch auf einer Art Eingabe, die fast immer von Hand erstellt wird.
Welchen Weg Sie auch einschlagen, um zum Code zu gelangen: Sei es über eine Konfiguration oder eine andere Eingabe, die dann den Code über ein Tool erzeugt, oder wenn Sie ihn von Grund auf neu schreiben, ist es nicht der Code, der zählt. Es ist das kritische Denken aller Teile, die benötigt werden, um zu dem Code zu gelangen, der wichtig ist. In Linus 'Welt sind das hauptsächlich Datenstrukturen und -beziehungen, in anderen Bereichen können es jedoch auch andere Teile sein. Aber in diesem Zusammenhang sagt Linus nur: "Es ist mir egal, ob Sie Code schreiben können, es ist mir wichtig, dass Sie die Dinge verstehen, die die Probleme lösen, mit denen ich zu tun habe."
quelle
Linus bedeutet das:
- Fred Brooks, "Der Monat des mythischen Mannes", Kapitel 9.
quelle
Ich denke, er sagt, dass das allgemeine High-Level-Design (Datenstrukturen und ihre Beziehungen) viel wichtiger ist als die Implementierungsdetails (Code). Ich denke, er schätzt Programmierer, die ein System entwerfen können, über diejenigen, die sich nur auf Details eines Systems konzentrieren können.
Beides ist wichtig, aber ich stimme zu, dass es im Allgemeinen viel besser ist, den Überblick zu behalten und Probleme mit den Details zu haben, als umgekehrt. Dies hängt eng mit dem zusammen, was ich zum Ausdruck bringen wollte , um große Funktionen in kleine aufzuteilen .
quelle
Ich kann dem nicht ganz zustimmen, weil Sie sich darum kümmern müssen. Und eines der Dinge, die ich an der Programmierung liebe, sind die Wechsel zwischen verschiedenen Abstraktionsebenen und Größen, die sich schnell vom Nachdenken über Nanosekunden zum Nachdenken über Monate und wieder zurück bewegen.
Die höheren Dinge sind jedoch wichtiger.
Wenn ich einen Fehler in einigen Problembereichen habe, der zu falschem Verhalten führt, ist es wahrscheinlich nicht allzu schwer, ihn zu beheben. Wenn es zu einer Unterperformance führt, spielt es wahrscheinlich keine Rolle.
Wenn ich einen Fehler bei der Auswahl der Datenstruktur in einem Subsystem habe, der zu falschem Verhalten führt, ist das Problem viel größer und schwerer zu beheben. Wenn es dazu führt, dass es unterdurchschnittlich abschneidet, kann es sehr ernst sein oder, wenn es erträglich ist, ist es immer noch merklich weniger gut als ein konkurrierender Ansatz.
Wenn ich einen Fehler in der Beziehung zwischen den wichtigsten Datenstrukturen in einer Anwendung habe, der zu falschem Verhalten führt, liegt eine massive Umgestaltung vor mir. Wenn es zu einer Underperformance führt, könnte es so schlimm sein, dass es fast besser wäre, wenn es sich falsch verhält.
Und genau das macht es schwierig, diese Probleme auf niedrigerer Ebene zu finden (das Beheben von Fehlern auf niedriger Ebene ist normalerweise einfach, es ist schwierig, sie zu finden).
Das Low-Level-Zeug ist wichtig, und seine verbleibende Bedeutung wird oft ernsthaft unterschätzt, aber es ist blass im Vergleich zu den großen Sachen.
quelle
Jemand, der Code kennt, sieht die "Bäume". Aber jemand, der Datenstrukturen versteht, sieht den "Wald". Daher konzentriert sich ein guter Programmierer mehr auf Datenstrukturen als auf Code.
quelle
Es ist wichtig zu wissen, wie die Daten fließen werden. Um den Fluss zu kennen, müssen Sie gute Datenstrukturen entwerfen.
Wenn Sie zwanzig Jahre zurückblicken, war dies eines der großen Verkaufsargumente für den objektorientierten Ansatz mit SmallTalk, C ++ oder Java. Das große Kriterium - zumindest mit C ++, weil ich das zuerst gelernt habe - war das Entwerfen der Klasse und der Methoden, und dann würde alles andere zusammenpassen.
Zweifellos sprach Linus weiter, aber schlecht gestaltete Datenstrukturen erfordern oft eine zusätzliche Überarbeitung des Codes, was auch zu anderen Problemen führen kann.
quelle
Wenn ich darf, meine Erfahrungen in den letzten Wochen. Die vorangegangenen Diskussionen verdeutlichten die Antwort auf meine Frage: "Was habe ich gelernt?"
Ich habe Code umgeschrieben und über die Ergebnisse nachgedacht, die ich immer wieder gesehen und gesagt habe: "Struktur, Struktur ...", deshalb gab es so dramatische Unterschiede. Jetzt sehe ich, dass es die Datenstruktur war , die den Unterschied ausmachte. Und ich meine alles .
Beim Testen meiner ursprünglichen Lieferung teilte mir der Geschäftsanalyst mit, dass dies nicht funktioniert habe. Wir sagten "30 Tage hinzufügen", meinten aber "einen Monat hinzufügen" (der Tag im resultierenden Datum ändert sich nicht). Addiere diskrete Jahre, Monate, Tage; Zum Beispiel nicht 540 Tage für 18 Monate.
Das Problem: In der Datenstruktur wurde eine einzelne Ganzzahl durch eine Klasse mit mehreren Ganzzahlen ersetzt. Die Änderung der Konstruktion war auf eine Methode beschränkt. Ändern Sie die tatsächlichen Datumsberechnungsanweisungen - alle 2 von ihnen.
Die Auszahlung
Beim Korrigieren des Verhaltens / der Ergebnisse des Codes:
quelle
Ich stelle mir gerne ein sehr kluges Team von Bibliothekaren in einer wunderschön gestalteten Bibliothek mit einer Million zufälliger und brillanter Bücher vor, es wäre eine ziemliche Torheit.
quelle
Kann nicht mehr mit Linus übereinstimmen. Die Konzentration auf die Daten hilft dabei, eine einfache und flexible Lösung für ein bestimmtes Problem zu finden. Git selbst ist ein erprobendes Beispiel - mit so vielen Funktionen, die in den Jahren der Entwicklung unterstützt wurden, bleibt die Kerndatenstruktur weitgehend unverändert. Das ist Magie! --2c
quelle
Ich habe gesehen, das sind zahlreiche Bereiche.
Denken Sie an Unternehmensanalysen ... Angenommen, Sie analysieren, wie Sie Marketing in einem Konsumgüterunternehmen wie Colgate am besten unterstützen können. Wenn Sie mit ausgefallenen Fenstern oder der neuesten Technologie beginnen, helfen Sie dem Unternehmen nicht annähernd so viel, als würden Sie zuerst die Datenanforderungen des Unternehmens durchdenken und sich dann später um die Präsentation kümmern. Das Datenmodell überdauert die Präsentationssoftware.
Betrachten Sie eine Webseite. Es ist viel besser, zuerst über das nachzudenken, was Sie anzeigen möchten (HTML), und sich danach über Stil (CSS) und Skripterstellung (wählen Sie Ihr Werkzeug aus) Gedanken zu machen.
Das heißt nicht, dass Codierung auch nicht wichtig ist. Sie benötigen Programmierkenntnisse, um am Ende das zu bekommen, was Sie brauchen. Es ist, dass Daten die Grundlage sind. Ein schlechtes Datenmodell spiegelt entweder ein zu komplexes oder ein ungedachtes Geschäftsmodell wider.
quelle
Ich schreibe viel häufiger neue Funktionen und aktualisiere vorhandene, als dass ich meinem Datenbankschema neue Spalten oder Tabellen hinzufügen muss. Dies gilt wahrscheinlich für alle gut konzipierten Systeme. Wenn Sie Ihr Schema jedes Mal ändern müssen, wenn Sie Ihren Code ändern müssen, ist dies ein klares Zeichen, dass Sie ein sehr schlechter Entwickler sind.
Qualität des Codeindikators = [Codeänderungen] / [Datenbankschemaänderungen]
"Zeigen Sie mir Ihre Flussdiagramme und verbergen Sie Ihre Tabellen, und ich werde weiterhin verwirrt sein. Zeigen Sie mir Ihre Tabellen, und ich werde Ihre Flussdiagramme normalerweise nicht benötigen; sie werden offensichtlich sein." (Fred Brooks)
quelle
Es scheint, dass diese Idee verschiedene Interpretationen in den verschiedenen Arten der Programmierung hat. Dies gilt sowohl für die Systementwicklung als auch für die Unternehmensentwicklung. Beispielsweise könnte man argumentieren, dass die starke Verschiebung des Fokus in Richtung der Domäne im domänengetriebenen Design dem Fokus auf Datenstrukturen und Beziehungen sehr ähnlich ist.
quelle
Hier ist meine Interpretation davon: Sie verwenden Code, um Datenstrukturen zu erstellen, daher sollte der Fokus auf Letzterem liegen. Es ist wie beim Bau einer Brücke - Sie sollten sich zum Ziel setzen, eine solide Struktur zu entwerfen, anstatt eine, die ansprechend aussieht. Es ist einfach so, dass gut geschriebene Datenstrukturen und Brücken aufgrund ihres effizienten Designs gleichermaßen gut aussehen.
quelle