El junk (código basura) se refiere al código y dependencias que no aportan beneficio a un proyecto pero aumentan su tamaño, tiempo de compilación y carga cognitiva del equipo. A diferencia del código muerto que nunca se ejecuta, el junk puede funcionar pero lo hace de manera ineficiente o redundante: bibliotecas duplicadas, importaciones no utilizadas, bloques comentados, polyfills obsoletos y abstracciones decorativas. Según el CodeScene Code Health Report (2025), en promedio el 15 por ciento de las dependencias en proyectos móviles no se usan directamente y solo arrastran paquetes transitivos. El código basura es el “peso extra” de un proyecto: hace que la base de código sea más grande pero no más fuerte. Las auditorías regulares de dependencias y la eliminación de abstracciones redundantes mejoran directamente la velocidad de compilación y la calidad del código.
Puntos clave
Junk (código basura) es un término colectivo para código, configuraciones y dependencias que existen en un proyecto pero no aportan valor funcional. El junk no necesariamente está roto o sin usar — el problema es que su presencia empeora las métricas del proyecto sin una justificación adecuada.
El junk se divide en cuatro categorías. Primera — dependencias redundantes: bibliotecas agregadas para una sola función que podría implementarse con herramientas estándar. Segunda — peso muerto: bloques comentados, TODO sin tickets, métodos vacíos y clases esqueleto. Tercera — soluciones duplicadas: dos bibliotecas que hacen lo mismo (por ejemplo, Gson y Kotlin Serialization en un mismo proyecto). Cuarta — sobreingeniería: capas arquitectónicas que no se usan pero se mantienen “por si acaso.”
Según la investigación de Stripe Engineering Productivity (2025), eliminar el 10 por ciento de junk de un proyecto típico reduce el tiempo de compilación completa en un promedio del 22 por ciento. La razón: cada dependencia extra aumenta el grafo de compilación, cada abstracción vacía requiere tiempo para entenderla, cada bloque comentado distrae la atención.
La principal dificultad en la lucha contra el junk es la ausencia de consecuencias inmediatas. Un proyecto con código basura compila y funciona. Los problemas se acumulan gradualmente: la compilación se ralentiza, la cantidad de dependencias transitivas crece, y al año agregar una nueva funcionalidad lleva el doble de tiempo del que debería.
Las dependencias basura son bibliotecas y paquetes agregados a un proyecto que no se usan directamente en el código, o se usan solo para una única función que sería más simple implementar con APIs estándar.
Ejemplos típicos: una biblioteca para procesamiento JSON cuando el proyecto ya usa Kotlin Serialization (dos parseadores es junk); la biblioteca Apache Commons Lang para una sola llamada StringUtils.isEmpty que podría reemplazarse con la extensión isNullOrBlank de Kotlin; una biblioteca de DI usada en un módulo de diez, mientras los otros reciben dependencias manualmente por constructor.
Cada dependencia extra no es solo código adicional en el binario. Aumenta la superficie de ataque para vulnerabilidades: según la GitHub Advisory Database (2025), el 40 por ciento de los CVE críticos en proyectos móviles provienen de dependencias transitivas que los desarrolladores no controlan. Cuantas menos dependencias, menor la superficie de ataque.
// View Gradle dependency tree
./gradlew app:dependencies --configuration releaseRuntimeClasspath
// Find unused dependencies (Gradle plugin)
plugins {
id "com.autonomousapps.dependency-analysis" version "2.0.0"
}
// Generate unused library report
./gradlew buildHealth
Para iOS, use el comando swift package show-dependencies, que muestra el árbol completo de dependencias. La herramienta Xcode Build Timeline indica cuánto tiempo de compilación agrega cada biblioteca. Si una biblioteca ocupa el 30 por ciento del tiempo de compilación pero se usa en una sola pantalla, es candidata para eliminación o reemplazo.
Para Node.js (React Native), use depcheck — una utilidad que encuentra dependencias no utilizadas en package.json, y npm-check, que además muestra versiones obsoletas. Implemente una regla: cada nueva dependencia debe pasar una revisión de código con una justificación de “por qué no se pueden usar herramientas estándar.”
Las importaciones muertas son el tipo más común de junk. No afectan el tiempo de ejecución pero aumentan el tiempo de compilación: el compilador procesa cada importación, incluso las no utilizadas. En proyectos grandes, eliminar importaciones no utilizadas reduce el tiempo de compilación entre un 5 y un 10 por ciento.
Los IDEs modernos resaltan automáticamente las importaciones no utilizadas en gris. Configure la limpieza automática al guardar: en IntelliJ IDEA — Optimize Imports on the fly, en Xcode — Editor > Remove Unused Imports. Agregue una verificación en CI: el linter debe bloquear commits con importaciones no utilizadas.
El código comentado es otro tipo de junk. Los desarrolladores comentan bloques para “no perder” funcionalidad durante la refactorización. Sin embargo, git almacena el historial completo de cambios: cualquier código eliminado puede restaurarse con un solo comando git revert o git log -S
La regla: no hay código comentado en el repositorio. Si el código no es necesario, elimínelo permanentemente. Si el código es necesario pero está temporalmente desactivado, use un feature toggle con un ticket y una fecha de vencimiento. Comentarios como // TODO: remove after migration — no los deje sin fecha límite. Establezca una fecha y recuérdese con un calendario.
La sobreingeniería es la creación de capas arquitectónicas que no resuelven problemas actuales pero requieren mantenimiento. Este es uno de los tipos de junk más difíciles porque formalmente el código es “correcto”: sigue SOLID, está cubierto por pruebas y se ajusta a la arquitectura. El problema es que no es necesario.
Un ejemplo clásico es una clase abstracta UseCase con un único método invoke que simplemente llama a un repositorio. Si el UseCase no agrega lógica (caché, reintento, transformación) y solo pasa la llamada, es una entidad extra. Aumenta la navegación en el proyecto: un desarrollador abre el UseCase, ve invoke → repositorio, y lo cierra. Tiempo perdido, beneficio cero.
Otro ejemplo es la parametrización excesiva. Una interfaz genérica con seis parámetros de tipo utilizada en un solo lugar. Cada parámetro de tipo agrega carga cognitiva: al leer el código, hay que mantener seis tipos en mente mientras solo dos se usan realmente. Si una abstracción no se reutiliza, es redundante.
El criterio de corte: si una abstracción no se reutiliza en tres contextos diferentes, elimínela. Una abstracción se justifica cuando realmente resuelve un problema de duplicación, no cuando predice escenarios hipotéticos futuros. YAGNI (You Ain’t Gonna Need It) es el mejor principio para prevenir la sobreingeniería.
La auditoría de junk requiere una combinación de análisis estático, análisis de dependencias y revisión manual. Es imposible automatizar completamente la detección de abstracciones redundantes, pero el junk técnico (importaciones muertas, bibliotecas no utilizadas, código comentado) se encuentra con herramientas.
| Categoría | Herramienta | Qué verifica |
|---|---|---|
| Dependencias no utilizadas | dependency-analysis (Gradle) | Bibliotecas no usadas en código |
| Dependencias no utilizadas | depcheck (Node.js) | Paquetes de package.json sin importaciones |
| Dependencias no utilizadas | swift package --show-dependencies | Árbol de dependencias SwiftPM |
| Importaciones muertas | IDE (Optimize Imports) | Sentencias import no utilizadas |
| Código comentado | grep -r “//” / rg “^\s*//” | Bloques de comentarios con código |
| Métodos/clases vacíos | SonarQube / CodeClimate | Métodos sin cuerpo o con cuerpo vacío |
| Bibliotecas duplicadas | Gradle lint (duplicate classes) | Conflictos de clases de diferentes bibliotecas |
Para una auditoría completa, ejecute buildHealth (Android) o depcheck (Node.js) una vez por sprint. Cree un panel en CI que muestre la tendencia de la cantidad de dependencias a través de los sprints. Si la cantidad crece pero la funcionalidad no crece proporcionalmente, el equipo está acumulando junk.
Preste atención a las clases duplicadas — un error que ocurre cuando dos bibliotecas contienen la misma clase. Esto no solo es junk sino también una fuente directa de conflictos de compilación. En Gradle, estos conflictos se resuelven mediante force o exclude, pero cada resolución es una señal de que una de las bibliotecas sobra.
La limpieza de junk no es una acción única sino un proceso regular. Sin un procedimiento, el junk regresa en dos o tres sprints. La mejor práctica es asignar entre el 10 y el 15 por ciento de la capacidad de cada sprint a la limpieza técnica, incluyendo la auditoría de junk.
El proceso consta de cuatro pasos. Primero — diagnóstico: ejecutar herramientas, obtener un informe, priorizar. Prioridad alta: dependencias con CVE conocidos y bibliotecas duplicadas. Prioridad media: importaciones muertas y código comentado. Prioridad baja: abstracciones redundantes (requieren análisis manual).
Segundo — limpieza: eliminar dependencias muertas, reemplazar bibliotecas duplicadas por una, borrar código comentado. Cada cambio debe ser un commit separado con un mensaje claro: “remove unused dependency: gson (replaced by kotlinx.serialization)”, “delete commented code in LoginViewModel.”
Tercero — verificación: compilar el proyecto, ejecutar pruebas, verificar la UI. Si las pruebas pasan después de eliminar una dependencia, la dependencia realmente era innecesaria. Si las pruebas fallan, hay una referencia oculta que el analizador estático no detectó.
Cuarto — prevención: actualizar la lista de verificación de code review, agregar una regla “sin nueva dependencia sin justificación” a la Definition of Done, configurar verificaciones automáticas en CI. La prevención es la única forma de evitar que el junk se acumule nuevamente.
Preguntas frecuentes
La deuda técnica es una solución de compromiso consciente (rápida pero de baja calidad) que se planea corregir. El junk no es una decisión consciente sino basura acumulada: dependencias extra, código comentado, abstracciones vacías que nadie planeó ni quiere mantener.
El ritmo óptimo es asignar el 10 por ciento de cada sprint a la limpieza técnica. Esto mantiene el junk bajo control sin acumular masa crítica. Si un proyecto tiene mucho junk, comience con un gran sprint de limpieza y luego cambie a un ritmo regular.
Mida y muestre los números: mida el tiempo de compilación antes y después de eliminar 3–5 dependencias extra. Una reducción de 15–30 segundos por compilación multiplicada por la cantidad de compilaciones por día da horas de tiempo ahorrado del equipo. Los números convencen mejor que los llamados abstractos a la limpieza.
Sí, especialmente si la dependencia tiene un CVE. Incluso si el proyecto es estable, una vulnerabilidad en una dependencia transitiva es un riesgo de seguridad. Además, al actualizar un SDK o lenguaje, una dependencia antigua puede volverse incompatible, y eliminarla antes de la actualización ahorrará horas de migración.
Cada TODO sin ticket es junk. Establezca una regla: el TODO se escribe solo en el formato // TODO(PROJECT-1234): fix vinculado a una tarea en el tracker. Revise los TODO regularmente y cierre aquellos que hayan perdido relevancia. Elimine los TODO vencidos — si el problema no surgió en seis meses, no es crítico.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también