Explore c贸mo construir sistemas m谩s fiables y mantenibles. Esta gu铆a cubre la seguridad de tipos a nivel arquitect贸nico, desde APIs REST y gRPC hasta sistemas orientados a eventos.
Fortificando sus Cimientos: Una Gu铆a sobre la Seguridad de Tipos en el Dise帽o de Sistemas en Arquitecturas Gen茅ricas de Software
En el mundo de los sistemas distribuidos, un asesino silencioso acecha en las sombras entre servicios. No causa errores de compilaci贸n ruidosos ni fallos obvios durante el desarrollo. En cambio, espera pacientemente el momento oportuno en producci贸n para atacar, derribando flujos de trabajo cr铆ticos y provocando fallos en cascada. Este asesino es la sutil desincronizaci贸n de tipos de datos entre componentes que se comunican.
Imagine una plataforma de comercio electr贸nico donde un servicio de `Pedidos` reci茅n desplegado comienza a enviar el ID de un usuario como un valor num茅rico, `{"userId": 12345}`, mientras que el servicio de `Pagos` aguas abajo, desplegado hace meses, lo espera estrictamente como una cadena, `{"userId": "u-12345"}`. El analizador JSON del servicio de pagos podr铆a fallar, o peor a煤n, podr铆a malinterpretar los datos, lo que llevar铆a a pagos fallidos, registros corruptos y una fren茅tica sesi贸n de depuraci贸n nocturna. Esto no es un fallo del sistema de tipos de un solo lenguaje de programaci贸n; es un fallo de la integridad arquitect贸nica.
Aqu铆 es donde entra en juego la Seguridad de Tipos en el Dise帽o de Sistemas. Es una disciplina crucial, aunque a menudo pasada por alto, centrada en garantizar que los contratos entre partes independientes de un sistema de software m谩s grande est茅n bien definidos, validados y respetados. Eleva el concepto de seguridad de tipos de los confines de una sola base de c贸digo al vasto y interconectado paisaje de la arquitectura de software gen茅rica moderna, incluyendo microservicios, arquitecturas orientadas a servicios (SOA) y sistemas orientados a eventos.
Esta gu铆a completa explorar谩 los principios, estrategias y herramientas necesarios para fortificar los cimientos de su sistema con seguridad de tipos arquitect贸nica. Pasaremos de la teor铆a a la pr谩ctica, cubriendo c贸mo construir sistemas resilientes, mantenibles y predecibles que puedan evolucionar sin romperse.
Desmitificando la Seguridad de Tipos en el Dise帽o de Sistemas
Cuando los desarrolladores escuchan "seguridad de tipos", normalmente piensan en comprobaciones en tiempo de compilaci贸n dentro de un lenguaje de tipado est谩tico como Java, C#, Go o TypeScript. Un compilador que le impide asignar una cadena a una variable entera es una red de seguridad familiar. Si bien es invaluable, esto es solo una pieza del rompecabezas.
M谩s all谩 del Compilador: Seguridad de Tipos a Escala Arquitect贸nica
La Seguridad de Tipos en el Dise帽o de Sistemas opera a un nivel de abstracci贸n m谩s alto. Se preocupa por las estructuras de datos que cruzan los l铆mites de procesos y redes. Si bien un compilador de Java puede garantizar la consistencia de tipos dentro de un solo microservicio, no tiene visibilidad del servicio de Python que consume su API, o del frontend de JavaScript que renderiza sus datos.
Considere las diferencias fundamentales:
- Seguridad de Tipos a Nivel de Lenguaje: Verifica que las operaciones dentro del espacio de memoria de un programa sean v谩lidas para los tipos de datos involucrados. Es impuesta por un compilador o un motor de tiempo de ejecuci贸n. Ejemplo: `int x = "hello";` // Falla al compilar.
- Seguridad de Tipos a Nivel de Sistema: Verifica que los datos intercambiados entre dos o m谩s sistemas independientes (por ejemplo, a trav茅s de una API REST, una cola de mensajes o una llamada RPC) se adhieran a una estructura y un conjunto de tipos mutuamente acordados. Es impuesta por esquemas, capas de validaci贸n y herramientas automatizadas. Ejemplo: El Servicio A env铆a `{"timestamp": "2023-10-27T10:00:00Z"}` mientras que el Servicio B espera `{"timestamp": 1698397200}`.
Esta seguridad de tipos arquitect贸nica es el sistema inmunol贸gico de su arquitectura distribuida, protegi茅ndola de cargas 煤tiles de datos inv谩lidas o inesperadas que pueden causar una serie de problemas.
El Alto Costo de la Ambig眉edad de Tipos
No establecer contratos de tipos fuertes entre sistemas no es un inconveniente menor; es un riesgo t茅cnico y comercial significativo. Las consecuencias son de gran alcance:
- Sistemas Fr谩giles y Errores en Tiempo de Ejecuci贸n: Este es el resultado m谩s com煤n. Un servicio recibe datos en un formato inesperado, lo que provoca su ca铆da. En una cadena compleja de llamadas, un fallo de este tipo puede desencadenar una cascada, provocando una interrupci贸n importante.
- Corrupci贸n Silenciosa de Datos: Quiz谩s m谩s peligroso que una ca铆da ruidosa es un fallo silencioso. Si un servicio recibe un valor nulo donde esperaba un n煤mero y lo establece por defecto a `0`, podr铆a continuar con un c谩lculo incorrecto. Esto puede corromper registros de bases de datos, llevar a informes financieros err贸neos o afectar los datos del usuario sin que nadie se d茅 cuenta durante semanas o meses.
- Mayor Fricci贸n en el Desarrollo: Cuando los contratos no son expl铆citos, los equipos se ven obligados a recurrir a la programaci贸n defensiva. Agregan una l贸gica de validaci贸n excesiva, comprobaciones de nulos y manejo de errores para cada posible malformaci贸n de datos. Esto hincha la base de c贸digo y ralentiza el desarrollo de funciones.
- Depuraci贸n Excruciante: Rastrear un error causado por una desincronizaci贸n de datos entre servicios es una pesadilla. Requiere coordinar registros de m煤ltiples sistemas, analizar el tr谩fico de red y a menudo implica culparse mutuamente entre equipos ("隆Tu servicio envi贸 datos incorrectos!" "隆No, tu servicio no puede procesarlos correctamente!").
- Erosi贸n de la Confianza y la Velocidad: En un entorno de microservicios, los equipos deben poder confiar en las API proporcionadas por otros equipos. Sin contratos garantizados, esta confianza se rompe. La integraci贸n se convierte en un proceso lento y doloroso de prueba y error, destruyendo la agilidad que prometen ofrecer los microservicios.
Pilares de la Seguridad de Tipos Arquitect贸nica
Lograr la seguridad de tipos en todo el sistema no se trata de encontrar una 煤nica herramienta m谩gica. Se trata de adoptar un conjunto de principios centrales y hacerlos cumplir con los procesos y tecnolog铆as adecuados. Estos cuatro pilares son la base de una arquitectura robusta y con tipos seguros.
Principio 1: Contratos de Datos Expl铆citos y Obligatorios
La piedra angular de la seguridad de tipos arquitect贸nica es el contrato de datos. Un contrato de datos es un acuerdo formal y legible por m谩quina que describe la estructura, los tipos de datos y las restricciones de los datos intercambiados entre sistemas. Esta es la 煤nica fuente de verdad a la que deben adherirse todas las partes comunicantes.
En lugar de confiar en documentaci贸n informal o en el boca a boca, los equipos utilizan tecnolog铆as espec铆ficas para definir estos contratos:
- OpenAPI (anteriormente Swagger): El est谩ndar de la industria para definir APIs RESTful. Describe puntos finales, cuerpos de solicitud/respuesta, par谩metros y m茅todos de autenticaci贸n en formato YAML o JSON.
- Protocol Buffers (Protobuf): Un mecanismo independiente del lenguaje y de la plataforma para serializar datos estructurados, desarrollado por Google. Utilizado con gRPC, proporciona una comunicaci贸n RPC altamente eficiente y fuertemente tipada.
- GraphQL Schema Definition Language (SDL): Una forma potente de definir los tipos y las capacidades de un grafo de datos. Permite a los clientes solicitar exactamente los datos que necesitan, con todas las interacciones validadas contra el esquema.
- Apache Avro: Un sistema de serializaci贸n de datos popular, especialmente en el ecosistema de big data y orientado a eventos (por ejemplo, con Apache Kafka). Sobresale en la evoluci贸n de esquemas.
- JSON Schema: Un vocabulario que le permite anotar y validar documentos JSON, asegurando que se ajusten a reglas espec铆ficas.
Principio 2: Dise帽o Orientado al Esquema (Schema-First)
Una vez que se compromete a utilizar contratos de datos, la siguiente decisi贸n cr铆tica es cu谩ndo crearlos. Un enfoque orientado al esquema dicta que dise帽e y acuerde el contrato de datos antes de escribir una sola l铆nea de c贸digo de implementaci贸n.
Esto contrasta con un enfoque orientado al c贸digo (code-first), donde los desarrolladores escriben su c贸digo (por ejemplo, clases de Java) y luego generan un esquema a partir de 茅l. Si bien el enfoque orientado al c贸digo puede ser m谩s r谩pido para la creaci贸n inicial de prototipos, el enfoque orientado al esquema ofrece ventajas significativas en un entorno multiequipo y multilinguaje:
- Fuerza la Alineaci贸n entre Equipos: El esquema se convierte en el artefacto principal para la discusi贸n y revisi贸n. Los equipos de frontend, backend, m贸vil y QA pueden analizar el contrato propuesto y proporcionar comentarios antes de que se desperdicie cualquier esfuerzo de desarrollo.
- Permite el Desarrollo Paralelo: Una vez que el contrato se finaliza, los equipos pueden trabajar en paralelo. El equipo de frontend puede crear componentes de interfaz de usuario contra un servidor simulado generado a partir del esquema, mientras que el equipo de backend implementa la l贸gica de negocio. Esto reduce dr谩sticamente el tiempo de integraci贸n.
- Colaboraci贸n Agn贸stica al Lenguaje: El esquema es el lenguaje universal. Un equipo de Python y un equipo de Go pueden colaborar de manera efectiva centr谩ndose en la definici贸n de Protobuf u OpenAPI, sin necesidad de comprender las complejidades de las bases de c贸digo de cada uno.
- Mejora del Dise帽o de API: Dise帽ar el contrato de forma aislada de la implementaci贸n a menudo conduce a API m谩s limpias y centradas en el usuario. Anima a los arquitectos a pensar en la experiencia del consumidor en lugar de simplemente exponer los modelos de bases de datos internos.
Principio 3: Validaci贸n Automatizada y Generaci贸n de C贸digo
Un esquema no es solo documentaci贸n; es un activo ejecutable. El verdadero poder de un enfoque orientado al esquema se realiza a trav茅s de la automatizaci贸n.
Generaci贸n de C贸digo: Las herramientas pueden analizar su definici贸n de esquema y generar autom谩ticamente una gran cantidad de c贸digo repetitivo:
- Stubs de Servidor: Genera la interfaz y las clases de modelo para su servidor, para que los desarrolladores solo necesiten completar la l贸gica de negocio.
- SDKs de Cliente: Genera bibliotecas cliente completamente tipadas en varios idiomas (TypeScript, Java, Python, Go, etc.). Esto significa que un consumidor puede llamar a su API con autocompletado y comprobaciones en tiempo de compilaci贸n, eliminando toda una clase de errores de integraci贸n.
- Objetos de Transferencia de Datos (DTOs): Crea objetos de datos inmutables que coinciden perfectamente con el esquema, asegurando la consistencia dentro de su aplicaci贸n.
Validaci贸n en Tiempo de Ejecuci贸n: Puede utilizar el mismo esquema para hacer cumplir el contrato en tiempo de ejecuci贸n. Las pasarelas de API o el middleware pueden interceptar autom谩ticamente las solicitudes entrantes y las respuestas salientes, valid谩ndolas contra el esquema OpenAPI. Si una solicitud no cumple, se rechaza de inmediato con un error claro, evitando que datos inv谩lidos lleguen a su l贸gica de negocio.
Principio 4: Registro Centralizado de Esquemas
En un sistema peque帽o con un pu帽ado de servicios, la gesti贸n de esquemas se puede hacer manteni茅ndolos en un repositorio compartido. Pero a medida que una organizaci贸n escala a docenas o cientos de servicios, esto se vuelve insostenible. Un Registro de Esquemas es un servicio centralizado y dedicado para almacenar, versionar y distribuir sus contratos de datos.
Las funciones clave de un registro de esquemas incluyen:
- Una 脷nica Fuente de Verdad: Es la ubicaci贸n definitiva para todos los esquemas. Ya no hay que preguntarse qu茅 versi贸n del esquema es la correcta.
- Versionado y Evoluci贸n: Gestiona diferentes versiones de un esquema y puede hacer cumplir reglas de compatibilidad. Por ejemplo, puede configurarlo para que rechace cualquier nueva versi贸n de esquema que no sea compatible con versiones anteriores, evitando que los desarrolladores implementen accidentalmente un cambio que rompe la compatibilidad.
- Descubribilidad: Proporciona un cat谩logo navegable y buscable de todos los contratos de datos en la organizaci贸n, lo que facilita a los equipos encontrar y reutilizar modelos de datos existentes.
El Registro de Esquemas de Confluent es un ejemplo conocido en el ecosistema de Kafka, pero se pueden implementar patrones similares para cualquier tipo de esquema.
De la Teor铆a a la Pr谩ctica: Implementando Arquitecturas con Tipos Seguros
Exploremos c贸mo aplicar estos principios utilizando patrones y tecnolog铆as arquitect贸nicas comunes.
Seguridad de Tipos en APIs RESTful con OpenAPI
Las API REST con cargas 煤tiles JSON son el caballo de batalla de la web, pero su flexibilidad inherente puede ser una fuente importante de problemas relacionados con los tipos. OpenAPI aporta disciplina a este mundo.
Escenario de Ejemplo: Un `UserService` necesita exponer un punto final para obtener un usuario por su ID.
Paso 1: Definir el Contrato OpenAPI (por ejemplo, `user-api.v1.yaml`)
openapi: 3.0.0
info:
title: User Service API
version: 1.0.0
paths:
/users/{userId}:
get:
summary: Get user by ID
parameters:
- name: userId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: A single user
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'404':
description: User not found
components:
schemas:
User:
type: object
required:
- id
- email
- createdAt
properties:
id:
type: string
format: uuid
email:
type: string
format: email
firstName:
type: string
lastName:
type: string
createdAt:
type: string
format: date-time
Paso 2: Automatizar y Hacer Cumplir
- Generaci贸n de Cliente: Un equipo de frontend puede utilizar una herramienta como `openapi-typescript-codegen` para generar un cliente de TypeScript. La llamada se ver铆a as铆: `const user: User = await apiClient.getUserById('...')`. El tipo `User` se genera autom谩ticamente, por lo que si intentan acceder a `user.userName` (que no existe), el compilador de TypeScript generar谩 un error.
- Validaci贸n en el Lado del Servidor: Un backend Java que utiliza un framework como Spring Boot puede usar una biblioteca para validar autom谩ticamente las solicitudes entrantes contra este esquema. Si llega una solicitud con un `userId` que no es un UUID, el framework la rechaza con un `400 Bad Request` antes de que el c贸digo de su controlador se ejecute siquiera.
Logrando Contratos de Hierro con gRPC y Protocol Buffers
Para la comunicaci贸n interservicios de alto rendimiento y uso interno, gRPC con Protobuf es una opci贸n superior para la seguridad de tipos.
Paso 1: Definir el Contrato de Protobuf (por ejemplo, `user_service.proto`)
syntax = "proto3";
package user.v1;
import "google/protobuf/timestamp.proto";
service UserService {
rpc GetUser(GetUserRequest) returns (User);
}
message GetUserRequest {
string user_id = 1; // Los n煤meros de campo son cruciales para la evoluci贸n
}
message User {
string id = 1;
string email = 2;
string first_name = 3;
string last_name = 4;
google.protobuf.Timestamp created_at = 5;
}
Paso 2: Generar C贸digo
Usando el compilador `protoc`, puede generar c贸digo tanto para el cliente como para el servidor en docenas de idiomas. Un servidor Go obtendr谩 estructuras fuertemente tipadas y una interfaz de servicio para implementar. Un cliente Python obtendr谩 una clase que realiza la llamada RPC y devuelve un objeto `User` completamente tipado.
El beneficio clave aqu铆 es que el formato de serializaci贸n es binario y est谩 estrechamente acoplado al esquema. Es pr谩cticamente imposible enviar una solicitud mal formada que el servidor intente siquiera analizar. La seguridad de tipos se aplica en m煤ltiples capas: el c贸digo generado, el framework gRPC y el formato de red binario.
Flexible pero Seguro: Sistemas de Tipos en GraphQL
El poder de GraphQL reside en su esquema fuertemente tipado. Toda la API se describe en el SDL de GraphQL, que act煤a como el contrato entre el cliente y el servidor.
Paso 1: Definir el Esquema GraphQL
type Query {
user(id: ID!): User
}
type User {
id: ID!
email: String!
firstName: String
lastName: String
createdAt: String! # T铆picamente una cadena ISO 8601
}
Paso 2: Aprovechar las Herramientas
Los clientes GraphQL modernos (como Apollo Client o Relay) utilizan un proceso llamado "introspecci贸n" para obtener el esquema del servidor. Luego, utilizan este esquema durante el desarrollo para:
- Validar Consultas: Si un desarrollador escribe una consulta que solicita un campo que no existe en el tipo `User`, su IDE o una herramienta de paso de compilaci贸n lo marcar谩n inmediatamente como un error.
- Generar Tipos: Las herramientas pueden generar tipos TypeScript o Swift para cada consulta, asegurando que los datos recibidos de la API est茅n completamente tipados en la aplicaci贸n cliente.
Seguridad de Tipos en Arquitecturas As铆ncronas y Orientadas a Eventos (EDA)
La seguridad de tipos es, argumentablemente, m谩s cr铆tica y desafiante en sistemas orientados a eventos. Los productores y consumidores est谩n completamente desacoplados; pueden ser desarrollados por diferentes equipos y desplegados en diferentes momentos. Una carga 煤til de evento inv谩lida puede envenenar un tema y hacer que todos los consumidores fallen.
Aqu铆 es donde un registro de esquemas combinado con un formato como Apache Avro brilla.
Escenario: Un `UserService` produce un evento `UserSignedUp` en un tema de Kafka cuando se registra un nuevo usuario. Un `EmailService` consume este evento para enviar un correo de bienvenida.
Paso 1: Definir el Esquema Avro (`UserSignedUp.avsc`)
{
"type": "record",
"namespace": "com.example.events",
"name": "UserSignedUp",
"fields": [
{ "name": "userId", "type": "string" },
{ "name": "email", "type": "string" },
{ "name": "timestamp", "type": "long", "logicalType": "timestamp-millis" }
]
}
Paso 2: Utilizar un Registro de Esquemas
- El `UserService` (productor) registra este esquema en el Registro de Esquemas central, que le asigna un ID 煤nico.
- Al producir un mensaje, el `UserService` serializa los datos del evento utilizando el esquema Avro y antepone el ID del esquema a la carga 煤til del mensaje antes de enviarlo a Kafka.
- El `EmailService` (consumidor) recibe el mensaje. Lee el ID del esquema de la carga 煤til, recupera el esquema correspondiente del Registro de Esquemas (si no lo tiene en cach茅) y luego utiliza ese esquema exacto para deserializar de forma segura el mensaje.
Este proceso garantiza que el consumidor siempre est茅 utilizando el esquema correcto para interpretar los datos, incluso si el productor se ha actualizado con una nueva versi贸n compatible con versiones anteriores del esquema.
Dominando la Seguridad de Tipos: Conceptos Avanzados y Mejores Pr谩cticas
Gesti贸n de la Evoluci贸n y Versionado de Esquemas
Los sistemas no son est谩ticos. Los contratos deben evolucionar. La clave es gestionar esta evoluci贸n sin romper los clientes existentes. Esto requiere comprender las reglas de compatibilidad:
- Compatibilidad con Versiones Anteriores (Backward Compatibility): El c贸digo escrito contra una versi贸n anterior del esquema a煤n puede procesar correctamente los datos escritos con una versi贸n m谩s reciente. Ejemplo: Agregar un campo nuevo y opcional. Los consumidores antiguos simplemente ignorar谩n el nuevo campo.
- Compatibilidad con Versiones Futuras (Forward Compatibility): El c贸digo escrito contra una versi贸n m谩s reciente del esquema a煤n puede procesar correctamente los datos escritos con una versi贸n anterior. Ejemplo: Eliminar un campo opcional. Los nuevos consumidores est谩n escritos para manejar su ausencia.
- Compatibilidad Total: El cambio es compatible tanto con versiones anteriores como futuras.
- Cambio que Rompe la Compatibilidad (Breaking Change): Un cambio que no es compatible con versiones anteriores ni futuras. Ejemplo: Renombrar un campo requerido o cambiar su tipo de datos.
Los cambios que rompen la compatibilidad son inevitables, pero deben gestionarse mediante un versionado expl铆cito (por ejemplo, creando una `v2` de su API o evento) y una pol铆tica de deprecaci贸n clara.
El Papel del An谩lisis Est谩tico y el Linting
Al igual que aplicamos linting a nuestro c贸digo fuente, deber铆amos aplicar linting a nuestros esquemas. Herramientas como Spectral para OpenAPI o Buf para Protobuf pueden aplicar gu铆as de estilo y mejores pr谩cticas a sus contratos de datos. Esto puede incluir:
- Aplicar convenciones de nomenclatura (por ejemplo, `camelCase` para campos JSON).
- Asegurar que todas las operaciones tengan descripciones y etiquetas.
- Se帽alar cambios que rompen la compatibilidad.
- Requerir ejemplos para todos los esquemas.
El linting detecta fallos de dise帽o e inconsistencias en una etapa temprana del proceso, mucho antes de que se arraiguen en el sistema.
Integraci贸n de la Seguridad de Tipos en Pipelines de CI/CD
Para que la seguridad de tipos sea verdaderamente efectiva, debe automatizarse e integrarse en su flujo de trabajo de desarrollo. Su pipeline de CI/CD es el lugar perfecto para hacer cumplir sus contratos:
- Paso de Linting: En cada pull request, ejecute el linter de esquemas. Falle la compilaci贸n si el contrato no cumple los est谩ndares de calidad.
- Comprobaci贸n de Compatibilidad: Cuando se cambia un esquema, utilice una herramienta para verificar su compatibilidad con la versi贸n actualmente en producci贸n. Bloquee autom谩ticamente cualquier pull request que introduzca un cambio que rompa la compatibilidad con una API `v1`.
- Paso de Generaci贸n de C贸digo: Como parte del proceso de compilaci贸n, ejecute autom谩ticamente las herramientas de generaci贸n de c贸digo para actualizar los stubs del servidor y los SDKs del cliente. Esto garantiza que el c贸digo y el contrato est茅n siempre sincronizados.
Fomentar una Cultura de Desarrollo Orientado al Contrato (Contract-First)
En 煤ltima instancia, la tecnolog铆a es solo la mitad de la soluci贸n. Lograr la seguridad de tipos arquitect贸nica requiere un cambio cultural. Significa tratar sus contratos de datos como ciudadanos de primera clase de su arquitectura, tan importantes como el propio c贸digo.
- Haga de las revisiones de API una pr谩ctica est谩ndar, al igual que las revisiones de c贸digo.
- Empodere a los equipos para que rechacen contratos mal dise帽ados o incompletos.
- Invierta en documentaci贸n y herramientas que faciliten a los desarrolladores el descubrimiento, la comprensi贸n y el uso de los contratos de datos del sistema.
Conclusi贸n: Construyendo Sistemas Resilientes y Mantenibles
La Seguridad de Tipos en el Dise帽o de Sistemas no se trata de a帽adir burocracia restrictiva. Se trata de eliminar proactivamente una categor铆a masiva de errores complejos, costosos y dif铆ciles de diagnosticar. Al trasladar la detecci贸n de errores del tiempo de ejecuci贸n en producci贸n al tiempo de dise帽o y construcci贸n en el desarrollo, crea un potente bucle de retroalimentaci贸n que da como resultado sistemas m谩s resilientes, fiables y mantenibles.
Al adoptar contratos de datos expl铆citos, adoptar una mentalidad orientada al esquema y automatizar la validaci贸n a trav茅s de su pipeline de CI/CD, no solo est谩 conectando servicios; est谩 construyendo un sistema cohesivo, predecible y escalable donde los componentes pueden colaborar y evolucionar con confianza. Comience por elegir una API cr铆tica en su ecosistema. Defina su contrato, genere un cliente tipado para su consumidor principal y cree comprobaciones automatizadas. La estabilidad y la velocidad de desarrollo que gane ser谩n el catalizador para expandir esta pr谩ctica en toda su arquitectura.