Incluye Code Reviews

Siempre Junior. Nunca Senior.

Developers que multiplican vs los que no, gracias a combinar la IA con una habilidad muy escasa y valiosa.

Diseño SostenibleDiseño SostenibleIngeniería y Artesanía del Software con TypeScript

Hoy la IA ya genera la mayor parte del código que se sube a producción.

Muchos developers han dejado de escribir código para generarlo mediante prompts.

Y no sabemos cuánto tardaremos en dejar de escribir incluso esos prompts.

Tampoco sabemos si las máquinas acabarán interpretándonos sin que tengamos que pedirles nada.

Y quizás, en ese momento, ya no harán falta más desarrolladores.

El futuro es incierto, ahora más que nunca, pero aún no estamos ahí.

Lo único real es el presente, en el que sigue habiendo muchísimo trabajo para los developers con criterio.

Verás.

La generación de código que llevan a cabo herramientas como Claude Code, Codex, Cursor o Copilot son predicciones en base al código con el que han sido entrenadas.

Y la realidad es que la mayoría del código que está en Github o en cualquier otro repositorio de internet, no es código sostenible para humanos, es más bien pasto para las máquinas.

En la corta historia de la programación, son pocos los developers que se han dado cuenta de la diferencia que marca programar para las personas. Por tanto, el código que genera la máquina sigue siendo insufrible en la mayoría de los casos.

Con estas herramientas incluso hay más riesgo de crear grandes repositorios de código legacy en menos tiempo.

Ahora tenemos la capacidad de generar toneladas de código que mata la moral de cualquiera en cuestión de minutos.

Dominando esta habilidad no te faltará trabajo en los próximos años

Existe una habilidad muy muy escasa y valiosa, que solo unas pocas personas que hayamos conocido, tienen:

La habilidad de escribir código deliberadamente explícito y simple. Que refleje claramente su intención como para que cualquier persona lo entienda.

Se trata de un nivel de consciencia y sensibilidad a la hora de codificar, totalmente fuera de lo común. Verdaderos artesanos de software.

Si además añadimos la variable pragmatismo a la ecuación, el número de personas que hemos conocido se reduce a un puñado.

Conciencia, sensibilidad, pero sin fanatismo, sin dogmatismo, con el foco puesto en los objetivos del equipo. Esto es como encontrar una aguja en un pajar.

A este puñado de personas les sobra el trabajo.

Son developers que tienen montones de ofertas para elegir y por supuesto con excelentes salarios. Esta gente ha entendido que programan para las personas, no para las máquinas.

Cuando sabes programar para las personas, los agentes de IA aumentan tu potencial.

La IA es capaz de replicar tu estilo de programación, de manera que se multiplica tu productividad, sin que el código degenere. Estás tú ahí para supervisar, controlar y corregir.

Y hay algo más.

El código que mejor entendemos los humanos es también el que mejor entiende la IA.

No solo porque se entrenó con código humano. Sobre todo porque se entrenó con lenguaje natural.

La IA es un modelo de lenguaje antes que un modelo de código.

Esto ya está ampliando la brecha de valor entregado entre unos programadores y otros. Developers que multiplican vs los que no.

Si saber escribir código sostenible se valoró cada vez más en los últimos años, ahora se ha vuelto innegociable.

Diseño SostenibleDiseño SostenibleIngeniería y Artesanía del Software con TypeScript

El proyecto que costó 10 veces más (por una mala decisión de diseño)

Podría contarte muchos casos de proyectos que, con el tiempo, se volvieron inmanejables.

Pero pocos ilustran tan bien lo que pasa cuando se toman decisiones sin pensar en la sostenibilidad del código como lo que le ocurrió a Carlos Blé —mi socio en esta formación— con dos empresas del mismo sector.

Dos casos muy similares. Dos enfoques completamente distintos. Y dos resultados que no podrían haber sido más diferentes.

Una historia con final feliz.

La otra, con una factura enorme.

“Hace años trabajé ayudando a una joven empresa que estaba empezando a desarrollar su propio software de gestión del negocio.

Ya tenían un volumen de facturación considerable y era insostenible seguir trabajando solamente con hojas de cálculo y procesos manuales.

Para seguir creciendo necesitaban automatizar más.

Decidieron hacer un sistema minimalista adaptado a las necesidades del momento y totalmente a la medida, con muy poco software de terceros.

Tan solo algunas librerías y un framework conocido.

Mi trabajo consistió en enseñarles a hacer test en todas las partes del sistema y en desarrollar un frontal web (la intranet de clientes), que conectaba a su back-end.

Lo hicimos practicando Test-driven development (TDD) y la cobertura superó el 90%.

