Series de artículos

Code Smells

Repaso de los code smells más frecuentes, con un ejemplo en el que se analiza como entorpece el desarrollo y estrategias para solucionarlos.

  1. Data Clump
  2. Large Class
  3. Long method
  4. Long Parameter List
  5. Primitive Obsession
  6. Rename, para entender mejor

Object Calisthenics

Un ejemplo práctico de cómo usar estar reglas para dirigir un refactor en nuestro código.

  1. Solo un nivel de indentación.
  2. No usar la palabra clave ELSE
  3. Empaquetar primitivas en objetos
  4. Colecciones de primera clase
  5. Un punto por línea
  6. No usar abreviaturas
  7. Mantener todas las entidades pequeñas
  8. No más de dos variables de instancia por clase
  9. No user getters, setters o propiedades públicas
  10. Comentarios finales

Patrones de Diseño

Un repaso a los patrones de diseño más comunes y cómo aplicarlos en nuestro código.

  1. Cadena de responsabilidad
  2. El patrón visitante
  3. El patrón Specification del dominio a la infraestructura (1)
  4. El patrón Specification del dominio a la infraestructura (2)
  5. El patrón Specification del dominio a la infraestructura (3)
  6. Strategy pattern
  7. El patrón decorador
  8. Patrones de creación de objetos
  9. Charla. New no, lo siguiente.
  10. New no. Lo siguiente
  11. Representation pattern (obsoleto)
  12. Ejemplos para tus tests con Object Mother
  13. El patrón State
  14. Generar representaciones de un objeto sin exponer getters
  15. Patrón Builder en Golang
  16. El patrón Object Mother
  17. A donde vamos, no necesitamos repositorios
  18. Evita el acoplamiento fuerte con configurable dependency
  19. Lecciones aprendidas del patrón observer

Golden Cookbook

Recipes for snapshot, approval and combinatory testing, with Golden for Go and PHP-Golden for PHP.

  1. What is golden and how to start with snapshot testing
  2. Testing existing code with snapshot testing
  3. The Golden Master technique, with approval mode

TDD Outside-In con Arquitectura Hexagonal

Donde mostramos cómo aplicar TDD Outside-In con Arquitectura Hexagonal, usando diferentes aproximaciones.

  1. Enfoque clásico, paso a paso y reflexiones
  2. London School, doble ciclo y comparativa
  3. Comparativa práctica y conclusiones
  4. Walking Skeleton y vía intermedia pragmática
  5. Sad paths, validaciones y robustez en los tests
  6. Añadiendo funcionalidad y resolviendo problemas
  7. El configurador y la aplicación
  8. El configurador y la aplicación revisados

Vertical Slice Architecture

Explicamos y reflexionamos sobre el patrón Vertical Slice Architecture con un ejemplo de su posible implementación.

  1. Preparando un proyecto Symfony para experimentar con Vertical Slice Architecture
  2. Vertical Slice Architecture
  3. Una aplicación usando Vertical Slice Architecture
  4. VSA. Diseño del handler
  5. VSA. Más de una feature
  6. TDD outside-in y testing inside-out
  7. Testeando lo que puede ir mal

Historia de una reescritura

Crónica paso a paso sobre el proceso de reescritura de una aplicación legacy hacia una arquitectura limpia y testeable.

  1. Historia de una reescritura (1)
  2. Historia de una reescritura (2) el problema con MVC
  3. Historia de una reescritura (3) empezar con la vista
  4. Historia de una reescritura (4) el código tóxico
  5. Historia de una reescritura (5) tests
  6. Historia de una reescritura (6) autoload sin namespaces

API Rest

Conceptos, diseño y buenas prácticas para servir y consumir APIs RESTful en PHP.

  1. API rest
  2. Sirviendo API rest (1)
  3. Sirviendo API rest (2)

Katando PHPSpec

Serie práctica resolviendo una kata de código guiada por especificaciones con PHPSpec.

  1. Katando PHPSpec 2
  2. Katando PHPSpec 1
  3. Katando PHPSpec 3
  4. Katando PHPSpec 4

