2010-12-02 1 views
8

Ich habe festgestellt, dass meine größte Schwäche als Programmierschüler meine schlechte Fähigkeit ist, den Code anderer zu verstehen.Werkzeuge und Techniken, um das Verständnis von unbekanntem Code zu verbessern?

Ich habe keine Probleme mit 'Lehrbuch' Code oder klar kommentierten Code, aber wenn ein Programm von ein paar hundert Zeilen, mit einem Dutzend oder so verschiedenen Funktionen und keine Kommentare gegeben, finde ich es sehr schwierig, sogar Start.

Ich weiß, diese Art von Code ist, was ich wahrscheinlich eher in meiner Karriere begegnen werde, und ich denke, dass schlechte Code Verständnis Fähigkeiten ein großes Hindernis für mich sein wird, so würde ich gerne konzentrieren um meine Fähigkeiten in diesem Bereich zu verbessern.

Welche Werkzeuge/Techniken haben dazu beigetragen, das Codeverständnis in Ihrer Erfahrung zu verbessern?

Wie tendieren Sie dazu, unbekannten, unkommentierten Code anzuwenden? Warum? Was ist mit deiner Technik, findest du hilfreich?

Dank

+1

Den Code mit einem anständigen Debugger zu durchforsten, ist ein guter Weg, ein Gefühl dafür zu bekommen, wie es zusammenpasst. –

Antwort

2

Ich finde, dass die Call-Graph und Vererbung Zeichnung oft Bäume aus für mich funktioniert. Sie können jedes Werkzeug verwenden, das Ihnen zur Verfügung steht. Ich benutze normalerweise nur ein Whiteboard.

Normalerweise sind die Code-Einheiten/Funktionen einfach genug, um selbst zu verstehen, und ich kann einfach sehen, wie jede Einheit funktioniert, aber ich habe oft Schwierigkeiten, das größere Bild zu sehen, und das ist, wo die Panne passiert und ich bekomme dieses Gefühl "Ich bin verloren".

Beginnen Sie klein. Sagen Sie zu sich selbst: "Ich möchte x erreichen, also wie wird es im Code gemacht?" wo x ist eine kleine Operation, die Sie verfolgen können. Verfolgen Sie den Code dann einfach und machen Sie etwas Visuelles, auf das Sie nach dem Trace zurückblicken können.

Dann wählen Sie einen anderen x und wiederholen Sie den Vorgang. Sie sollten jedes Mal, wenn Sie das tun, ein besseres Gefühl für den Code bekommen.

Wenn es Zeit ist, etwas zu implementieren, wählen Sie etwas, das ähnlich zu einem der Dinge ist, die Sie verfolgt haben (aber nicht fast identisch). Auf diese Weise gelangen Sie von einem Trace-Level-Verständnis zu einem Verständnis auf Implementierungsebene.

Es hilft auch, mit der Person zu sprechen, die den Code das erste Mal schrieb.

2

Die erste Sache, die ich versuche und tue, herauszufinden, was der Zweck des Codes auf einer hohen Ebene ist - die Art des Details irrelevant, bis Sie ein wenig über die Problemdomäne verstehen. Eine gute Möglichkeit, das herauszufinden, ist, die Namen der Bezeichner zu betrachten, aber es ist normalerweise noch hilfreicher, den Kontext zu betrachten - woher haben Sie diesen Code? Wer schrieb es? War es Teil einer Anwendung mit einem bekannten Zweck? Sobald Sie herausgefunden haben, was der Code tun soll, können Sie eine Kopie erstellen und neu formatieren, um es für Sie einfacher zu machen, sie zu verstehen. Das kann das Ändern der Namen von Bezeichnern, wo nötig, das Aussortieren von merkwürdigen Einrückungen, das Hinzufügen von Leerzeichen, um Dinge aufzulösen, das Kommentieren von Bits, sobald du herausgefunden hast, was sie tun usw., sein. Das ist ein Anfang, auf jeden Fall ... :)

Auch - sobald Sie den Zweck des Codes herausgefunden haben, können Sie durch einen Debugger auf einigen einfachen Beispielen manchmal auch eine klarere Vorstellung davon bekommen, was auf FWIW läuft ...

4

du Vertraut mit fremdem Code

Wenn die Code-Basis klein genug ist, können Sie beginnen, es sofort zu lesen. Irgendwann werden die Teile zusammenfallen.

In diesem Szenario variiert "klein genug", es wird größer, je größer Ihre Erfahrung ist. Sie werden auch hier von "Cheaten" profitieren: Sie können Teile des Codes überspringen, die Sie aus Erfahrung als "Implementierungsmuster X" kennen.