El director técnico quedó muy contento con el trabajo, el equipo (cuatro personas) acordó que escribir test era indispensable y se comprometieron a seguir haciéndolo.

Por lo que me pude marchar a otro proyecto.

Cuatro años más tarde, volvieron a llamarnos para pedir ayuda.

Habían multiplicado su facturación a lo largo de los años, con el mismo equipo.

Pero el software se les estaba quedando corto para tantas peticiones.

La escalabilidad del sistema era insuficiente para alcanzar el siguiente nivel de facturación.

Estuvimos trabajando en la optimización de algunos procesos, introduciendo cambios en el código y en la arquitectura del sistema.

Manteniendo siempre una sensación de estar en un greenfield project.

El resultado fue un éxito en tiempo y forma.

Curiosamente, a la vez que hacíamos esta mejora, nos contrató otra empresa del mismo sector, que operaba de manera muy similar.

Pero con un equipo de desarrollo de cuarenta personas (10 veces más).

Esta empresa en sus inicios decidió contratar la licencia de un software propietario genérico.

Un software que supuestamente era fácilmente adaptable a sus procesos de negocio.

Pero nada más lejos de la realidad.

Lo que nos encontramos fue un infierno.

El software era un lastre para la compañía, no les permitía avanzar al ritmo que el negocio necesitaba y por supuesto el coste era salvaje en cuanto a salarios.

Tuvieron que contratar a expertos en soporte y mantenimiento de ese software propietario, para ayudar al resto del equipo de desarrollo.

Nos llamaron para domar a la bestia que les tenía secuestrados.

Una faena que costaría varios años.

¡Qué gran diferencia comparada con la primera empresa!

Nunca antes había podido comparar dos casos tan parecidos y a la vez tan diferentes.

La diferencia en términos de costes económicos era como mínimo de diez veces y todo por un código indomable, insolente y catastrófico.”

¿Se puede reconducir un proyecto cuando ya hemos perdido el control?

La respuesta corta es sí, algo se puede hacer.

Perder el control significa no tener ni idea de lo que vamos a tardar en hacer cambios. Ni en lo que va a dejar de funcionar cuando los hagamos o tan siquiera dónde hay que aplicarlos.

Ahora bien, lo que se convirtió en un monstruo con los años, no se va a convertir en oro de la noche a la mañana, sino que también tomará años de trabajo.

Diseño SostenibleDiseño SostenibleIngeniería y Artesanía del Software con TypeScript
Carlos Blé y Miguel Gómez tomando un café

Carlos Blé y yo llevábamos años viendo cómo se repetía el mismo patrón...

Software hecho con prisas, difícil de testear y de mantener, imposible de escalar.

Equipos atrapados en decisiones que parecían buenas… hasta que dejaban de serlo.

Equipos secuestrados por la complejidad de su propio código.

Y por eso nació esta formación.

Un curso online dividido en 16 módulos donde condensamos lo más importante que hemos aprendido diseñando software real durante más de dos décadas.

Módulo 1: Introducción & Mentalidad

Programar no es solo escribir instrucciones para una máquina.

Es escribir código para humanos.

Y lo más irónico de esto es que los LLMs detrás de Cursor o ChatGPT entienden mejor ese tipo de código que ningún otro.

Precisamente porque están diseñados para entender el lenguaje humano.

Lo que me obliga a hacerte una pregunta incómoda:

¿Estás aportando valor… o dejando deuda técnica?

En este módulo entenderás:

Módulo 2: Principios del Diseño Simple

La mayoría del código es innecesariamente complejo.

No por mala intención. Por urgencia. Por desconocimiento. Por falta de criterio.

El resultado: código que funciona, pero nadie quiere tocar.

Este módulo no te trae fórmulas mágicas.

Te da 4 principios que —cuando los aplicas en serio— transforman tu forma de diseñar software.

No para que el código sea más “clean”. Sino para que sea fácil de mantener con el paso del tiempo.

Aquí aprenderás:

Módulo 3: Código Sostenible

Los developers tenemos el grave problema de que le prestamos muy poca atención a los pequeños detalles.

El código no se arruina en una tarde.

Sino que lo vamos empeorando poco a poco cada día, porque ignoramos o infravaloramos que cada línea importa.

Cuando empezamos a darnos cuenta de que el código se ha vuelto inmanejable ya cuesta mucho reparar el daño.

En este módulo verás:

Módulo 4: Kata Bowling

Entender un concepto no es lo mismo que poder aplicarlo bajo presión.

Y en programación, solo hay una forma de llegar ahí: practicar con intención.

Las katas están para eso. Para entrenar heurísticas y afinar tu criterio.

Como en artes marciales: no practicas para que se vea bonito. Practicas para que salga cuando hace falta.

