Lo sentimos, esto va a ser largo, pero se basa en la experiencia personal como arquitecto y desarrollador en múltiples proyectos de reescritura.
Las siguientes condiciones deberían hacer que considere algún tipo de reescritura. Hablaré sobre cómo decidir cuál hacer después de eso.
- El tiempo de aceleración del desarrollador es muy alto. Si se necesita más tiempo que por debajo (por nivel de experiencia) para aumentar un nuevo desarrollador, entonces el sistema debe ser rediseñado. Por tiempo de aceleración, me refiero a la cantidad de tiempo antes de que el nuevo desarrollador esté listo para realizar su primer compromiso (en una función pequeña)
- Recién salido de la universidad - 1.5 meses
- Todavía verde, pero he trabajado en otros proyectos antes - 1 mes
- Nivel medio - 2 semanas
- Experimentado - 1 semana
- Nivel sénior - 1 día
- La implementación no se puede automatizar debido a la complejidad de la arquitectura existente.
- Incluso las correcciones de errores simples toman demasiado tiempo debido a la complejidad del código existente
- Las nuevas funciones tardan demasiado y cuestan demasiado debido a la interdependencia de la base de código (las nuevas funciones no pueden aislarse y, por lo tanto, afectan las funciones existentes)
- El ciclo de prueba formal lleva demasiado tiempo debido a la interdependencia de la base de código existente.
- Se ejecutan demasiados casos de uso en muy pocas pantallas. Esto causa problemas de capacitación para los usuarios y desarrolladores.
- La tecnología que tiene el sistema actual lo exige
- Los desarrolladores de calidad con experiencia en la tecnología son demasiado difíciles de encontrar.
- Está en desuso (no se puede actualizar para admitir plataformas / características más nuevas)
- Simplemente hay una tecnología de nivel superior mucho más expresiva disponible
- El costo de mantener la infraestructura de la tecnología anterior es demasiado alto.
Estas cosas son bastante evidentes. Cuándo decidir sobre una reescritura completa versus una reconstrucción incremental es más subjetivo y, por lo tanto, tiene más carga política. Lo que puedo decir con convicción es que afirmar categóricamente que nunca es una buena idea está mal.
Si un sistema puede rediseñarse de forma incremental y tiene el pleno apoyo del patrocinio del proyecto para tal cosa, entonces debe hacerlo. Aquí está el problema, sin embargo. Muchos sistemas no pueden ser rediseñados de forma incremental. Estas son algunas de las razones que he encontrado para evitar esto (tanto técnico como político).
- Técnico
- El acoplamiento de componentes es tan alto que los cambios en un solo componente no pueden aislarse de otros componentes. Un rediseño de un solo componente da como resultado una cascada de cambios no solo en los componentes adyacentes, sino indirectamente en todos los componentes.
- La pila de tecnología es tan complicada que el diseño de estado futuro requiere múltiples cambios de infraestructura. Esto también sería necesario en una reescritura completa, pero si se requiere en un rediseño incremental, entonces pierde esa ventaja.
- Rediseñar un componente da como resultado una reescritura completa de ese componente de todos modos, porque el diseño existente es tan fubar que no hay nada que valga la pena guardar. Nuevamente, pierde la ventaja si este es el caso.
- Político
- No se puede hacer que los patrocinadores comprendan que un rediseño incremental requiere un compromiso a largo plazo con el proyecto. Inevitablemente, la mayoría de las organizaciones pierden el apetito por el drenaje continuo del presupuesto que crea un rediseño incremental. Esta pérdida de apetito también es inevitable para una reescritura, pero los patrocinadores estarán más inclinados a continuar, porque no quieren dividirse entre un sistema nuevo parcialmente completo y un sistema antiguo parcialmente obsoleto.
- Los usuarios del sistema están demasiado apegados a sus "pantallas actuales". Si este es el caso, no tendrá la licencia para mejorar una parte vital del sistema (el front-end). Un rediseño le permite evitar este problema, ya que están comenzando con algo nuevo. Todavía insistirán en obtener "las mismas pantallas", pero tienes un poco más de munición para hacer retroceder.
Tenga en cuenta que el costo total de rediseñar de forma incremental siempre es mayor que hacer una reescritura completa, pero el impacto para la organización suele ser menor. En mi opinión, si puede justificar una reescritura y tiene desarrolladores superestrellas, hágalo.
Solo hágalo si puede estar seguro de que existe la voluntad política de completarlo. Esto significa la aceptación tanto del ejecutivo como del usuario final. Sin ella, fracasarás. Supongo que es por eso que Joel dice que es una mala idea. La aceptación de ejecutivos y usuarios finales parece un unicornio de dos cabezas para muchos arquitectos. Tienes que venderlo agresivamente y hacer campaña para que continúe continuamente hasta que se complete. Eso es difícil, y estás hablando de apostar tu reputación en algo que algunos no querrán ver tener éxito.
Algunas estrategias para el éxito:
- Sin embargo, si lo hace , no intente convertir el código existente. Diseñe el sistema desde cero. De lo contrario, estás perdiendo el tiempo. Nunca he visto ni oído hablar de un proyecto de "conversión" que no haya terminado miserablemente.
- Migre los usuarios al nuevo sistema un equipo a la vez. Identifique los equipos que tienen el MÁS DOLOR con el sistema existente y migre primero. Permítales difundir las buenas noticias de boca en boca. De esta manera, su nuevo sistema se venderá desde adentro.
- Diseñe su marco como lo necesite. No comience con un marco de trabajo que he pasado 6 meses construyendo este marco que nunca ha visto código real.
- Mantenga su pila de tecnología lo más pequeña posible. No sobre diseño. Puede agregar tecnologías según sea necesario, pero eliminarlas es difícil. Además, cuantas más capas tenga, más trabajo les costará a los desarrolladores hacer cosas. No lo dificultes desde el primer momento.
- Involucre a los usuarios directamente en el proceso de diseño, pero no permita que dicten cómo hacerlo. Gana su confianza mostrándoles que puedes darles lo que quieren mejor si sigues buenos principios de diseño.