Come molte di queste domande, penso che la risposta sia:
Dipende
C'è motivo di credere che prendere la posizione che ogni programmatore dovrebbe conoscere ogni riga di codice è fuorviata.
Se ipotizziamo per un momento che qualcuno con una profonda comprensione di un pezzo di codice apporti modifiche 5 volte più velocemente di qualcuno che non lo conosce affatto (non un gigantesco atto di fede nella mia esperienza) e richiede circa un mese di esperienza di codifica per ottenere una buona comprensione di un modulo di dimensioni significative (anche non irragionevole), quindi possiamo eseguire alcuni numeri (completamente falsi e fittizi):
- Il programmatore A: ha una profonda comprensione
- Programmatore B: nessuno
Diciamo che il programmatore A ottiene 1 unità di lavoro al giorno. In 4 settimane di 5 giorni lavorativi lui / lei può ottenere 20 unità di lavoro fatte.
Quindi il programmatore B, partendo da 0,2 unità di lavoro al giorno e terminando con 0,96 unità di lavoro al suo 20 ° giorno (il 21 ° giorno sono all'altezza del programmatore A), realizzerà 11,6 unità di lavoro nello stesso periodo di 20 giorni. Durante quel mese il programmatore B ha raggiunto il 58% di efficienza rispetto al programmatore A. Tuttavia, ora hai un altro programmatore che conosce quel modulo e anche il primo.
Ovviamente, su un progetto di dimensioni decenti, potresti avere ... 50 moduli? Quindi, acquisire familiarità con tutti loro richiede circa 4 anni e ciò significa che il programmatore di apprendimento lavora in media al 58% di efficienza rispetto al programmatore A ... hmmm.
Quindi considera questo scenario: stessi programmatori, stesso progetto (A sa tutto e B non ne sa niente). Diciamo che ci sono 250 giorni lavorativi all'anno. Supponiamo che il carico di lavoro sia distribuito casualmente sui 50 moduli. Se dividiamo entrambi i programmatori in modo uniforme, A e B ottengono entrambi 5 giorni lavorativi su ciascun modulo. A può fare 5 unità di lavoro su ciascun modulo, ma B ottiene, secondo la mia piccola simulazione Excel, 1,4 unità di lavoro eseguite su ciascun modulo. Totale (A + B) è di 6.4 unità di lavoro per modulo. Questo perché B passa la maggior parte del tempo senza alcuna abilità con il modulo su cui stanno lavorando.
In questa situazione, è più ottimale avere B focus su un sottoinsieme più piccolo di moduli. Se B si concentra su solo 25 moduli, ottengono 10 giorni ciascuno, per un totale di 3,8 unità di lavoro su ciascuno. Il programmatore A potrebbe quindi trascorrere 7 giorni ciascuno sui 25 moduli su cui B non sta lavorando, e 3 giorni ciascuno lavorando sugli stessi di B. La produttività totale varia da 6,8 a 7 unità per modulo, con una media di 6,9, e questo è significativamente più alto rispetto alle 6,4 unità per modulo che abbiamo ottenuto quando A e B diffondono il lavoro in modo uniforme.
Man mano che riduciamo l'ambito dei moduli su cui lavora B, otteniamo un'efficienza ancora maggiore (fino a un certo punto).
Formazione
Vorrei anche obiettare che qualcuno che non sa tanto di un modulo interromperà la persona che molto di più di qualcuno con più esperienza. Quindi questi numeri sopra non tengono conto del fatto che più il tempo B trascorre sul codice che non capiscono, più il tempo che A impiega a fare domande, ea volte A deve aiutare a correggere o risolvere ciò che ha fatto B. Addestrare qualcuno è un'attività che richiede tempo.
Soluzione ottimale
Ecco perché penso che la soluzione ottimale debba essere basata su domande come:
- Quanto è grande la tua squadra? Ha senso che tutti abbiano una formazione trasversale su ogni parte, o se abbiamo una squadra di 10 persone, possiamo semplicemente assicurarci che ogni modulo sia conosciuto da almeno 3 persone? (Con 10 programmatori e 50 moduli, ogni programmatore deve conoscere 15 moduli per ottenere una copertura 3x.)
- Come è il fatturato del tuo dipendente? Se passi dei dipendenti a una media ogni 3 anni, e ci vuole più tempo per conoscere davvero ogni angolo del sistema, allora non sarà abbastanza lungo perché l'addestramento possa ripagarsi.
- Hai davvero bisogno di un esperto per diagnosticare un problema? Un sacco di persone usano la scusa, "cosa succede se quella persona va in vacanza", ma sono stato chiamato in numerose volte per diagnosticare un problema in un sistema con cui non ho avuto esperienza. Potrebbe essere vero che la persona esperta potrebbe trovarla molto più velocemente, ma ciò non significa che non puoi vivere senza di loro per una settimana o due. Pochi sistemi software sono così mission critical che il problema deve essere diagnosticato in 1 ora invece che in 5 ore o il mondo finirà. Devi valutare questi rischi.
Ecco perché penso che "dipende". Non vuoi dividere 20 moduli tra due programmatori a metà (10 ciascuno), perché non hai flessibilità, ma non vuoi nemmeno attraversare i 10 programmatori su tutti e 50 i moduli perché perdi un sacco di efficienza e non hai bisogno di così tanto ridondanza.