Ir al contenido
wannacode

El panorama de la empresa y sus capacidades

En resumen: Un mapa de capacidades describe qué hace el negocio, sin depender de sus sistemas; unido a las aplicaciones muestra huecos y duplicaciones, y el modelo TIME dice en qué invertir.

Problema

Tres sistemas para las facturas y ninguno para las devoluciones

La tienda lleva cinco años creciendo. Con cada pedido, la tienda emite una factura por sí misma. Contabilidad compra su propio sistema y emite las facturas de las empresas. Después marketing paga un SaaS de facturas para las suscripciones, porque «era más rápido».

La directora financiera pregunta por qué las facturas tienen tres numeraciones. Mientras tanto, atención al cliente lleva las devoluciones en correos y en una hoja de cálculo, y el contador copia cada devolución a mano.

Cada equipo conoce su propio sistema. Nadie ve el conjunto.

La idea

Qué hace el negocio, no qué sistemas tiene

La arquitectura empresarial mira toda la empresa: todos los sistemas, cómo se conectan y para qué sirven. No empieza por los sistemas, sino por las capacidades: lo que hace el negocio. Vende, factura, envía, recibe devoluciones. Eso cambia poco. Los sistemas, los departamentos y los proveedores se reemplazan, y la tienda sigue facturando diez años después.

Un mapa de capacidades las ordena en grupos, normalmente en una sola página:

static readonly Group[] Map =
[
new("Ventas", ["Catálogo", "Carrito", "Pedidos"]),
new("Finanzas", ["Pagos", "Facturación", "Contabilidad"]),
new("Logística", ["Almacén", "Envío", "Devoluciones"]),
new("Clientes", ["Notificaciones", "Soporte"]),
];
static readonly App[] Apps =
[
new("Tienda", ["Catálogo", "Carrito", "Pedidos", "Facturación"]),
new("Almacén 2009", ["Almacén"]),
new("Sistema de contabilidad", ["Contabilidad", "Facturación"]),
new("SaaS de facturas", ["Facturación"]),
new("Proveedor de pagos", ["Pagos"]),
new("Mensajero", ["Envío"]),
new("Servicio de correo", ["Notificaciones"]),
new("Helpdesk", ["Soporte"]),
];
record Group(string Name, string[] Capabilities);
record App(string Name, string[] Capabilities);

Debajo del mapa cuelgas las aplicaciones: para cada capacidad, qué sistemas la respaldan. Entonces aparecen dos cosas que de otro modo son invisibles:

  • un hueco: una capacidad sin sistema; la gente la hace a mano;
  • una duplicación: una capacidad con varios sistemas; pagas varias veces y tienes varias versiones de la verdad.

Míralo

El mapa, coloreado por cobertura

// los sistemas que respaldan la capacidad
static List<string> AppsFor(string cap,
IEnumerable<App> apps) =>
apps.Where(a => a.Capabilities.Contains(cap))
.Select(a => a.Name)
.ToList();
static string Coverage(List<string> names)
{
if (names.Count == 0)
return "✗ sin sistema";
if (names.Count > 1)
return $"⚠ {names.Count} sistemas: "
+ string.Join(", ", names);
return names[0];
}
Paso a paso, en palabras
  1. El mapa de capacidades: lo que hace el negocio, en grupos. Todavía sin ningún sistema.
  2. Las 8 aplicaciones llegan una por una. Cada una dice qué capacidades respalda, y los contadores crecen.
  3. Una capacidad con exactamente un sistema está cubierta: verde.
  4. Facturación: lo hacen 3 sistemas. Tres licencias, tres numeraciones de facturas, tres lugares donde corregir.
  5. Devoluciones: ningún sistema. La gente las lleva en correos y hojas de cálculo.
  6. El mapa coloreado por cobertura: 1 hueco y 1 duplicación. De aquí parte el estado objetivo.
// los sistemas que respaldan la capacidad
static List<string> AppsFor(string cap,
IEnumerable<App> apps) =>
apps.Where(a => a.Capabilities.Contains(cap))
.Select(a => a.Name)
.ToList();
static string Coverage(List<string> names)
{
if (names.Count == 0)
return "✗ sin sistema";
if (names.Count > 1)
return $"⚠ {names.Count} sistemas: "
+ string.Join(", ", names);
return names[0];
}
static void PrintMap(IEnumerable<Group> map, IEnumerable<App> apps)
{
int gaps = 0, duplicated = 0;
foreach (var group in map)
{
Console.WriteLine(group.Name);
foreach (var capability in group.Capabilities)
{
var names = AppsFor(capability, apps);
if (names.Count == 0) gaps++;
if (names.Count > 1) duplicated++;
Console.WriteLine($" {capability}: {Coverage(names)}");
}
}
Console.WriteLine($"Huecos: {gaps}, duplicadas: {duplicated}");
}
PrintMap(Map, Apps);
Salida
Ventas
Catálogo: Tienda
Carrito: Tienda
Pedidos: Tienda
Finanzas
Pagos: Proveedor de pagos
Facturación: ⚠ 3 sistemas: Tienda, Sistema de contabilidad, SaaS de facturas
Contabilidad: Sistema de contabilidad
Logística
Almacén: Almacén 2009
Envío: Mensajero
Devoluciones: ✗ sin sistema
Clientes
Notificaciones: Servicio de correo
Soporte: Helpdesk
Huecos: 1, duplicadas: 1
El mapa y las aplicaciones son arreglos de record. Usamos arreglos y no un Dictionary: el orden de un Dictionary es en la práctica el de inserción, pero no está garantizado.

