Wie sollte jemand daran gewöhnt sein, imperativen Code auszulesen?

14

Ich habe vor ungefähr fünf Monaten meinen Universitätsabschluss gemacht und arbeite seit vier Monaten in einem lokalen Startup. Während meines Studiums habe ich alleine Haskell, F # usw. studiert. An der Universität wurde uns Java beigebracht, aber ich war sehr bald mit funktionaler Programmierung vertraut und habe viel mehr Zeit damit verbracht als mit imperativer Programmierung. Infolgedessen ist mein Gehirn auf ein funktionierendes Denken eingestellt. Die Firma, der ich beigetreten bin, verwendet Python, und der Code ist äußerst wichtig. Es fällt mir sehr schwer, imperativen Code zu lesen. Ich kann Mutationen nicht nachverfolgen. Wenn eine Verschachtelung für-wenn-sonst-für-... mehr als vier Ebenen tief geht, verliere ich den Überblick darüber, was im Code vor sich geht. Python ist eine dynamische Sprache, daher enthält der Code keine Typen. Es' Es ist Wochen her, seit ich versucht habe, einen Teil unserer Codebasis (die angeblich "mäßig komplex" ist) zu verstehen, aber ich habe bisher keine nennenswerten Fortschritte beim Verständnis gemacht. Bitte bieten Sie mir einige praktische Techniken an, wie ich diesen Code verstehen soll. Danke im Voraus!

Edit:
Vielleicht sollte ich auch erwähnen , dass es nicht wirklich viele Kommentare im Code und die Namen sind auch nicht sehr intuitiv.

an0nym0us c0ward
quelle
1
Möchten Sie lieber keine oder falsche Kommentare? Ich bin mir sicher, dass Kommentare unter den Bedingungen, die Sie erwähnen, nicht gut altern würden.
Larry Coleman
Sofern sich der Code nicht in dieser extrem kleinen Untergruppe von Code befindet, die als "selbstkommentierend" bezeichnet werden kann, hätte ich lieber einige Kommentare, die zumindest eine Reihe hilfreicher Hinweise enthalten könnten, um mich durch ansonsten nicht zu entzifferendes Geschwätz zu führen! Aber das bin nur ich!
John Tobler
2
Selbst imperative Programmierer neigen dazu, ihre Nebenwirkungen zumindest intuitiv zu begrenzen und kleine Methoden zu schreiben. Ich denke, Sie sind gerade auf einer weniger als idealen Codebasis gelandet.
Mauricio Scheffer

Antworten:

14

Legacy-Code zu verstehen ist schwierig. Es hat fast nichts mit funktionalen oder prozeduralen Aspekten zu tun.

  1. Erstellen Sie eine Karte. Ein Komponentendiagramm der Python-Pakete und -Module. Für jedes Modul müssen Sie Klassendiagramme erstellen.

  2. Verwenden Sie den Python-Interpreter. Sie sollten in der Lage sein, Module zu importieren, Objekte zu erstellen und diese interaktiv auszuüben. Deshalb ist Python beliebt. Sie können drucken, um type(x)zu sehen, welcher Typ eine Variable ( x ) tatsächlich ist.

  3. Lesen Sie im Zweifelsfall unbedingt den Einheitentestcode. Wenn es keinen Unit-Test-Code gibt, treten zusätzlich zum Erlernen einer neuen Codebasis große Probleme auf.

  4. Zeug aufschreiben. Beginnen Sie mit Begleitpapieren. Wenn Sie glauben, dass Sie wissen, was los ist, fügen Sie den Funktionen, Methoden und Klassen docstring-Kommentare hinzu. Fügen Sie diese früh und oft hinzu.

  5. Verwenden Sie Sphinx mit 'autodoc', um zu sammeln, was Sie lernen.

Der wichtigste Teil ist dies. Es ist schwer, die Dinge im Kopf zu behalten. Es ist einfacher, Dinge in Dokumentationsdateien aufzubewahren.

S.Lott
quelle
6
+1. Es ist schwierig, einen Legacy-Code zu verstehen , auch wenn er gut geschrieben ist.
quant_dev
12

