Siamo spiacenti, questo sarà lungo, ma si basa sull'esperienza personale di architetto e sviluppatore in più progetti di riscrittura.
Le seguenti condizioni dovrebbero farti considerare una sorta di riscrittura. Parlerò di come decidere quale fare dopo.
- Il tempo di accelerazione dello sviluppatore è molto elevato. Se per accelerare un nuovo sviluppatore è necessario più tempo di sotto (per livello di esperienza), è necessario riprogettare il sistema. Per tempo di accelerazione, intendo la quantità di tempo prima che il nuovo sviluppatore sia pronto per eseguire il primo commit (su una piccola funzione)
- Appena uscito dal college - 1,5 mesi
- Ancora verde, ma hanno lavorato su altri progetti prima di - 1 mese
- Livello medio - 2 settimane
- Esperto - 1 settimana
- Livello senior - 1 giorno
- La distribuzione non può essere automatizzata, a causa della complessità dell'architettura esistente
- Anche le semplici correzioni di bug richiedono troppo tempo a causa della complessità del codice esistente
- Le nuove funzionalità richiedono troppo tempo e costano troppo a causa dell'interdipendenza della base di codice (le nuove funzionalità non possono essere isolate e quindi influenzano le funzionalità esistenti)
- Il ciclo di test formale richiede troppo tempo a causa dell'interdipendenza della base di codice esistente.
- Troppi casi d'uso vengono eseguiti su un numero troppo limitato di schermate. Ciò causa problemi di formazione per utenti e sviluppatori.
- La tecnologia in cui si trova l'attuale sistema lo richiede
- Gli sviluppatori di qualità con esperienza nella tecnologia sono troppo difficili da trovare
- È obsoleto (non può essere aggiornato per supportare piattaforme / funzionalità più recenti)
- C'è semplicemente una tecnologia di livello superiore molto più espressiva disponibile
- Il costo di mantenimento dell'infrastruttura della tecnologia precedente è troppo elevato
Queste cose sono abbastanza evidenti. Quando decidere su una riscrittura completa rispetto a una ricostruzione incrementale è più soggettivo, e quindi più politicamente carico. Quello che posso dire con convinzione è che affermare categoricamente che non è mai una buona idea è sbagliato.
Se un sistema può essere ridisegnato in modo incrementale e hai il pieno supporto della sponsorizzazione del progetto per una cosa del genere, allora dovresti farlo. Ecco il problema, però. Molti sistemi non possono essere riprogettati in modo incrementale. Ecco alcuni dei motivi che ho riscontrato per impedirlo (sia tecnico che politico).
- Tecnico
- L'accoppiamento dei componenti è così elevato che le modifiche a un singolo componente non possono essere isolate da altri componenti. Una riprogettazione di un singolo componente comporta una cascata di modifiche non solo ai componenti adiacenti, ma indirettamente a tutti i componenti.
- Lo stack tecnologico è così complicato che la futura progettazione dello stato richiede molteplici modifiche all'infrastruttura. Ciò sarebbe necessario anche in una riscrittura completa, ma se è richiesto in una riprogettazione incrementale, perdi quel vantaggio.
- La riprogettazione di un componente comporta comunque una completa riscrittura di quel componente, perché il design esistente è così fubar che non c'è nulla che valga la pena salvare. Ancora una volta, perdi il vantaggio se questo è il caso.
- Politico
- Non è possibile far comprendere agli sponsor che una riprogettazione incrementale richiede un impegno a lungo termine per il progetto. Inevitabilmente, la maggior parte delle organizzazioni perde l'appetito per il continuo drenaggio del budget creato da una riprogettazione incrementale. Questa perdita di appetito è inevitabile anche per una riscrittura, ma gli sponsor saranno più inclini a continuare, perché non vogliono essere divisi tra un nuovo sistema parzialmente completo e un vecchio sistema parzialmente obsoleto.
- Gli utenti del sistema sono troppo collegati con le loro "schermate correnti". In questo caso, non avrai la licenza per migliorare una parte vitale del sistema (il front-end). Una riprogettazione ti consente di aggirare questo problema, poiché stanno iniziando con qualcosa di nuovo. Insisteranno ancora per ottenere "gli stessi schermi", ma hai un po 'più di munizioni da respingere.
Tieni presente che il costo totale della riprogettazione in modo incrementale è sempre maggiore rispetto a una riscrittura completa, ma l'impatto sull'organizzazione è generalmente inferiore. Secondo me, se puoi giustificare una riscrittura e hai sviluppatori superstar, allora fallo.
Fallo solo se puoi essere certo che esiste la volontà politica di vederlo fino al completamento. Ciò significa sia il buy-in esecutivo che quello dell'utente finale. Senza di essa, fallirai. Suppongo che sia per questo che Joel dice che è una cattiva idea. Il buy-in esecutivo e dell'utente finale sembra un unicorno a due teste per molti architetti. Devi venderlo in modo aggressivo e fare una campagna per la sua continuazione continuamente fino a quando non è completo. È difficile e stai parlando di puntare la tua reputazione su qualcosa che alcuni non vorranno vedere avere successo.
Alcune strategie per il successo:
- Se lo fai, tuttavia, non provare a convertire il codice esistente. Progetta il sistema da zero. Altrimenti stai perdendo tempo. Non ho mai visto o sentito parlare di un progetto di "conversione" che non è finito miseramente.
- Migra gli utenti nel nuovo sistema un team alla volta. Identifica i team che hanno PIÙ problemi con il sistema esistente e prima migrali. Lascia che diffondano la buona notizia con il passaparola. In questo modo il tuo nuovo sistema verrà venduto dall'interno.
- Progetta il tuo framework quando ne hai bisogno. Non iniziare con un po 'di I-ho trascorso 6 mesi a costruire questo framework che non ha mai visto un vero codice.
- Mantieni il tuo stack tecnologico il più piccolo possibile. Non progettare troppo. È possibile aggiungere tecnologie secondo necessità, ma eliminarle è difficile. Inoltre, più livelli hai, più lavoro è per gli sviluppatori. Non renderlo difficile fin dall'inizio.
- Coinvolgi gli utenti direttamente nel processo di progettazione, ma non lasciare che dettino come farlo. Guadagna la loro fiducia mostrando loro che puoi dare loro ciò che vogliono meglio se segui buoni principi di progettazione.