El programa es pequeño, pero el trabajo de verdad está en los datos: qué cuenta como una capacidad aparte y qué hace realmente cada sistema. Eso se averigua hablando con los equipos, no con código.

Pruébalo

Completa

¿Cómo compruebas que la aplicación respalda la capacidad?

apps.Where(a => a.Capabilities.(cap))

La idea

Portafolio de aplicaciones: TIME

El mapa dice dónde está el problema. El portafolio de aplicaciones dice qué hacer con cada sistema. De cada uno anotas cuánto cuesta al año y dos puntuaciones de 1 a 5:

  • valor para el negocio: cuánto lo necesita el negocio;
  • estado técnico: qué tan sano está por dentro (si se mantiene, si hay gente que lo conoce, cuántas veces se cae).

Las dos puntuaciones dan cuatro decisiones, conocidas como el modelo TIME (Gartner):

técnicamente sano técnicamente enfermo
valioso para el negocio Invest Migrate
de poco valor Tolerate Eliminate
record Rating(string App, int CostPerYear, int Business, int Technical);
// TIME: ¿vale mucho para el negocio y está sano por dentro?
static string Decide(Rating r)
{
bool valuable = r.Business >= 3;
bool healthy = r.Technical >= 3;
if (valuable && healthy) return "invertir";
if (valuable) return "migrar";
if (healthy) return "tolerar";
return "eliminar";
}

Los precios de abajo son ejemplos, y las puntuaciones son las del equipo.

List<Rating> ratings =
[
new Rating("Tienda", 60000, 5, 3),
new Rating("Almacén 2009", 18000, 4, 1),
new Rating("Sistema de contabilidad", 24000, 4, 4),
new Rating("SaaS de facturas", 9600, 2, 2),
new Rating("Helpdesk", 4800, 2, 4),
];
int total = 0, saved = 0;
foreach (var r in ratings)
{
var decision = Decide(r);
Console.WriteLine($"{r.App}: {decision} (negocio {r.Business}, técnica {r.Technical})");
total += r.CostPerYear;
if (decision == "eliminar") saved += r.CostPerYear;
}
Console.WriteLine($"Al año: {total} €, quitas {saved} €");
Salida
Tienda: invertir (negocio 5, técnica 3)
Almacén 2009: migrar (negocio 4, técnica 1)
Sistema de contabilidad: invertir (negocio 4, técnica 4)
SaaS de facturas: eliminar (negocio 2, técnica 2)
Helpdesk: tolerar (negocio 2, técnica 4)
Al año: 116400 €, quitas 9600 €

TIME no es un veredicto, sino el comienzo de una conversación. «Tolerate» significa «no gastes en eso», no «olvídalo»: el Helpdesk funciona y no estorba. «Eliminate» necesita una fecha y un plan, o la aplicación vive cinco años más.

Pruébalo

Predice la salida

La app móvil trae la mitad de los pedidos (negocio 4), pero está escrita sobre un framework que ya no se mantiene (técnica 2). ¿Qué dice decide?

Console.WriteLine(Decide(new Rating("App móvil", 30000, 4, 2)));
Respuesta

Pruébalo

Encuentra el error

Un colega escribió decide con copiar y pegar. Ahora el portafolio dice:

Salida
Tienda: invertir (negocio 5, técnica 3)
Almacén 2009: invertir (negocio 4, técnica 1)
Sistema de contabilidad: invertir (negocio 4, técnica 4)
SaaS de facturas: eliminar (negocio 2, técnica 2)
Helpdesk: eliminar (negocio 2, técnica 4)
Al año: 116400 €, quitas 14400 €

De pronto el Almacén 2009 pasa a recibir inversión y el Helpdesk va a eliminarse. ¿En qué línea está el error?

Elige la línea con el error.

La idea

Estado objetivo y hoja de ruta