TDD en PHP con colecciones

Desarrollo paso a paso guiado por tests (TDD) para modelar e implementar estructuras de colecciones orientadas a objetos en PHP.

  1. TDD en PHP. Un ejemplo con colecciones (1)
  2. TDD en PHP. Un ejemplo con colecciones (2)
  3. TDD en PHP. Un ejemplo con colecciones (3)
  4. TDD en PHP. Un ejemplo con colecciones (4)
  5. TDD en PHP. Un ejemplo con colecciones (5)

Ejercicio de refactoring

Ejemplo práctico de refactorización progresiva: desde tests de caracterización hasta el diseño final limpio.

  1. Ejercicio de refactor (1) Los tests de caracterización
  2. Ejercicio de refactor (2) Extraer hasta la última gota
  3. Ejercicio de refactoring (3) Intervenir y seguir o no refactorizando
  4. Ejercicio de refactoring (4) Finalizando

Código mentiroso

Análisis de patrones en el código que engañan sobre su verdadero comportamiento y cómo corregirlos.

  1. Código mentiroso
  2. Código mentiroso (2) más ejemplos

Test doubles

Introducción y principios de diseño fundamentales al trabajar con dobles de test.

  1. Test doubles (1)
  2. Test doubles (2) Principios de diseño

Introducción a BDD en PHP

Guía práctica de Behavior Driven Development en PHP utilizando herramientas como Behat y PHPSpec.

  1. Introducción a Behavior Driven Development en PHP (1)
  2. Introducción a Behavior Driven Development en PHP (2)
  3. Introducción a Behavior Driven Development en PHP (3)
  4. Introducción a Behavior Driven Development en PHP (4)

Refactor cotidiano

Técnicas y hábitos diarios de refactorización para mejorar continuamente la legibilidad y mantenibilidad del código.

  1. Refactor cotidiano (1). Fuera comentarios
  2. Refactor cotidiano
  3. Refactor cotidiano (2). Mejora los nombres
  4. Refactor cotidiano (3). Acondiciona las condicionales
  5. Refactor cotidiano (4). Sustituye escalares por objetos
  6. Refactor cotidiano (5). Refactoriza a Enumerables
  7. Refactor cotidiano (6). Aplica Tell, Don't Ask y la Ley de Demeter
  8. Refactor cotidiano (7). Refactoriza de single return a return early
  9. Refactor cotidiano (8). Dónde poner el conocimiento

Guía para testear con dobles

Guía completa y detallada sobre el uso apropiado de dobles de test (mocks, stubs, fakes, spies y dummies).

  1. Guía para testear con dobles (2)
  2. Guía para testear con dobles (1)
  3. Guía para testear con dobles (3)

De Directory Driven a DDD

Transición paso a paso desde una arquitectura guiada por carpetas hacia Domain-Driven Design.

  1. De directory driven a DDD paso a paso
  2. De ddd a DDD paso a paso 2. Del repositorio al dominio.

Pong en Python

Desarrollo ágil de un juego Pong en Python, abordando legacy, refactoring, tests automatizados y gestión de sprints.

  1. Pong en Python. Los prototipos como punto de partida de un proyecto de software
  2. Pong en Python. Convivencia entre legacy y código nuevo
  3. Pong en Python. Reubicar el legacy y automatizar los tests
  4. Pong en Python. Mejorando la aplicación
  5. Pong en Python. Separando el legacy en Scenes
  6. Pong en Python. Eliminando deuda técnica.
  7. Pong en Python. Nuevas features, nuevos tests
  8. Pong en Python. Desarrollo ágil
  9. Pong en Python. Agilidad y prioridades
  10. Pong en Python. Ramas y bugs
  11. Pong en Python. Refinamiento y sprint desbocado
  12. Pong en Python. Recuperarse de un sprint fallido

Más allá de SOLID

Reflexiones sobre principios de diseño de software fundamentales que complementan y trascienden a SOLID.

  1. Más allá de SOLID, principios básicos
  2. Más allá de SOLID, los cimientos
  3. Más allá de SOLID, los consejos prácticos
  4. Más allá de SOLID, los principios olvidados

