Una de las anĂ©cdotas mĂĄs comunes de un proyecto de software es que siempre hay una clase o una funciĂłn que serĂĄ recordada por el nĂșmero de lĂneas que esta tuvo. Estoy seguro de que al menos una vez hemos escuchado:
“No toques esa clase, tiene como 1000 lĂneas de cĂłdigo”
Developer anĂłnimo
Este es un dato particular de acuerdo a los proyectos en los que estuve y conversaciones entre amigos. Lo que es menos comĂșn, es saber cuĂĄntas lĂneas de cĂłdigo tiene el proyecto en el que estamos trabajando.
Si en este momento nos hacemos esa pregunta o se la hacemos a otro miembro del equipo, es posible de que no consigan una respuesta concreta. Si bien es cierto no considero necesario ser 100% precisos, he notado que pocas personas se preocupan de esa mĂ©trica, a menos claro, de que haya algĂșn costo asociado.
Si no les ha pasado, les comento que casos como este se dan desde hace mucho en proyectos donde se audita cĂłdigo. Sin ir muy lejos, Amazon liberĂł [CodeGuru], un servicio (aĂșn en preview) que analiza el cĂłdigo fuente. Como es de esperar, el costo estĂĄ asociado al nĂșmero de lĂneas y no es el Ășnico producto o servicio que hace este [tipo de trabajos]

¿Qué es lo que regularmente encontraremos?
He participado en proyectos donde el anĂĄlisis o auditorĂa de calidad de software era uno de los objetivos mĂĄs importantes. Muchas veces el costo de servicios adquiridos âu ofrecidosâ estaba relacionado al nĂșmero de lĂneas de cĂłdigo (o LoC por [Lines of Code]).
En cada trabajo era comĂșn confirmar lo encontrado en proyectos anteriores:
- Pocas personas conocĂan el nĂșmero de LoC o la importancia de este indicador
- Una prĂĄctica conocida ây en algunos casos, aceptadaâ era “agregar cĂłdigo de ejemplo, ir cambiando y probando pero guardar la versiĂłn original por si algo se malograba”
- Muchas veces se mantenĂan las carpetas de plantillas y ejemplos de las librerĂas y componentes de terceros que en algunos casos ya no se utilizaban
Ya en un caso concreto, estuve en un proyecto donde el desarrollo tenĂa mĂĄs de un millĂłn de LoC y estaba seguro de que eso no podĂa ser posible pues las funcionalidades del sistema no reflejaban dicha realidad.
SabĂa que estaba frente a un caso de CĂłdigo Muerto, pero tenĂa que demostrarlo.
¿Qué es Código Muerto?
Sin entrar en detalles (pues es posible que encuentren discrepancias y hasta [una canciĂłn]), el cĂłdigo muerto o “Dead Code” es aquel que no aporta valor al negocio.
El cĂłdigo muerto se puede clasificar de la siguiente manera:
- CĂłdigo que no se usa: Muy usual en los proyectos de software, algunas veces no se recuerda su objetivo inicial y por lo general ocurre pues las necesidades van cambiando y el cĂłdigo no se depura adecuadamente luego de cada cambio (mucho cuidado con las frases “es que no hay tiempo” o “lo vemos despuĂ©s”)
- CĂłdigo que se ejecuta pero que no se usa: AquĂ entran los casos como los de variables asignadas o llamadas a funciones cuyo resultado no es utilizado. Esto es nocivo pues ademĂĄs ser cĂłdigo inĂștil, consume recursos del sistema.

