Come leggere migliaia di righe di codice senza alcuna documentazione? [chiuso]


12

In precedenza ero alla ricerca di un buon controllo TimeLine per un progetto WPF. Ho trovato una risposta qui che mi indirizza a questo progetto CodePlex .

Ora voglio cambiare il codice per soddisfare le mie esigenze di cultura. Ma ci sono alcune discrepanze!

La mia domanda è:

Come interagisci con tali migliaia di righe di codice?

MODIFICARE:

Qualsiasi scorciatoia sarà fantastica!


3
chiedere un aumento. aiuta sempre. (possono farne uno motivatore)
Visualizza nome

2
sbattere la testa contro la scrivania fino a quando tutto diventa chiaro.
jellyfishtree,

19
Come mangi un elefante? ... Un boccone alla volta.
Bill

1
@Jalal Questo è quello che vogliono che tu pensi.
Mateen Ulhaq

2
@DisplayName, l'approccio alla motivazione della carota e del bastone ha dimostrato di essere una soluzione scadente per qualsiasi lavoro che richieda abilità cognitive rudimentali. La scienza della motivazione è più complessa del sistema di ricompensa. Dai un'occhiata a "Drive: la sorprendente verità su ciò che ci motiva" di Dan Pink, è una lettura sorprendente. Oppure dai un'occhiata a questo video del tuo tubo per una versione ridotta. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Risposte:


37

Aggiungi commenti al codice sorgente quando hai capito abbastanza per poterlo fare. Rifattorizza vigorosamente questi commenti man mano che capisci sempre di più.


3
+1 e un buon modo è effettivamente scrivere la documentazione mentre sfogli il codice sorgente. E perché inviare il tuo contributo ai coordinatori operativi?

1
+1 Inoltre, se modifichi il codice, assicurati di cambiare anche i tuoi commenti, in modo che le generazioni future non siano confuse su ciò che hai fatto. Sii un peccato fare tutto quel doc e far odiare le persone perché è sbagliato!
Michael K,

1
Se il progetto originale si trova in un sistema di controllo del codice sorgente distribuito (come git), sarebbe vantaggioso forkarlo, eseguire il commit delle modifiche in modo incrementale e farlo in modo da poter eventualmente ricollegare le modifiche in seguito all'originale

8
  1. Scorri il codice
  2. Rinomina secondo necessità
  3. Rifrattore secondo necessità
  4. Ripeti fino a quando non capisci completamente

... e il codice ti ringrazierà per questo. ;-)


7
Cambiare posizioni casuali nel codice di produzione solo perché è più facile, non è una buona idea. Solo le richieste di funzionalità dovrebbero causare la modifica del codice, il factoring è una richiesta di funzionalità. Non importa quanto tu sia bravo, le rotture del codice, a volte gli stupidi effetti collaterali sono ciò su cui i clienti fanno affidamento. Solo codice refactor di cui sei molto sicuro. E ricorda, anche i test unitari non garantiscono nulla.
Coder

D'accordo, ma il refactoring solo per provare un design può aiutarti a capire perché il codice è scritto così com'è (o confermare che sei corretto che sia fatto male / stranamente). Non è necessario mantenere tali modifiche.
Ricky Clarkson,

+1 Coder. E questa risposta al momento non menziona nemmeno i test unitari. Spaventoso.
MarkJ

Spiacente, non significava grande refactoring. Stavo parlando di più su refactoring minori, roba di tipo cleanup. Quindi, alla fine, arriverai al punto che lo scopo del codice è ovvio.
John MacIntyre,

5

Esegui una singola azione, esegui il debug (ancora e ancora) del codice per scoprire come tale azione viene eseguita. Scrivi lo stesso in un linguaggio semplice per capire meglio!


Normalmente lo faccio anche finché non mi trovo ad affrontare un progetto che non è in grado di funzionare in modalità debug! Si blocca sempre durante l'avvio! :( Ma funziona bene in modalità di rilascio: S
Afriza N. Arief

@afriza CHE COSA È IL CAZZO. È un codice gravemente cattivo, controlla quali errori ti dà.
Daniel S,

@afriza, la prima cosa da risolvere!