Es fällt mir sehr schwer, imperativen Code zu lesen. Wenn eine Verschachtelung für-wenn-sonst-für-... mehr als vier Ebenen tief geht, verliere ich den Überblick darüber, was im Code vor sich geht.

Warten Sie ... bei solch tiefen Verschachtelungsebenen verliert jeder den Überblick über den Code. Oder wie es Linus Torvalds ausdrückte:

Wenn Sie mehr als 3 Einrückungsstufen benötigen, sind Sie trotzdem geschraubt und sollten Ihr Programm reparieren.

Vielleicht sollte ich auch erwähnen, dass der Code nicht wirklich viele Kommentare enthält und die Namen auch nicht sehr intuitiv sind.

Dies hört sich nicht so an, als würde Ihr Unternehmen die gängigen Best Practices einhalten.

Wenn ich Sie wäre, würde ich nur versuchen, die Codebasis durch Disziplin und Gewalt zu verstehen. Grabe dich einfach ein, immer und immer wieder. Es ist wahrscheinlich wie alles. Im Moment fühlen Sie sich wie unter Wasser und können nicht atmen, aber fahren Sie fort, die Codebasis zu untersuchen, und bald schwimmen Sie an die Oberfläche.

Ich fürchte, Ihrer Frage fehlen die technischen Details, um Ihnen einen guten Rat zum Verständnis der Codebasis zu geben, aber es ist nie falsch, sie in einigen Sitzungen mit erfahrenen Kollegen durchzuarbeiten. Lassen Sie sich die Gesamtarchitektur und das Zusammenspiel der verschiedenen Komponenten sowie die von ihnen getroffenen Implementierungsentscheidungen erklären.

Es ist schwierig, allgemeine Ratschläge für den Übergang von funktionalen Sprachen zu imperativen / OO-Sprachen zu geben. Klar, ich könnte ein paar blumige Ausdrücke wie "Sie müssen über Zustände und Verhaltensweisen von Objekten nachdenken" erwähnen, aber diese helfen Ihnen nicht viel. Ich denke, das ist etwas, was Sie erleben müssen.

Falke
quelle
Die Vertiefung Problem kann schlimmer sein: wenn die Sprache säulen Code (wie RPG), und es ist nicht jede tatsächliche Vertiefung. Einige Tools versuchen, dies zu beheben ...
Clockwork-Muse
2

Wenn es Unit-Tests gibt (groß, wenn von Ihnen beschriebene schlechte Praktiken), können Sie sich diese ansehen, um zu sehen, wie der Code getestet wird. Dies bietet einen guten Einblick in die Funktionsweise des Codes.

Ansonsten würde ich empfehlen, allgemeineren Python-Code zu lesen, um sich an die Art und Weise zu gewöhnen, wie er geschrieben wurde.

Sardathrion - Setzen Sie Monica wieder ein
quelle
2

Sie könnten versuchen, einige Fragmente aus Python in Pseudo-Haskell oder was auch immer Sie möchten zu übersetzen. Das kann Ihnen ein Gefühl dafür geben, welche Imperativkonstruktionen lose auf welche Funktionskonstruktionen abgebildet werden. Mit zunehmender Erfahrung werden sich die imperativen Konstruktionen natürlicher anfühlen.

Ich bin von der Programmierung von OCaml und Haskell zur Programmierung von Java und Python übergegangen, und ich habe die Erfahrung gemacht, dass zwingende Programmierung kein so großer Sprung ist wie dynamisches Tippen, was sich bis heute fremd anfühlt.

RTS - lesen Sie über Monica Cellio
quelle
1

Ich schlage vor, Sie setzen Haltepunkte und beginnen mit der Verwendung des Befehls Next (als ob Sie debuggen). Dies wird Ihnen helfen, den Ablauf zu verstehen (wahrscheinlich auf Zweigen, es gibt Pfade, die mit größerer Wahrscheinlichkeit genommen werden, auf diejenigen, auf die Sie sich konzentrieren sollten, um sie zu erhalten) die allgemeine Idee des Codes).

(Ich hatte gute Ergebnisse mit Eclipse zusammen mit PyDev als Eclipse-Plugin)

Liran Orevi
quelle