Zum Inhalt
wannacode

Die Unternehmenslandschaft und ihre Capabilities

Kurz gesagt: Eine Capability-Map beschreibt, was das Business tut, unabhängig von seinen Systemen; mit den Anwendungen verbunden zeigt sie Lücken und Doppelungen, und das TIME-Modell sagt, worin du investierst.

Problem

Drei Systeme für Rechnungen und keins für Retouren

Der Shop wächst seit fünf Jahren. Bei jeder Bestellung stellt der Shop selbst eine Rechnung aus. Die Buchhaltung kauft ein eigenes System und stellt Rechnungen für Firmenkunden aus. Dann zahlt das Marketing für die Abos einen Rechnungs-SaaS, weil es „schneller ging“.

Die Finanzchefin fragt, warum die Rechnungen drei Nummerierungen haben. Währenddessen führt der Kundenservice die Retouren in E-Mails und einer Tabelle, und der Buchhalter kopiert jede Retoure von Hand.

Jedes Team kennt sein eigenes System. Niemand sieht das Ganze.

Die Idee

Was das Business tut, nicht welche Systeme es hat

Die Enterprise-Architektur schaut auf die ganze Firma: alle Systeme, wie sie zusammenhängen und wofür sie da sind. Sie beginnt nicht bei den Systemen, sondern bei den Capabilities: was das Business tut. Es verkauft, stellt Rechnungen, liefert, nimmt Retouren an. Das ändert sich selten. Systeme, Abteilungen und Lieferanten werden ersetzt, und der Shop stellt auch zehn Jahre später noch Rechnungen.

Eine Capability-Map ordnet sie in Gruppen, meist auf einer Seite:

const MAP = [
["Vertrieb", ["Katalog", "Warenkorb", "Bestellungen"]],
["Finanzen", ["Zahlungen", "Rechnungsstellung", "Buchhaltung"]],
["Logistik", ["Lager", "Lieferung", "Retouren"]],
["Kunden", ["Benachrichtigungen", "Support"]],
];
const APPS = [
["Shop", ["Katalog", "Warenkorb", "Bestellungen", "Rechnungsstellung"]],
["Lager 2009", ["Lager"]],
["Buchhaltungssystem", ["Buchhaltung", "Rechnungsstellung"]],
["Rechnungs-SaaS", ["Rechnungsstellung"]],
["Zahlungsanbieter", ["Zahlungen"]],
["Kurier", ["Lieferung"]],
["E-Mail-Dienst", ["Benachrichtigungen"]],
["Helpdesk", ["Support"]],
];

Unter die Map hängst du die Anwendungen: für jede Capability, welche Systeme sie unterstützen. Dann zeigen sich zwei Dinge, die sonst unsichtbar sind:

  • eine Lücke: eine Capability ohne System; die Leute machen es von Hand;
  • eine Doppelung: eine Capability mit mehreren Systemen; du zahlst mehrfach und hast mehrere Versionen der Wahrheit.

Sieh es dir an

Die Map, eingefärbt nach Abdeckung

// die Systeme, die die Capability unterstützen
function appsFor(cap, apps) {
return apps
.filter(([, caps]) => caps.includes(cap))
.map(([name]) => name);
}
function coverage(names) {
if (names.length === 0)
return "✗ kein System";
if (names.length > 1)
return "⚠ " + names.length + " Systeme: "
+ names.join(", ");
return names[0];
}
Schritt für Schritt, in Worten
  1. Die Capability-Map: was das Business tut, in Gruppen. Noch ohne ein einziges System.
  2. Die 8 Anwendungen kommen eine nach der anderen. Jede sagt, welche Capabilities sie unterstützt, und die Zähler wachsen.
  3. Eine Capability mit genau einem System ist abgedeckt: grün.
  4. Rechnungsstellung: 3 Systeme erledigen es. Drei Lizenzen, drei Rechnungsnummerierungen, drei Stellen für jede Korrektur.
  5. Retouren: überhaupt kein System. Die Leute führen sie in E-Mails und Tabellen.
  6. Die Map, eingefärbt nach Abdeckung: 1 Lücke und 1 Doppelung. Von hier aus beginnt der Zielzustand.