4

Qualcosa che Joel Spolsky ha scritto molto tempo fa quando era sul suo blog (non riesco a trovare l'articolo ora) davvero bloccato con me riguardo a questo:

Ha detto che il codice non è un linguaggio umano naturale, ma come programmatori, siamo facilmente indotti a pensare che lo sia e che dovremmo essere in grado di leggerlo come tale. Di conseguenza, molti di noi guardano il nuovo codice e si aspettano di essere in grado di "leggerlo" e comprenderlo immediatamente, come se fosse un blocco di testo in inglese.

Quindi penso che la chiave sia fondamentalmente essere lenti, metodici e scientifici. E come altri hanno già detto, commentalo (e persino rifattore) mentre procedi. Non cadere nella mentalità di "Dovrei solo guardarlo e capire immediatamente".

Oh, e sì, a volte cado ancora in questa trappola a volte. "Fai come dico, non come faccio", e tutto il resto. :)


Il fatto è che il testo inglese che puoi "leggere" è generalmente lineare, il motivo per cui il codice è spesso difficile da digerire all'inizio è generalmente perché non è lineare e il trucco è semplicemente scomporlo. La pletora di differenti idiomi di implementazione che gli sviluppatori usano generalmente non aiuta neanche, ma il primo stadio è di solito l'esecuzione del codice attraverso un debugger e l'utilizzo di punti di interruzione per vedere cosa succede. Cercare di leggerlo è un esercizio abbastanza inutile. Scherzi a parte, quando hai letto l'ultima volta il codice che hai scritto? (inizio alla fine, cioè.)
ocodo

In realtà, un codice ben scritto è facile da leggere, ma non come testo. Basta scansionare per vedere i mattoni e capire la struttura principale, non è necessario leggere tutto. Approcci di codifica errata, come il vecchio codice skool, o l'abuso di SOLID e schemi possono rendere questo compito molto difficile.
Coder

4

SE-Radio ha intervistato Dave Thomas proprio su questo argomento

Questo episodio di podcast ha molti suggerimenti e tecniche per entrare nella "cultura" del progetto e capire come vivevano gli abitanti originali.


La parte divertente dell'esperienza di Dave Thomas è che la documentazione - al di là di una panoramica di alto livello - è (quasi) senza eccezioni peggiore di nessuna documentazione. (Nella mia esperienza è perché la maggior parte della documentazione è basata su una piattaforma che fornisce una comprensione a livello superficiale del "cosa" o "come", che invariabilmente viene poi lasciato diventare obsoleto, al punto da essere fuorviante.)
Michael Kropat

2

Ho dovuto farlo di recente con un progetto di oltre 100.000 LOC. La mia prima idea è stata che è più facile vedere schemi da grafici di 100 o persino 1000 nodi che da 100.000 righe di testo.

Quindi ho trascorso 45 minuti e ho scritto un breve programma (<100LOC) Python per analizzare ciò di cui avevo bisogno e disegnare le relazioni dell'oggetto. Ho generato la fonte Graphviz , che è un linguaggio davvero facile da generare. (Non c'è niente di speciale in Python qui: Ruby o C # o Common Lisp o qualunque cosa possa farlo altrettanto bene.)

In altri progetti, ho visto le persone usare Graphviz per dipendenze dei moduli, grafici delle chiamate, cronologia delle versioni, cose di ogni genere. Il più grande meta-strumento per la visualizzazione dei programmi di sempre.

(Forse è perché ho preso i compilatori , ma trovo strano che quando un programmatore si trova ad affrontare un problema, la risposta sembra essere sempre "scrivere un programma!", Tranne quando il problema riguarda il codice sorgente di un programma.: - )


1

Passalo attraverso il debugger mentre è in esecuzione, è quasi l'unico modo per capire una nuova base di codice di grandi dimensioni.


2
Questa non è un'opzione pratica quando hai migliaia di righe di codice (specialmente quando parliamo di decine o centinaia di KLOC) e / o se parte di quel codice è nei template. Per avere un'idea di una base di codice nuova (e scarsamente documentata), è necessario coinvolgere l'azienda e cercare di comprendere il contesto in cui dovrebbe essere eseguito il codice. Se riesci a passare attraverso il codice con un debugger e comprenderlo, quella base di codice non era così grande per cominciare (rendendo l'uso di un debugger piuttosto inutile nella maggior parte dei casi.)
luis.espinal

