La complejidad es un arma de doble filo en la ingeniería de software. Cuando escalamos los sistemas y las organizaciones que los respaldan, agregamos partes móviles para aumentar la capacidad. Esta complejidad dificulta la comprensión de las consecuencias de nuestros cambios, pero evitar la complejidad por completo puede limitar lo que el sistema puede manejar. A menudo me parece que elijo entre dos problemas: o necesitamos descubrir cómo romper una estructura monolítica sin interrumpir el tráfico valioso que la atraviesa, o debemos descubrir cómo promover el desarrollo local de estructuras orientadas a servicios. . sin requerir que los ingenieros descarguen una copia completa de la producción en sus computadoras portátiles. A veces, los equipos de ingenieros pueden enfrentar ambos problemas al mismo tiempo, pero todos los equipos de ingeniería en los que he trabajado han tenido que resolver al menos uno de ellos.
¿Cómo terminamos construyendo cosas tan complejas todo el tiempo? ¿Y cuándo debemos evitar añadir complejidad al sistema?
La solución requiere una comprensión de la plataforma.
¿Qué es la plataforma?
En este contexto, la creación de plataformas es el proceso de capturar la funcionalidad central en abstracciones, lo que minimiza la necesidad de que los ingenieros de software construyan soporte para esta funcionalidad por su cuenta. Esto a menudo toma la forma de herramientas o marcos que se pueden ubicar más fácilmente entre una pieza de tecnología existente y un programa basado en ella. El sistema operativo está lleno de tipos de abstracciones como contenedores y sistemas de orquestación como Docker o kubernetes. Las herramientas de implementación a menudo se crean como parte de una plataforma. Los servicios compartidos a menudo se crean como parte de una plataforma.
Las plataformas nos ayudan a gestionar la complejidad al reducir la imagen general que necesitamos comprender. Un ingeniero de software no debe comprender las diferencias entre las diferentes arquitecturas de chips, porque la plataforma puede manejarlas. No necesita aprender múltiples dialectos de SQL porque ORM crea sus consultas por ella.
¿Qué es la plataforma?
Lo principal es la generalización. La plataforma es la separación de partes de un sistema que puede generalizarse lo suficiente como para funcionar como una caja negra. El punto no es que el sistema sea más simple, porque más abstracciones significan invariablemente más complejidad. En cambio, las plataformas simplifican el sistema al delegar cuánta complejidad necesita comprender cada ingeniero al mismo tiempo. El desarrollador del programa no tiene que comprender la complejidad del entorno de ejecución del contenedor, pero los ingenieros que trabajan en las herramientas de contenedorización lo entienden absolutamente. En las arquitecturas modernas, es imposible comprender completamente todo el sistema, pero al crear plataformas, reducimos la barrera de la contribución productiva. Los ingenieros trabajan más rápido y ejecutan código eficiente más rápido.
Si se hace bien, la plataforma también beneficia la salud de los sistemas. Cuando un conjunto de funcionalidades se puede generalizar hasta el punto en que un ingeniero individual no necesita comprenderlo, el ingeniero no necesitará cambiar esta funcionalidad. Por esta razón, los incentivos que fomentan el uso de plataformas a menudo son los beneficios de limitar quién puede realizar cambios en el sistema.
Abstracción y generalizaciones
Pero no todas las abstracciones son generalizaciones. Nuestras pilas tienen herramientas y marcos que agregan variaciones, no las minimizan. Una buena manera de notar la diferencia es preguntarse qué tan bien un ingeniero necesita comprender la interfaz de las dependencias que operan dentro de una abstracción para usarla de manera efectiva.
Las abstracciones que se enfocan en aplicar estilo o lograr beneficios de rendimiento generalmente agregan variación, no la minimizan. La ingeniería de interfaz se ha disparado en complejidad con muchos marcos en conflicto que se utilizan para aclarar las inconsistencias de Javascript, acelerarlo, sellarlo, empaquetarlo o cargarlo de cualquier manera. Estas abstracciones no son parte de la plataforma, ya que el ingeniero primero debe comprender Javascript y luego estudiar las diversas abstracciones para usarlas de manera efectiva.
Esto no significa que dichos marcos no sean útiles, pero cada vez es más difícil mantener los sistemas a medida que aumenta su complejidad. Por lo tanto, si una estructura o herramienta en particular no minimiza el impacto de esta complejidad, los arquitectos de sistemas deben pensar detenidamente en el valor que agregan. Cuando las personas no entienden cómo cambiar algo bien, rápidamente encuentran varias formas de cambiarlo mal.
Platformización y escala
La ventaja de la plataforma es que la complejidad del sistema se divide en áreas específicas que se pueden delegar a ingenieros especializados y que todos los demás pueden ignorar de manera segura. Esto simplifica el sistema, pero esta simplicidad es una ilusión. Cada nueva pieza móvil añade más complejidad. Por esta razón, la plataforma en la que se apoya el equipo de ingenieros debe reflejar la escala del propio equipo. Intentar construir una plataforma demasiado pronto, antes de tener personal especial al que delegar, es otro fracaso común.
Afortunadamente, muchos componentes de una plataforma moderna pueden ser administrados por equipos de terceros en relación con la propia organización de ingeniería. AWS ofrece una serie de servicios administrados, como la mayoría de sus competidores en la nube. El uso de herramientas de código abierto con una configuración predeterminada predeterminada es otra forma de delegar la complejidad a un equipo externo mientras se amplía un equipo interno.
Los ingenieros a menudo se sienten atraídos por el resplandor de la tecnología de escala de Google, pero las economías de escala son tan comunes en TI como en la fabricación. Las soluciones para todo Google son redundantes al inicio. Tratar de generar 10 o 100 veces el tráfico que realmente tiene es una buena manera de agregar mucha complejidad innecesaria.
Se necesita práctica y experiencia para saber cuándo crear su plataforma, cuánto desarrollarla y qué abstracciones se ajustan al modelo de plataforma. Al tomar decisiones estratégicas sobre su propia arquitectura, tenga en cuenta estas tres reglas:
- Las plataformas delegan la complejidad a equipos especializados. Solo un equipo que soporte y ejecute iteraciones de abstracción puede comprender las dependencias; todos los demás interactúan con una caja negra que simplemente funciona.
- Las plataformas minimizan la variación. Debería ser fácil para los ingenieros que construyen sobre la plataforma hacer lo correcto, y es casi imposible introducir la abstracción en un caso extremo o un estado desconocido..
- No todas las abstracciones son generalizadas. Algunas abstracciones son útiles porque agregan la funcionalidad que falta, aumentan el rendimiento o empaquetan el código, lo que facilita la entrega del producto.
Crear una plataforma para una plataforma no es rentable, pero cuando una organización ha alcanzado (a) una escala en la que la carga de la complejidad se ralentiza y (b) tiene los recursos para comenzar a asignar y delegar esa complejidad en equipos específicos, la plataforma puede ser una excelente manera de continuar con el desarrollo tecnológico.