Sobre por qué la programación orientada a objetos perdió relevancia

Erase una vez cuando se desarrollaban aplicaciones grandes, con decenas o incluso cientos de entidades. Era una época donde se esperaba que cada pieza de software viviera por muchos años y los ciclos de release podían extenderse por muchos meses excediendo incluso el año. Era una época donde la programación orientada a objetos y sobre todo un buen modelo de objetos podía marcar una diferencia relevante en la construcción, evolución y mantenimiento de una pieza de software[1].

Pero esa época ha quedado atrás, cada vez son más las demandas del negocio por dar respuestas rápidas a las situaciones cambiantes del mercado. Los ciclos de release se han acortado radicalmente y de mano de ello también alcance de cada aplicación. Los avances en virtualización y la popularización de los contenedores han habilitado el surgimiento de prácticas como infraestructura como código y continuous delivery. En este contexto, propuestas de diseño como la de microservicios han probado ser muy efectivas. Cada microservicio es una aplicación de un tamaño acotado, no hay un regla fija de esto pero se suele usar como referencia un bounded context [2]. En este hilo de razonamiento cada aplicación no tiene ya tantas entidades y tampoco se espera que un microservicio «viva por siempre». Dado que los microservicios son relativamente pequeños no resulta impensado que luego de un tiempo sea reemplazado por una nueva versión que podría estar incluso desarrollada con una tecnología distinta.

Esto me lleva a pensar que en cierto modo la importancia de la programación orientada a objetos ha perdido cierta importancia relativa. En un punto cuestiones como la arquitectura de runtime (que impactan en la posibilidad de escalar) han tomado mayor relevancia (posiblemente porque la necesidad de escalar está mucho más presente ahora que hace 15 años).

Sin embargo estoy convencido que los principios de la orientación siguen completamente vigentes porque muchos de ellos son aplicables más allá de la programación. De hecho, los principios de diseño de los microservicios no son más que «refraseos» de los principios de orientación objetos. Un caso es el principio de Responsabilidad Única (Single Responsibility Principle): un objeto debe hacer UNA cosa y hacerla bien, eso mismo aplica a los microservicios. De hecho creo que perfectamente uno podría tomar los principios de orientación a objetos, aplicarlos al diseño de microservicios y luego programar internamente el microservicio utitilizando objetos pero de una forma más «procedural» utilizando alguna estrategia del Transaction Script. en lugar de hacer un Domain Model.

Tal vez este razonamiento genere alguna crítica y ante ello debo aclarar que he estado enseñando Programación Orientada a Objetos por más de 15 años y aún lo hago. Pero desde hace un tiempo vengo con la sensación de que en la medida en que podamos hacer aplicaciones/servicios pequeños, con pruebas automatizadas y prácticas de configuración management, la forma interna en que programemos las aplicación, resulta menos relevante.

[1] Posiblemente en algunos contextos esto siga ocurriendo
[2] Bounded Context es una idea desarrollada por Eric Evans en su libro Domain-Driven Design

Micro-servicios: por donde empezar

Una simple búsqueda en Google del término «microservices» nos arroja unos 710.000 resultados. Entre los tres primeros están: un artículo de Martin Fowler, la correspondiente página de wikipedia y el sitio microservices.io.

Si uno simplemente quiere tener una idea de qué son los microservicios cualquiera de estos tres recursos podría ser suficiente. Pero si uno quiere ir un poco más allá de las definiciones y explicaciones introductorias, mi recomendación es el libro Building Microservices, designing fine-grained systems de Sam Newman. Por otro lado si uno viene del mundo Java, hay un librito muy interesante escrito por Markus Eisele que se llama Modern Java EE Design Patterns: Building Scalable Architecture for Sustainable Enterprise Development.

 

Micro-servicios: ¿un nuevo buzzword?

Puede que si o puede que no. Algunas impresiones:

  • Hay gente que viene construyendo micro-servicios desde bastante tiempo antes de que el término se ponga de moda
  • Como suele ocurrir con toda moda en algún momento, hay gente que se está subiendo a esta iniciativa a pesar de que su contexto no lo requiere

Pero… ¿que es realmente esto de los micro-servicios? Es básicamente un nombre para identificar un conjunto de prácticas a nivel de diseño e implementación con foco en dos cuestiones:

  • Posibilidad de responder rápidamente a las necesidades del negocio
  • Soluciones robustas y escalables

El primer punto está íntimamente relacionado con la agilidad y la entrega continua y tiene un impacto directo en la forma de trabajo de los equipos/organizaciones a punto tal que resulta común que las organizaciones modifiquen sus estructuras de equipos al moverse hacía el mundo de los micro-servicios.

El segundo punto tiene una impronta mucho más técnica y a nivel implementación suele implicar cuestiones como: cloud computing, virtualización y dockerización.

¿Y a que se debe el nombre «micro-servicios»?

Hace unos 10 años hubo una fuerte «ola de servicios» en el contexto de SOA (Service Oriented Architecture). La implementación de iniciativas SOA implicó en la mayoría de los casos el uso de componentes de arquitectura «pesados» cuya administración/instalación solía tener un grado importante de complejidad. Al mismo tiempo muchas de las soluciones generadas en los contextos SOA no se caracterizaban por ser muy testeables (automatizamente).

Los micro-servicios deben su nombre en gran medida  a la intención de diferenciarse de lo que fueron las iniciativas SOA. Pues si bien hay puntos en común entre ambas iniciativas también hay importantes diferencias. Entre esas diferencias yo me inclino por los siguientes objetivos en el diseño de los micro-servicios:

  • Testeabilidad
  • Despliegue independiente y automatizado
  • Resiliencia
  • Escalabilidad horizontal

Continuará…

3 semanas de proyecto

El miércoles pasado se cumplieron 3 semanas/iteraciones desde que empecé a trabajar en mi proyecto actual. En estas semanas creo que hemos hecho algunos avances importantes respecto al producto y a la forma de trabajo:

  • Mejoramos «el teamwork»
    • ahora el equipo se sienta todo junto en la misma mesa
    • dimos un par de pasos para integrar a los miembros con asignación part-time (testing y UX)
    • creamos una lista de correo que tiene bastante vida y que nos permite estar más comunicados principalmente los días que hacemos homeworking
  • Respecto de los aspectos técnicos del proceso de desarrollo
    • tenemos 2 ambientes de testing: uno para tests automatizados y otro para tests manuales
    • agregamos tests automatizados
    • automatizamos el deployment a los distintos ambientes
    • empezamos a desplegar la aplicación en forma frecuente
    • ordenamos el versionado del producto agregando release notes y tags en los repositorios
  • Finalmente respecto del producto
    • hicimos un refactoring de arquitectura que gradualmente nos permite movernos de una arquitectura monolítica a una esquema de microservicios
    • como consecuencia del refactoring mejoró la estabilidad del producto

Personalmente estoy contento con como venimos avanzando y con los desafios que aún nos quedan por delante.

Continuará…