Guai se la base di codice è troppo grande per eseguire il debug in un debugger. Vedere il codice reagire a un input e output noti aiuta a trasformare la conoscenza di "cosa" in "come". La domanda "perché" non è mai a cui è possibile rispondere solo con un debugger, ma potrebbero esserci commenti sorgente in linea che è possibile visualizzare nell'IDE durante il debug.
grrussel,

@grrussel Non sono d'accordo perché non è quello che faccio ... Non ho idea di essere rappresentativo o no! Posso in qualche modo vedere usare il punto di interruzione dispari (ma ancora non passare esplicitamente) e uso le funzioni IDE per permettermi di mettere in relazione un pezzo con un altro.
Murph

1

Comprendi che non ci sono scorciatoie per il trekking in pienezza. (E se hai problemi con quella frase, la tua educazione è stata MOLTO trascurata. Viene da "Stranger In a Strange Land", di Robert A. Heinlein.)

Leggilo, una pagina alla volta, una routine alla volta. Aggiungi commenti. Disegna immagini delle principali strutture di dati. Riconosci gli algoritmi. Attingi da conoscenze precedenti.

Resistere alla tentazione di avviare il debugger. La vista del debugger è troppo piccola: vedi una riga alla volta, ma in realtà non vedi dove sei stato o dove stai andando.


Il debugger spiega alcune convenzioni sulle convenzioni dello scrittore di codice originale su ciò che è previsto all'interno delle variabili (ad esempio, si aspettano Full Path o nome file o percorso relativo?) E molte altre cose, quindi secondo me è ancora importante
Afriza N. Arief

2
-1 per pensare che sei
forte

1

Qualunque cosa tu faccia, scrivi più che puoi, così nessuno finirà mai nella stessa posizione che hai.


1

devi usare indizi. ottenere un indizio di ciò che si deve cercare e utilizzare ampiamente la funzionalità di ricerca del proprio ambiente o IDE che può portarti nella sezione desiderata del codice che è necessario apportare modifiche.

leggere 14 mila righe di codice java non ha alcun senso. La funzionalità di ricerca ti salva la vita


0

Persone diverse hanno stili di apprendimento diversi, quindi YMMV. La prima cosa che faccio in questa situazione è leggere l'intera base di codice almeno una volta. Questo mi dà un'idea generale di dove sia tutto. Quindi scelgo una sezione da esaminare in modo più dettagliato. Le strutture dati sarebbero un buon punto di partenza. Una volta che ho un'idea generale di cosa sta succedendo, faccio lo stesso con un'altra parte del codice che interagisce con il primo. Dopo abbastanza iterazioni, ho una buona idea di come funziona il codice.


0

Il modo migliore, come con tutta la programmazione non solo grossi pezzi di codice non commentato, è di scomporlo in pezzi. Questo è sia qualcosa che dovresti fare nella tua testa sia visivamente nel codice. Ciò può significare l'aggiunta di grandi commenti in grassetto o più interruzioni di riga. Questo aiuta mentre lo scorri per vedere i pezzi. Prova a trovare i blocchi logici di codice.

Ovviamente, mentre capisci i bit, commentali per quello che sai in quel momento, eventualmente inserendo note su qualcosa che non capisci.

Consiglierei anche di non provare a capire l'intero pezzo fin dall'inizio. Invece cerca di capire i pezzi che devi sapere in questo momento e di lavorare sul resto in seguito.


0

Vorrei iniziare usando l' Editor Leo in modalità @shadow con l'uso attivo dei nodi clonati . Ciò consente di aggiungere note e commenti per ogni sezione di codice in studio senza modificare il codice e le annotazioni saranno sempre nel contesto, accanto al codice di cui sta parlando. Ecco un flusso di lavoro di esempio i documenti:

