Entwicklung & Code
Linting-Stack für Node-Projekte: Code-Qualität, Formatierung und Prosa-Linting
Nicht nur Code bestimmt die Softwarequalität, sondern auch die Art, wie Softwareentwicklerinnen und -entwickler ihn dokumentieren und präsentieren. In einer Zeit, in der viele Entwicklerteams vollständig remote arbeiten und die Codebase weiter kontinuierlich wächst, ist die konsistente und automatisierte Qualitätskontrolle eine Notwendigkeit.
Weiterlesen nach der Anzeige

David König ist seit über 20 Jahren in der IT aktiv. Viele Jahre hat ihn das Thema Workplace-Management und Infrastruktur als Berater beschäftigt, bevor er in die Entwicklung gegangen ist, um sich intensiv mit den Themen Produkt-Management und DevOps auseinanderzusetzen. Nachdem er den Schaffensprozess von Software von allen Seiten kennengelernt hat und neben der IT-Community auch in der Heim- und Handcommunity aktiv ist, versteht er die Entwicklung und den Betrieb von Software weniger als Wissenschaft, sondern als Handwerk. Dieser Gedanke treibt ihn und er versucht immer wieder, Parallelen zwischen Handwerk und Softwareentwicklung aufzuzeigen.
Heute betreibt David Softwareentwicklung in der Automotive-Branche bei der adesso SE und zusammen mit vielen weiteren Kollegen IoT-Projekte und die pragmatische Vision der Softwareentwicklung als Handwerk vor allem im AI-Bereich.
Während meiner Arbeit an einem node-basierten Dokumentationsstack mit dem Static-Site-Generator Astro und Starlight, einem darauf aufbauenden Framework speziell für Dokumentationswebsites, bin ich auf die Herausforderung gestoßen, nicht nur sauberen Code, sondern auch hochwertige Prosa zu produzieren. Prosa kommt aus dem Lateinischen und bedeutet „geradeheraus reden“ – also ohne Schnörkel normal sprechen.
Im Rahmen einer Dokumentation bezeichnet Prosa den gesamten ausformulierten Textinhalt der technischen Dokumentation – alle Erklärungen, Anleitungen, Beschreibungen und Kommentare. Ziel ist es, dass Stil-Konsistenz, Grammatik, Wortwahl, Lesbarkeit und die Einhaltung von Dokumentationsrichtlinien sichergestellt sind und die technische Dokumentation nicht nur funktional korrekt, sondern auch verständlich, einheitlich und professionell geschrieben ist.
Die Lösung: Ein mehrstufiges Linting-System, das Code-Qualität, Formatierung und Prosa-Linting für englischsprachige Dokumentation geschickt miteinander verbindet und sich durch Git Pre-Commit Hooks sowie CI/CD-Pipelines automatisieren lässt. Prosa Linting für deutsche Texte ist nicht nativ integriert, lässt sich aber durch eigene Regeln integrieren. Hierbei kann die KI bei der Erstellung der Regeln gute Dienste tun. Eine gute Hilfestellung bietet hier auch der webbasierte Regelgenerator valegen.
- Automatisierung ist der Schlüssel: Pre-Commit Hooks und CI/CD-Pipelines stellen sicher, dass Qualitätsstandards eingehalten werden
- Dreistufiger Ansatz: Code-Qualität, Formatierung und Prosa-Linting ergänzen sich perfekt
- Tool-Integration: Astro, Starlight, Vale und moderne Entwicklertools harmonieren ausgezeichnet
- Skalierbarkeit: Das System wächst mit dem Projekt und dem Team mit
- Zukunftssicherheit: KI-Integration wird nahtlos möglich
Test-Setup: Astrogon als Grundlage für das Linting-System
Weiterlesen nach der Anzeige
Bevor es an die detaillierte Umsetzung des dreistufigen Linting-Konzepts geht, ist eine praktische Arbeitsumgebung einzurichten. Als grundlegendes Code- und Dokumentations-Beispiel dient Astrogon – ein vielseitiges Astro-Theme, das sich ideal für die Demonstration des Linting-Systems eignet. Astrogon ist ein schnell anpassbares, Mehrzweck-Website-Template, das auf Astro JS, Tailwind CSS und React basiert. So bildet es eine solide Grundlage für verschiedene Website-Typen – von Blogs über Dokumentationsseiten bis hin zu Portfolio-Websites.
Astrogon eignet sich deshalb als Demo-Basis, weil es:
- Verschiedene Dateitypen enthält: .astro, .tsx, .js, .md, .mdx, .css
- Realistische Komplexität bietet: ein echtes Projekt mit authentischen Herausforderungen
- Einen modernen Stack verwendet: aktuelle Technologien, die typisch für moderne Webprojekte sind
- Gut strukturiert ist: klare Ordnerstruktur für effektives Linting
- Content-fokussiert arbeitet: viel Text-Content für Prosa-Linting
Durch einen Fork des originalen Astrogon Repository, den man lokal klont, lässt sich das Projekt einfach aufsetzen.
# Create a fork (via GitHub.com)
# Clone repository
git clone
cd my-linting-project
# Install dependencies
npm install
# Fix existing vulnerabilities
npm audit fix
# Start development server
npm run dev
Nach der Installation steht eine vollständig funktionsfähige Website mit folgender Struktur parat:
my-linting-project/
├── docs/ # Documentation
├── public/ # Static public viewable resources
├── src/
│ ├── assets/ # Pictures, icons,...
│ ├── components/ # reusable components
│ ├── content/ # Markdown/MDX content collections
│ ├── lib/ # Utility functions
│ ├── pages/ # Astro-pages (Routing)
│ ├── styles/ # CSS/SCSS files
│ ├── types/ # TypeScript type-definitions
│ ├── content.config.ts # Content Collections configuration
│ └── env.d.ts # Environment variables types
├── .editorconfig # Editor-configuration
├── .prettierrc # Preconfigured prettier
├── .markdownlint.json # Preconfigured markdownlot
├── astro.config.mjs # Astro configuration
├── package.json # Dependencies and scripts
├── tailwind.config.js # Tailwind CSS configuration
├── tsconfig.json # TypeScript Configuration
└── wrangler.jsonc # Cloudflare workers configuration
Integration der Linter in den Stack
Modernes Linting geht weit über die reine Syntaxprüfung hinaus und umfasst drei komplementäre Dimensionen der Qualitätskontrolle: Code-Qualität für die Logik, Formatierung für die Konsistenz und Prosa-Linting für die menschliche Lesbarkeit. Für diese drei Aspekte kommen verschiedene Linter zum Einsatz: ESLint für die Code-Qualität, Prettier für die Formatierung und Vale für das Prosa-Linting.
Code-Qualität mit ESLint: ESLint bildet das Fundament des Linting-Stacks. Es analysiert TypeScript-, JavaScript- und Astro-Dateien auf potenzielle Fehler, Style-Inkonsistenzen und Best-Practice-Verletzungen. Die Installation leitet der folgende Befehl ein:
npm install -D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser astro-eslint-parser eslint-plugin-astro
Im nächsten Schritt folgt das Anlegen der Datei .eslintrc.js, die die Konfiguration für die verschiedenen Dateitypen definiert. Dies gelingt am einfachsten über den offiziellen Konfigurations-Wizard von ESLint:
npm init @eslint/config@latest
module.exports = {
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint"],
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
env: {
node: true,
browser: true,
es2022: true,
},
rules: {
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-empty-interface": "off",
},
overrides: [
{
files: ["*.astro"],
extends: ["plugin:astro/recommended"],
parser: "astro-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser",
extraFileExtensions: [".astro"],
},
},
],
};
Anschließend sind die aufrufenden npm-Skripte in der Datei package.json zu hinterlegen.
{
"scripts": {
"lint": "eslint ./src --ext .js,.ts,.jsx,.tsx,.astro --fix",
"lint:check": "eslint ./src --ext .js,.ts,.jsx,.tsx,.astro"
}
}
Der Befehl npm run lint korrigiert dann automatisch behebbare Probleme, während npm run lint:check nur überprüft, ohne Änderungen vorzunehmen, und die Ergebnisse im Terminal ausgibt.
Code-Formatierung mit Prettier: Prettier sorgt für einheitliche Code-Formatierung und nimmt Entwicklern die Diskussion über Code-Style ab. Besonders in Astro-Projekten mit gemischten Dateitypen ist eine konsistente Formatierung essenziell. Prettier lässt sich mit folgendem Befehl installieren:
npm install -D prettier prettier-plugin-astro prettier-plugin-tailwindcss
Die Konfiguration von .prettierrc\ im Root-Verzeichnis des Repository berücksichtigt die spezifischen Anforderungen von Astro-Projekten:
{
"plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"],
"semi": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 80,
"useTabs": false,
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "always",
"endOfLine": "lf",
"overrides": [
{
"files": ["*.astro"],
"options": {
"parser": "astro"
}
},
{
"files": ["*.md", "*.mdx"],
"options": {
"printWidth": 100,
"proseWrap": "always"
}
}
]
}
Sind die Abhängigkeiten installiert und die Konfiguration angelegt, werden die entsprechenden npm-Skripte in der Datei package.json eingefügt:
{
"scripts": {
...
...
"format": "prettier --write ./src --log-level silent",
"format:check": "prettier --check ./src --log-level silent"
}
}
Der Befehl npm run format korrigiert anschließend automatisch behebbare Probleme, während npm run format:check nur überprüft, ohne Änderungen vorzunehmen, und die Ergebnisse im Terminal ausgibt.
Prosa-Linting mit Vale: Vale ist ein Open-Source-Tool für das Prosa-Linting, das wie ein Code-Linter funktioniert, aber Fließtext verarbeitet. Es prüft Texte auf stilistische Fehler, wiederkehrende Muster und Verstöße gegen vordefinierte oder eigene Stilrichtlinien. Es funktioniert mit Markdown, HTML, AsciiDoc oder reStructuredText und analysiert diese Formate anhand konfigurierter Regeln. Die Style-Guides, anhand derer Vale überprüft, können frei gewählt, angepasst oder erweitert werden – beispielsweise nach Vorbildern von Google, Microsoft oder eigenen Anforderungen.
Typische Regeln erkennen etwa unnötige Passiv-Konstruktionen, zu viele Wiederholungen, fehlende Oxford-Kommas – also das Komma vor der Konjunktion in einer Aufzählung, das helfen soll, Missverständnisse zu vermeiden – oder „Weak Words“ wie „viele“ oder „manchmal“. Die Ergebnisse zeigt Vale direkt im Editor, in der Kommandozeile oder als Teil automatisierter CI-Prozesse.
Vale erfordert eine plattformspezifische Installation sowie den Download der Style-Guides und LibreOffice-kompatibler Hunspell-Wörterbücher (.dic/.aff-Dateien) für die Rechtschreibprüfung in anderen Sprachen als Englisch. Ja, die Kombination von Prosa-Linting-Style-Guides (wie Vale, Google oder Microsoft Style Guides) mit einem deutschen Wörterbuch ist durchaus sinnvoll und funktioniert einwandfrei – Vale nutzt Hunspell-Dictionaries unabhängig voneinander für Rechtschreibung und Stilregeln. Rechtschreibprüfung prüft Wörter auf Korrektheit, während Prosa-Linting Stil, Lesbarkeit und Konventionen überwacht; beide ergänzen sich nahtlos in einem Workflow. Für das beispielhafte Repository habe ich entsprechende Linux/macOS– und Windows-Skripte angelegt, die das Setup erledigen. Getestet ist aktuell nur das Bash-Skript, das PowerShell-Skript wurde via KI automatisiert auf Basis des Bash-Skripts erstellt.
Abweichend von der standardmäßigen Vorgehensweise, bei der Probleme mit dem in Vale integrierten Installer vale sync auftraten, laden die Skripte die git-Repositories für die Styleguides manuell herunter und löschen alle git-spezifischen Inhalte.
# Linux/macOS
chmod +x .vale/install-vale.sh
./.vale/install-vale.sh
# Windows
powershell -ExecutionPolicy Bypass -File .vale/install-vale.ps1
Nach Ausführen der Skripte entsteht folgendes Verzeichnis im Root-Verzeichnis des Repositories:
my-linting-project/
├── .vale/
├── dictionaries
│ ├── de_DE.aff
│ ├── de_DE.dic
├── styles
├── Base
│ ├── accept.txt
│ ├── reject.txt
│ ├── Microsoft/
│ ├── write-good/
├── install-vale.ps1
├── install-vale.sh
└── vale
Zu beachten ist dabei noch, alle dynamisch generierten Inhalte in die .gitignore-Datei aufzunehmen.
# Vale binary (install with npm run install-vale)
.vale/dictionaries
.vale/styles/Microsoft
.vale/styles/write-good
.vale/vale
.vale/vale.exe
Vale-Styleguides auswählen und installieren
Das Installationsskript lädt nicht nur Vale herunter, sondern auch die benötigten Styleguides. Auf der Vale-Website sind, neben einigen weiteren spezifischen, vier wesentliche Style-Guides referenziert:
- Starker Fokus auf technische Konsistenz und Präzision für Entwickler.
- Große Ausnahmeliste für Akronyme und Begriffe aus APIs.
- Substitutionslisten mit Google-typischer Terminologie.
- Stil: direkt, technisch, an Entwickler gerichtet, prägnant, präzise.
- Quelle Git, Quelle Style-Guide
Microsoft
- Sehr starke Gewichtung auf Inklusivität und Barrierefreiheit.
- Klare Satzlängen- und Limits für Wörter.
- Hunderte produkt- und communityspezifische Begriffe.
- Stil: freundlich, inklusiv, leserorientiert, markengerecht, barrierefrei.
- Quelle Git, Quelle Style-Guide
Red Hat
- Strikte Regeln zu „Open Source“-neutraler Sprache und Kollaboration.
- Erlaubt keinen Produkt-Bias, eigene Accessibility- und Bias-Listen.
- Regeln für CLI-Beispiele, Dateipfade und produktneutrale Formulierungen.
- Bevorzugt kollaborativen Duktus und Community-Perspektive.
- Stil: offen, kollaborativ, communitygetrieben, produktneutral, inklusiv.
- Quelle Git, Quelle Style-Guide
Write-good
- Fokussiert sich rein auf sprachliche Klarheit und verbessert Lesbarkeit und Stil, ohne produkt- oder technikspezifische Prüfkriterien.
- In modernen Dokumentations-Workflows eignen sich Write-Good-Regeln ergänzend, um die sprachliche Qualität unabhängig von der Plattform zu verbessern.
- Write-Good Vale Style-Guide
Im Folgenden kommt der „Microsoft Style Guide“ zum Einsatz – erweitert um die Style-Guides „write-good“, „MDX“ und „Vale Core“. Diese sind wie folgt charakterisiert:
Microsoft Style Guide: Unternehmensstandards für technische Dokumentation
write-good: allgemeine Regeln für klares Schreiben
Vale Core: grundlegende Prosa-Regeln
MDX: Prüfung der Sprache innerhalb von JSX Tags
Beim Einsatz unterschiedlicher Style-Guides in Kombination lässt sich in manchen Situationen schwer identifizieren, warum welche Regel benötigt wird. Ein Beispiel macht dies klarer. Gegeben ist folgende MDX-Datei:
---
title: "Using Feature Y"
author: "Adesso"
---
# Feature Y Benefits
You will be able to use this feature very effectively. It was developed by adeso and their team.
DO NOT use this feature if your environment isn't set correctly.
Step 1: Initializing the data source
Step 2 Call the performOperation() function
Step 3: Confirm the output's accuracy
> Note: The process can be slow. It is important that you wait patiently.
For details, check our doc [documentation](htp://example.com/feature-y).
Die Ergebnisse des Lintings fasst die folgende Tabelle zusammen:
| Fehler | Welcher Regelsatz | Erklärungen & Korrektur |
| Autor „Adesso“ und „adeso“ inkonsistent geschrieben | Custom Regel | Korrigiert in „adesso“ |
|
Großschreibung in JSX-Komponente ` |
MDX-Regelsatz |
Meldet falsche Großschreibung oder unbekannte JSX-Tags, erwartet ` |
| Markdown-Liste ohne korrekte Aufzählungszeichen | MDX-Regelsatz | Fehlt das `-` oder die Nummerierung bei Liste (z.B. `Step 2` ist kein Listenelement) |
| Unsichere URL im Link (htp statt http) | Microsoft Regelsatz | Erkennt ungültige URLs, fordert Korrektur auf gültiges Schema (` |
| Übermäßiger Gebrauch von Floskeln (z.B. „very effectively“, „It is important that“) | Write-Good | Empfiehlt prägnantere Ausdrucksweise („effectively“, „Wait patiently.“) |
| Use of first-person pronouns („You will be able…“, „you wait patiently“) in nicht passender Art | Microsoft Regelsatz | Warnt bei unpassender Verwendung von Personalpronomen, schlägt Sparse-Usage vor |
| Passiver Sprachgebrauch („was developed“) | Write-Good & Microsoft | Empfiehlt aktive Formulierung, z.B. „adesso developed this feature.“ |
Die korrigierte MDX-Datei sieht nach der Regelprüfung dann wie folgt aus:
---
title: "Using Feature Y"
author: "adesso"
---
# Feature Y Benefits
You can use this feature effectively, adesso and their team developed it.
Do not use this feature if your environment is not set correctly.
- Step 1: Initialize the data source
- Step 2: Call the performOperation() function
- Step 3: Confirm the output's accuracy
> Note: The process can be slow. Please wait patiently.
For details, check our [documentation](
Mithin ergeben sich folgende Einschränkungen:
- Die Vale-Style-Guides sind nur für englischen Text optimiert, eine Anpassung an Deutsch oder andere Sprachen scheint bisher nicht vorgesehen zu sein.
- Die Style-Guides basieren auf klassischen Regular Expressions. Wer KI-basierte Ansätze erwartet, wird enttäuscht.
- Speziell in größeren Projekten empfiehlt es sich einen eigenen Style-Guide aufzubauen. Die Konfiguration von Vale erfordert eine kontinuierliche Anpassung an die Bedürfnisse des Projekts.
Konfigurieren und Anpassen von Vale (.vale.ini)
Die Vale-Konfigurationsdatei gibt an, in welchen Verzeichnissen und mit welchen Style-Vorgaben das Tool den Text überprüfen soll. Für das Beispiel sei angenommen, dass sich der englische Content in den Unterverzeichnissen des Ordners /src/content befindet.
# Vale configuration file
# See:
Packages = MDX
StylesPath = .vale/styles
# Add dictionary path for German dictionaries
DictionaryPath = .vale/dictionaries
MinAlertLevel = error
# File type associations - English content (excluding German docs)
[src/content/**]{.md,.mdx}
# Enable/disable specific styles for English content
BasedOnStyles = Vale, write-good, Microsoft
# Enable rules
Vale.Terms = YES # Disables term-based checks. Example: Avoid using "jargon".
Vale.Spelling = YES # Disables spelling checks. Example: "recieve" instead of "receive".
Vale.Vocab = YES # Disables vocabulary checks. Example: Using "utilize" instead of "use".
Vale.Repetition = YES # Disables repetition checks. Example: "very very good".
Vale.Wordiness = YES # Disables wordiness checks. Example: "in order to" instead of "to".
# Write-good rules (English-specific)
write-good.Weasel = YES # Disables detection of weasel words. Example: "some people say".
write-good.TooWordy = YES # Disables detection of overly wordy phrases. Example: "due to the fact that".
write-good.So = YES # Disables detection of sentences starting with "so". Example: "So, we decided to...".
write-good.ThereIs = YES # Disables detection of "there is/are" constructions. Example: "There is a need for...".
write-good.Passive = YES # Disables detection of passive voice. Example: "The ball was thrown by John".
write-good.Adverbs = YES # Disables detection of adverbs. Example: "He ran quickly".
write-good.Cliches = YES # Disables detection of cliches. Example: "Think outside the box".
write-good.E-Prime = YES # Disables detection of E-Prime violations. Example: "He is a teacher".
write-good.Illusions = YES # Disables detection of ambiguous phrases. Example: "The results were significant".
# Microsoft style rules (English-specific)
Microsoft.Gender = YES # Ensures gender-neutral language is used. Example: Use "they" instead of "he/she".
Microsoft.PassiveVoice = YES # Flags sentences written in passive voice. Example: "The report was written by Sarah".
Microsoft.Cliches = YES # Detects overused phrases and cliches. Example: "At the end of the day".
Microsoft.Jargon = YES # Highlights technical jargon that may confuse readers. Example: "Leverage synergies".
Microsoft.Complexity = YES # Identifies sentences that are overly complex or difficult to read. Example: "The implementation of the solution was carried out in a manner that ensured...".
Microsoft.Redundancy = YES # Flags redundant phrases or words. Example: "Free gift".
Microsoft.Spelling = YES # Checks for spelling errors based on Microsoft's style guide. Example: "color" vs. "colour".
Microsoft.Spacing = YES # Disables because of D2 diagrams - Allows ignoring spacing-related issues. Example: "word word".
Microsoft.Contracting = YES # Allows ignoring contracting-related issues. Example: "isn't" vs. "is not".
Microsoft.Quotes = YES # Allows ignoring quotes-related issues. Example: "'single quotes' vs. "double quotes".
Microsoft.Contractions = YES # Allows ignoring contractions-related issues. Example: "can't" vs. "cannot".
Microsoft.Foreign = YES # Allows ignoring foreign phrases and words. Example: "et cetera".
Microsoft.Plurals = YES # Allows ignoring pluralization-related issues. Example: "criterias" vs. "criteria".
Microsoft.Auto = YES # Disables automatic suggestions for corrections. Example: "autocorrect".
Microsoft.AMPM = YES # Allows ignoring AM/PM formatting issues. Example: "2 PM" vs. "14:00".
Microsoft.DateOrder = YES # Allows ignoring date order-related issues. Example: "MM/DD/YYYY" vs. "DD/MM/YYYY".
Microsoft.Dashes = YES # Allows ignoring dash-related issues. Example: "em-dash" vs. "en-dash".
Microsoft.DateFormat = YES # Allows ignoring date format-related issues. Example: "2025-10-01" vs. "01/10/2025".
Microsoft.Units = YES # Allows ignoring unit-related issues. Example: "5kg" vs. "5 kg".
Microsoft.Avoid = YES # Allows ignoring "avoid" suggestions. Example: "Avoid using passive voice".
Microsoft.Negative = YES # Allows ignoring negative phrasing suggestions. Example: "Not bad" vs. "Good".
Nun sind noch die richtigen Cross-Platform npm-Skripte für Vale bereitzustellen, um den Linter zu installieren und aufzurufen.
{
"scripts": {
...
...
"postinstall": "npm run install-vale",
"install-vale": "node -e \"const cmd = process.platform === 'win32' ? 'powershell -ExecutionPolicy Bypass -File .vale/install-vale.ps1' : 'bash .vale/install-vale.sh'; require('child_process').exec(cmd, (err, stdout, stderr) => { if (err) { console.error(stderr); process.exit(1); } console.log(stdout); })\"",
"prose": "node -e \"const vale = process.platform === 'win32' ? './.vale/vale.exe' : './.vale/vale'; const { exec } = require('child_process'); exec(vale + ' --config=.vale.ini src/content', (err, stdout, stderr) => { console.log(stdout); if (stderr) console.error(stderr); if (err) process.exit(1); });\""
}
}
postinstall: Wird automatisch aufgerufen, wennnpm installausgeführt wirdinstall-vale: Ruft je nach Plattform die richtigen Installationsscripte aufprose: Ruft das Linting auf und gibt Fehler in der Kategorie „error“, „warning“ und „information“ aus
Ausnahmen für Sonderfälle sind eigens zu definieren, etwa für Situationen, in denen Vale eine Regel bewusst ignorieren soll. Beispielsweise würde die Regel write-good.So für den Satz „So the experiment failed because the measurements were taken incorrectly“ normalerweise den folgenden Fehler melden:
src/content/blog/myfile.mdx
188:52 error Don't start a sentence with write-good.So
'So '.
✖ 1 error, 0 warnings and 0 suggestions in 38 files.
Um für diesen spezifischen Fall die Prüfung abzuschalten, ist die entsprechende Zeile mit einem Kommentar zu umfassen:
{/* */}
So the experiment failed because the measurements were taken incorrectly
{/* */}
Zu beachten ist dabei, dass die beiden Kommentar-Tags und die betroffene Zeile durch einen Zeilenumbruch getrennt sein müssen. Da es sich zudem um MDX-Dateien handelt, müssen die Zeilen erst mit einem JSX-Kommentarblock umschlossen werden, damit der Server nicht meckert, und anschließend mit einem HTML-Kommentarblock, damit Vale diesen erkennt. Darüber hinaus benötigt Vale – mit folgenden beiden Zeilen in der vale.ini – einen Hinweis, dass MDX-Dateien letztlich auch als Markdown-Dateien zu behandeln sind:
[formats]
mdx = md
Im Falle kompletter Textblöcke oder wenn der Grund der Deaktivierung der Vale-Regel benannt werden soll, ist es ebenfalls möglich, nur einzelne Regeln abzuschalten:
{/* */}
So the experiment failed because the measurements were taken incorrectly
{/* */}
Entwicklung & Code
Capability-centric Architecture – einheitliche Struktur für Embedded und Cloud
Softwarearchitektur hat seit Längerem das Problem, dass sie innerhalb von Systemgrenzen stattfindet, in denen jeweils spezifische Anforderungen dominieren: Enterprise-Systeme verlangen beispielsweise Flexibilität, Skalierbarkeit und schnelle Evolution. Embedded-Systeme hingegen benötigen direkten Hardwarezugriff, Echtzeitperformance und effiziente Ressourcen. Traditionelle Architekturmuster zwingen Architektinnen und Architekten oft, zwischen diesen Welten zu wählen oder separate Ansätze für unterschiedliche Systemtypen zu pflegen.
Weiterlesen nach der Anzeige

Prof. Dr. Michael Stal arbeitet seit 1991 bei Siemens Technology. Seine Forschungsschwerpunkte umfassen Softwarearchitekturen für große komplexe Systeme (Verteilte Systeme, Cloud Computing, IIoT), Eingebettte Systeme und Künstliche Intelligenz.
Er berät Geschäftsbereiche in Softwarearchitekturfragen und ist für die Architekturausbildung der Senior-Software-Architekten bei Siemens verantwortlich.
Das neue Muster Capability-centric Architecture (CCA) löst diese Spannung auf. Es erweitert und synthetisiert Konzepte aus Domain-driven Design, Hexagonal Architecture und Clean Architecture. Dabei führt es neue Mechanismen ein, die es gleichermaßen auf einen Mikrocontroller anwendbar machen, der Sensordaten liest, wie auf eine Cloud-native Enterpriseplattform, die Milliarden von Transaktionen verarbeitet.
Diese Artikelserie stellt das neue Muster in vier Artikeln vor. Hier im ersten Teil geht es um die Grundlagen der Methode. Anschließend folgen drei Beispiele, für ein Embedded-System, für eine Enterprise-Anwendung und für eine Architektur mit KI-Komponente.
Fundamentale Probleme mit existierenden Ansätzen
Das Muster entstand aus unserer Analyse, warum existierende Architekturen versagen, wenn Systeme evolvieren müssen, neue Technologien wie KI und Containerisierung integrieren sollen oder das Embedded-bis-Enterprise-Spektrum überspannen. Anstatt diese Anforderungen als separate Probleme zu behandeln, bietet CCA ein vereinheitlichtes konzeptionelles Framework mit Mechanismen zur Verwaltung von Komplexität, Abhängigkeiten und Änderungen.
Ein Beispiel für einen unzureichenden Ansatz ist es, eine typische geschichtete Architektur auf ein industrielles Steuerungssystem anzuwenden. Die Präsentationsschicht zeigt Sensorwerte an, die Schicht der Businesslogik verarbeitet Steuerungsalgorithmen, die Datenzugriffsschicht verwaltet Persistenz, und irgendwo erfolgt Hardwarezugriff zum Lesen von Sensoren und zur Steuerung der Aktoren.
Das unmittelbare Problem liegt auf der Hand: Wo passt die Hardwareschicht hin? Unterhalb der Datenzugriffsschicht erzeugt sie eine ungeschickte Abhängigkeitsstruktur. Als separates Anliegen verletzt sie das Schichtenprinzip. Kritischer noch: Die starre Schichtung macht es nahezu unmöglich, kritische Pfade zu optimieren. Wenn ein Sensor-Interrupt auftritt, muss das Signal mehrere Schichten durchlaufen, bevor es den Steuerungsalgorithmus erreicht, was eine inakzeptable Latenz bedeutet.
Weiterlesen nach der Anzeige
Hexagonal Architecture versucht, dies durch Ports und Adapter zu lösen. Die Kern-Domänenlogik sitzt im Zentrum, und Adapter verbinden zu externen Systemen durch definierte Ports. Dies funktioniert gut für Enterprise-Systeme mit Datenbank- und API-Adaptern. Für Embedded-Systeme jedoch verschleiert die Behandlung eines Hardware-Timers als weiteren Adapter den fundamentalen Unterschied zwischen einem austauschbaren, externen Service und einer Hardwarekomponente, die die Echtzeitfähigkeit des Systems definiert.
Ein typischer hexagonaler Ansatz für Embedded-Systeme sieht folgendermaßen aus:
// Port-Definition
public interface SensorPort {
SensorReading read();
}
// Domain-Logik
public class TemperatureController {
private final SensorPort sensor;
public TemperatureController(SensorPort sensor) {
this.sensor = sensor;
}
public void regulate() {
SensorReading reading = sensor.read();
// Steuerungslogik hier
}
}
// Hardware-Adapter
public class HardwareSensorAdapter implements SensorPort {
private static final int SENSOR_REGISTER = 0x40001000;
public SensorReading read() {
// Direkter Speicherzugriff
int rawValue = readRegister(SENSOR_REGISTER);
return new SensorReading(convertToTemperature(rawValue));
}
private native int readRegister(int address);
}
Der Code sieht sauber aus, verbirgt aber kritische Probleme. Die Abstraktion verhindert, dass der Controller auf Sensor-Metadaten zugreift, die in benachbarten Hardwareregistern verfügbar sind. Sie erzwingt alle Sensorzugriffe durch einen Methodenaufruf und verhindert den direkten Speicherzugriff per DMA oder Interrupt-gesteuertes Lesen. Sie macht Tests schwieriger, weil Entwickler Timing-Verhalten nicht einfach injizieren können. Am kritischsten: Sie behandelt Hardware als nur eine weitere austauschbare Komponente, obwohl die Hardwarefähigkeiten fundamental die Leistung des Systems prägen.
Clean Architecture steht vor ähnlichen Problemen. Ihre konzentrischen Kreise mit nach innen zeigenden Abhängigkeiten funktionieren wunderbar für Geschäftsanwendungen. Die Entities-Schicht enthält Geschäftsregeln, die Use-Cases-Schicht anwendungsspezifische Regeln, und äußere Schichten behandeln UI und Infrastruktur. Aber Embedded-Systeme passen nicht in dieses Modell. Hardware ist keine Infrastruktur, die sich abstrahieren lässt. Sie ist das Fundament, auf dem Fähigkeiten aufgebaut sind.
Enterprise-Systeme stehen vor unterschiedlichen, aber gleichermaßen herausfordernden Problemen. Während die Systeme wachsen, vermehren sich Bounded Contexts, und die Abhängigkeiten zwischen ihnen verheddern sich. Teams versuchen Schichtung oder hexagonale Grenzen durchzusetzen, was aber in praktischen Zwängen resultiert und Hintertüren sowie Abkürzungen schafft. Ein Kundenservice benötigt Daten vom Inventarservice, der Preise vom Katalogservice braucht, der wiederum Kundensegmente vom Kundenservice benötigt. Die zirkuläre Abhängigkeit ist offensichtlich, das Geschäftsbedürfnis aber real.
Moderne Technologien verschärfen diese Probleme. KI-Modelle sind keine einfachen Komponenten, die in eine Schicht oder einen Adapter passen. Sie haben eigene Infrastrukturbedürfnisse, Training-Pipelines, Anforderungen an die Versionierung und Inferenz-Charakteristiken. Big-Data-Verarbeitung passt nicht zu traditionellen Request-Response-Mustern. Infrastructure-as-Code verwischt die Grenze zwischen Anwendungs- und Deployment-Architektur. Kubernetes und Containerisierung ändern, wie Architekten über Deployment-Einheiten und Skalierungsgrenzen denken.
(Bild: RONY/Adobe Stock)

Die Online-Konferenz betterCode() Modern Architecture von iX und dpunkt.verlag am 25. März 2026 stellt aktuelle Konzepte der Softwarearchitektur vor wie Clean Architecture, Hexagonale Architektur oder Microservices. Design mit LLMs ist ebenso ein Thema wie Architektur für eine digitale Souveränität.
Entwicklung & Code
Warum Microsoft auf Anthropic setzt: Tausende Mitarbeiter testen Claude Code
Wenn ein Bäcker regelmäßig eine große Tüte Brötchen des Mitbewerbers einkauft, betreibt er entweder intensive Marktbeobachtung – oder sieht seine Bedürfnisse von seinem eigenen Produkt nicht vollständig abgedeckt. Ähnliche Fragen stellen sich Beobachter mit Blick auf Microsoft. Nach Informationen des US-Tech-Portals The Verge setzt der Software-Riese verstärkt auf das KI-Entwicklungs-Tool Claude Code von seinem Mitbewerber Anthropic. Vornehmlich zum Vergleich, wie es heißt. Doch die Intensität des Tests ist dennoch ungewöhnlich.
Weiterlesen nach der Anzeige
Laut The Verge nutzen mehrere tausend Mitarbeiter aus verschiedenen Entwicklerteams Claude Code. Beim CoreAI-Team sollen die Tests schon seit Monaten laufen. Inzwischen sei auch die „Experiences + Devices Division“ aufgefordert worden, Claude Code zu installieren. Dieses Team betreut die für Microsoft wichtigen Produkte Windows, Microsoft 365, Outlook, Teams, Bing, Edge und Surface.
Ungewöhnlicher Faible für die Konkurrenz?
Microsofts Werkzeugauswahl überrascht deshalb, weil das Unternehmen mit dem GitHub Copilot doch über ein eigenes Tool verfügt. Die in Zusammenarbeit mit OpenAI entwickelte Software sei auch weiterhin das primäre KI-Coding-Tool, betont Microsoft.
Dennoch scheint Microsoft auch ein Faible für das Konkurrenzprodukt entwickelt zu haben. Während die Software-Ingenieure beide Tools nutzen und vergleichen sollen, werden Designer und Projektmanager ohne Programmier-Erfahrung dazu ermuntert, damit zu experimentieren, etwa um Prototypen auf den Weg zu bringen. Laut dem Bericht sei aber auch ein möglicher späterer Vertrieb von Claude Code an Azure-Kunden denkbar.
Besonderer Deal mit Anthropic
Weiterlesen nach der Anzeige
Das Fachmagazin The Information zählt Microsoft zu den Top-Kunden von Anthropic. Beide Unternehmen hätten eine besondere Vereinbarung geschlossen, die Anthropic dazu verpflichte, im Umfang von 30 Milliarden US-Dollar Rechenkapazitäten von Microsofts Cloud Azure zu nutzen. Microsoft rechne umgekehrt die Kosten für die eigene Nutzung der Anthropic-Modelle auf die Verkaufsquoten für Anthropics Azure-Nutzung an. Das sei ungewöhnlich, da normalerweise nur eigene Produkte und die aus der Partnerschaft mit OpenAI auf diese Weise gefördert würden.
(mki)
Entwicklung & Code
Google stellt kostenlosen Web-Suchindex für Entwickler ein
Google hat angekündigt, den kostenlosen Zugriff auf seinen vollständigen Suchindex für Entwickler einzustellen. Neue Programmable Search Engines können ab sofort nur noch maximal 50 Domains durchsuchen. Die bisher verfügbare Option „Search the entire web“ steht für neue Engines nicht mehr zur Verfügung.
Weiterlesen nach der Anzeige
Betreiber bestehender Suchmaschinen, die mehr als 50 Domains indexieren oder den vollständigen Web-Index nutzen, müssen bis zum 1. Januar 2027 auf eine Alternative umsteigen. Google begründet den Schritt in der Ankündigung mit einer „Evolution zu fokussierten, leistungsfähigeren Lösungen“, die eine bessere Nutzererfahrung bieten sollen.
Vertex AI Search als kostenpflichtige Alternative
Als Ersatz für den kostenlosen Vollzugriff verweist Google auf Vertex AI Search, einen Cloud-basierten Enterprise-Dienst mit KI-gestützten Features wie konversationeller Suche und Grounding (Verankerung von KI-Antworten in verifizierbaren Datenquellen). Wer weiterhin den vollständigen Google-Index nutzen möchte, muss ein Formular ausfüllen und auf ein individuelles Preisangebot warten. Öffentliche Preise existieren nicht, frühere Paid-API-Angebote kosteten rund 5 US-Dollar pro 1000 Anfragen.
Die Custom Search JSON API wird ebenfalls eingestellt. Nutzer müssen ihre Implementierungen bis zur Frist auf Vertex AI oder den neuen Enterprise-Full-Web-Dienst portieren. Das kostenlose „Sites to search“-Feature für maximal 50 Domains bleibt erhalten und ist laut Google optimal für fokussierte, seitenspezifische Suchergebnisse gedacht.
Indie-Entwickler unter Druck
Die Änderungen treffen besonders Entwickler von Nischensuchmaschinen, Bildungseinrichtungen und Non-Profit-Organisationen. Viele WordPress-Plugins und Drupal-Module, die auf Googles Programmable Search Engine basieren, müssen umgebaut oder eingestellt werden.
Weiterlesen nach der Anzeige
Als Alternativen bietet sich selbst gehostete Software wie Meilisearch, Typesense oder Elasticsearch an. Für Web-Index-basierte Anwendungen könnten Dienste wie Common Crawl (ein offenes Web-Archiv) in Kombination mit eigenen Modellen zum Einsatz kommen. Allerdings erreichen diese Alternativen nicht die Aktualität und Vollständigkeit des Google-Index.
Kartellrechtliche Bedenken?
Die Einschränkungen könnten in der EU kartellrechtliche Fragen aufwerfen. Als Gatekeeper im Sinne des Digital Markets Act kontrolliert Alphabet mit der Google-Suche den Zugang zu einem wesentlichen Infrastrukturelement des Internets. Offen ist, ob die Abschaffung des kostenlosen Zugriffs bei gleichzeitiger Einführung kostenpflichtiger Alternativen als wettbewerbswidrig interpretiert wird.
Google argumentiert hingegen, die Vereinfachung seines Produktportfolios diene der Qualität: „Wir vereinfachen und modernisieren unser Angebot, damit Sie das beste Werkzeug für Ihre Ziele auswählen können“, heißt es im Blogpost.
(fo)
-
Entwicklung & Codevor 2 MonatenKommandozeile adé: Praktische, grafische Git-Verwaltung für den Mac
-
UX/UI & Webdesignvor 3 MonatenArndt Benedikt rebranded GreatVita › PAGE online
-
Künstliche Intelligenzvor 4 WochenSchnelles Boot statt Bus und Bahn: Was sich von London und New York lernen lässt
-
Entwicklung & Codevor 1 MonatKommentar: Anthropic verschenkt MCP – mit fragwürdigen Hintertüren
-
Apps & Mobile Entwicklungvor 2 MonatenFast 5 GB pro mm²: Sandisk und Kioxia kommen mit höchster Bitdichte zum ISSCC
-
Apps & Mobile Entwicklungvor 2 MonatenHuawei Mate 80 Pro Max: Tandem-OLED mit 8.000 cd/m² für das Flaggschiff-Smartphone
-
Social Mediavor 1 MonatDie meistgehörten Gastfolgen 2025 im Feed & Fudder Podcast – Social Media, Recruiting und Karriere-Insights
-
Künstliche Intelligenzvor 2 MonatenWeiter billig Tanken und Heizen: Koalition will CO₂-Preis für 2027 nicht erhöhen
