Quali sono le tecniche più efficaci per impedire che una base di codici diventi difficile da mantenere man mano che cresce? [chiuso]

6

Sono un ingegnere del software di 10 anni e mi sono chiesto cosa altre persone hanno trovato efficace nell'arrestare un degrado nel tempo della base di codice. Ad esempio, alcuni dei problemi che ho notato sono:

  • grande debito tecnico
  • perdita di conoscenza da parte delle aziende a seguito di modifiche personali
  • strategie complesse di aggiornamento e migrazione tra versioni del prodotto
  • team multisito con valori diversi
  • un grande requisito di conoscenza per comprendere il prodotto e le parti del componente
  • design di difficile comprensione a causa dello sviluppo cumulativo per un certo numero di anni
  • percorsi di codice ampi e diversi
  • tecnologie miste ad es .: server oracle / sql
  • diversi dipartimenti con diversi livelli e aree di responsabilità del codice

La mia principale area di interesse è quella di apprendere quali strategie un lead tecnico potrebbe utilizzare in un nuovo progetto per ridurre al minimo il degrado del codebase nel tempo?

    
posta Dizzle 14.12.2016 - 13:48
fonte

4 risposte

10

What are the most effective techniques to stop a codebase from becoming difficult to maintain as it grows

Osserva la legge di Demeter . Ti insegna che non solo i valori negli oggetti dovrebbero essere incapsulati ma che gli oggetti dovrebbero essere incapsulati dai loro amici.

large technical debt

Inizia fissando quello che sta diventando più grande. Uccidere le crocs può essere divertente ma svuotare la palude è più efficace.

loss of knowledge from companies due to personnel changes

Mentoring. Allenamento incrociato. Se hai un solo go-to-guy per qualcosa è tempo che si allenino con un altro ragazzo.

complex upgrade and migration strategies between product versions

Fai in modo che gli sviluppatori facciano ciò che stanno chiedendo agli utenti di fare. Gli sviluppatori sono bravi a automatizzare ciò che gli interessa. Falli coinvolgere da questo.

multi site teams with different values

Avere valori diversi non è un problema. Non capire questi valori diversi potrebbe essere. Visita i siti se necessario.

large requirement of knowledge to understand the product and component parts difficult to understand design due to cumulative development over a number of years

Dove sono le tue esigenze? Se sei come la maggior parte sono nel codice. Se avessi i documenti dei requisiti di cui ti fidi, potresti semplificare ciò che sai di cui hai veramente bisogno.

Poiché è nel codice, la cosa migliore da aggiungere ora sono i test di regressione che dimostrano che la tua applicazione sta ancora facendo ciò che ti serve. Con i test in atto sei ora libero di semplificare, disaccoppiare e modernizzare il design.

large and diverse code paths

Ho menzionato Demeter ?

mixed technologies eg: oracle/sql server

Se il tuo progetto richiede che ti interessi chi ha costruito il tuo DB, non c'è da meravigliarsi se le cose sono diventate brutte. Elimina il tuo DB dal tuo dominio e trattalo come un plug-in . Solo alcune cose dovrebbero comunicare direttamente con il DB. Ho menzionato Demeter ?

different departments with differing levels and areas of code responsibility

... è una buona cosa. Fai una cosa e fallo bene. Non interfacciarsi con tutti. Parla solo ai tuoi amici. Fornisci utili astrazioni in modo che i tuoi amici non debbano parlare con gli altri tuoi amici. Ho menzionato Demeter ?

    
risposta data 14.12.2016 - 14:22
fonte
1
  • grande debito tecnico

Il debito tecnico è solitamente sostenuto in piccoli incrementi. Un sacco di piccole modifiche vengono apportate al codice a causa delle mutevoli esigenze del cliente, i moduli crescono, le funzionalità vengono aggiunte in luoghi dove non dovrebbero. Questo accade perché non vediamo nel momento come le piccole scorciatoie che prendiamo peseranno l'intero codebase dopo un po '.

Nella mia esperienza l'incorrere in debiti tecnici è quasi inevitabile. Le scadenze possono mettere sotto pressione il progetto. I nuovi sviluppatori potrebbero non sapere come adattare al meglio un pezzo di codice nel codice base. Gli architetti potrebbero non vedere come la loro struttura originale non sia ideale per supportare le nuove funzionalità.

Ciò che possiamo fare, che è possibile solo con il giusto atteggiamento da parte del management, è di mantenere il debito tecnico gestibile. Refactoring del codice ogni tanto per mantenere tutto intatto. Dobbiamo pagare il debito. Per un refactoring di successo dovremmo evitare di rompere le cose, quindi questo è possibile solo con un buon ambiente di test unitario. Questo è il motivo per cui vorrei sostenere la creazione di TDD sin dall'inizio. Ti dà la sicurezza di refactoring quando necessario.

  • perdita di conoscenza da parte delle aziende a seguito di modifiche personali

L'unico antidoto alla perdita di conoscenza è se si mantiene viva la conoscenza. La documentazione, anche con le migliori intenzioni, diventa obsoleta. Spesso gli esperti non sanno quello che qualcuno ha bisogno di sapere che non è già al ginocchio nel loro argomento.

