Cada Reescritura Iba a Ser la Última
Reescribí el mismo componente central de mi sistema tres veces. No lo parcheé, no lo refactoricé — lo reconstruí, casi desde cero, tres veces distintas. Y cada una de esas veces estaba seguro de que esta versión era la de verdad: la arquitectura limpia y correcta sobre la que por fin construiría para siempre.
Me equivoqué tres veces seguidas, con plena confianza cada vez. Equivocarme era molesto. La plena confianza es la parte de la que en realidad quiero hablar, porque era la misma sensación repitiéndose, y ni una sola vez la reconocí como una advertencia.
”Esta vez está bien”
Hay un subidón específico que viene con una reescritura desde cero. El código viejo es un desastre — puedes ver cada concesión, cada parche, cada lugar donde la realidad te forzó a doblarte. El nuevo diseño, sentado limpio en tu cabeza, no tiene nada de eso. Es elegante. Es obvio. Es claramente mejor.
Así que derribas lo viejo y construyes lo nuevo, y por un tiempo se siente como progreso, porque el código nuevo realmente es más limpio. Luego empiezas a usarlo, y el doblarse comienza de nuevo, y un tiempo después estás de pie frente a un segundo desastre, sintiendo exactamente la misma comezón de empezar otra vez.
Por qué la reescritura siempre se ve mejor
La comparación está amañada, y me tomó tres rondas ver cómo. Cuando juzgas una reescritura, estás comparando un diseño fresco e idealizado contra uno viejo que ha pasado meses absorbiendo la fricción del uso real. Por supuesto que el nuevo se ve mejor. Todavía no se ha topado con ninguno de los problemas.
El código viejo se ve feo no solo porque fue diseñado imperfectamente, sino porque está llevando puesta su experiencia. Muchas de las ramas torpes en él son cicatrices de casos límite reales — cosas que el mundo le arrojó y que el nuevo diseño limpio simplemente nunca ha tenido que sobrevivir. No siempre estás comparando un buen diseño contra uno malo. A menudo estás comparando un veterano contra un recluta y quedando impresionado por lo poco marcado que está el recluta.
El costo que seguí pagando
Cada reescritura desechaba más que código. Desechaba conocimiento — el manejo acumulado y duramente ganado de todas las situaciones extrañas que la versión vieja había aprendido a manejar en silencio. Y como ese conocimiento vivía en el código en lugar de en mi cabeza, reconstruir significaba redescubrirlo: toparme de nuevo con los mismos casos raros, depurar de nuevo los mismos problemas, pagar una segunda y tercera vez por lecciones que ya había comprado.
Hay un tipo particular de agotamiento en arreglar un error y darte cuenta de que ya has arreglado este mismo error antes, en una versión del código que ya no existe. Eso fue gran parte de mi tercera reescritura — volver a ganar lentamente el conocimiento que había desechado en la segunda.
Lo que hay debajo: la abstracción prematura
El verdadero motor de toda esta reconstrucción era un error en cómo pensaba sobre el diseño. Seguía reescribiendo porque seguía intentando encontrar la estructura correcta antes de entender realmente el problema. Trataba la abstracción correcta como algo que podía sentarme a diseñar correctamente de antemano, con tal de ser lo bastante astuto.
En mi experiencia, las abstracciones útiles rara vez se diseñaban correctamente de antemano; se ganaban a través del uso. Vienen de convivir con el problema lo suficiente para aprender dónde se dobla de verdad — qué partes varían y cuáles permanecen fijas, dónde están las verdaderas costuras. Diseñarlo por completo con antelación es adivinar, y cada reescritura era solo yo adivinando de nuevo, un poco mejor informado, pero todavía mucho antes de haber aprendido lo suficiente para adivinar bien.
Cuándo una reescritura realmente vale la pena
No quiero afirmar que las reescrituras siempre estén mal. A veces un diseño genuinamente no puede estirarse hasta donde necesitas que llegue, y hacerlo evolucionar en su lugar costaría más que empezar de cero. La distinción que con el tiempo aprendí a trazar es sobre la fuente del impulso.
Una reescritura impulsada por un entendimiento genuinamente nuevo del problema — “ahora veo que esta cosa que trataba como un concepto en realidad son dos” — a menudo es progreso real. Una reescritura impulsada en su mayoría por la incomodidad con el código actual — “esto es feo, quiero algo limpio” — es más a menudo movimiento con una mano de pintura fresca. La primera tiene más probabilidades de producir un progreso estructural significativo. La segunda en su mayoría cambia cómo te sientes al respecto por unas semanas, hasta que la cosa nueva también se vuelve fea.
La solución: dóblalo en su lugar, hasta que de verdad no puedas
El hábito que construí fue degradar la reescritura de un primer instinto a un último recurso. Ante una estructura que me molesta, ahora intento cambiarla en su lugar primero — remodelarla, refactorizarla, dejar que conserve su conocimiento acumulado mientras la muevo hacia lo que necesito. Intento reservar una reconstrucción completa para cuando la estructura existente genuinamente pelea contra cada intento de hacerla evolucionar, no meramente cuando ofende mi sentido del orden.
Gran parte del tiempo, la incomodidad que te hace querer empezar de cero es información, no un veredicto. Es el código diciéndote dónde le duele — y eso es exactamente el conocimiento que desecharías al reconstruir desde cero.
La certeza era la señal
El hilo que recorría las tres reescrituras no era código malo. Era una sensación: la certeza limpia y total de que esta vez lo tenía bien. “Esta es la arquitectura final” era la frase que decía, en efecto, antes de cada una. Que una frase siga resultando equivocada debería bajar tu confianza en ella, y lentamente lo hizo.
La certeza fuerte sobre un diseño que aún no has sometido a prueba de estrés no es lo mismo que la perspicacia. A menudo es solo la ausencia de las cicatrices que te habrían enseñado lo contrario — la confianza cómoda de un plan que aún no se ha topado con el mundo. En estos días, cuando me siento completamente seguro de que un nuevo diseño es el final, intento tratar la sensación en sí como una pista de que tal vez no he convivido con el problema lo suficiente para que se me confíe esa opinión.
— Sin señales, sin retornos, esto no es asesoramiento de inversión.