El mapa y el portafolio dan el estado objetivo: cómo debería verse el panorama dentro de uno o dos años. Para la tienda:

  • las facturas están solo en el sistema de contabilidad, con una sola numeración; el SaaS de facturas se va (eliminate), y el módulo de facturas de la tienda se apaga;
  • el almacén se reemplaza (migrate) por uno nuevo que también respalda las devoluciones: el hueco se cierra donde está la mercancía;
  • todo lo demás se queda.

La hoja de ruta es el orden de los pasos para llegar ahí, con estados intermedios que funcionan:

  1. el almacén nuevo se encarga de las devoluciones, y el viejo se queda con la mercancía; la conexión con el Almacén 2009 pasa por una anti-corruption layer, para que su CSV no se filtre al código nuevo;
  2. la mercancía pasa poco a poco al almacén nuevo, como en «Cambiar un sistema en marcha (Strangler Fig, Expand–Contract)», hasta que el Almacén 2009 se queda sin tráfico;
  3. las facturas de la tienda pasan al sistema de contabilidad; la numeración cambia con el año nuevo, para que quede claro a los contadores;
  4. la suscripción al SaaS se cancela después de la última factura emitida en él.

Cada paso es una decisión aparte con un ADR, su propio costo y sus propios riesgos en el registro. El orden se elige por el dolor y por las dependencias: las devoluciones van primero, porque hoy ahí se pierde dinero.

Más precisamente, para curiosos

Los frameworks. TOGAF es el framework de arquitectura empresarial más conocido: describe un método (ADM) para estos pasos y muchos documentos. ArchiMate es un lenguaje para diagramas del panorama, y Zachman es una tabla para clasificar las descripciones. Aquí solo los nombramos: el curso enseña el trabajo, y la certificación es otro camino.

Capacidad, proceso y departamento. Una capacidad es el «qué» (facturar). Un proceso es el «cómo», en pasos (pedido → factura → pago). Un departamento es el «quién». El mapa se hace con capacidades porque son lo que menos cambia.

Las herramientas. Las empresas grandes llevan el portafolio en herramientas de EA específicas o en una CMDB. Una empresa pequeña lo lleva en una hoja de cálculo. Lo que importa es que sea un solo lugar y que se mantenga al día.

La idea

Cuándo ayuda y cuándo es burocracia

La arquitectura empresarial ayuda cuando:

  • los sistemas son decenas y nadie los tiene todos en la cabeza;
  • la empresa se fusiona con otra y debe decidir qué sistema se queda;
  • el gasto en software crece y nadie sabe por qué se paga;
  • un regulador pregunta dónde están los datos de los clientes.

Hace daño cuando:

  • el mapa es el objetivo. Dibujado, impreso y olvidado. Un mapa con el que nunca se tomó una decisión es decoración.
  • un comité aprueba cada biblioteca. Las decisiones que un equipo puede revertir por sí solo se quedan con el equipo. Solo se decide de forma central lo que es caro para toda la empresa: la identidad compartida, los pagos, los datos de los clientes.
  • la empresa es pequeña. Tres sistemas y un equipo no necesitan un framework: basta una tabla de una página y los ADR.
  • el framework sustituye a la conversación. Los documentos del framework no son el trabajo. El trabajo es la decisión que sale de ellos.

Ejercicio

El estado objetivo

Resuelve este ejercicio en tu editor.

Escribe el estado objetivo como una lista nueva de aplicaciones: la tienda ya no factura, el SaaS de facturas desaparece, y el Almacén 2009 se reemplaza por un «Almacén nuevo» que respalda el almacén y las devoluciones. Ejecuta sobre ella la misma comprobación de cobertura:

Salida
Ventas
Catálogo: Tienda
Carrito: Tienda
Pedidos: Tienda
Finanzas
Pagos: Proveedor de pagos
Facturación: Sistema de contabilidad
Contabilidad: Sistema de contabilidad
Logística
Almacén: Almacén nuevo
Envío: Mensajero
Devoluciones: Almacén nuevo
Clientes
Notificaciones: Servicio de correo
Soporte: Helpdesk
Huecos: 0, duplicadas: 0

Más ejercicios

  • Una fitness function para el panorama. Convierte la comprobación en una prueba que falle si hay un hueco o una duplicación sin decisión registrada (una lista de duplicaciones permitidas con sus motivos).
  • El costo de la duplicación. Añade el costo de cada aplicación e imprime cuánto cuestan al año todos los sistemas de las capacidades duplicadas.
  • Dos países. La tienda arranca en Grecia con un mensajero local. ¿Son dos sistemas de envío una infracción? ¿Cómo lo muestras en el mapa?

Test

Ponte a prueba

1. ¿Qué es una capacidad?
2. Una capacidad que respaldan tres sistemas es…
3. El Almacén 2009 importa al negocio (4), pero está en mal estado técnico (1). ¿Qué dice TIME?
4. ¿Cuándo es burocracia un mapa de capacidades?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·