Este módulo es tu primer dojo.

En el que aprenderás:

Módulo 5: Principio POLA

Una buena API no te sorprende.

Hace lo que esperas. Ni más. Ni menos.

Eso es lo que busca el principio de menor sorpresa (POLA):

Que el código se comporte como cualquiera esperaría.

Sin trampas. Sin efectos colaterales. Sin tener que leer cinco archivos para entender una línea.

Este principio no es estético. Es estratégico.

Porque cuando tu código sorprende… alguien paga el precio más adelante.

Antes podías pasar la patata caliente al desarrollador que viniera después.

Ahora que la IA acelera todo… el código vuelve a ti antes de que dé tiempo a que el marrón se lo coma otro.

En este módulo aprenderás:

Módulo 6: Naming y Contexto

“El código tiene que ser simple y directo. Debería leerse con la misma facilidad que un texto bien escrito” — Grady Booch.

Pero sin buenos nombres, esa idea de Grady es simplemente inalcanzable.

Y lo peor no es eso.

Lo peor es que elegir nombres sigue siendo una de las habilidades más infravaloradas en el mundo del desarrollo.

Y sin embargo pocas cosas tienen un impacto tan grande en la calidad del código.

Cuando programas, cada palabra que eliges para nombrar una función, una clase o una variable… es un concepto que introduces en la cabeza de quien te lee (que casi siempre eres tú mismo dentro de seis meses).

No tienes poder sobre las palabras reservadas del lenguaje.

Ni sobre los símbolos.

Pero sí sobre los nombres que eliges.

Y esos nombres son abstracciones.

Igual que la palabra “interruptor” no es un interruptor, sino una imagen mental que aparece en tu cabeza con una pieza de plástico, una pared blanca y el clic que enciende la luz…

Un nombre en tu código activa un modelo mental. Bueno o malo.

De ahí que nombrar no sea un detalle técnico sino un gesto de diseño.

Y por eso es tan difícil.

De ahí esa frase tan repetida: “Solo hay dos problemas difíciles en programación, la invalidación de la caché y nombrar cosas”.

Este módulo va de lo segundo.

Aquí aprenderás:

Módulo 7: Kata Game of Life

Game of life

Hay ejercicios que no solo sirven para practicar sino que ayudan a desarrollar el pensamiento computacional.

Game of Life, del gran matemático John Conway, es uno de ellos.

Esta es mi kata preferida, no solo por lo que enseña… sino por todo lo que revela.

A simple vista parece un juego matemático trivial. Pero en realidad, es una excusa perfecta para poner a prueba tu criterio de diseño.

Porque aquí no hay un framework que te diga qué hacer.

Ni una arquitectura que seguir.

No hay clases heredadas. Ni convenciones impuestas. Solo un conjunto de reglas simples… y las decisiones que tomas al implementarlas.

En este módulo aprenderás:

Módulo 8: Formato y comentarios

“El buen código siempre parece estar escrito por alguien a quien le importa”. – Michael Feathers

Y eso se nota en los pequeños detalles:

Indentación consistente, uso apropiado del espacio vertical, coherencia visual, simetría… Pequeñas decisiones que ayudan a que el código se entienda mejor.

No se trata de gustos personales. Ni de modas.

Se trata de comunicar mejor.

¿Te imaginas un libro mal indentado, con espacios arbitrarios y comentarios al margen explicando lo que el autor no supo decir bien?

Y sin embargo, eso es lo que hacemos todo el tiempo en nuestro código.

Este módulo va de pulir esos pequeños detalles.

Aquí aprenderás:

Módulo 9: Diseño de Funciones

“Sabemos que estamos desarrollando buen código cuando cada función hace exactamente lo que su nombre indica”. – Ward Cunningham

Hay dos tipos de funciones: las que te hacen dudar cada vez que las miras… y las que entiendes al vuelo.

La diferencia no está en el lenguaje.

Está en cómo están planteadas.

Una función mal diseñada no solo complica el código. Rompe el flujo mental, te obliga a poner comentarios innecesarios y a revisar cosas que deberían ser obvias.

Hace que todo lo que construyas encima sea más difícil de mantener.

Porque una función no es solo una secuencia de instrucciones. Es una decisión de diseño. Y, en muchos casos, el lugar donde empieza la simplicidad… o donde nace la deuda técnica.

En este módulo verás:

Módulo 10: Kata Template Engine

La kata del motor de plantillas es un clásico.

Una función que reemplaza variables en un texto. Sencillo… al menos en apariencia.

Pero cuando lo implementas desde cero, empiezan a salir a la luz todas esas decisiones de diseño que normalmente ignoras.

