El precio real de introducir una solución rápida es que cuando alguien más necesita introducir una segunda solución rápida, la presentará basándose en su propia solución rápida. Por lo tanto, cuanto más tiempo esté implementado una solución rápida, más arraigada se volverá. Muy a menudo, un truco toma solo un poco más de tiempo que hacer las cosas bien, hasta que te encuentras con un segundo truco que se basa en el primero.
Entonces, obviamente, a veces es (o parece ser) necesario introducir una solución rápida.
Una posible solución, asumiendo que su control de versiones lo admite, es introducir una bifurcación desde la fuente cada vez que realice un truco de este tipo. Si se anima a las personas a evitar codificar nuevas funciones dentro de estas bifurcaciones especiales de "hazlo listo", eventualmente será más trabajo integrar las nuevas funciones con la bifurcación que deshacerse del truco. Sin embargo, es más probable que se descarte la bifurcación "buena". Y si está lo suficientemente lejos del lanzamiento como para que hacer una bifurcación de este tipo no sea práctico (porque no vale la pena hacer la integración dual mencionada anteriormente), entonces probablemente ni siquiera debería usar un truco de todos modos.
Un enfoque muy idealista.
Una solución más realista es mantener su programa segmentado en tantos componentes ortogonales como sea posible y ocasionalmente hacer una reescritura completa de algunos de los componentes.
Una mejor pregunta es por qué la solución hacky es mala. Si es malo porque reduce la flexibilidad, ignórelo hasta que necesite flexibilidad. Si es malo porque afecta el comportamiento del programa, ignórelo y eventualmente se convertirá en una corrección de errores y se abordará. Si es malo porque se ve feo, ignórelo, siempre que el truco esté localizado.