Wie schaffen es Menschen, extrem komplexen und schwer lesbaren Code zu schreiben und zu pflegen? [geschlossen]

27

Das Lesen des SQLite- Quellcodes ist IMO-Mission unmöglich. Dabei handelt es sich um eine nützliche, recht komplexe Software (schließlich handelt es sich um eine vollständig eingebettete Datenbank), die heruntergeladen, kompiliert und aus anderem Code verwendet und ständig aktualisiert werden kann.

Wie schaffen es die Leute, solch extrem komplexen und schwer lesbaren Code zu schreiben und zu pflegen?

scharfer Zahn
quelle
1
Ich denke, sie tun es nicht :-D
Pawka
2
@Pawka: Wo "sie" nicht die SQLite-Leute einschließen.
Frank Shearar
11
Auch wenn der Code komplex und schwer zu lesen ist, kann er in Anbetracht der Komplexität des Problems, das er löst, immer noch ein relativ guter Code sein. Das Schreiben von einfachem und leichtem Code zur Lösung schwerwiegender Probleme ist oft einfach unmöglich, unabhängig davon, wie genau Sie sich an die "Best Practices" halten. Umso wichtiger ist es, den Code so einfach und klar wie möglich zu gestalten .
Joonas Pulakka
1
Hat jemand jemals ein riesiges Projekt gesehen, das einfach zu lesen war?
Jeff Davis
2
Praktikanten, Postdocs usw.
einstellen

Antworten:

19

Es gibt einen großen Unterschied zwischen komplex und kompliziert. Der folgende Link fasst es zusammen. :)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

Persönlicher ausgedrückt, arbeite ich mit einer Codebasis von mehr als 1 Million Codezeilen. Ich war von Zeile 1 bis zu seinem aktuellen Status dabei. Je mehr Farmilar Sie sind (lesen Sie länger, bis Sie im Code sind), desto einfacher wird es. Ich kann Ihnen nicht sagen, was jede Zeile tut, aber ich kann Ihnen sagen, dass Sie nach einer bestimmten Aufgabe oder einem bestimmten Fehler suchen sollen. Es kommt einfach von alleine.

Die Moral der Geschichte ist, dass wie alles in der Programmierwelt Zeit benötigt wird. Wenn Sie SQLite kennen und verstehen wollen, dann machen Sie doch selbst Witze. Es wird einige Zeit dauern, um herauszufinden, wie alles zusammenarbeitet. Der Unterschied zwischen gutem und schlechtem Code besteht darin, wie lange dieser Vorgang dauert.

Schließlich haben einige Entwickler nicht die Möglichkeit, in eine Codebasis zu springen und dies herauszufinden. Viele werden sich von der Größe oder Architektur der Codebasis überwältigt fühlen. Andere werden kein Problem damit haben, einfach hinein zu springen. Es hängt alles von den Stärken der Entwickler ab.

Tony
quelle
31

Im speziellen Fall von SQLite ist das Hauptwerkzeug, das sie für die Entwicklung und Wartung ausgewählt haben, das automatisierte Testen. Sie sind stolz auf eine 100% ige Abdeckung (Zweigabdeckung, keine Aussageabdeckung) in ihrer Testsuite. Ihnen zufolge ist es eines der am besten getesteten Softwareprodukte der Welt. Sie wissen also sofort, wann etwas, das sie hinzugefügt oder geändert haben, eine Regression hervorruft und können sich infolgedessen ziemlich furchtlos entwickeln.

http://sqlite.org/testing.html

Ziemlich erstaunliche Zahlen - sie haben ungefähr 640- mal so viele Zeilen Testcode wie der Seriencode.

EDIT: Diese Frage wurde von den Toten aufgeworfen, wie es scheint! Und etwas mehr als ein Jahr später meldet dieselbe Seite, dass sie 1177-mal so viele Zeilen Testcode wie in der Produktion enthält!

