Ci si aspetta che le codebase grandi o vecchie siano facili da navigare?

7

Sono uno studente universitario di informatica attualmente in un anno di tirocinio presso un'azienda che produce e supporta un'applicazione web aziendale di grandi dimensioni. Mi piace l'esperienza di vedere come viene prodotto il software nel mondo reale e mi sento molto fortunato a trovare un'azienda che offre la possibilità non solo di mantenere ed estendere le funzionalità esistenti, ma anche di sviluppare funzionalità completamente nuove per il prodotto.

Tutto ciò che ho detto, però, sono molto consapevole che questo è molto, molto improbabile che sia un perfetto esempio di come sviluppare correttamente. Lungi da ciò, infatti. Sento che sto imparando una grande quantità dalla mia esperienza qui, e non voglio imparare le cose sbagliate o prendere cattive abitudini dai colleghi che potrebbero essere difficili da scrollare di dosso in fondo alla strada. Per lo più è facile dire cosa è buono e cosa no - ad esempio la copertura del Test unitario qui è praticamente inesistente per vari motivi (per lo più scuse povere mescolate con uno o due punti validi). Ultimamente, però, ho notato un evento normale di cui non sono sicuro.

Ogni volta che iniziamo un nuovo progetto, naturalmente dobbiamo trovare qualsiasi codice rilevante che debba essere esteso, modificato o rimosso. Mi sembra che, nella stragrande maggioranza delle volte, tutto ciò che non rientra nelle sezioni più comunemente utilizzate dell'applicazione richiede alle persone un'età da trovare all'interno del codebase. Ci sono uno o due lead tecnologici che conoscono bene la loro sezione del codice, ma anche a volte vengono smarcati e devono trascorrere molto tempo a cercare ciò che richiedono o rivolgersi a qualcuno che ha modificato recentemente quella parte del codice ( se qualcuno) per aiuto. Quando parlo da molto tempo, non intendo ore (di solito) ma mi sembra che una buona base di codici possa essere navigabile in qualsiasi momento nel giro di pochi minuti nel peggiore dei casi, a chiunque abbia anche una vaga familiarità con il sistema.

Quindi, la mia domanda. Il problema sopra è dovuto a un codice scarsamente strutturato? In alternativa, è compito degli sviluppatori non avere abbastanza conoscenza della base di codice? O è semplicemente inevitabile nelle applicazioni di grandi dimensioni, indipendentemente da quanto lavoro vada a mantenere chiara la struttura del file?

Oppure, in effetti ... sto solo perdendo tempo su un argomento che non ha davvero importanza?

    
posta Hecksa 18.04.2012 - 17:33
fonte

4 risposte

18

Le grandi basi di codice non sono progettate, si evolvono. Un sacco di cose che non hanno senso quando si guarda a un'istantanea attuale, hanno perfettamente senso quando si tiene conto della storia. E non intendo solo la storia individuale della base di codice, intendo anche la storia delle pratiche di ingegneria del software in generale.

Il testing delle unità praticamente è sempre esistito fino ad un certo punto, ma non è mai entrato in uso diffuso fino a quando non sono stati "inventati" la programmazione estrema e lo sviluppo guidato dai test negli anni dal 1999 al 2003. Un sacco di basi di codice sono precedenti a questo, e di conseguenza non sono stati progettati in modo da rendere facile il test dell'unità.

C'è una storia simile dietro altre pratiche di ingegneria del software. Ad esempio, la rivoluzione DVCS del 2005 ha cambiato il modo in cui le persone pensano ai flussi di lavoro e ai modelli ramificati, anche con il controllo della versione non distribuito. Per un altro esempio, anche se esisteva, quasi nessuno aveva sentito parlare del pattern di progettazione MVC fino a quando Microsoft non creò un framework con quel nome, e ora il fallimento nel separare il modello e la vista è molto più scoraggiato di quanto non fosse, anche nei progetti che non usano la struttura di Microsoft.