Devi assicurarti che i tuoi sviluppatori non lavorino da soli, hanno bisogno di lavorare come una squadra, in cui ogni ruolo può essere preso in carico da un altro dev, nel caso in cui lo sviluppatore principale di un argomento subisca un incidente.

Per fare in modo che i tuoi sviluppatori abbiano familiarità con altri argomenti, devono lavorare attivamente su di loro. Non solo guardare come l'esperto fa la sua cosa. La programmazione delle coppie può funzionare qui. Le recensioni non sono sufficienti.

La documentazione è ovviamente anche importante. I casi di test unitari sopra menzionati, possono anche servire da documentazione meno aggiornata (perché eseguibile e sempre aggiornata). Dovrebbero quindi essere scritti in uno stile che sai cosa sta facendo ogni test.

  • strategie complesse di aggiornamento e migrazione tra versioni del prodotto

È necessario pianificare in anticipo le migrazioni. Se introduci un nuovo strumento di controllo delle versioni, devi già pensare a come puoi eseguire la migrazione in un secondo momento.

  • design di difficile comprensione a causa dello sviluppo cumulativo per un certo numero di anni

Per me è lo stesso del debito tecnico sopra descritto.

  • diversi dipartimenti con diversi livelli e aree di responsabilità del codice

Forse rotazioni attraverso i dipartimenti potrebbero aiutarti qui.

    
risposta data 14.12.2016 - 14:12
fonte
0

Non conosco il "più efficace", ma trovo quanto segue utile.

Abstraction è la chiave e ha diverse dimensioni e dimensioni. Le astrazioni dovrebbero essere utili e complete e consentire al consumatore di definire e implementare un'altra astrazione nei termini di dominio che richiede.

Debito tecnico significa povere astrazioni; astrazioni che sono difficili da usare e astrazioni che sono incomplete in modo da richiedere al cliente che consuma le differenze necessarie e che così facendo si finisce per comprendere e affidarsi a un'implementazione sottostante più che desiderabile, che nella migliore delle ipotesi risulti più stretta accoppiamento e, nel caso peggiore, in spaghetti e / o zuppe!

In ordine crescente di dimensioni, un'astrazione può essere: una singola costante, un singolo metodo, un insieme di metodi, un'interfaccia e / o una classe, un pacchetto di interfacce e / o classi, un livello.

La stratificazione riguarda la creazione di astrazioni verticali che si appoggiano e si accumulano l'una sull'altra. Quando creiamo un'astrazione che fornisce esattamente i termini del dominio necessari per il prossimo programmatore (per creare il loro livello), è efficace all'isolamento. Un livello è un insieme di interfacce e / o classi che fornisce un insieme completo di entità, relazioni e comportamenti orientati al dominio. La stratificazione consente di separare i dubbi in modo che uno strato intermedio possa essere riprogettato senza disturbare i livelli superiori.

La creazione e il mantenimento della stratificazione man mano che il codice si evolve richiede una costante consapevolezza dei requisiti del dominio del consumatore consumante, del riconoscimento delle difficoltà del consumatore di uno strato a causa della mancata corrispondenza nei requisiti del dominio e del normale refactoring per creare e mantenere i livelli utili e completi.

Nel grande, il layering ci consente di cambiare tecnologia, come i linguaggi di implementazione.

Dobbiamo anche essere in grado di identificare quando stiamo attraversando i confini della responsabilità, come i confini organizzativi, dipartimentali o aziendali. I confini di responsabilità meritano un'attenzione speciale. Progettiamo astrazioni orientate al dominio appropriate a quei confini. Ai confini definiamo le orizzontali astrazioni che consentono a varie organizzazioni sia di esseri umani sia di sistemi automatizzati di riunirsi in un ecosistema più ampio.

Ad un certo punto, man mano che i nostri sforzi aumentano di dimensioni e portata, abbiamo bisogno di apparire solo dal codice in modo da poter parlare efficacemente dei nostri livelli verticali e dei nostri limiti orizzontali. Questa è architettura o architettura astrazione . L'architettura ci aiuta a collegare i punti tra i nostri requisiti e amp; intenzioni e scelte di design & implementazioni.

La centralizzazione combatte la separazione delle preoccupazioni, che a sua volta combatte una buona astrazione.

Un singolo database condiviso per tutta la persistenza può essere interessante per uno sforzo di piccole dimensioni, ma la co-locazione della persistenza rende molto facile per le applicazioni che hanno proprietà e responsabilità diverse accedere direttamente alle informazioni altrui invece di passare attraverso un confine orizzontale appropriato .

Un singolo motore di regole condivise raccoglie in modo simile la logica di business da quelli logicamente separati e crea interdipendenze di quelle regole che sono difficili da sfatare in seguito.

    
risposta data 14.12.2016 - 16:04
fonte
-1

Penso che questo ponga al centro del nostro business. E molte persone hanno pensato e studiato al riguardo. Ma non penso che ci sia una risposta o una strategia banale o completa. Se scegli come target uno dei tuoi problemi e lo risolvi, un altro potrebbe alzarsi e oscurare la tua correzione. E se scegli come target tutti, alla fine, il problema che si presenterà è il denaro poiché nessuno è in grado di pagare per un simile processo di sviluppo del software.

    
risposta data 14.12.2016 - 14:08
fonte

Leggi altre domande sui tag