Dan Ray
quelle
2
Niemand anderes als ich sieht dies eher als ein Problem als als einen Punkt des Stolzes ?
Stephen
1
Ich nehme nicht wirklich an. Die Datenbank muss in erster Linie zuverlässig sein.
Ts01
5
@Stephen, warum sollten viele Testfälle ein Problem sein ?
1
eine Taille der Zeit? Zu viele Tests sind so schlecht wie zu wenig Tests (IMHO)
Dainius
9
Wie kann ein Test Zeitverschwendung sein, wenn er einen möglichen Fall abdeckt, in dem der Code fehlschlagen könnte?
Ramhound
7
  • Funktionalitäten entwickeln sich im Laufe der Zeit.
    • Neue Funktionalitäten werden durch neue Kundenanforderungen vorangetrieben.
    • Alter Code wurde so geschrieben, dass zukünftige, noch zu implementierende Funktionen hinzugefügt werden können, ohne alten Code zu beschädigen.
  • Domain-Experten (in diesem Fall ist die Datenbank eine bekannte Domain in der Informatik.)
  • Community-Feedback
    • Bugs
  • steile Lernkurve war kein Problem für die gut vorbereiteten und ausdauernden. Es kann 6 Monate, 1 Jahr oder sogar länger dauern, bis man es sich bequem macht, und das können manche Leute ertragen.
  • kommerzielle Motivationen. Ohne finanzielle Unterstützung können nur sehr wenige Menschen Zeit und Energie in die steile Lernkurve investieren.
rwong
quelle
4

Sie müssen das gesamte Projekt nicht genau kennen, um es verwalten zu können. In der Regel haben Menschen mit großer, komplexer Software ihre eigenen "Bereiche", die sie betreuen, und sie verfügen nur über ein vorübergehendes Wissen über den Rest des Systems.

SQLite ist im Vergleich zu "großen Softwareprojekten" eigentlich relativ klein, aber wenn Sie sich so etwas wie das Windows-Betriebssystem ansehen, werden Sie Leute haben, die nur am Kernel arbeiten, Leute, die nur an der Shell arbeiten, Leute, die nur arbeiten im Internet Explorer, Leute, die nur mit dem Fenstermanager arbeiten, usw. usw. Jemand, der in der "Shell" arbeitet, kann einen Fehler im Kernel nicht im Handumdrehen beheben.

Es gibt auch den Vorteil, dass sich diese Projekte im Laufe der Zeit weiterentwickeln: Sie haben nicht immer so kompliziert begonnen. Das bedeutet, dass ein neuer Entwickler normalerweise von erfahreneren Entwicklern "geschult" werden kann.

Wenn Sie sich einem großen Entwicklerteam anschließen, erhalten Sie einen bestimmten Aspekt des Projekts, an dem Sie arbeiten müssen (möglicherweise einen Fehler oder eine neue Funktion), und in den ersten paar Iterationen wird ein anderer Entwickler Sie zum "Kumpel". Ihr Kumpel hat ein gutes Verständnis für den Bereich, in dem Sie arbeiten, und kann Ihnen helfen, sich zurechtzufinden.

Bei Open-Source-Projekten wie SQLite ist es tatsächlich etwas schwieriger, da vorhandene Entwickler nicht motiviert sind, neue Entwickler zu "schulen". So werden Sie feststellen, dass Sie ein bisschen mehr alleine sind. Sie finden jedoch weiterhin Hilfe in Entwicklerforen oder Mailinglisten (z. B. wenn Sie eine Frage wie "Ich möchte diese und jene Funktion implementieren" oder "Ich habe Fehler XYZ gefunden, wo soll ich suchen?" irgendeine Form von Hilfe.

Dean Harding
quelle
Ändere die Details und das klingt sehr nach meinem aktuellen Job! Der beste Teil dieser Antwort ist die Spezialisierung und die Notwendigkeit, sich im Laufe der Zeit zu entwickeln. Fügen Sie auch eine Prise Humor über die ganze Sache hinzu.
DarenW
4

Es gibt einen Unterschied zwischen schwer lesbaren und komplexen Projekten. Wenn eine Person die Sprache, in der das Projekt geschrieben wurde, oder die Domäne des Projekts nicht gut versteht, bedeutet dies nicht, dass der Code schlecht geschrieben ist.

Mein Rat:

  • Stellen Sie sicher, dass Sie die Sprache des Projekts verstehen. Es ist nicht genug, die Sprache zu kennen.
  • Erfahren Sie alles über die Domain, bevor Sie den Code in die Hand nehmen.

Für mich ist SQLite viel zu komplex und nichts kompliziertes. Die Domäne dieses Projekts erfordert ein tiefes Verständnis für breite Konzepte.

Maniero
quelle
3

Eine Sache, die in den anderen Antworten nicht erwähnt wird, ist "Es kommt natürlich zu ihnen". Die meisten Menschen möchten guten Code schreiben, sind jedoch darauf eingestellt, schlechten Code zu schreiben. Einige der Programmierer, die ich getroffen habe, sind natürlich LINEAR-Denker. Manchmal kommen sie sehr witzig auf komplexe Lösungen. Die meisten dieser Leute verbringen keine Zeit damit, das Buch zu lesen oder daraus zu lernen, wie und wann die Arbeit es erfordert.

Aussenseiter
quelle
1
LOL, ich habe mit soemone gearbeitet, wenn es mehrere Möglichkeiten gäbe, etwas zu tun (und es gibt immer welche), würde er immer die komplizierteste, komplizierteste Lösung wählen. Ich glaube nicht, dass er sich dessen überhaupt bewusst war.
HLGEM 05.10.10
3

Wie schaffen es die Leute, solch extrem komplexen und schwer lesbaren Code zu schreiben und zu pflegen?

Wenn es sich bei ihnen um die ursprünglichen Programmierer handelt und sie es weiterhin pflegen, sehen sie es nicht als "komplex und schwer zu lesen" an. Sie sehen es wahrscheinlich als "einfach und leicht zu lesen" an, da sie es selbst geschrieben haben.

Jeder Code braucht Zeit, um ihn zu verstehen. Es ist nur so, dass einige länger dauern als andere :)