Ad esempio, quando correggo un bug in Leo, creo un nodo normale per rappresentare il bug. Questo nodo di bug è la mia visione di tutti i dati nel codice sorgente di Leo relativi al bug. Quando scopro il codice relativo al bug, clonano i loro nodi e li sposto sotto il nodo del bug. Aggiungerò anche nodi ordinari come figli del nodo bug. Questi nodi contengono la segnalazione di bug originale, le descrizioni di come ho corretto il bug, i dati di test o qualsiasi altra nota che potrei voler conservare.

Una volta creato il nodo bug, mi concentro solo su quel nodo e sui suoi figli. Posso esaminare il nodo bug e i suoi figli senza dover saltare il contorno. Tutto ciò di cui ho bisogno è in un unico posto. Quando riesco a risolvere il problema, posso farlo cambiando i cloni. Ancora una volta, non devo saltare il contorno. Non importa quanto sia grande o complessa l'intera struttura: ho a che fare solo con il nodo bug e i suoi figli. Questa messa a fuoco estremamente ristretta rende molto più facile correggere i bug.


0

Disegna diagrammi della fonte: le relazioni di dati, le relazioni funzionali, le relazioni di oggetti. Determinare l'aggregazione, il flusso di dati e il flusso di codice. Le immagini sono molto meglio dei commenti per questo, e possono essere tenute separate dal codice.


0

Prima di refactificare qualsiasi cosa scrivere test. Molti test. Test molto specifici su piccoli blocchi di codice che sono almeno richiamabili, poiché dipenderà da come viene scritto il tuo pasticcio ereditato.

Il vantaggio di scrivere i test per cominciare è che devi avere una qualche comprensione del codice prima di poterlo testare, quindi ogni test che scrivi sarà un po 'di conoscenza acquisita. Puoi anche commentare pesantemente i test con le tue assunzioni insieme alle asserzioni.

Effettuando prima il test, non corri il rischio di alterare qualcosa nel codice che ha effetti a catena che non puoi conoscere. Avrai anche una rete di sicurezza quando verrai a riformattare il codice.


0

Uso strumenti come doxygen, per generare un diagramma di classe generale, che aggiunge la mia comprensione di ciò che ciascuna classe fa.

Quindi raccolgo alcuni semplici bug dalla coda dei bug (prima che il mio manager ne assegni uno difficile: P), quindi eseguo quella funzionalità nel debugger e provo a generare un flusso di dati approssimativo o un modello di flusso di codice.

Ad esempio funzionalità di esportazione in alcuni software: quindi cerco di capire come vengono letti i dati di origine, da dove nel codice (interfaccia di base) posso valutare che i dati vengano letti correttamente usando i miei diagrammi di flusso di classe e di codice, di quali classi sono responsabili quale tipo di esportazioni, ecc. Penso che metà della comprensione sia fatta, una volta che hai i diagrammi di classe e i diagrammi di flusso.


0

Affronta un difetto insignificante, ad esempio una NullPointerException. Per prima cosa evita qualsiasi cosa riguardante la concorrenza, qualsiasi cosa che per sua natura comporterà la comprensione di molto codice contemporaneamente.

Dopo aver corretto alcuni bug, probabilmente avrai una buona idea. Funziona per me, in ogni caso.


-2

Fondamentalmente l'azione per scrivere un codice pulito dovrebbe iniziare proprio dalla progettazione. Se stiamo programmando in linguaggio OOP escogitare un UML, condividere con i colleghi e convincerci che il design non è ambiguo. In ogni caso, noi sviluppatori dovremmo convincerci che il design risolve il problema e non gli ambigui.

Quando si tratta di codifica, dobbiamo assicurarci che il progetto venga convertito in codice, ovvero un'entità in una classe o struttura, un'operazione per funzionare ecc.

E ho esaminato un white paper http://queue.acm.org/detail.cfm?id=2063168 che parla di stile di codifica o di come possiamo usare lo spazio, il rientro, la variazione dei caratteri come la maggior parte degli IDE che possiamo usare per scrivere MOLTO Codice CLEANER in cui noi umani possiamo capire tanto quanto le macchine. Sottolinea maggiormente la scrittura di codice libero da commenti in modo che il nostro codice appaia come paragrafi stessi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.