Ist das Schreiben von Software einfacher als das Lesen und Verstehen von Grund auf? [geschlossen]


12

Ich und ein Freund von mir diskutierten gestern über die Unterschiede zwischen dem Schreiben einer großen C ++ - Software und dem Verstehen als Neuzugang.

Ist es möglich, dass das Schreiben einer großen Software einfacher ist, als sie zu lesen und zu verstehen, was sie tut, da eine Software Zeile für Zeile ausgeführt wird und dieser Prozess der Art ähnelt, wie wir (Menschen) Dinge lernen und eine Sache auf eine andere aufbauen (Durchlaufen des Codes hilft, aber Sie müssen sich mehrere Klassen / Quelldateien zusammen merken. Sie wissen nicht einmal, wofür sie geschrieben wurden. Multithread-Code fügt Maluspunkte hinzu.)

Das klingt zunächst seltsam, aber nachdem wir uns ein bisschen überlegt hatten, schien es vernünftig


1
Kurze Erklärung des Abschlusses: Dies ist zwar eine ausgezeichnete Frage, aber auch eine, die einfach nicht beantwortet, sondern nur (ausführlich) diskutiert werden kann. Es gibt zu viele Faktoren zu berücksichtigen, die Qualität und den Stil des Codes, die Lernfähigkeiten und die Vertrautheit des Lesers mit dem Projekt und der Sprache, die Größe des Projekts und so weiter. Wenn Sie daran interessiert sind, die Schließung weiter zu diskutieren, gibt es auf unserer Meta-Site bereits eine Frage dazu .
Yannis

Das Buch "Apprenticeship Patterns" handelt von der Reise vom Anfänger zum Meister. Es beantwortet viele Fragen von Anfängern, Auszubildenden und Programmierern auf Gesellenebene in ihrer Karriereentwicklung. Es dauert einige Zeit, um viele der Muster zu verwenden, aber das ist Teil der Reise. Eines der Muster besteht darin, "Broken Toys" oder "Prototypes" zu schreiben, mit deren Hilfe man herausfinden und mit Produktionssystemen vergleichen kann. Es gibt viele weitere nützliche Muster.
GuruM

Antworten:


41

Aufgrund meiner Erfahrung würde ich die folgenden Aktivitäten in der Reihenfolge von der einfachsten bis zur schwierigsten einordnen.

  1. Guten Code lesen
  2. Schlechten Code schreiben
  3. Guten Code schreiben
  4. Schlechten Code lesen

Die obige Rangfolge führt zu 2 Schlussfolgerungen

  1. Während es einfacher ist, Code zu schreiben als schlechten Code zu lesen, ist es einfacher, guten Code zu lesen als Ihren eigenen Code zu schreiben
  2. Das Schreiben von schlechtem Code ist einfacher als das Schreiben von gutem Code, aber das Schreiben von schlechtem Code bereitet Sie darauf vor, schlechten Code zu lesen, was das Schwierigste von allem ist. Zumal schlechter Code mehr gelesen als geschrieben wird.

Natürlich sind guter Code und schlechter Code allgemeine Verallgemeinerungen. Ich empfehle Code Complete und Clean Code für weitere Details zu gutem Code.


Viele andere Dinge können zu "schlechtem Code" führen - mangelnde interne Konsistenz, einheitliche Vision oder Planung. Ein allgemeiner Mangel an Planung oder eine ordnungsgemäße Modularisierung des Codes. Ich habe guten Code gesehen, der sinnlos war, weil er keine integrierten Sprachfunktionen verwendet hat, die genauso gut funktioniert hätten.
Ben DeMott

Außerdem, wie man guten Code schreibt: cdn.thenextweb.com/files/2011/01/65987_700b.jpg
CurtisHx

2
In meiner Skala bleibt das Lesen von schlechtem Code einfacher als das Schreiben von gutem Code. Im schlimmsten Fall können Sie einen Debugger für fehlerhaften Code starten, den Sie lesen möchten, oder ihn mit einem Refactoring-Tool bearbeiten.
mouviciel

