Consejo: Cómo convencer a mi líder de equipo recientemente ungido para que no escriba la base del código desde cero

8

Trabajo en una MNC bastante reconocida, y el módulo en el que trabajo ha sido asignado a un nuevo "líder". La base del código es bastante grande (~ 130K o más, con interdependencias en otros módulos), pero estable: algunas partes se han vuelto feas a lo largo de los años, pero es probable que funcione. (Nuestros productos llevan años funcionando, incluso nuevos). El problema es que nuestro líder quiere reescribir el código desde cero , para abarcar "una granularidad más fina y un diseño proactivo".

Sé en mis entrañas que no es una muy buena idea, pero ¿cómo puedo convencerlo a él / al resto del equipo (que son mucho más altos que yo en términos de años de experiencia), sin sonar demasiado pedante (No deberías ser demasiado pedante) reescribir, ya que Joel et al tienen artículos claros que lo prohíben)?

¡Tengo una buena relación de trabajo con la persona en cuestión, y no quiero arruinarla, pero tampoco quiero ser parte en una decisión que seguramente nos afectará en los próximos años ! ¿Alguna sugerencia para un enfoque más suave pero efectivo? ¡Incluso los relatos de cómo has abordado tal situación a tu gusto me ayudarían mucho!

EDITAR: La base de código de la que estoy hablando no es un producto / GUI, sino a nivel de núcleo con todas las funcionalidades críticas para nuestro producto. ¡Espero que ahora sepas por qué sueno tan aprensivo!

TCSGrad
fuente
solo para asegurarse, antes de darle este tipo de consejo ... ¿Está haciendo un montón de trabajo de evolución / mantenimiento en este código (y termina pasando mucho tiempo arreglando errores de regresión)? ¿Necesita agregar una nueva funcionalidad pero no puede porque necesitaría tocar las partes "feas" de su código? Creo que reescribir NO es SIEMPRE una mala idea ...
@paolo - no, la base de código funciona bien (desearía poder nombrar nuestros productos, probablemente lo estés usando :)). Hay errores para algunos clientes, pero no hay hacks importantes en el código (¡excepto cuando tenemos que ocultar los defectos de HW!)
TCSGrad
1
Hay muchos pros y contras en c2.com/cgi/wiki?RewriteCodeFromScratch
k3b
130k de código de kernel como es, con los controladores de granularidad fina y diseño proactivo. ¿Es suficientemente desafiante o casi imposible implementar / interconectar nuevos dispositivos o protocolos? ¿El resultado de los cambios previstos lo haría mucho más fácil para los clientes / usuarios intermedios?
JustinC
Los clientes no sentirán nada: las interfaces son bastante simples y lo suficientemente robustas. Como había determinado, la intención era reducir la "complejidad de lectura del código". En mi humilde opinión, esa es una vista bastante subjetiva ... si reescribe todo el código desde cero, por supuesto, sería más fácil de leer, ¡pero qué pasa con los nuevos ingenieros, que tendrían que leer ambos de todos modos!
TCSGrad

Respuestas:

8

Hagan las matemáticas con él juntos:

Del lado de la deuda:

  • cuánto tiempo llevará recrear las funciones que tiene en este momento. ¿Cuánto cuesta eso (desarrolladores + gastos generales)

  • ¿cuánto perderá la compañía por no poder implementar nuevas funciones / correcciones de errores o solo a un ritmo mucho más lento?

  • ¿Cuál es el riesgo de no poder completar la reescritura y recurrir a la base fuente actual después de n meses? Incluyendo el riesgo de matar el producto todos juntos.

  • ¿Cuánto tiempo pasará hasta que la nueva base de código se vea tan fea como la actual?

En el lado del activo:

  • cuánto mejor será el código después de la reescritura (medido en costos de mantenimiento ahorrados por mes)

Súmelo todo, posiblemente haciendo una comparación del mejor / peor de los casos.

Al final tendrás una respuesta. Si ignora la respuesta, hable con su jefe.

Jens Schauder
fuente
Gran enumeracion !! ¡Los agregaría a mis notas de la reunión!
TCSGrad
3
Pensarías que este era el camino a seguir, pero es una locura cómo sobreestimarás el tiempo que lleva poner nuevas funciones en la antigua base de código y al mismo tiempo subestimes el tiempo que llevará obtener el "nuevo "código base hasta la lista de características de la antigua.
Wheaties
Grandes puntos Sería bueno obtener realmente estas estimaciones de todos los desarrolladores involucrados Para que cada uno tenga una idea clara.
Aditya P
@wheaties Eso, por supuesto, es un problema con cada estimación. La forma de combatir eso es repetir la estimación con frecuencia y compararla con el progreso real. (Think Product Burn Down)
Jens Schauder
Con bastante frecuencia, el "activo" del nuevo código no es mejor que el que reemplazó, especialmente después de algunas iteraciones de mejora y mantenimiento. En mi humilde opinión, las reescrituras totales nunca son la mejor idea.
gbjbaanb
13

Obligatorio: Cosas que nunca debes hacer, Parte 1 (Lo has visto, pero en caso de que alguien encuentre esta pregunta y no la haya visto).

Reescribir desde cero es muy tentador para los desarrolladores. Nadie quiere trabajar en código heredado, todos quieren escribir código nuevo y sexy. Pero al final del día, se trata de lo que es mejor para el negocio. ¿Por qué se necesita una reescritura? ¿Pueden presentar ese caso de una manera clara que demuestre un valor agregado para el negocio?

No debería tener que convencerlos de que no gasten recursos. Deberían tener que convencer a la empresa para que gaste recursos.