La creazione e la divulgazione di strumenti di revisione tra pari online hanno essenzialmente interrotto la pratica di una revisione tra pari in un incontro formale, rendendoli molto più facili da eseguire e quindi più ubiquitari. La divulgazione dei linguaggi di raccolta dei rifiuti ha spinto le innovazioni di gestione della memoria in C ++ come puntatori intelligenti e RAII, che ora sono considerati pratica standard, ma non erano noti quando sono state avviate molte basi di codice correnti. Potrei andare avanti ancora.

Man mano che le aziende crescono, cercano di sfruttare il più possibile il riutilizzo del codice, quindi un'architettura di codice ideale per un prodotto potrebbe essere inserita in un altro progetto con poche modifiche, anche se l'architettura potrebbe risultare un po 'scomoda il nuovo contesto. Quando questo accade più volte su forse decenni, il quadro generale non ha più senso.

Non è che le aziende non vogliano cambiare con i tempi, ma le basi di codice sono come i transatlantici. Impiegano molto tempo e stanno pianificando attentamente di girarsi. Pertanto, è altamente improbabile che tu possa mai trovare una base di codice di grandi dimensioni che non sarebbe ridisegnata in un modo diverso se si inizia da zero oggi. La cosa importante da cercare è se un'azienda sta cercando di girare nella giusta direzione.

    
risposta data 18.04.2012 - 18:52
fonte
5

Certamente c'è un limite alla complessità che la mente umana può comprendere. Non puoi aspettarti che qualcuno conosca milioni di righe di codice. Ecco perché dovresti strutturarlo e documentarlo in modo ragionevole e comprensibile. Di solito, le possibilità di strutturare il codice sono lasciate fuori. Non troverai una classe di database nel pacchetto per un'interfaccia utente grafica. Ma potresti trovare una classe di database che fa qualcosa di molto diverso (ad es. Reporting). Le classi e i moduli tendono a crescere quasi organicamente. È preferibile organizzare il codice in classi più piccole ma con responsabilità singole, per rendere il codice più facile da capire. Il codice di facile comprensione è fondamentale per raggiungere gli obiettivi dell'ingegneria del software, ad es. software corretto, robusto, riutilizzabile ed estensibile.

    
risposta data 18.04.2012 - 18:57
fonte
3

Non troverai nessuno sviluppatore che voglia scrivere molto codice. L'idea è di scrivere solo tanto e averlo scritto in modo estensibile.

Sfortunatamente, gli sviluppatori devono raccogliere i requisiti di business / vendite / marketing e solitamente non sono mai specifici. Quindi hai casi d'uso che devono essere rattoppati in un codice che non è mai stato concepito per fare quello che sta facendo in primo luogo.

Non c'è modo di modificare questa situazione, a meno che tu non abbia un modo con le menti umane. Ciò che può farti risparmiare è una documentazione obbligatoria, una solida unità e un framework di test di integrazione, un sistema di tracciamento dei bug, una mailing list degli sviluppatori all'interno dell'azienda che può archiviare mail, peer review e apprendere tecniche di programmazione generica.

Inoltre, considera di utilizzare il più possibile da componenti open source poiché generalmente hanno una buona base di utenti e livelli moderati di documentazione. Ancora più importante, devi chiedere alle persone se il tuo lead tecnologico è in vacanza.

Anche i libri di progettazione di software su larga scala sono una gradita aggiunta.

    
risposta data 18.04.2012 - 19:04
fonte
1

Quando si affronta un'applicazione in campo scuro, il primo passo ideale è quello di scrivere test di unità per esso.

Questo porta a termine diverse cose:

  1. Ti costringe a elaborare il codice e a comprenderlo
  2. I test unitari servono come documentazione e codice di esempio per la funzionalità esistente e
  3. I test unitari forniscono una rete di sicurezza per il refactoring.

Che l'organizzazione abbia o meno voglia di permetterti di farlo è un'altra questione. Hanno vissuto senza test unitari per così tanto tempo; far sì che siano d'accordo a ridurre il debito tecnico in questo modo sarà difficile.

    
risposta data 18.04.2012 - 17:45
fonte

Leggi altre domande sui tag