2
Das Schreiben von schlechtem Code ist nur bis zu dem Punkt einfach, an dem er integriert werden und funktionieren oder sich im Hinblick auf sich ändernde Anforderungen ändern muss. Wenn Sie sich "in eine Ecke programmieren", ist das nicht mehr einfach.
Kaz

@mouviciel Schlechten Code zu lesen, der von sehr cleveren Programmierern geschrieben wurde, die keinen schlechten Code schreiben sollten, kann schwierig sein. Das Lesen von schlechtem Code, der von naiven Programmierern geschrieben wurde, ist einfach. Setzen Sie einfach Ihren "naiven Hut" auf und es wird offensichtlich, was der Code nicht erreichen kann. :)
Kaz

13

Diese Frage spricht einen falschen Konsens an. http://en.wikipedia.org/wiki/False-consensus_effect

Unterschiedliche Menschen lernen und nehmen Informationen unterschiedlich auf. Es ist vergleichbar mit auditorischen Lernern, visuellen Lernern und kinästhetischen Lernern. Für einige ist das Lesen von Code einfacher, für andere ist das Erstellen von Code einfacher. Für mich ist es das letztere. Für andere in meinem Team ist es das erstere. Ich glaube nicht, dass es sinnvoll ist, einen Konsens oder eine Mehrheit zu finden. Es ist besser zu verstehen, wie Ihr Gehirn Informationen aufnimmt und lernt, und dieses Wissen zu nutzen, um sich selbst zu verbessern und andere zu akzeptieren, die anders sind.


1
Sicherlich ist es viel besser, die Frage zu stellen und die Meinung zu erheben, als einfach zu glauben, dass diese (oder jede andere) Hypothese automatisch richtig ist. Das Erkennen, wie verschiedene Personen dasselbe Problem angehen, kann sich oft positiv auf die Leistung von Teams und die Verbesserung der sozialen Interaktion auswirken.
Robbie Dee

7
Sie sind absolut richtig. Fragen ist der Anfang. Und zu verstehen, dass es einen falschen Konsens gibt, ist für das Verständnis von Vorteil. Deshalb habe ich die Frage "beantwortet", anstatt sie einfach zu ignorieren.
mawcsco

7

Unterschiede zwischen dem Schreiben einer großen C ++ - Software und dem Verstehen als Neuzugang

Dies ist nicht der Unterschied zwischen Lese- und Schreibsoftware. Wenn Sie neu in einem Projekt sind (und besonders wenn Sie neu in einem Unternehmen sind), müssen Sie viel mehr lernen als nur, was der Code tut. Um zu verstehen, warum der Code das tut, was er tut, ist häufig ein Verständnis der Funktionsweise des Unternehmens und der Beziehung des Projekts zum Rest der Organisation erforderlich. Kurz gesagt, das Lesen von Code ohne Hintergrundwissen ist eine langsamere und schwierigere Aufgabe als das Lesen von Code, wenn Sie den Kontext, in dem der Code funktioniert, vollständig verstehen.

Es gibt einen Unterschied zwischen dem Schreiben von brandneuem Code in einem Greenfield-Projekt und dem Lesen und Ändern von vorhandenem Code, aber ich würde nicht sagen, dass einer notwendigerweise einfacher als der andere ist, nur anders. Wenn Sie etwas Neues erstellen, müssen Sie sich nicht darum kümmern, wie Ihr Code mit den bereits vorhandenen Elementen funktioniert, sondern Sie müssen sich darum kümmern, dass Ihr Projekt ausreichend erweiterbar und anpassbar ist, damit es auch in Zukunft nützlich bleibt . Wenn Sie an einem vorhandenen Projekt arbeiten, können Sie häufig die bereits vorhandenen Informationen als Leitfaden verwenden. Sie müssen jedoch zunächst verstehen, was vorhanden ist.

Als "Neueinsteiger" ist es normalerweise besser, an einem vorhandenen Projekt zu arbeiten, da Sie so alles lernen, was Sie nicht wissen: wie das Geschäft funktioniert, wie die verschiedenen Projekte zusammenarbeiten, Standards und Praktiken programmieren und sogar (vor allem) was könnte verbessert werden.