ÂżCĂłmo identificar CĂłdigo Muerto?
Con el paso del tiempo preparĂ© una secuencia de anĂĄlisis que me sirviĂł para encontrar casos de cĂłdigo muerto bajo la premisa de que si algo se define en el programa, este debe ser utilizado de manera efectiva. La lista puede parecer obvia, pero ya estĂĄ demostrado que en tecnologĂa no debemos confiar en las obviedades đ
- Variables
- Funciones
- Clases
- Comentarios (sean redundantes o cĂłdigo que fue comentado para ser utilizado “mĂĄs adelante”)
- Elementos de archivos de configuraciĂłn (por ejemplo, secciones comentads o que ya no se utilizan)
- Archivos de configuraciĂłn
- LibrerĂas (componentes de terceros)
- Elementos idĂ©nticos (funciones, clases archivos, librerĂas o carpetas distribuidos en ubicaciones distintas)
- Elementos parecidos (librerĂas con versiones diferentes, funciones o clases que inicialmente eran una copia de la otra)
- Carpetas y archivos varios que poco a poco quedan relegados hasta el olvido
Un hecho comĂșn en todos los casos, es que el cĂłdigo muerto existe debido al temor a perder cĂłdigo o a malograr el sistema construido. Esto tiene relaciĂłn directa con el desconocimiento de que los gestores de versiones permiten volver al pasado si es que se necesita ver algo que ha sido borrado.
Otra consecuencia es que a mĂĄs cĂłdigo muerto, mĂĄs complejo serĂĄ el entendimiento de nuestro sistema, la mantenibilidad serĂĄ afectada y a su vez generarĂĄ dependencias con un programador en particular (a veces pueden ser mĂĄs personas). Recuerden, el cĂłdigo es de todos los miembros del equipo y mientras menos dependencias, mejor.
¿Qué herramientas debemos usar?
Puede que parezca una broma, pero un elemento muy importante es la inspecciĂłn visual. A pesar de ello, esta debe pasar a segundo plano pues debemos evitar confiar totalmente de los presentimientos o “literalmente” de puntos de vista.
De acuerdo a esta premisa, lo primero que debemos hacer es trabajar con [herramientas de anĂĄlisis estĂĄtico] que nos brinden un enfoque acertado de lo que estĂĄ ocurriendo.
A pesar de ello, hasta el momento no he encontrado una herramienta que brinde un indicador de cĂłdigo muerto bajo un enfoque holĂstico. Es asĂ que utilizo principalmente [SonarQube] como base del trabajo a realizar.
Regresando al caso del millón de LoC, encontré pistas que me ayudaron a confirmar la existencia del temible código muerto.
Si queremos empezar con estas prĂĄcticas, algo que nos podrĂa ayudar estĂĄ incluido en las herramientas del navegador web. Una de las que ha llamado mi atenciĂłn es la utilizada para analizar la cobertura de los archivos JavaScript y CSS. Esta viene en [Chrome] y no es complicado de usar/entender.
¿Qué conseguà luego de presentar lo encontrado?
El objetivo de mi trabajo en dicho proyecto, fue preparar un informe sobre lo que se estaba construyendo y sobre eso un plan de trabajo para implementar una nueva arquitectura. No me parecĂa adecuado llegar con una presentaciĂłn llena de indicadores ni menos señalar responsables (aunque en algunos casos ese ha sido mi trabajo), asĂ que gracias al apoyo y explicaciones que el equipo dio cuando estaba analizando el cĂłdigo, tenĂa el conocimiento necesario para “limpiarlo”, al menos en casos que parecĂan obvios o donde veĂa que complejidad baja o media.
Como este tipo de trabajos me gustan, no parĂ© hasta eliminar 95% del cĂłdigo del sistema. No esperaba llegar a ese nĂșmero pero mĂĄs de un millĂłn lĂneas era cĂłdigo muerto que se podĂa limpiar fĂĄcilmente.
Nada mejor que llegar con un informe que tenga un entregable como ese đ
La buena noticias es que el equipo quedó sorprendido. Cuåndo me preguntaron cómo lo hice, les comenté que empecé por las obviedades (y ya saben lo que pienso de ellas :)) creo que eso los animó a seguir limpiando (luego de una segunda limpieza el código no superaba las 30 mil LoC)
¿Qué es lo que aprend�
- Es posible que este tipo de trabajos sea incomprendido al principio, pero se consigue mucho enseñando con el ejemplo. En dicho proyecto tenĂa que preparar una arquitectura que aproveche lo que ya estaba construido, pero ante las sospechas de cĂłdigo muerto, decidĂ detenerme un momento y evaluar cĂłmo eliminarlo, primero por mi cuenta y luego con el equipo.
- Lo que he encontrado en muchos casos, es que hay pocas intenciones de refactorización que a veces no se dan por el uso desmedido de frameworks y herramientas. Lo que creo que se debe hacer es sentar una base medible de lo que estå sucediendo sin olvidar que lo mås se hace en un proyecto de software es la construcción del mismo. Si es asà ¿por qué no saber cómo va creciendo nuestro código?
- La automatizaciĂłn de pruebas es muy importante pero esta se debe postergar si hay casos obvios de cĂłdigo muerto, he comprobado que a veces resulta mĂĄs rĂĄpido borrar (sin miedo) que ponermos a programar un caso de prueba.
- Siempre debemos utilizar un gestor de versiones (personalmente prefiero Git sobre GitHub) y tenerlo enlazado a un motor de automatizaciĂłn (como [Jenkins] o [Azure DevOps], ambos me parecen buenos y Azure DevOps es mĂĄs sencillo de configurar) que ayude a tener visibilidad de la integraciĂłn continua.
- El equipo de desarrollo pasa a otro nivel de conocimiento, pues ademĂĄs de entender la importancia de prĂĄcticas de limpieza de cĂłdigo muerto se abre una nueva puerta hacia la calidad del producto.
- Si la confianza y comunicación son las adecuadas, este tipo de situaciones se convierten en anécdotas del equipo.
ÂżCuĂĄl fue mi reflexiĂłn final?
Antes de refactorizar o hacer lo que sea en el sistema, eliminen el CĂłdigo Muerto, no teman.
Un abrazo,
Fuente imagen cabecera: [Finding Dead Code]
















