No lo explicas, pero la "complejidad accidental" se define como la complejidad que no es inherente al problema, en comparación con la complejidad "esencial". Las técnicas requeridas para "Domar" dependerán de dónde empieces. Lo siguiente se refiere principalmente a los sistemas que ya han adquirido una complejidad innecesaria.
Tengo experiencia en varios proyectos grandes de varios años en los que el componente "accidental" superó significativamente el aspecto "esencial", y también aquellos en los que no lo hizo.
En realidad, el algoritmo de Feynman se aplica en cierta medida, pero eso no significa que "pensar realmente duro" significa solo magia que no se puede codificar.
Me parece que hay dos enfoques que deben tomarse. Tómalos a ambos, no son alternativas. Uno es abordarlo de forma parcial y el otro es hacer un gran trabajo.
Así que ciertamente, "anote el problema". Esto podría tomar la forma de una auditoría del sistema: los módulos de código, su estado (olor, nivel de pruebas automatizadas, la cantidad de personal que afirma entenderlo), la arquitectura general (existe una, incluso si “tiene problemas” ), estado de los requisitos, etc. etc.
Es la naturaleza de la complejidad "accidental" que no hay un problema que solo deba abordarse. Así que necesitas triaje. ¿Dónde le duele, en términos de capacidad para mantener el sistema y avanzar en su desarrollo? Quizás algún código sea realmente maloliente, pero no es la máxima prioridad y la reparación puede hacerse para esperar. Por otro lado, puede haber algún código que devuelva rápidamente el tiempo empleado en refactorizar.
Defina un plan para una mejor arquitectura e intente asegurarse de que el nuevo trabajo se ajuste a ese plan: este es el enfoque incremental.
También, articule el costo de los problemas y utilícelo para construir un caso de negocios para justificar un refactor. La clave aquí es que un sistema bien diseñado puede ser mucho más robusto y comprobable, lo que da como resultado un tiempo mucho más corto (costo e cronograma) para implementar el cambio, esto tiene un valor real.
Un retrabajo importante viene en la categoría de "pensar realmente duro": es necesario hacerlo bien. Aquí es donde tener un "Feynman" (bueno, una pequeña fracción de uno estaría bien) da sus frutos enormemente. Una revisión importante que no resulte en una mejor arquitectura puede ser un desastre. Las reescrituras completas del sistema son conocidas por esto.
Implícito en cualquier enfoque es saber distinguir "accidental" de "esencial", es decir, es necesario tener un gran arquitecto (o equipo de arquitectos) que realmente entienda el sistema y su propósito.
Habiendo dicho todo eso, la clave para mí es pruebas automatizadas . Si tienes suficiente, tu sistema está bajo control. Si no lo haces . .