// die Systeme, die die Capability unterstützen
function appsFor(cap, apps) {
return apps
.filter(([, caps]) => caps.includes(cap))
.map(([name]) => name);
}
function coverage(names) {
if (names.length === 0)
return "✗ kein System";
if (names.length > 1)
return "⚠ " + names.length + " Systeme: "
+ names.join(", ");
return names[0];
}
function printMap(map, apps) {
let gaps = 0;
let duplicated = 0;
for (const [group, capabilities] of map) {
console.log(group);
for (const capability of capabilities) {
const names = appsFor(capability, apps);
if (names.length === 0) gaps++;
if (names.length > 1) duplicated++;
console.log(" " + capability + ": " + coverage(names));
}
}
console.log("Lücken: " + gaps + ", dupliziert: " + duplicated);
}
printMap(MAP, APPS);
Ausgabe
Vertrieb
Katalog: Shop
Warenkorb: Shop
Bestellungen: Shop
Finanzen
Zahlungen: Zahlungsanbieter
Rechnungsstellung: ⚠ 3 Systeme: Shop, Buchhaltungssystem, Rechnungs-SaaS
Buchhaltung: Buchhaltungssystem
Logistik
Lager: Lager 2009
Lieferung: Kurier
Retouren: ✗ kein System
Kunden
Benachrichtigungen: E-Mail-Dienst
Support: Helpdesk
Lücken: 1, dupliziert: 1
Die Map und die Anwendungen sind Arrays aus [Name, Liste]-Paaren, keine Objekte: So ist die Reihenfolge ausdrücklich die des Arrays.

Das Programm ist klein, aber die eigentliche Arbeit steckt in den Daten: was als eigene Capability zählt und was jedes System wirklich tut. Das erfährst du im Gespräch mit den Teams, nicht mit Code.

Probier es aus

Ergänze

Wie prüfst du, ob die Anwendung die Capability unterstützt?

apps.filter(([, caps]) => caps.(cap))

Die Idee

Anwendungsportfolio: TIME

Die Map zeigt, wo das Problem liegt. Das Anwendungsportfolio sagt, was du mit jedem System tun sollst. Für jedes hältst du fest, was es pro Jahr kostet, und zwei Bewertungen von 1 bis 5:

  • Wert für das Business: wie sehr das Business es braucht;
  • technischer Zustand: wie gesund es innen ist (wird es gepflegt, gibt es Leute, die es kennen, wie oft fällt es aus).

Aus den zwei Bewertungen ergeben sich vier Entscheidungen, bekannt als das TIME-Modell (Gartner):

technisch gesund technisch krank
wertvoll für das Business Invest Migrate
von geringem Wert Tolerate Eliminate
// TIME: Ist es dem Business viel wert, und ist es innen gesund
function decide(r) {
const valuable = r.business >= 3;
const healthy = r.technical >= 3;
if (valuable && healthy) return "investieren";
if (valuable) return "migrieren";
if (healthy) return "tolerieren";
return "abschaffen";
}

Die Preise unten sind Beispiele, und die Bewertungen stammen vom Team.

const ratings = [
{ app: "Shop", costPerYear: 60000, business: 5, technical: 3 },
{ app: "Lager 2009", costPerYear: 18000, business: 4, technical: 1 },
{ app: "Buchhaltungssystem", costPerYear: 24000, business: 4, technical: 4 },
{ app: "Rechnungs-SaaS", costPerYear: 9600, business: 2, technical: 2 },
{ app: "Helpdesk", costPerYear: 4800, business: 2, technical: 4 },
];
let total = 0;
let saved = 0;
for (const r of ratings) {
const decision = decide(r);
console.log(`${r.app}: ${decision} (Business ${r.business}, Technik ${r.technical})`);
total += r.costPerYear;
if (decision === "abschaffen") saved += r.costPerYear;
}
console.log(`Pro Jahr: ${total} €, du streichst ${saved} €`);
Ausgabe
Shop: investieren (Business 5, Technik 3)
Lager 2009: migrieren (Business 4, Technik 1)
Buchhaltungssystem: investieren (Business 4, Technik 4)
Rechnungs-SaaS: abschaffen (Business 2, Technik 2)
Helpdesk: tolerieren (Business 2, Technik 4)
Pro Jahr: 116400 €, du streichst 9600 €