lamcro
quelle
2

Sie können Ihren Kopf um jede Code-Basis wickeln, wenn Sie - Ausdauer, Geduld und einen methodischen Ansatz - aber hauptsächlich Ausdauer haben :-)

Nikhil
quelle
1

Das Management wird viel einfacher, wenn die Dinge immer auf die gleiche Weise erledigt werden. Ich kenne den SQLite-Code nicht, arbeite aber in einer Umgebung, in der es mehrere Projekte gibt. Abgesehen vom Verständnis des Geschäftsfalls (EQ-Logik) ist es relativ einfach, mit der Arbeit an einem anderen Projekt zu beginnen, da im Grunde genommen alles überall auf die gleiche Weise erfolgt (Datenbankzugriff usw.). Langer Text, kurzer Sinn: Codierungsrichtlinien - in geeigneter Weise - machen das Leben und einen solchen Code viel einfacher. Dies könnte einer der Helfer für die SQLite-Codierer sein.

Sascha
quelle
1
  • Wenn Sie der ursprüngliche Autor der Software sind und> 10 Jahre damit gearbeitet haben und ein Genie sind, ist es möglicherweise möglich, das Ganze zu verstehen. Große Teile komplexer Software (wie SQLite oder der Linux-Kernel) haben tatsächlich in der Regel genau einen Originalautor, der ein umfassendes und tiefes Verständnis dafür hat, auch wenn andere dazu beigetragen haben.
  • Wenn die Softwarearchitektur vernünftig ist (hohe Kohäsion, niedrige Kopplung), ist das Verstehen des Ganzen keine Voraussetzung für sinnvolle Ergänzungen und Modifikationen.
  • Das Verständnis eines RDBMS oder Betriebssystems ist ein Sonderfall, der ein tiefes Verständnis der zugrunde liegenden CS-Prinzipien erfordert. Nicht so bei "normalen" Softwareanwendungen.
Joonas Pulakka
quelle
1

Sie versuchen es auf einfache Weise zu schreiben, aber nicht auf einfache Weise.

Wenn Sie so einfach wie möglich vorgehen, wird das Verstehen / Lesen beschleunigt, auch wenn dies einige Zeit in Anspruch nehmen kann.

Klaim
quelle
1

Der implementierte Algorithmus legt eine Untergrenze für die Einfachheit des Codes für eine Implementierung fest. Wenn eine abstrakte Beschreibung des zu implementierenden Algorithmus extrem kompliziert ist und das Koppeln von Tonnen verschiedener Daten erfordert, kann der Code, der den Algorithmus implementiert, nicht einfach sein, egal wer ihn schreibt.

Mit anderen Worten, ein Grund, warum ich manchmal unergründlichen Code schreibe, ist, dass ich angesichts des Algorithmus, den ich implementieren möchte, keine andere Wahl habe.

dsimcha
quelle