TODO en realidad no es algo "para resolver"
(sophiebits.com)- Algunos equipos usan políticas como registrar todos los comentarios TODO en el bug tracker o borrar automáticamente los TODO con más de un año, pero no se recomienda esta práctica
- Los comentarios TODO no son necesariamente cosas que solo tienen valor si se completan, sino que funcionan como una instantánea mental que deja el contexto y las ideas del momento en que se escribió el código
- Los TODO importantes deberían gestionarse como issues, pero la mayoría son notas de baja prioridad o apuntes sobre edge cases
- Un TODO bien ubicado le da al futuro lector del código pistas para entender la intención del autor de ese momento cuando se pregunta "¿está bien refactorizar esta parte?"
- El valor de un TODO no está en si se completa o no, sino en registrar contexto, intención y posibilidades para ayudar al mantenimiento y la colaboración en el futuro
Comentarios TODO: ¿de verdad hay que resolverlos?
- En algunas organizaciones se aplican reglas como registrar todos los TODO del código en el bug tracker o borrarlos automáticamente después de cierto tiempo (más de un año)
- Sin embargo, este enfoque es en realidad ineficiente y pierde de vista la esencia de un TODO: no adquiere valor solo cuando se resuelve
El verdadero valor de TODO
-
Por ejemplo, un comentario como
// TODO: 다음 주 출시 전에 이 파일의 뒷부분을 완성해야 함sí podría necesitar seguimiento real
-
Pero un buen TODO suele servir, más bien, para registrar edge cases o dejar ideas de mejora estructural que no se pudieron abordar en ese momento, situaciones omitidas, etc., junto con su contexto, como en
// TODO: 사용자가 이 버튼을 트리플 클릭할 경우, 핸들러에서 \[xyz] 오류 발생
TODO no es un "plan", sino un "canal"
- La mayoría de los TODO en realidad son de baja prioridad y no necesitan resolverse de inmediato
- Cumplen la función de transmitir al futuro lector del código las dudas, criterios y contexto del autor en el momento de escribirlo
- Cuando alguien lea ese código más adelante y se pregunte "¿se puede cambiar la estructura aquí?", el TODO ayuda a entender la intención original del autor
Efectos de un TODO bien escrito
- Los TODO dentro del código a veces ofrecen pistas importantes sobre posibles problemas, oportunidades de mejora estructural o edge cases no resueltos
- Aunque no sean necesariamente un plan para solucionar algo, cumplen un papel clave al transmitir contexto sutil en la colaboración y el mantenimiento
- Al final, los comentarios TODO funcionan como un valioso registro que mejora la comprensión del código y su futura mantenibilidad
Conclusión
- Un TODO no tiene valor solo si se completa; también funciona como un canal de comunicación que deja los pensamientos, la intención y el contexto del autor para los futuros lectores del código
1 comentarios
Opiniones en Hacker News
TODOsiempre debería estar vinculado a un issue concreto"Creo que hay tres formas de resolver un
TODOantes del merge1. Dejar un issue: si realmente es algo que hay que hacer, conviene invertir unos 20 segundos en registrarlo y darle seguimiento
2. Resolverlo de una vez: si es algo demasiado pequeño como para convertirlo en issue, se arregla antes del commit
3. Convertirlo en comentario: si no vale la pena corregirlo ni hace falta rastrearlo, pero quieres recordarlo, recomiendo dejarlo como comentario normal en el código
Si te importa la salud del proyecto, conviene tener el hábito de rastrear los
TODO, como quien come brócoli por saludUn issue registrado en un sistema externo puede no ser visible para quienes tocan esa parte del código
Si te parece un desperdicio el costo de rastrear cosas sencillas que se podrían arreglar fácil, entonces es más eficiente dejarlas como
TODOLos
TODOdentro del código se ven de inmediato al trabajar en esa parte, y también se pueden borrar fácilmente durante un refactorPero da pena que no haya explicado con claridad la diferencia entre un comentario
TODOy un comentario normalEl término
TODOen sí tiene mucha fuerza visual, así que deja claro de inmediato qué tipo de comentario esMe genera cierta duda eso de sostener que no hace falta interpretar
TODOliteralmente como “por hacer”En general estoy de acuerdo con el artículo, pero creo que sería mejor dejarlo simplemente como comentario normal
TODOSi además lo subes a un sistema de tickets, toma mucho más de 20 segundos y, en vez de ayudar, termina generando distracción
TODOdebe incluir obligatoriamente un número de ticket// TODO: improve the routing https://jira.com/whatever/TIX-1234
La razón es que, si el comentario queda huérfano, nadie sabe por qué se dejó ahí
Si dejas solo el comentario, después alguien olvidará su propósito y contexto
Por eso creo que siempre hay que crear un ticket o resolverlo de inmediato
grepFIXME: algo claramente incorrecto o roto, máxima prioridadXXX: algo feo de ver o con suposiciones incorrectas, prioridad altaTODO: algo donde algún día habrá que implementar un enfoque/categoría/rama completamente nuevosNOTE: para transmitir información más importante que un comentario simpleYo trabajo sobre todo en motores de código legacy o sin mantenimiento, y aquí “el código es la verdad”, así que no creo JIRA, sino que voy leyendo y corrigiendo sobre la marcha
TODO: trabajo imprescindible antes del release, algo obligatorio. Si no entra en eso, debería pasar a otra categoría. Bloquea el releaseFUTURE: algo que algún día podría convertirse enTODO, normalmente opcional, como diseño estructuralMAYDO: estaría bien tenerlo, pero no pasa nada si no estáPERF: convendría hacerlo cuando haga falta más rendimientoY además uso etiquetas semánticas relacionadas con el dominio
Mi opinión es que
TODOno es un code smell, sino algo que se acumula naturalmente en partes centrales del codebaseXXXcomo nota personal de “esto hay que arreglarlo antes del siguiente PR”Si quiero ponerme serio, configuro el CI para que rechace cualquier código que contenga esa cadena
En ese sentido, para mí
XXXtiene la prioridad más altaFIXME, y también cualquierTODOsin ticket de issueOrdenándolo por prioridad hacia abajo
FIXME: para mantener el enfoque. Tiene que resolverse antes del merge o antes de que el código se considere terminadoXXX: hay que corregirlo pronto. Funciona por ahora, pero debe arreglarse en poco tiempoTODO: hay que volver a revisarlo después. El código se puede usar perfectamente. Tiene menos prioridad queXXXNOTE: explica rarezas o cosas que conviene saber para ayudar a quien trabaje despuésasserten vez deFIXMEUso
TODOpara dejar posibles tareas como refactors, mejoras de rendimiento o de claridadUso
NOTEpara dejar contexto histórico o líneas de pensamiento que no se entienden fácilmente a simple vistaSi además asumes que se trabaja en equipo, todavía más
Eso no significa que diga que no tengan valor; más bien creo que hacen falta o deberían crearse herramientas para esto
Este tipo de deuda técnica o code smells en realidad debería rastrearse, registrarse y explicarse mejor, pero si propones hacer algo que baja la productividad, como usar JIRA, al final la gente deja de registrar cualquier cosa
Al menos si hay un
TODOdentro del código, queda en algún lugarY un
TODOsí tiene significado porque también es literalmente algo “por hacer”TODOde muchas personas pueden mezclarse y volverse caóticos, pero para proyectos personales es una buena solución de compromiso“Sé que podría hacerse mejor, pero no voy a interrumpir mi flujo a propósito por eso. No rompe la funcionalidad; simplemente estaría un poco mejor si se hiciera.”
Cuando el resaltado de
TODOreaparece en el editor, a veces ayuda para resolver uno rápidamentePero la mayoría de los
TODOse quedan para siempre, o en la práctica casi nunca se resuelvenTODOporque quiero dejar una señal en el código de que hay algo pendiente por tratarAunque lo registres en JIRA, GH Issues, etc., al final ese registro tiene que estar conectado
Y si solo dejas una referencia, puede perder el significado con el tiempo, así que el comentario también debería incluir una explicación
Muchos commits en realidad no transmiten bien su contenido
En vez de seguir dejando
TODOcomo antes, preferiría que se promoviera usar mejores herramientasMucha gente hace commits con muy poca frecuencia y mete varios trabajos distintos en uno solo
Además, los mensajes de commit muchas veces son cosas sin sentido como
updating somefile.pyTODOEn mi codebase,
TODOse usa tal como se describe aquíTODOsirve para documentar la implementación, especialmente las partes faltantes; no implica necesariamente que haya que resolverloA mí me parece que dejar una lista real de tareas dentro del código no tiene mucho sentido. Las prioridades cambian constantemente: algo pudo ser importante cuando se escribió, pero luego ya no, y también pueden aparecer problemas no previstos que terminen siendo más urgentes
No puedes estar levantando PRs continuamente solo para actualizar comentarios
TODOSi quieres anotar tareas, es mejor gestionarlas fuera del código, en un issue tracker o en un documento de texto fácil de actualizar
Justo ahora dejé un
#TODOpara registrar una situación excepcional que ocurre extremadamente raro. En dos años no ha pasado ni una sola vez, pero me ayuda por si luego me pregunto por qué no manejé esa parteEntiendo a quienes dicen que cosas así a veces deberían quedarse como comentarios normales. Depende del tipo de codebase, y en un entorno como el mío, de equipo de dos personas, el enfoque de
TODOfunciona bien// TBD: [...]para ese propósito. Era un truco para que la gente obsesionada con losTODOno se diera cuentaNo planeas arreglarlos realmente, pero quizá cuando tengas tiempo más adelante quieras buscarlos con un
ctrl-Fpara ver si vale la pena limpiar algoMe parece irracional que demasiadas herramientas o procesos consideren
TODOcomo un code smellPara mí es solo una cuestión de prioridades y, al final, lo veo como una “ventana rota” (la famosa metáfora de The Pragmatic Programmer)
Si de verdad decidiste no arreglarlo, es mejor registrarlo en la documentación del software
Por ejemplo, si solo pones
// If the user triple-clicks this button, the click handler errors because [xyz]
así nada más, no queda claro si eso es un bug o si era la intención original
TODOes una señal simple de “aquí hay algo imperfecto, tenlo en cuenta cuando trabajes en esto”Si de verdad es algo que debe resolverse, entonces sí corresponde rastrearlo en otro lugar
Pero creo que si reduces demasiado los
TODO, lo único que logras es aumentar el código sin documentarTODOespecialmente buenoEn el tiempo que tardas en escribir eso, mejor arreglas el bug de una vez o dejas un comentario como “el triple clic se ignora por [xyz]”
Si ya identificaste el disparador y la causa, yo diría que el 80% del trabajo ya está hecho
El problema es cuando se asume que el código funciona perfectamente aunque no sea así
El mejor
TODOque he visto decía algo comoTODO: encrypt thisen código de seguridad, dejando clarísimo que eso todavía no estaba cifradoGracias a eso, cualquiera podía notar rápido que el código no estaba cifrando, y también se reducía la duda de si tal vez el cifrado se estaba manejando aparte por modularidad o si había que preocuparse por cifrar dos veces
FIXMEque aTODOClaramente es un error, pero no parece que haya demasiada urgencia por atenderlo
Si no lo vas a registrar como bug o no vas a trabajarlo de verdad, preferiría que no dejaras un
TODO// TODO: If the user triple-clicks this button, the click handler errors because [xyz]
Eso solo registra el fenómeno observado. Lo correcto sería quitar la palabra
TODOFIXMElo uso cuando de verdad hay que arreglar algo o cuando ya tengo clarísimo cuál es el siguiente pasoTODOlo uso para ideas más vagas, o simplemente para sacarlas de mi cabeza y poder concentrarme en lo siguientePuede ser porque la idea todavía no madura, porque no estoy seguro de que realmente haga falta, o porque estoy esperando algo relacionado, entre muchas otras situaciones
Si no lo anoto, me sigue rondando en la cabeza y me distrae; con escribirlo como
TODOo como sea, psicológicamente me siento mucho más liberadoOjalá uno pudiera escribir código tan claro que se entendiera de inmediato sin comentarios
Aun así, si queda tan confuso que ni yo mismo lo entendería después, no queda otra que comentar
Lo triste es que, si luego alguien modifica el código y no actualiza el comentario, termina generando todavía más confusión
Creo que los
TODOno deberían existir en código ya committed; deberían gestionarse en el proyecto o en el sistema de seguimiento de issues correspondiente