Verständnis einer Kontextbreite / -tiefe des Systems und der zugrunde liegenden API mit Erfahrung. Was sind die logischen Komponenten des Systems? Wie interagieren diese Komponenten miteinander? Welche Mechanismen nutzen sie für die zugrunde liegenden Bausteine? Wie verhalten sich zugrunde liegende Bausteine ​​auf unterschiedlichen Pfaden? Was sind die Einschränkungen / Ziele des Systems? Warum wurden bestimmte Wege anderen Kandidaten vorgezogen? Wenn Sie eine neue Komponente hinzufügen müssen, welche könnten Sie wiederverwenden und welche müssen Sie neu hinzufügen? Können Sie von "innerhalb des Systems" sehen? Ein Super-Buch zum Pragmatischen Denken und Lernen.
GuruM

Das Bauen eines "Prototyps" oder eines "kaputten Spielzeugs" (mit bekannten Mängeln und nur um Alternativen zu untersuchen) würde dazu beitragen, sich selbst zu "zwingen", die obigen Fragen zu überdenken. Das Hinzufügen von Komponenten und Funktionen, gefolgt von Refactoring, würde dazu beitragen, ein Gefühl für die vorliegenden Probleme und die möglichen Lösungen zu bekommen (möglicherweise über die Forensuche).
GuruM

4

Es ist eine interessante Frage, aber ich tendiere dazu, mich auf die Seite zu neigen, die leichter zu lesen und zu verstehen ist, als sie zu erstellen.

Wenn Sie ein erfahrener Programmierer sind, lesen Sie wahrscheinlich den Code durch und sagen: "Ja, gute Wahl, überprüfen Sie, oh, ich hätte vielleicht X statt Y gemacht." Sparen Sie immense Zeit beim Schreiben von Grund auf (es sei denn, es gibt Gründe dafür).

Wenn Sie ein neuerer Programmierer sind, dann "wissen Sie nicht, was Sie nicht wissen", und so müssen Sie all die kleinen Dinge erfinden / lernen, und sehr wahrscheinlich werden Sie einige Ineffizienzen in der Code. Sie werden jedoch wahrscheinlich ein besseres Verständnis der Sprache entwickeln.

In beiden Fällen ist es jedoch einfacher, den Code zu lesen und von dort aus fortzufahren, als ihn vollständig von Grund auf neu zu schreiben.


2

Den meisten Programmierern fällt es leichter, selbst geschriebenen Code zu verstehen, im Vergleich zu Code, den andere Leute geschrieben haben. Dies ist sowohl auf das von Ihnen erwähnte zeilenweise Lernen als auch auf individuellen Stil und Talent zurückzuführen. Das ist der Grund, warum so viel Rad neu erfunden wird.

Das ist jedoch der Blick auf die Bäume. Die Gesamtstrukturansicht sieht so aus, dass es viel einfacher ist, Code zu lesen, als ihn von Grund auf neu zu schreiben. Ist es beispielsweise einfacher, ein neues Textverarbeitungsprogramm von Grund auf neu zu schreiben oder eine vorhandene Codebasis gut genug zu lernen, um Verbesserungen vorzunehmen?

Wenn Sie mit dem Lesen des Codes beginnen, können Sie sich unzählige Möglichkeiten vorstellen, um den Code für sich selbst leichter lesbar zu machen. Sie verbringen die erste Zeit damit, nur den Code zu verfolgen und zu versuchen, die Lage des Landes herauszufinden, manchmal in einer Architektur, die völlig unvorstellbar ist, wie Sie es tun möchten. Aber selbst in wirklich großen Codebasen werden Sie vielleicht 40-80 Stunden damit verbringen, Ihre Räder zu drehen, verglichen mit den hunderttausenden Arbeitsstunden, die bereits in die Erstellung dieser Anwendung investiert wurden.


Können Sie Code schreiben und nicht verstehen? Vielleicht kopieren.
JeffO

@ Jeffo die ganze Zeit - lol ...
Robbie Dee

1

Die Person, die die Software schreibt, hat fast immer das beste Verständnis für das Programm, da sie die Logik und den Denkprozess während des Schreibens kennt.

