1. ¿Qué es el código legado?
1.1. Definiciones.
1.2. Valor en el código legado.
1.3. El código legado como problema de negocio.
1.4. El coste humano del código legado.
1.5. El código legado puede ser beneficioso para nuestra carrera.
2. Priorización de deuda técnica.
2.1. Deuda técnica.
--- 2.1.1. Metáfora original, definición inclusiva y clasificaciones.
--- 2.1.2. Costes: principal, interés recurrente e interés acumulado.
--- 2.1.3. Línea de vida de la deuda técnica.
2.2. Priorización.
--- 2.2.1. Inspección contínua.
--- 2.2.2. Contingencia de la deuda técnica.
--- 2.2.3. Análisis de comportamiento de código.
--- 2.2.4. Análisis de Hotspots.
--- 2.2.5. Product Hurricane Maps.
--- 2.2.6. Análisis de Change Coupling y dependencias implícitas.
--- 2.2.7. Análisis de Sum of Coupling (SoC).
--- 2.2.8. Combinando análisis: Hotspots, Change Coupling y SoC.
3. Evolucionando código legado: técnicas.
--- 3.1. Metáfora original, definición inclusiva y clasificaciones.
--- 3.1.1. Valor en el código legado: comportamiento.
--- 3.1.2. Tipos de cambios.
--- 3.1.3. Protegiendo el comportamiento.
--- 3.1.4. Cubrir y Modificar.
--- 3.1.5. Problemas de testeabilidad <=> Mal diseño.
4. Introducir tests en código no testeable.
4.1. Dependencias problemáticas.
4.2. Técnicas de rotura de dependencias.
--- 4.2.1. Razones.
--- 4.2.2. Modelo de costuras.
--- 4.2.3. Costuras de objetos.
--- 4.2.4. Técnicas básicas.
--- 4.2.5. Técnicas para dependencias estáticas y Singletons.
--- 4.2.6. Atajos.
5. Estrategias de testing en código legado.
5.1. Tipos de tests.
5.2. Ventajas y desventajas de cada tipo de test.
5.3. Distribución de tests: objetivos, trade offs y alternativas.
5.4. ¿Pirámide de testing en código legado?
5.5. Estrategia propuesta.
6. Tests de caracterización.
6.1. Caracterizando código legado.
6.2. Structural Testing.
--- 6.2.1. Uso de herramientas de cobertura.
--- 6.2.2. Heurísticas y criterios para seleccionar inputs relevantes.
--- 6.2.3. Criterios de cobertura.
--- 6.2.4. Análisis de valores de frontera.
6.3. Mutation Testing: concepto, herramientas y uso práctico.
7. Encontrando puntos de testeo.
7.1. Análisis de la propagación de los efectos de un cambio.
7.2. Puntos desde los que testear.
--- 7.2.1. Interception points.
--- 7.2.2. Pinch points.
7.3. Distancia desde la que testear y scope de los tests.
8. Otras maneras de caracterizar código legado.
8.1. Golden Master + Sampling.
8.2. Approval Testing.
--- 8.2.1. Combinatorics & Approval Testing.
9. Relación entre falta de cohesión y dificultad de testeo.
9.1. Análisis de diferentes casos.
--- 9.1.1. Código cohesivo.
--- 9.1.2. Falta de cohesión por divergent change (hotspots).
--- 9.1.3. Falta de cohesión por shotgun surgery (change coupling).
10. Haciendo cambios: TDD en código legado.
11. Haciendo cambios: Atajos cuando no hay tiempo de cubrir y modificar.
11.1. Sprouting.
11.2. Wrapping.
12. Reescrituras incrementales.
12.1. ¿Por qué reescrituras incrementales?.
12.2. Branch By Abstraction.
12.3. Strangler Fig Application.
12.4. Testeando reescrituras en producción con experimentos.
13. Refactorizando código legado.
13.1. Flujos de refactoring.
13.2. Objetivos y estrategias.
13.3. Estrategias de refactoring según subdominios de DDD.
13.4. Refactorings que mejoran la testeabilidad y productividad.
--- 13.4.1. Separar infraestructura de lógica de negocio.
--- 13.4.2. Mejora de la cohesión.
14. Introduciendo DDD en código legado.
14.1. Motivación.
14.2. Patrones útiles.
--- 14.2.1. Contexto Burbuja.
--- 14.2.2. Burbuja Autónoma.
--- 14.2.3. Exponiendo activos del legado como servicios.
15. Técnicas de refactoring para hotspots.
15.1. ¿Cómo se forma un hotspot?.
15.2. Heurísticas para identificar responsabilidades.
15.3. ¿Cómo dividir una hotspot en clases más cohesivas?.
--- 15.3.1. Aproximación en Working Effectively with legacy Code.
--- 15.3.2. Splinter Pattern.
--- 15.3.3. Aproximación en Object-Oriented Reengineering Patterns.
16. Orientación a objetos para mejorar código legado.
16.1. Aplicando patrones de diseño para simplificar código legado.
--- 16.1.1. Cross-cutting concerns.
--- 16.1.2. Separar tarea principal de tareas secundarias asociadas.
--- 16.1.3. Reglas de negocio bizantinas.
--- 16.1.4. Código condicional.
--- 16.1.5. Sucedáneos procedurales del polimorfismo.
--- 16.1.6. Interfaces adecuadas para código legado estable.
16.2. Code smells que perjudican o inhiben la orientación a objetos.
17. Técnicas de refactoring para costuras basadas en herencia.
17.1. Mover costura basada en herencia a delegado.
17.2. Introducir inyección de depedencias.
18. Cierre del curso: cartas de navegación.
18.1. Visión de conjunto: temas explorados y por explorar.
18.2. Cambiando perspectivas sobre el código legado.