David
fuente
Me encanta ese artículo Odio reescribir cosas!
Mark Canlas
3
@ Mark Canlas: En realidad es un poco divertido, porque a menudo soy un defensor de la reescritura. Odio el código heredado :) Pero también entiendo que si no puedo demostrar un valor agregado al negocio, la reescritura no debería suceder. Mi opinión debe estar respaldada por números.
David
2
También odio el código heredado, pero desde que leí ese artículo, aprendí a valorar los barcos en funcionamiento en lugar de los teóricos. Un barco roto y en marcha genera más dinero por hora que uno hipotético escrito con una servilleta. ¡Es un acto de equilibrio!
Mark Canlas
1
@ Mark Canlas: Absolutamente. Y ahí es donde muchos desarrolladores (incluso los más experimentados en muchos casos) pierden su control sobre el negocio en general. Tiene que tener un valor tangible real para el negocio, y muy a menudo el producto existente tiene ese valor. Aunque un argumento que siempre odio del negocio es "ya gastamos dinero en esto, por lo que debemos usarlo". A veces, como en el caso de mi último trabajo, una decisión como esa los lleva al suelo. No es "reescribir siempre" ni "nunca reescribir". Como dijiste ... equilibrio.
David
8

¿Cuán bien cubre su enfoque de prueba la base del código? ¿Qué hay de las pruebas unitarias?

Si ya no está allí, sugiera que cualquier código solo se reescriba una sección a la vez y que cualquier sección en reescritura tenga una cobertura de código de prueba de unidad casi completa (90% +). Una vez que haga esto, habrá definido una parte del código que está bien definido (podríamos probarlo) y también tiene una interfaz conocida.

En ese punto, reescribir ese código es un riesgo mucho menor. Los errores deben ser detectados por las pruebas unitarias / otras pruebas, y suponiendo que también tenga el control de la fuente puede revertirse fácilmente.

Tomar la reescritura en fragmentos más pequeños también les permite a usted y a su equipo tener una idea más precisa de una reescritura completa. ¿Ambos saben en lo que se están metiendo? ¿Uno de ustedes es demasiado pesimista / optomista?

Chris Pitman
fuente
130k de código de kernel como es, con los controladores de granularidad fina y diseño proactivo. ¿Es suficientemente desafiante o casi imposible implementar / interconectar nuevos dispositivos o protocolos?
JustinC
2

Hay algunos factores relevantes a considerar:

  • El hecho de que funcione de la manera que los usuarios desean es una indicación para refactorizar en lugar de reescribir
  • Si tiene pruebas unitarias, definitivamente refactorice en lugar de reescribir. Si no lo hace, eso nivela el esfuerzo entre refactorizar y reescribir (suponiendo que su objetivo sea tener pruebas unitarias para el sistema resultante). Si no tiene pruebas unitarias, y todo el código está en la capa GUI, podría ser más rápido reescribir, especialmente si la funcionalidad está mayormente rota de todos modos. Esa es mi experiencia.
  • Si su objetivo es cambiar completamente las plataformas (código no administrado -> .NET o Windows -> Linux o PHP -> python, etc.), ese es un argumento obvio en apoyo de la reescritura.
Scott Whitlock
fuente
No, no tenemos pruebas unitarias.
TCSGrad
Es poco probable que el nuevo lo tenga también, ya que ve la cantidad de trabajo que ya implica. Además, la base de código de la que estoy hablando no es un producto / GUI, sino a nivel del núcleo con una funcionalidad crítica para nuestro producto. ¡Espero que ahora sepas por qué sueno tan aprensivo!
TCSGrad
1
@ shan23: ¿por qué comenzaría una reescritura y no mantendría al menos un conjunto de pruebas de aceptación? Simplemente terminarás creando el mismo desastre. ¡El hecho de que no tenga una GUI hace que sea mucho más fácil de probar!
Scott Whitlock
0

Solo di no." Sea convincente, pero esté dispuesto a decir "No solo está equivocado acerca de sus beneficios, sino que está equivocado porque es un desperdicio de esfuerzo humano".

Andy Finkenstadt
fuente
0

¿Dónde está el caso de negocios para una reescritura? Tiene una base de código que satisface una necesidad. Por supuesto, puede que no sea perfecto, pero representa una inversión sustancial en términos de tiempo y recursos. El único momento en que se justifica una reescritura completa es cuando la calidad del código es tan mala que está causando que la organización pierda dinero u oportunidades comerciales. Uno debe recordar el viejo adagio, si no está roto, ¡no lo arregles!

bit-twiddler
fuente
Tengo que darle un voto negativo porque ese dicho es lo peor de nuestra industria; fomenta la holgazanería, la incompetencia y el comportamiento perezoso en los desarrolladores porque nadie tiene la capacidad de abordar un problema adecuadamente porque "funciona" de alguna manera.
Wayne Molina
@WayneM: la opción "reescribir" es la peor, a menudo se debe al ego y la incompetencia entre los desarrolladores que no pueden trabajar con el código existente. Quieren reescribir es algo nuevo y genial, y terminan cometiendo peores errores en su actitud equivocada que son mucho mejores que los muchachos que hicieron las últimas cosas. Solo cuando el código antiguo ha evolucionado durante mucho tiempo (o fue una mierda para empezar), debe volver a escribir, e incluso entonces debe considerarse primero una refactorización seria.
gbjbaanb
0

Compre tantos pantalones cortos en la acción como sea posible. Si la gerencia acepta suicidarse, al menos debería ganar algo de dinero. Después de todo, pronto estarás en la calle después del tanque.

SnoopDougieDoug
fuente