¿Cómo decides qué hacer cuando falta algún campo?

¿Cómo notificas los errores sin llenar el código de excepciones?

¿Cómo evitas que tu API se convierta en un obstáculo para el cliente que la consume?

Además de las respuestas a esas preguntas, en este módulo pondrás en práctica:

Módulo 11: Diseño de Clases y Módulos

“La programación orientada a objetos hace el código comprensible encapsulando las partes móviles. La programación funcional lo hace minimizándolas.” – Michael Feathers

La programación orientada a objetos está muerta.

O eso dicen cada dos por tres en Twitter.

Y, sin embargo, ahí sigue. Resolviendo problemas como cualquier otro paradigma.

El problema no es usar clases. Es no saber cómo diseñarlas.

Te lo dice un fan de la programación funcional.

Y es que saber diseñar buenas clases no es solo útil cuando haces POO.

Es útil cuando diseñas módulos, closures y hasta custom hooks de React…

Porque en el fondo, todo diseño modular se apoya en los mismos principios: encapsular lo que cambia, exponer lo esencial y reducir las dependencias innecesarias.

Aprender a diseñar buenas clases te obliga a pensar en términos de responsabilidad, cohesión y acoplamiento.

Y eso no cambia aunque programes en TypeScript, en Haskell o en Java.

En este módulo verás:

Módulo 12: Kata Mars Rover

Hay ejercicios que no se diseñaron para enseñarte un concepto.

Están pensados para enfrentarte a tu forma de programar.

Este es uno de ellos.

Uno de mis favoritos, de hecho (después de Game of Life).

No solo porque parece fácil y no lo es.

Sino porque expone tu manera de pensar sin que puedas esconderte detrás de frameworks y librerías.

La kata Mars Rover se usaba a menudo como prueba técnica en entrevistas de Google.

Y no por casualidad.

Sino porque revela cosas que otros ejercicios no muestran:

Qué responsabilidades asignas, cómo separas el comportamiento del estado, hasta dónde llega tu obsesión por los detalles…

En este módulo pondrás en práctica:

Módulo 13: Principios de Diseño Avanzado

Todo el mundo habla de SOLID.

Pero pocos lo entienden.

Y aún menos lo aplican bien.

Porque no se trata de recordar cinco siglas.

Se trata de tomar mejores decisiones de diseño para maximizar la cohesión y minimizar el acoplamiento.

Este módulo no pretende convencerte de que sigas principios por fe.

Porque los principios de diseño no son dogmas.

Son herramientas.

Y como toda herramienta, pueden ayudarte o estorbarte, según cómo y cuándo las uses.

En este módulo aprenderás:

Módulo 14: Kata Markdown Transformer

Este ejercicio surgió resolviendo un problema real en Savvily, la editorial de Carlos Blé.

Mientras preparaban libros en markdown, se dieron cuenta de algo obvio pero fácil de pasar por alto: los enlaces no sirven en papel.

Un link funciona en un PDF o en un ePub. Pero en un libro impreso es invisible.

La solución fue convertir los enlaces en notas al pie. Y esa transformación, que parecía trivial, resultó ser un reto de diseño más interesante de lo esperado.

En este módulo verás:

Módulo 15: Gestión y Prevención de Errores

“Si depurar código es el proceso de eliminar los errores de software, entonces programar debe ser el proceso de introducirlos” — Edsger Dijkstra

A estas alturas ya no hace falta decirlo, pero lo diré igual: programar sin errores es imposible.

Ni los tests automáticos, ni el coverage, ni el compilador, ni los linters, ni las buenas intenciones bastan.

La única defensa real es escribir código que reduzca al mínimo el riesgo de accidente.

Este módulo no va solo de dónde y cómo gestionar los errores.

Va de entender dónde se rompen las cosas, por qué, y qué decisiones de diseño las están provocando.

Aquí aprenderás a identificar los tramos de código donde los errores no son una posibilidad, sino una certeza. Y qué hacer para anticiparte a ellos.

Verás también:

Módulo 16: Kata Final – Backend con DDD y Arquitectura Hexagonal

Llega el momento de cerrar el círculo.

Este módulo no va de aprender algo nuevo.

Va de poner en práctica lo que ya sabes.

La idea no es escribir un backend perfecto, ni aplicar todos los patrones posibles.

Es resolver un caso realista con sentido común, cuidando el diseño desde el principio.

La idea es que compares tu solución con la nuestra, sin buscar la “respuesta correcta”, sino entendiendo las decisiones detrás del diseño.

Aquí pondrás en práctica:

Diseño SostenibleDiseño SostenibleIngeniería y Artesanía del Software con TypeScript

Una colaboración de:

Colaboración