En un par de meses, un colega se mudará a un nuevo proyecto y yo heredaré uno de sus proyectos. Para prepararme, ya he ordenado a Michael Feathers ' Working Effectively with Legacy Code' .
Pero estos libros, así como la mayoría de las preguntas sobre código heredado que encontré hasta ahora, están relacionadas con el caso de heredar código tal como está. Pero en este caso, realmente tengo acceso al desarrollador original y tenemos algo de tiempo para una entrega ordenada.
Algunos antecedentes sobre el fragmento de código que heredaré:
- Está funcionando: no hay errores conocidos, pero a medida que los requisitos de rendimiento sigan aumentando, algunas optimizaciones serán necesarias en un futuro no muy lejano.
- Sin documentar : hay prácticamente cero documentación a nivel de método y clase. Sin embargo, lo que se supone que debe hacer el código en un nivel superior se entiende bien, porque he estado escribiendo en contra de su API (como recuadro negro) durante años.
- Solo pruebas de integración de nivel superior: solo hay pruebas de integración que prueban la interacción adecuada con otros componentes a través de la API (nuevamente, recuadro negro).
- Nivel muy bajo, optimizado para la velocidad: debido a que este código es central para todo un sistema de aplicaciones, gran parte de él se ha optimizado varias veces a lo largo de los años y es de nivel extremadamente bajo (una parte tiene su propio administrador de memoria para ciertas estructuras) /archivos).
- Simultáneo y sin bloqueo: si bien estoy muy familiarizado con la programación concurrente y sin bloqueo y he contribuido algunas piezas a este código, esto agrega otra capa de complejidad.
- Base de código grande: este proyecto en particular tiene más de diez mil líneas de código, por lo que no hay forma de que me expliquen todo.
- Escrito en Delphi: solo voy a presentar esto, aunque no creo que el idioma esté relacionado con la pregunta, ya que creo que este tipo de problema es independiente del idioma.
Me preguntaba cómo pasaría el tiempo hasta su partida. Aquí hay un par de ideas:
- Obtener todo para construir en mi máquina: aunque todo se debe verificar en el control del código fuente, quién no se ha olvidado de registrar un archivo de vez en cuando, por lo que probablemente este sea el primer orden del día.
- Más pruebas: si bien me gustaría realizar más pruebas unitarias a nivel de clase para que cuando realice cambios, cualquier error que presente pueda detectarse desde el principio, el código tal como está ahora no es comprobable (clases enormes, métodos largos, demasiados dependencias mutuas).
- Qué documentar: Creo que, para empezar, sería mejor centrar la documentación en aquellas áreas del código que de otro modo serían difíciles de entender, por ejemplo, debido a su naturaleza de bajo nivel / altamente optimizada. Me temo que hay un par de cosas allí que pueden parecer feas y que necesitan una refactorización / reescritura, pero en realidad son optimizaciones que han estado ahí por una buena razón que podría extrañar (cf. Joel Spolsky, Cosas que deberías Nunca lo hagas, parte I )
- Cómo documentar: Creo que algunos diagramas de clase de la arquitectura y diagramas de secuencia de funciones críticas acompañadas de algo de prosa sería lo mejor.
- A quién documentar: Me preguntaba qué sería mejor, que él escribiera la documentación o que me la explicara, para que yo pueda escribir la documentación. Me temo que las cosas que son obvias para él, pero no para mí, no estarían cubiertas adecuadamente.
- Refactorización mediante programación de pares: es posible que esto no sea posible debido a limitaciones de tiempo, pero tal vez podría refactorizar parte de su código para que sea más fácil de mantener mientras todavía estaba cerca para proporcionar información sobre por qué las cosas son como son.
Por favor comente y agregue a esto. Como no hay suficiente tiempo para hacer todo esto, estoy particularmente interesado en cómo priorizarías.
Actualización: a medida que finaliza el proyecto de entrega, he ampliado esta lista con mis propias experiencias en esta respuesta a continuación .