Como desarrollador de software, una de mis tareas principales es mantener la complejidad bajo control.
Sin embargo, en algunos proyectos, hay un momento en que el nivel de complejidad crece tan alto que alcanza algún tipo de punto de "no retorno". Pasado este momento, nunca podrá devolver el proyecto a un nivel aceptable de complejidad en menos tiempo del que necesitaría reescribir todo desde cero.
¿Este momento en particular tiene un nombre en el dialecto de los programadores (algo similar a la ley de Godwin para trolls)?
--editar--
Lo siento si no estoy claro. No creo que este "momento" tenga un nombre oficial, o sea una métrica seria. Estaba pensando en algo en el espíritu del "pico de Ballmer" en xkcd .
terminology
Thibault J
fuente
fuente
Respuestas:
Es más una cuestión de mantenibilidad que de complejidad.
El fenómeno se llama "deuda técnica", y una vez que alcanza un nivel crítico, el proyecto está en camino a la bancarrota.
¿Es eso lo que querías decir?
fuente
El "punto de exceso de complejidad" se conoce en inglés como:
OH DIOS MÍO QUE ES ESTA MIERDA.
El problema es que esto puede aplicarse a algo que es realmente simple, pero se implementa de una manera tan horrible que tiene la misma reacción.
Así que distinguir algo muy complejo de algo muy horrible puede ser difícil.
SIN EMBARGO: Lo que en realidad tiende a suceder a todo el software es un proceso como este:
Paso 1: Tener una buena especificación, hacer un buen diseño, implementar cosas buenas. Todo el mundo está feliz.
Al final del paso 1: los desarrolladores se felicitan por la maravillosa elegancia de su diseño y se van felices pensando "Tengo un maravilloso legado aquí para que otros agreguen cosas en el futuro, será maravilloso y el mundo será un mejor lugar."
Paso 2: Se realizan algunos cambios, se agregan cosas, se incluyen nuevas funciones. La arquitectura y la estructura del Paso 1 hicieron de este un proceso bastante sencillo. [Pero vaya, el "factor cruft" solo aumentó un poco.]
Al final del paso 2: los desarrolladores se felicitan por la maravillosa elegancia de su diseño, y se van contentos pensando "Gee, soy tan inteligente de haber tenido en cuenta todo eso en el Paso 1. Esto fue tan bien. Tengo un maravilloso legado aquí para que otros agreguen cosas en el futuro, será maravilloso y el mundo será un lugar mejor ".
Paso 3: se realizan más cambios, se agregan más cosas, se agregan más funciones nuevas, se cambian muchas cosas y se escuchan los comentarios de los usuarios.
Al final del paso 3: los desarrolladores se felicitan a sí mismos por la maravillosa elegancia de su diseño y se van bastante felices pensando "Gee, esta arquitectura es bastante buena para permitir tantos cambios que se insertan fácilmente. Pero estoy un poco infeliz sobre X e Y y Z. Ahora podrían limpiarse un poco. ¡Pero! ¡Ah! ¡Soy tan inteligente de haber hecho todos esos ajustes en el Paso 1. Esto fue tan bien. Tengo un maravilloso legado aquí para otros para agregar cosas en el futuro, será maravilloso y el mundo será un lugar mejor ".
Paso 4: al igual que el paso 3. Excepto:
Al final del paso 4: los desarrolladores piensan: "Esto es tan bueno que se está poniendo feo para mantener. Realmente necesita algunos cambios serios. Realmente no me gusta trabajar en esto. Necesita una refactorización. Me pregunto qué hará el jefe dirá cuando le diga que necesita 6 semanas y que no habrá nada para que los usuarios vean al final de esto ... pero tendré otros 5 años de delicioso alcance de modificación futura al hacer esto ... hmmm ... "Es hora de ir al pub a tomar una cerveza".
Paso 5: se deben realizar muchos cambios.
Y DURANTE el paso 5, los desarrolladores se dicen unos a otros: "Este código apesta. ¿Quién escribió esto? Deberían ser fusilados. Es horrible. Tenemos que volver a escribirlo".
El paso 5 es fatal. Aquí es donde el factor cruft se ha vuelto tan malo que el código no puede tener solo algunos cambios más, sino que debe tener algunos GRANDES cambios.
El problema en el Paso 5 es el deseo de tirarlo y comenzar de nuevo. La razón por la que esto es fatal es "El factor Netscape". Ve a google it. Las empresas MUEREN en este punto, porque comenzar de nuevo significa que comienzas con aproximadamente un 50% de suposiciones en lugar de hechos, 150% de entusiasmo en lugar de conocimiento, 200% de arrogancia en lugar de humildad ("¡Esos tipos eran tan estúpidos!"). Y presentas un montón de nuevos errores.
Lo mejor que puedes hacer es refactorizar. Cambia poco a poco. Si la arquitectura se está cansando un poco, arréglala. Añadir, ampliar, mejorar. Gradualmente. En cada paso del camino, prueba, prueba y prueba un poco más. Cambios incrementales como este significan que 10 años después el código actual y el original son como el hacha del abuelo ("tenía 10 cabezas nuevas y 3 manijas nuevas pero sigue siendo el hacha del abuelo"). En otras palabras, no queda mucho en común. Pero te moviste de lo viejo a lo nuevo de forma gradual y cuidadosa. Esto reduce el riesgo, y para los clientes, reduce el factor cabreado.
fuente
Estoy de acuerdo en que el momento es difícil de reconocer y puede evitarse mediante procesos adecuados. Sin embargo, la pregunta era sobre cómo llamarlo. En la economía real, existe el concepto de "rendimientos decrecientes": el punto en el que el aumento de los insumos para un recurso en un proceso disminuye su beneficio general por unidad. Esto ciertamente se aplica a la codificación, e incluso cosas buenas como la abstracción, la reutilización, etc. tienen tal punto de rendimientos decrecientes. El término general específico de programación es "sobreingeniería". Para alguien que es propenso a hacer esto, me gusta el término de Joel " astronauta de la arquitectura ".
fuente
Con demasiada frecuencia, se descarta un buen código bajo la falsa impresión de que el nuevo equipo con nuevas herramientas puede hacerlo más barato, más rápido y con mayor confiabilidad, solo para descubrir que
Posiblemente el tiempo que ha descrito llega con algunas bases de código (solía pensar que sí). Nunca experimenté personalmente un caso de código antiguo que causara que un proyecto se arruinara, o reescribí el código para guardar un proyecto.
No incluyo en estos casos donde las métricas se han utilizado para identificar módulos o diseños problemáticos específicos, que luego fueron eliminados y reemplazados.
fuente
El verdadero problema con este "momento" teórico es que solo se reconoce después del hecho. A menos que sus colegas sean psicópatas, cada compromiso en la base de código se realiza con la creencia de que es una mejora en esa base de código. Solo mirando hacia atrás en el desorden resultante, puedes ver que has pasado ese "momento".
Pero me gusta que podamos darle un nombre. "Caballeros", podría decir, atrayendo a sus colegas desarrolladores a su alrededor, "Hemos cruzado el Malesibility Hellespont. Envíe un mensaje de texto a su esposa y hágale saber que no la verá por un tiempo".
fuente
No sé si hay un nombre, pero si no lo hay, propondría llamarlo "punto de fusión"
fuente
Esta no es una pregunta muy interesante.
De hecho es trivial.
Es tan trivial que hemos desarrollado numerosas formas de hacer frente.
Metodologías en cascada. Mucha gente pasa mucho tiempo revisando requisitos y diseñando documentos para asegurarse de que se gestione la complejidad.
Metodologías ágiles. Menos personas pasan menos tiempo discutiendo lo que es inmediatamente aplicable para resolver el problema de alguien y lanzarles software. La complejidad se gestiona porque todos se centran en obtener algo lanzado.
La única vez que alguien lucha con la "complejidad" es por no seguir la metodología y administrar su tiempo adecuadamente.
No hay supervisión detallada en una metodología de cascada. No están obligados a revisar los productos de trabajo intermedio según los requisitos, la arquitectura, el diseño de alto nivel o las revisiones detalladas del diseño.
Sin fecha límite de sprint o prioridades de caso de uso adecuado en una metodología ágil. No están enfocados en hacer que algo sea lanzado al usuario lo más rápido posible.
La complejidad debe limitarse estableciendo metas.
Luchar con la complejidad significa que los objetivos no se establecen o no se recompensan adecuadamente.
No hay un "punto de inflexión". Si la gestión de la complejidad es de alguna manera un problema, algo ya está mal organizacionalmente.
fuente
Existen métodos para visualizar y monitorear el riesgo de aumentar la complejidad de los proyectos (grandes) y el código. Cuando se aplican razonablemente con suerte, no se necesita un nuevo nombre para el punto de no retorno. (Hay un MOOC relacionado en openHPI: https://open.hpi.de/courses/softwareanalytics2015/ )
La complejidad estructural es un problema de diseño general, no solo para el diseño de software en grandes equipos. La visualización es el primer paso en la gestión de la complejidad estructural. Las matrices y los gráficos dirigidos también se pueden usar para este propósito.
Algunos métodos para reducir la complejidad estructural son http://www.buch.de/shop/home/suche/?fq=3540878890 :
Además, existe el concepto de diseño axiomático: https: \ en.wikipedia.org \ wiki \ Axiomatic_design \ Con este concepto se pueden evitar problemas de fiabilidad debido a la complejidad innecesaria.
Por lo tanto, hay un montón de métodos disponibles. Al final, siempre se trata de la decisión de pensar en ellos porque un proyecto se vuelve lo suficientemente grande.
fuente