Trabajar con legacy y entender el dominio

Estrategias para poner código legacy bajo test, extraer conceptos y estructurar la aplicación descubriendo el dominio.

  1. Poner el código bajo test
  2. Extracción de conceptos
  3. Dar estructura a la aplicación

Código a prueba de futuro

Técnicas y decisiones de diseño para escribir código sostenible, extensible y resistente al paso del tiempo.

  1. Escribir código a prueba de futuro
  2. Escribir código a prueba de futuro 2

Outside-in y Behavior Driven Development

Desarrollo de aplicaciones siguiendo el ciclo Outside-In con BDD usando Behat y PHPSpec.

  1. Outside-in y Behavior Driven Development 1
  2. Outside-in y Behavior Driven Development 2
  3. Outside-in y Behavior Driven Development 3
  4. Outside-in y Behavior Driven Development 4
  5. Outside-in y Behavior Driven Development 5
  6. Outside-in y Behavior Driven Development 6
  7. Outside-in y Behavior Driven Development 7

Aprendiendo Go con TDD

Exploración del lenguaje Go aprendiendo sus fundamentos y características mediante Test-Driven Development.

  1. Aprendiendo Go con TDD 1
  2. Aprendiendo Go con TDD 2

Dungeon Crawler en Python

Serie completa sobre el desarrollo de un juego Dungeon en Python aplicando diseño incremental.

  1. Dungeon 1. Empezando por algún sitio
  2. Dungeon 2. The Walking Skeleton
  3. Dungeon 3. Compaginar diseño y delivery
  4. Dungeon 4. Una historia de usuario
  5. Dungeon 5. Laberintos y deuda técnica
  6. Dungeon 6. Builders al rescate
  7. Dungeon 7. Code Review
  8. Dungeon 8. Energía y feature flags
  9. Dungeon 9. El camino equivocado
  10. Dungeon 10. Eventos para controlarlos a todos
  11. Dungeon 11. Power-ups y un poco de orden
  12. Dungeon 12. Otra revisión de código
  13. Dungeon 13. Salir con un tesoro. Parte 1
  14. Dungeon 14. Salir con un tesoro. Parte 2
  15. Dungeon 15. Problemas con null y modelando una mano

Arquitectura Hexagonal con BDD

Construcción de aplicaciones basadas en Puertos y Adaptadores (Arquitectura Hexagonal) guiadas por BDD.

  1. Introducción a la Arquitectura Hexagonal
  2. Algunas dudas comunes con Arquitectura Hexagonal
  3. Una aplicación hexagonal construida con BDD (1)
  4. Intentando llegar a buen puerto con Arquitectura Hexagonal y BDD
  5. Creando un adaptador driver en una aplicación hexagonal
  6. Como añadir features en arquitectura hexagonal

Refactoring Gilded Rose

Estrategias avanzadas de refactorización del clásico kata Gilded Rose: Golden Master, condicionales y polimorfismo.

  1. Cobertura de test rápida con Golden Master
  2. Despejar una maraña de condicionales
  3. Refactoriza rompiendo cosas
  4. De condicionales a polimorfismo

Bus de mensajes y Command Bus

Explicación detallada del funcionamiento, beneficios e implementación práctica de buses de comandos y mensajería.

  1. Como funciona un bus de mensajes
  2. Disfrutando del Command Bus
  3. Mensajería variada

Refactoring para quienes no refactorizan

Introducción accesible al refactoring con pasos sencillos y pragmáticos para perder el miedo a mejorar el código existente.

  1. Refactoring para quienes no refactorizan
  2. Refactor para quienes no refactorizan 2
  3. Refactoring para quienes no refactorizan 3

La guía definitiva de los dobles de test

Guía revisada y exhaustiva sobre dobles de test: definiciones claras, cuándo utilizarlos y antipatrones a evitar.

  1. La guía definitiva de los dobles de test
  2. La guía definitiva de los dobles de test 2