Sie können es hilfreich finden, kleine Umwege beim Lesen des Codes, z. indem Sie eine Funktion nachschlagen, wie Sie es genannt wird, dann verbringen ein wenig Zeit über sie hinwegblicken. Bleiben Sie nicht auf diesen Umwegen, bis Sie verstehen, was die aufgerufene Funktion tut; Das ist nicht der Punkt, und es wird dir das Gefühl geben, dass du herumspringst und keine Fortschritte machst. Das Ziel beim Umgehen ist es, zu verstehen, was die neue Funktion in weniger als einer halben Minute macht. Wenn Sie nicht können, bedeutet dies, dass die Funktion zu kompliziert ist. Brechen Sie den Umweg ab und akzeptieren Sie die Tatsache, dass Sie Ihre "aktuelle" Funktion ohne diese zusätzliche Hilfe verstehen müssen.

Wenn die Codebasis zu groß ist, können Sie sie nicht einfach lesen. In diesem Fall können Sie beginnen, indem Sie die logischen Komponenten des Programms auf einer hohen Abstraktionsebene identifizieren. Ihr Ziel besteht darin, Typen (Klassen) im Quellcode mit diesen Komponenten zu verknüpfen und dann die Rolle zu identifizieren, die jede Klasse in ihrer Komponente spielt. Es gibt Klassen, die intern in einer Komponente verwendet werden, und Klassen, die für die Kommunikation mit anderen Komponenten oder Frameworks verwendet werden. Teilen und erobern Sie hier: Teilen Sie zuerst die Klassen in verwandte Gruppen auf, dann konzentrieren Sie sich auf eine Gruppe und verstehen Sie, wie ihre Teile zusammenpassen.

Um Ihnen bei dieser Aufgabe zu helfen, können Sie die Struktur des Quellcodes als Richtlinie verwenden (nicht als das ultimative Gesetz; es kann aufgrund menschlicher Fehler manchmal irreführend sein). Sie können auch Tools wie "Suchen nach Verwendungen" einer Funktion oder eines Typs verwenden, um zu sehen, wo auf sie verwiesen wird. Erneut versuchen Sie nicht vollständig zu verdauen, was die IDE Ihnen sagt, wenn Sie es nicht schnell genug machen können. Wenn das passiert, bedeutet das, dass Sie ein kompliziertes Stück Metall aus einer Maschine genommen haben, die Sie nicht ganz verstehen. Lege es zurück und probiere etwas anderes, bis du etwas findest, das du verstehen kannst.

Debuggen von fremdem Code

Dies ist eine weitere ganz Sache. Ich werde ein wenig schummeln, indem ich sage, dass es keine Möglichkeit gibt, bis Sie eine Menge Erfahrung sammeln, Code erfolgreich zu debuggen, solange es Ihnen fremd ist.

+0

toller Punkt -> lassen Sie sich nicht durch weißes Rauschen/Umwege ablenken. – CedricB

0

Understand ist ein tolles Code-Analyse-Tool. Es war weit verbreitet bei meinem früheren Arbeitgeber (L-3), also habe ich es dort gekauft, wo ich gerade arbeite.

1

Ich verstehe Ihre Frustration, aber denken Sie daran, dass es viel schlechten Code da draußen gibt, also behalten Sie Ihre Klimmzüge. nicht alle Code ist schlecht :)

dies der Prozess ist, dass ich folgen neigen:

  1. Look für jede Unit-Tests, wie sie, was der Code tun ...
  2. navigate soll dokumentieren sollte durch den Code mit Code Rush/Resharper/Visual Studio Shortcuts - das sollte Ihnen einige Ideen über die logischen und physischen Ebenen geben ...
  3. Scannen Sie den Code zuerst, auf der Suche nach gängigen Mustern, Namenskonventionen und Code-Stile - dies sollte Ihnen Einblick in die Teams Standards geben und vielleicht die ursprünglichen Programmierer Mind Set ... wie ich durch die Code-Hierarchie I navigieren notieren Sie die verwendeten Objekte ... in der Regel mit Stift & Papier zeichnen eine einfache activity diagram:
  4. Ich neige dazu, von einem gemeinsamen Einstiegspunkt zu starten, also wenn es eine UI ist, starten Sie aus der Sicht und arbeiten Sie Ihren Weg bis zum Datenzugriffscode, wenn ein Dienst von der Dienstgrenze aus beginnt und sich bis zum Datenzugriffscode durcharbeitet ...
  5. nach Code suchen, der refaktoriert werden könnte - wenn du kannst siehe Code, Refactoring werden kann, Sie haben gelernt, wie es zu vereinfachen, ohne sein Verhalten zu ändern ...
  6. Baupraxis die gleiche Sache, die Sie gelesen hat, aber in einer anderen Art und Weise ...
  7. , wie Sie durch ungetestete lesen Code, denken Sie an Möglichkeiten, es testbar zu machen ...
  8. Verwenden Sie Code Rush Diagnostic Tools, um Methoden zu finden, die von hoher Wartungskomplexität oder zyklomatische Komplexität sind und besondere Aufmerksamkeit auf diese Bereiche zu widmen, da die Chancen sind, das ist, wo die meisten Bugs sind ...

Viel Glück

Verwandte Themen