TIME ist kein Urteil, sondern der Anfang eines Gesprächs. „Tolerate“ heißt „gib dafür nichts aus“, nicht „vergiss es“: Der Helpdesk läuft und steht nicht im Weg. „Eliminate“ braucht ein Datum und einen Plan, sonst lebt die Anwendung noch fünf Jahre weiter.

Probier es aus

Sage die Ausgabe voraus

Die mobile App bringt die Hälfte der Bestellungen (Business 4), ist aber auf einem Framework geschrieben, das nicht mehr gepflegt wird (Technik 2). Was sagt decide?

console.log(decide({ app: "Mobile App", costPerYear: 30000, business: 4, technical: 2 }));
Antwort

Probier es aus

Finde den Fehler

Ein Kollege hat decide mit Copy-and-paste geschrieben. Jetzt sagt das Portfolio:

Ausgabe
Shop: investieren (Business 5, Technik 3)
Lager 2009: investieren (Business 4, Technik 1)
Buchhaltungssystem: investieren (Business 4, Technik 4)
Rechnungs-SaaS: abschaffen (Business 2, Technik 2)
Helpdesk: abschaffen (Business 2, Technik 4)
Pro Jahr: 116400 €, du streichst 14400 €

Das Lager 2009 soll plötzlich Investitionen bekommen, und der Helpdesk soll abgeschafft werden. In welcher Zeile steckt der Fehler?

Wähle die Zeile mit dem Fehler.

Die Idee

Zielzustand und Roadmap

Die Map und das Portfolio ergeben den Zielzustand: wie die Landschaft in ein, zwei Jahren aussehen soll. Für den Shop:

  • Rechnungen gibt es nur im Buchhaltungssystem, mit einer Nummerierung; der Rechnungs-SaaS wird abgeschafft (eliminate), und das Rechnungsmodul im Shop wird abgeschaltet;
  • das Lager wird durch ein neues ersetzt (migrate), das auch Retouren unterstützt: Die Lücke wird dort geschlossen, wo die Ware liegt;
  • alles andere bleibt.

Die Roadmap ist die Reihenfolge der Schritte dorthin, mit Zwischenzuständen, die funktionieren:

  1. Das neue Lager übernimmt die Retouren, und das alte bleibt für die Ware; die Anbindung an das Lager 2009 läuft über einen Anti-corruption Layer, damit sein CSV nicht in den neuen Code durchsickert;
  2. die Ware zieht schrittweise ins neue Lager um, wie in „Ein laufendes System verändern (Strangler Fig, Expand–Contract)“, bis das Lager 2009 keinen Verkehr mehr hat;
  3. die Rechnungen des Shops wandern ins Buchhaltungssystem; die Nummerierung wechselt zum neuen Jahr, damit es für die Buchhalter klar ist;
  4. das SaaS-Abo wird nach der letzten Rechnung darin gekündigt.

Jeder Schritt ist eine eigene Entscheidung mit einem ADR, eigenen Kosten und eigenen Risiken im Register. Die Reihenfolge richtet sich nach Schmerz und Abhängigkeiten: Die Retouren kommen zuerst, weil dort heute Geld verloren geht.

Genauer, für Neugierige

Die Frameworks. TOGAF ist das bekannteste Framework für Enterprise-Architektur: Es beschreibt eine Methode (ADM) für diese Schritte und viele Dokumente. ArchiMate ist eine Sprache für Diagramme der Landschaft, und Zachman ist eine Tabelle zum Einordnen der Beschreibungen. Hier nennen wir sie nur: Der Kurs lehrt die Arbeit, und eine Zertifizierung ist ein eigener Weg.

