Non lo si scrive, ma la "complessità accidentale" è definita come una complessità che non è inerente al problema, rispetto alla complessità "essenziale". Le tecniche richieste per "Addomesticare" dipenderanno da dove parti. Quanto segue si riferisce principalmente a sistemi che hanno già acquisito una complessità non necessaria.
Ho esperienza in una serie di grandi progetti pluriennali in cui la componente "accidentale" superava in modo significativo l'aspetto "essenziale" e anche quelli in cui non lo era.
In realtà, l'algoritmo di Feynman si applica in una certa misura, ma ciò non significa che "pensare in modo reale" significhi solo magia che non può essere codificata.
Trovo che ci siano due approcci che devono essere presi. Prendili entrambi: non sono alternative. Uno è quello di affrontarlo frammentario e l'altro è quello di fare una rielaborazione importante.
Quindi certamente, "annota il problema". Ciò potrebbe assumere la forma di un audit del sistema - i moduli del codice, il loro stato (odore, livello di test automatizzati, quanti membri dello staff pretendono di capirlo), l'architettura generale (ce n'è uno, anche se "ha problemi") ), stato dei requisiti, ecc. ecc.
È la natura della complessità "accidentale" che non esiste un problema che deve essere affrontato. Quindi è necessario triage. Dove fa male - in termini di capacità di mantenere il sistema e progredire nel suo sviluppo? Forse un po 'di codice è davvero maleodorante, ma non è una priorità assoluta e il fixing può essere fatto aspettare. D'altra parte, potrebbe esserci del codice che restituirà rapidamente il tempo trascorso per il refactoring.
Definisci un piano per ciò che sarà una migliore architettura e cerca di assicurarti che il nuovo lavoro sia conforme a tale piano - questo è l'approccio incrementale.
Inoltre, articola il costo dei problemi e usalo per costruire un business case per giustificare un refactoring. La cosa fondamentale qui è che un sistema ben progettato può essere molto più robusto e verificabile risultando in un tempo molto più breve (costo e programma) per implementare il cambiamento - questo ha un valore reale.
Una grossa rielaborazione arriva nella categoria "think real hard": è necessario farlo bene. È qui che avere un "Feynman" (beh, una piccola parte di uno andrebbe bene) ha un enorme successo. Un importante rilavorazione che non risulti in un'architettura migliore può essere un disastro. Le riscritture complete del sistema sono famose per questo.
Implicito in qualsiasi approccio è saper distinguere "accidentale" da "essenziale", vale a dire che è necessario avere un grande architetto (o un gruppo di architetti) che capisca veramente il sistema e il suo scopo.
Detto questo, la cosa fondamentale per me è test automatici . Se ne hai abbastanza, il tuo sistema è sotto controllo. Se non lo fai. . .