Come fanno le persone a scrivere e mantenere codice estremamente complesso e difficile da leggere? [chiuso]

27

La lettura del codice sorgente SQLite è impossibile per IMO. Eppure è una parte utilizzabile di un software abbastanza complesso (è un database completamente integrato, dopo tutto) che può essere scaricato, compilato e utilizzato da altri codici ed è costantemente aggiornato.

In che modo le persone riescono a scrivere e mantenere un codice estremamente complesso e difficile da leggere?

    
posta sharptooth 05.10.2010 - 11:45
fonte

12 risposte

19

C'è una grande differenza tra Complesso e Complicato. Il seguente link su riassume. :)

link

Su una nota più personale, lavoro su un codice base di oltre 1 milione di righe di codice. Ci sono stato dalla riga 1 al suo stato attuale. Più sei in forma (leggi più a lungo sei nel codice) più diventa facile. Non posso dirti cosa fa ogni linea, ma posso dire che dovresti iniziare a cercare un determinato compito o bug. Viene semplicemente naturale.

La morale della storia è che come qualsiasi cosa nel mondo della programmazione ci vuole tempo. Se ti aspetti di guardare SQLite e solo di conoscerlo e capirlo, stai scherzando. Ci vorrà del tempo per capire come tutto funziona insieme. La differenza tra codice buono e codice errato è la durata del processo.

Infine, alcuni sviluppatori non hanno la possibilità di entrare in un codice base e iniziare a capirlo. Molti si sentiranno sopraffatti dalle dimensioni o dall'architettura della base di codice. Gli altri non avranno problemi a saltarci dentro. Tutto dipende dai punti di forza degli sviluppatori.

    
risposta data 05.10.2010 - 13:37
fonte
31

Nel caso specifico di SQLite, lo strumento principale che hanno scelto di utilizzare nello sviluppo e nella manutenzione è il test automatizzato. Sono orgogliosi di avere una copertura del 100% (copertura delle filiali, non copertura informativa) nella loro suite di test. Secondo loro, è uno dei prodotti software più testati al mondo. Quindi sanno subito quando qualcosa che hanno aggiunto o modificato causa una regressione e possono svilupparsi senza paura come conseguenza di ciò.

link

Numeri piuttosto sbalorditivi: hanno circa 640 volte quante linee di codice di test sono presenti nel codice di produzione.

EDIT: Questa domanda è stata sollevata dai morti, a quanto pare! E poco più di un anno dopo, quella stessa pagina riporta che hanno 1177 volte più linee di codice di test della produzione!

    
risposta data 05.10.2010 - 14:40
fonte
7
    Le funzionalità
  • si evolvono nel tempo.
    • le nuove funzionalità sono guidate dai nuovi requisiti dei clienti.
    • Il vecchio codice è stato scritto in un modo che consente di aggiungere funzionalità future ancora da implementare senza interrompere il vecchio codice.
  • esperti di dominio (in questo caso, il database è un dominio ben noto in Informatica.)
  • feedback della community
    • bug
  • la curva di apprendimento ripida non era un problema per i ben preparati e perseveranti. Potrebbero volerci 6 mesi, 1 anno o anche più tempo per sentirsi a proprio agio, ed è quello che alcune persone sono in grado di sopportare.
  • motivazioni commerciali. senza supporto monetario, pochissime persone possono investire il tempo e l'energia nella curva di apprendimento ripida.
risposta data 05.10.2010 - 11:51
fonte
4

Non è necessario avere una comprensione approfondita del progetto intero per poterlo mantenere. Di solito con un software grande e complesso, le persone avranno le loro "aree" particolari che si occupano di loro e hanno solo una conoscenza "passante" del resto del sistema.

SQLite è in realtà relativamente piccolo sulla scala dei "progetti software di grandi dimensioni", ma se si guarda qualcosa come il sistema operativo Windows, ci sono persone che solo lavorano sul kernel, persone che solo funzionano sulla shell, le persone che solo lavorano su Internet Explorer, le persone che solo lavorano su Window manager, ecc. ecc. Qualcuno che lavora nella "shell" non è possibile correggere un bug nel kernel alla caduta di un cappello.

C'è anche il vantaggio che questi progetti evolvono nel tempo: non sono sempre partiti da questo complicato. Ciò significa che un nuovo sviluppatore di solito può essere "addestrato" da sviluppatori più esperti.

Quando ti unisci a un grande team di sviluppatori, ti verrà dato un aspetto particolare del progetto su cui lavorare (forse un bug o una nuova funzionalità) e avrai un altro sviluppatore che sarai "amico" per i primi iterazioni. Il tuo amico avrà una buona conoscenza dell'area in cui lavori e può aiutarti a orientarti.

