Come molte di queste domande, penso che la risposta sia:
Dipende
C'è motivo di ritenere che assumere la posizione secondo cui ogni programmatore dovrebbe conoscere ogni riga di codice sia errato.
Se supponiamo per un momento che qualcuno con una profonda conoscenza di un pezzo di codice effettuerà le modifiche 5 volte più velocemente di qualcuno che non lo conosce affatto (non un grande salto di fiducia nella mia esperienza) e ci vorrà circa un mese di esperienza di codifica per ottenere una comprensione davvero buona di un modulo di dimensioni significative (anche non irragionevole) quindi possiamo eseguire alcuni numeri (completamente falsi e fittizi):
- Programmatore A: ha una profonda comprensione
- Programmatore B: nessuno
Diciamo che il programmatore A esegue 1 unità di lavoro al giorno. In 4 settimane di 5 giorni lavorativi può svolgere 20 unità di lavoro.
Quindi il programmatore B, a partire da 0,2 unità di lavoro al giorno e terminando con 0,96 unità di lavoro nel suo 20 ° giorno (il 21 ° giorno sono bravi come il programmatore A), realizzerà 11,6 unità di lavoro nella stessa Periodo di 20 giorni. Durante quel mese il programmatore B ha raggiunto un'efficienza del 58% rispetto al programmatore A. Tuttavia, ora hai un altro programmatore che conosce quel modulo e il primo.
Certo, su un progetto di dimensioni decenti, potresti avere ... 50 moduli? Quindi familiarizzare con tutti loro richiede circa 4 anni e ciò significa che il programmatore di apprendimento lavora, in media, con un'efficienza del 58% rispetto al programmatore A ... hmmm.
Quindi considera questo scenario: stessi programmatori, stesso progetto (A sa tutto e B non ne conosce nessuno.) 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, solo 1,4 unità di lavoro su ciascun modulo. Il totale (A + B) è di 6,4 unità di lavoro per modulo. Questo perché B trascorre la maggior parte del tempo senza alcuna abilità con il modulo su cui stanno lavorando.
In questa situazione, è più ottimale concentrarsi B su un sottoinsieme di moduli più piccolo. Se B si concentra su soli 25 moduli, ottengono 10 giorni su ciascuno, per un totale di 3,8 unità di lavoro su ciascuno. Il programmatore A potrebbe quindi passare 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 fatto quando A e B hanno distribuito il lavoro in modo uniforme.
Quando restringiamo l'ambito dei moduli su cui B lavora, otteniamo ancora più efficienza (fino a un certo punto).
Formazione
Direi anche che qualcuno che non sa molto di un modulo interromperà la persona che fa molto di più di qualcuno con più esperienza. Quindi questi numeri sopra non tengono conto del fatto che più tempo B dedica al codice che non capiscono, più tempo A impiega facendo domande e talvolta A deve aiutare a correggere o risolvere ciò che B ha fatto. Formare qualcuno è un'attività che richiede tempo.
Soluzione ottimale
Ecco perché penso che la soluzione ottimale debba basarsi su domande come:
- Quanto è grande la tua squadra? Ha senso avere tutti cross training su ogni parte, o se abbiamo un team di 10 persone, possiamo solo 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 sta il fatturato dei tuoi dipendenti? Se si consegnano i dipendenti in media ogni 3 anni e ci vuole più tempo per conoscere davvero ogni angolo del sistema, non saranno abbastanza a lungo da consentire alla formazione di ripagarsi.
- Hai davvero bisogno di un esperto per diagnosticare un problema? Molte persone usano la scusa, "cosa succede se quella persona va in vacanza", ma sono stato chiamato più volte per diagnosticare un problema in un sistema con cui non avevo esperienza. Potrebbe essere vero che la persona esperta potrebbe trovarlo 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 di 5 ore, altrimenti il mondo finirà. Devi soppesare questi rischi.
Ecco perché penso "dipende". Non vuoi dividere 20 moduli tra due programmatori proprio al centro (10 ciascuno), perché non hai flessibilità, ma non vuoi nemmeno formare 10 programmatori su tutti i 50 moduli perché perdi molto efficienza e non è necessaria molta ridondanza.