El código que perdura: código limpio, arquitecturas limpias y DDD

1 · Introducción6 min read

De dónde vienen estas ideas

Antes de entrar en materia conviene saber una cosa que casi nunca se cuenta a quien empieza: nada de lo que vas a aprender aquí se inventó de golpe, ni lo inventó una sola persona. «Código limpio», «arquitectura hexagonal», «DDD»… suenan a marcas, pero son capas de sedimento: medio siglo de gente quemándose con los mismos problemas y dejando notas para los siguientes. Este capítulo es el mapa de ese sedimento. No hace falta memorizarlo; hace falta saber que existe, para que cuando el curso cite a alguien sepas dónde colocarlo.

1968: la palabra «crisis»

En 1968, la OTAN organizó en Garmisch (Alemania) una conferencia con un título deliberadamente provocador: Software Engineering. Allí se puso nombre a algo que todos los presentes sufrían: los proyectos de software llegaban tarde, costaban el doble y fallaban en producción. Lo llamaron la crisis del software. Más de cincuenta años después, la crisis no se ha «resuelto»: se ha ido domesticando con ideas. Las de este curso son, probablemente, las que mejor han envejecido.

La primera lección de la historia es humilde: el problema nunca fue escribir código; fue cambiarlo. Un programa que funciona hoy y no puede modificarse mañana es un problema con fecha de caducidad. Casi todo lo que estudiarás aquí — nombres claros, capas, dependencias que apuntan hacia dentro, código que habla el idioma del negocio — son estrategias para una sola cosa: que el cambio no duela.

Los setenta y ochenta: cohesión, acoplamiento y objetos

En los años setenta, Larry Constantine y Edward Yourdon formalizaron dos palabras que usaremos constantemente: acoplamiento (cuánto depende una pieza de otras) y cohesión (cuánto tienen que ver entre sí las cosas que viven dentro de una misma pieza). Su libro Structured Design (1979) estableció el criterio que sigue vigente: acoplamiento bajo, cohesión alta. David Parnas, en 1972, había publicado el artículo que fundamenta todo lo demás: On the Criteria To Be Used in Decomposing Systems into Modules, donde propuso dividir los sistemas ocultando decisiones — cada módulo esconde un secreto que puede cambiar sin afectar al resto. Guarda esa idea: la verás reaparecer, con otros nombres, en cada sección de este curso.

En los ochenta llegó la programación orientada a objetos al gran público (Smalltalk, C++), y con ella la promesa de modelar el mundo en el código. La promesa se cumplió a medias — veremos por qué —, pero dejó el vocabulario sobre el que todo lo demás se construye.

Los noventa: los pragmáticos

Los noventa son la década en que la comunidad empezó a escribir para la comunidad. Tres nombres que citaremos mucho:

  • Kent Beck — creador de Extreme Programming y del testing automatizado moderno (JUnit, junto a Erich Gamma). Suyas son las «cuatro reglas del diseño simple» que veremos en la sección 2, y suya es la práctica que hace posible todo lo demás: si el código tiene tests, se puede cambiar sin miedo.
  • Martin Fowler — el gran cronista de la disciplina. Su libro Refactoring (1999) dio nombre y catálogo a la actividad de mejorar código sin cambiar su comportamiento, y su web, martinfowler.com, es la enciclopedia abierta que este curso cita una y otra vez.
  • Robert C. Martin («Uncle Bob») — durante los noventa recopiló y bautizó los principios de diseño orientado a objetos que hoy conocemos por el acrónimo SOLID (sección 3), y años después popularizó las ideas de Clean Code (2008) y Clean Architecture (2012/2017).

En 2001, varios de ellos firmaron el Manifesto for Agile Software Development. Conviene recordar una cosa que se olvida a menudo: el manifiesto ágil lo escribieron, en su mayoría, personas obsesionadas con la calidad técnica. La agilidad sin código sano es solo prisa.

2003-2005: el dominio en el centro

Dos publicaciones casi simultáneas forman el corazón de este curso:

  • En 2003, Eric Evans publicó Domain-Driven Design: Tackling Complexity in the Heart of Software, conocido cariñosamente como «el libro azul». Su tesis: la mayor complejidad del software no está en la tecnología, sino en el dominio — el negocio, el problema real —, y por tanto el modelo del dominio debe ser el centro del diseño, expresado en un lenguaje ubicuo compartido entre programadores y expertos del negocio. Evans liberó después las definiciones esenciales en el DDD Reference bajo licencia Creative Commons; son las que usaremos.
  • En 2005, Alistair Cockburn publicó el artículo Hexagonal Architecture (Ports and Adapters): la aplicación debe poder funcionar igual con una interfaz gráfica, con tests automáticos o con un fichero por lotes, porque su lógica no sabe nada del mundo exterior — se comunica con él a través de «puertos» a los que se enchufan «adaptadores».

En 2012, Robert C. Martin sintetizó éstas y otras propuestas (la Onion Architecture de Jeffrey Palermo, entre ellas) en un artículo breve y muy influyente, The Clean Architecture, cuyo diagrama de círculos concéntricos probablemente hayas visto alguna vez: las dependencias apuntan siempre hacia el centro, donde viven las reglas de negocio.

Hoy: la síntesis

Nada de lo anterior compite entre sí. El estado del arte actual — el que practican los equipos que citaremos y el que describe el documento de arquitectura real que leeremos entero en la sección 10 — es una síntesis: código limpio en lo pequeño, capas con dependencias hacia dentro en lo mediano, y el dominio como centro y el lenguaje como guía en lo grande. Ese es el viaje del curso, y este es su mapa:

SeccionesEscalaPregunta que responden
1-2Una línea, una función¿Cómo escribo código que otro pueda leer y tocar?
3Una clase, un módulo¿Cómo evito que todo dependa de todo?
4Una aplicación¿Dónde pongo cada cosa y por qué?
5-7Los ladrillos¿Qué son entidades, value objects, repositorios y casos de uso?
8Un sistema y su gente¿Cómo hago que el código hable el idioma del negocio?
9La red de seguridad¿Qué tests sostienen todo esto?
10El plano completo¿Cómo se ve todo junto en un proyecto real?

Una advertencia final, la más importante del capítulo: ninguna de estas ideas es un dogma. Todas nacieron de dolores concretos, y solo se entienden desde el dolor que resuelven. Por eso este curso empieza cada sección con una historia: para que sientas el problema antes de aprender la solución. Los mejores ingenieros que conocemos no son los que aplican patrones; son los que saben por qué existen — y por eso saben también cuándo no aplicarlos.

En el próximo capítulo empieza la historia. Es lunes, hay una junior con la mochila aún puesta, y en la bandeja de entrada de soporte hay 214 correos con el mismo asunto.