Antes que nada, es importante entender que un código puede degenerar a lo largo del tiempo y convertirse en un infame código espagueti. Ya sea por falta de tiempo, por falta de experiencia o por directrices poco claras, las órdenes innecesariamente complejas en la programación del código acaban obstaculizando su funcionalidad. Cuanto más rápido y complejo sea el ámbito de aplicación de un código, más se erosionará.
El término código espagueti hace referencia a códigos fuente confusos y de difícil lectura, cuya estructura es difícil de comprender para los programadores. Algunos ejemplos típicos de elementos que complican el código son las órdenes de salto (GOTO) redundantes, que indican al programa que vaya saltando de un sitio a otro en el código; los bucles for/while y los comandos if.
Concretamente, los proyectos en los que trabajan muchos desarrolladores suelen generar un código poco legible. Si un código que ya de por sí presentaba ciertas imperfecciones pasa por muchas manos, es difícil evitar que se encadenen modificaciones a modo de parche y que, finalmente, se requiera una cara revisión o review del códigopara corregirlo. En el peor de los casos, el código espagueti puede poner en peligro todo el proceso de desarrollo del software, llegando a un punto en el que ni siquiera la refactorización puede resolver el problema.
Los llamados code smells y el code rot(es decir, los defectos y la erosión del software) no tienen por qué ser tan preocupantes. Con el paso del tiempo, si un código contiene muchos elementos innecesarios, puede empezar a apestar, por así decirlo. Las secciones poco claras de la estructura empeoran cada vez que un programador nuevo se pone a trabajarlas o amplía el código. Es por tanto necesario realizar un refactoring en cuanto aparezcan los primeros code smells, ya que si no el código seguirá erosionándose y perderá su funcionalidad a causa del code rot (el proceso de putrefacción, traducido literalmente).