Chiunque può modificare qualsiasi codice. Responsabilità condivisa per l'intera codebase.
Nei modelli tradizionali, il codice ha dei proprietari. "Quello è il modulo di Alice." "Parla con Bob per il livello database." Questo crea problemi:
Colli di bottiglia: Quando Alice è in vacanza, il suo modulo non può essere modificato. Quando Bob è occupato, il lavoro sul database si accumula.
Silos: Le persone non comprendono il codice che non possiedono. L'integrazione diventa dolorosa.
Bus factor: Se Alice se ne va, la conoscenza se ne va con lei.
La proprietà collettiva significa che chiunque nel team può modificare qualsiasi codice. Non ci sono territori personali. Il team possiede la codebase insieme.
All'inizio fa paura. Le persone non romperanno cose che non comprendono? Il codice non diventerà incoerente? Non ne deriverà il caos?
Non se hai le pratiche di supporto.
Il Compromesso
La proprietà individuale protegge il codice da modifiche non informate. La proprietà collettiva abilita il flusso e l'apprendimento condiviso. XP usa pratiche (test, standard, pairing) per ottenere i benefici della proprietà collettiva senza il caos.
La proprietà collettiva richiede pratiche di supporto:
Test completi: Se rompi qualcosa, i test lo rilevano immediatamente. Questo rende sicuro per i non esperti modificare il codice.
Pair programming: Quando modifichi codice non familiare, lavora in coppia con qualcuno che lo conosce. La conoscenza si trasferisce e gli errori vengono rilevati.
Standard di codifica: Uno stile coerente significa che chiunque può leggere qualsiasi codice. Nessuna traduzione tra "lo stile di Alice" e "lo stile di Bob."
Integrazione continua: Le modifiche si integrano immediatamente. Se qualcosa va in conflitto o si rompe, lo sai velocemente.
Refactoring: Tutti migliorano il codice mentre lavorano. La codebase migliora, non peggiora, nel tempo.
Senza queste pratiche, la proprietà collettiva è caos. Con esse, è liberatoria.
La proprietà individuale ha un suo posto. Fornisce:
Ma i costi sono alti:
XP dice che i costi superano i benefici. La proprietà condivisa con pratiche di supporto batte la proprietà individuale.
Alcuni team usano un ibrido: proprietari primari e secondari. Il primario conosce meglio il codice; il secondario sta imparando. Questo fornisce competenza riducendo il rischio di collo di bottiglia.
Uno sviluppatore deve correggere un bug in un modulo non familiare. Apre il codice, legge i test, lavora in coppia con qualcuno che conosce l'area, fa la correzione ed esegue tutti i test. La conoscenza si diffonde.
Viene trovato un bug critico nel modulo di Alice. Alice è in vacanza. Il team decide di aspettare il suo ritorno perché nessun altro 'dovrebbe' toccare il suo codice. Il bug rimane in produzione per una settimana.
Passare alla proprietà collettiva può essere difficile:
"Ma io sono l'esperto!" Sei ancora l'esperto. Lavorerai in coppia con altri quando modificheranno il tuo codice. La tua competenza si diffonde—non diminuisce.
"Le persone rovineranno il mio codice." I test proteggono dal rovinare. La revisione del codice (o il pairing) rileva i problemi. E il "tuo" codice non è davvero tuo—è del team.
"Non posso stare al passo con tutto il codice." Non devi. Impari ciò che ti serve quando ti serve. Lavora in coppia con gli esperti. Leggi i test. Segui gli standard.
"Il nostro codice è troppo complesso per i non esperti." Questo è un code smell, non un argomento sulla proprietà. Il codice complesso dovrebbe essere semplificato. Nel frattempo, il pair programming protegge da modifiche non informate.
Il cambiamento è culturale tanto quanto tecnico. Richiede fiducia, trasparenza e una mentalità di crescita.
Passare alla proprietà collettiva gradualmente:
Settimana 1-2: Pairing cross-dominio. Fai lavorare in coppia esperti con non esperti sul codice degli altri.
Settimana 3-4: Rimuovi le etichette di proprietà esplicite. Smetti di dire "il modulo di Alice." Inizia a dire "il modulo di pagamento."
Settimana 5-6: Incoraggia l'impollinazione incrociata. Quando assegni le storie, metti intenzionalmente le persone su codice non familiare (con supporto di pairing).
Continuo: Celebra la condivisione della conoscenza. Riconosci quando qualcuno impara una nuova area o quando un "proprietario" trasferisce con successo la conoscenza.
Misura il bus factor: Quante persone possono lavorare in modo significativo su ciascuna area della codebase? Punta ad almeno 2, idealmente 3+.
Un rapido controllo del bus factor: per ogni area principale del codice, chi potrebbe correggere un bug in produzione alle 3 del mattino? Se la risposta è una persona, hai un problema.