Capability, Prozess und Abteilung. Eine Capability ist das „Was“ (Rechnungen stellen). Ein Prozess ist das „Wie“, in Schritten (Bestellung → Rechnung → Zahlung). Eine Abteilung ist das „Wer“. Die Map besteht aus Capabilities, weil sie sich am wenigsten ändern.

Die Werkzeuge. Große Firmen führen das Portfolio in eigenen EA-Werkzeugen oder in einer CMDB. Eine kleine Firma führt es in einer Tabelle. Wichtig ist, dass es ein einziger Ort ist und aktuell gehalten wird.

Die Idee

Wann es hilft und wann es Bürokratie ist

Enterprise-Architektur hilft, wenn:

  • es Dutzende Systeme gibt und niemand sie alle im Kopf hat;
  • die Firma mit einer anderen fusioniert und entscheiden muss, welches System bleibt;
  • die Ausgaben für Software wachsen und niemand weiß, wofür sie gezahlt werden;
  • eine Aufsichtsbehörde fragt, wo die Kundendaten liegen.

Sie schadet, wenn:

  • die Map das Ziel ist. Gezeichnet, gedruckt und vergessen. Eine Map, mit der nie eine Entscheidung getroffen wurde, ist Dekoration.
  • ein Gremium jede Bibliothek freigibt. Entscheidungen, die ein Team allein zurücknehmen kann, bleiben beim Team. Zentral wird nur entschieden, was für die ganze Firma teuer ist: gemeinsame Identität, Zahlungen, Kundendaten.
  • die Firma klein ist. Drei Systeme und ein Team brauchen kein Framework: Eine Tabelle auf einer Seite und ADRs reichen.
  • das Framework das Gespräch ersetzt. Die Dokumente des Frameworks sind nicht die Arbeit. Die Arbeit ist die Entscheidung, die daraus entsteht.

Übung

Der Zielzustand

Löse diese Aufgabe in deinem Editor.

Schreibe den Zielzustand als neue Liste von Anwendungen: Der Shop stellt keine Rechnungen mehr aus, der Rechnungs-SaaS ist weg, und das Lager 2009 ist durch ein „Neues Lager“ ersetzt, das das Lager und die Retouren unterstützt. Lass dieselbe Abdeckungsprüfung darüber laufen:

Ausgabe
Vertrieb
Katalog: Shop
Warenkorb: Shop
Bestellungen: Shop
Finanzen
Zahlungen: Zahlungsanbieter
Rechnungsstellung: Buchhaltungssystem
Buchhaltung: Buchhaltungssystem
Logistik
Lager: Neues Lager
Lieferung: Kurier
Retouren: Neues Lager
Kunden
Benachrichtigungen: E-Mail-Dienst
Support: Helpdesk
Lücken: 0, dupliziert: 0

Weitere Übungen

  • Eine Fitness Function für die Landschaft. Mach aus der Prüfung einen Test, der fehlschlägt, wenn es eine Lücke oder eine Doppelung ohne festgehaltene Entscheidung gibt (eine Liste erlaubter Doppelungen mit ihren Gründen).
  • Die Kosten der Doppelung. Füge die Kosten jeder Anwendung hinzu und gib aus, wie viel alle Systeme der doppelten Capabilities pro Jahr kosten.
  • Zwei Länder. Der Shop startet in Griechenland mit einem lokalen Kurier. Sind zwei Liefersysteme ein Verstoß? Wie zeigst du es auf der Map?

Test

Teste dich

1. Was ist eine Capability?
2. Eine Capability, die drei Systeme unterstützen, ist…
3. Das Lager 2009 ist für das Business wichtig (4), aber technisch in schlechter Verfassung (1). Was sagt TIME?
4. Wann ist eine Capability-Map Bürokratie?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·