Per i progetti open source come SQLite, è in realtà un po 'più difficile perché non ci sono motivi per gli sviluppatori esistenti di "addestrare" i nuovi sviluppatori. Quindi troverai di essere da solo un po 'di più. Ma puoi ancora trovare aiuto nei forum degli sviluppatori o nelle mailing list (ad esempio, pubblicando semplicemente una domanda come "Mi piacerebbe implementare tale e così caratteristica" o "Ho trovato bug XYZ, da dove comincio a cercare?" E probabilmente sei per ottenere una qualche forma di aiuto.

    
risposta data 05.10.2010 - 13:25
fonte
4

C'è una differenza tra progetto difficile da leggere e complesso. Se una persona non comprende a fondo la lingua in cui è stato scritto il progetto o il dominio del progetto, ciò non significa che il codice sia scritto male.

Il mio consiglio:

  • Assicurati di aver compreso la lingua del progetto. Non è sufficiente conoscere la lingua.
  • Scopri tutti i dettagli sul dominio prima di mettere le mani sul codice.

Per me SQLite è molto complesso e complicato. Il dominio di questo progetto richiede una profonda comprensione dei concetti ampi.

    
risposta data 05.10.2010 - 19:20
fonte
3

Una cosa non menzionata nelle altre risposte è "Viene naturale per loro". La maggior parte delle persone vuole scrivere un buon codice ma sono sintonizzati sulla scrittura di codice errato. Alcuni dei programmatori che ho incontrato sono naturalmente pensatori LINEAR + alcune volte molto ingegnosamente escogitano soluzioni complesse. La maggior parte di queste persone non trascorre il tempo a leggere o imparare dal libro che apprendono come e quando il lavoro lo richiede.

    
risposta data 05.10.2010 - 13:25
fonte
3

How do people manage to write and maintain such extremely complex and hard to read code?

Se sono i programmatori originali e continuano a mantenerlo, non lo vedono come "complesso e difficile da leggere". Probabilmente lo vedono come "semplice e facile da leggere", dal momento che l'hanno scritto da soli.

Ogni codice richiede tempo per capirlo. È solo che alcuni impiegano più tempo di altri :)

    
risposta data 05.10.2010 - 18:32
fonte
2

Puoi avvolgere la tua mente su qualsiasi base di codice, se hai - perseveranza, pazienza e un approccio metodico - ma soprattutto perseveranza: -)

    
risposta data 05.10.2010 - 12:03
fonte
1

La gestione diventa molto più semplice se ci sono cose fatte sempre allo stesso modo. Non conosco il codice SQLite, ma sto lavorando in un ambiente in cui ci sono più progetti. Oltre a comprendere il business case (logica eq), dato che tutto è fondamentalmente svolto nello stesso modo ovunque (accesso al database, ecc.) È relativamente facile iniziare a lavorare su un altro progetto. Breve testo lungo: le linee guida sulla codifica - in modo appropriato - rendono la vita e tale codice molto più facili. Questo potrebbe essere uno degli helper per i codificatori SQLite.

    
risposta data 05.10.2010 - 12:22
fonte
1
  • Se sei l'autore originale del software e hai lavorato con esso per > 10 anni, e tu sei un genio, allora potrebbe essere possibile capire il tutto. Grandi pezzi di software complesso (come SQLite o il kernel Linux) di solito hanno esattamente un autore originale che ne ha una completa e profonda comprensione, anche se altre persone hanno contribuito.
  • Se l'architettura del software è sana (alta coesione, basso accoppiamento), la comprensione dell'intera cosa non è un prerequisito per apportarvi aggiunte e modifiche utili.
  • La comprensione di un RDBMS o di un sistema operativo è un caso un po 'speciale, che richiede una profonda comprensione dei principi CS sottostanti. Non così con le applicazioni software "ordinarie".
risposta data 05.10.2010 - 11:58
fonte
1

Provano a scriverlo in modo semplice ma non in modo semplicistico.

Il semplice fatto di rendere le cose più veloci da capire / leggere, anche se può richiedere del tempo.

    
risposta data 05.10.2010 - 13:18
fonte
1

L'algoritmo implementato stabilisce un limite inferiore su quanto può essere semplice il codice per un'implementazione. Se una descrizione astratta dell'algoritmo da implementare è estremamente complicata e richiede che tonnellate di dati diversi siano accoppiati tra loro, allora il codice che implementa detto algoritmo non può essere semplice, indipendentemente da chi lo sta scrivendo.

In altre parole, una ragione per cui a volte scrivo codice imperscrutabile è perché, dato l'algoritmo che voglio implementare, non ho scelta.

    
risposta data 22.10.2010 - 23:25
fonte

Leggi altre domande sui tag