Ich glaube nicht, dass das Schreiben von Code mit dem Lesen von Code in Bezug auf die Verständlichkeit verglichen werden kann. Auf der einen Seite bietet das einfache Schreiben von Software ein besseres Verständnis dieser spezifischen Software, da der Kontext für jeden Abschnitt des verwendeten Codes, der verwendeten Bibliothek usw. bekannt ist. Das Lesen von Code, den andere geschrieben haben, kann jedoch schwierig zu verstehen sein die eigentliche Software, aber in Bezug auf das Verständnis der Sprache kann sie Einblicke in neue Möglichkeiten geben, Dinge oder Verwendungen einer Bibliothek zu tun, die Sie möglicherweise nicht in Betracht gezogen haben, was dazu führen kann, dass Sie Ihr Leben leichter mit dem Schreiben von Code verbringen.

In Bezug auf das Build-Wissen denke ich, dass das Lesen und Schreiben von Code sehr eng miteinander verbunden sind und in vielerlei Hinsicht aufeinander aufbauen. Die Erfahrung mit dem Schreiben von Code erleichtert das Verstehen von Code anderer Benutzer, und das Lesen von Code erleichtert das Schreiben von Code (durch neue Logikkonzepte, Bibliotheksnutzung usw.).


1

Dies ist etwas, das ich persönlich als selbstverständlich empfunden habe, aber ich war mir nie ganz sicher, ob es für die gesamte Programmpopulation gilt. Ich kenne zum Beispiel einige sehr talentierte Programmierer, die die Dokumentation nicht lesen, sondern gerne den Code anderer lesen und verstehen können, als ob es ihr eigener wäre.

Dies führt zu der Frage: Ist das wichtig?

Wenn Sie den Code lesen, nehmen Sie wahrscheinlich eine Änderung vor, anstatt ihn neu zu schreiben. Selbst wenn Sie es umschreiben, schreiben Sie es wahrscheinlich in einer neuen Sprache / Version, sodass Sie den Code möglicherweise nicht unbedingt auf die gleiche Weise erstellen. Der Punkt, den ich anspreche, ist, dass es nicht immer notwendig ist, den gesamten Code zu verstehen.

In Anbetracht dessen erkennen neuere Entwicklungsmethoden, z. B. BDD , dass es wichtig ist, dass die Geschäftslogik aus dem Code klar hervorgeht, anstatt dass der Code lediglich ein Mittel ist, um die Maschine anzutreiben. Das ist natürlich nichts Neues - das Konzept gibt es seit Donald Knuths wegweisender Arbeit: Literate Programming .


1

Ich gehe auf die Antwort von StMotorSpark ein und füge nur hinzu:
Es hängt von so vielen Faktoren ab, dass es keine Ja- oder Nein-Frage sein kann, zum Beispiel:

  • Ist der vorhandene Code gut dokumentiert und gut geschrieben oder sieht er wie ein Spaghetti ohne Sinn und Kommentar aus?
  • Ist es eine winzige App mit sehr seltenen Situationen, die Sie unendlich viel Zeit gekostet haben, um herauszufinden, wie die Lösung aussehen soll, oder eine größere, aber einfache App?
  • etc.

1
Sehr gute Punkte; Ich würde jedoch argumentieren, dass es mehr von der Person abhängt. Selbst wenn es beispielsweise Code gibt, der fast keine Dokumentation enthält, kann er dennoch einen Einblick in die Form "Das ist seltsam, ich frage mich, was das ist" geben. Wenn jemand wirklich lernen möchte, findet er alles, was hilfreich ist, unabhängig von der Größe des Programms oder der Dokumentation. In Anbetracht dessen helfen gute Dokumentationen und Code, dessen Größe nicht übertrieben ist, erheblich.
StMotorSpark

1
Stimme voll und ganz zu, es kommt auch sehr auf die Person an. Beachten Sie nur, dass einige von uns aufgrund ihrer beruflichen Anforderungen viel von Grund auf neu entwickeln, während andere viel warten. Dies wird unweigerlich zwei verschiedene Fachkenntnisse perfektionieren, egal ob beide mit der gleichen gut organisierten Denkweise, der gleichen
Logikstufe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.