Die meisten Angular-Architekturkurse vermitteln Theorie. Nicht dieser.
Hier lernen Sie, echte Probleme zu erkennen, fundierte Entscheidungen zu treffen und Systeme aufzubauen, die auch dann Bestand haben, wenn das Team wächst, sich das Produkt ändert und die Zeit vergeht.
Zwanzig Module. Praxisorientiert. Keine Polsterung.
INDEX – Praktische Angular-Architektur für das wirkliche Leben
01 — Grundlegende architektonische Probleme
- Geschäftslogik in Komponenten
- Gottesdienste
- Doppelter oder verstreuter Status
- Kopplung zwischen Features
- Gemischte Verantwortlichkeiten
- Ordner, die ordentlich aussehen, sich aber nicht skalieren lassen
- Vorzeitige Abstraktionen
- Unnötiges Over-Engineering
- Architektur für heute, aber nicht für Wachstum
- Code, der schwer zu löschen, zu verschieben oder umzugestalten ist
02 — Tatsächliche Projektstruktur
- Featurebasiert vs. Layerbasiert
- Wann Sie die einzelnen Ansätze verwenden sollten
- So erkennen Sie eine Struktur, die nicht skalierbar ist
- So teilen Sie nach Domänen oder begrenzten Kontexten
- So organisieren Sie Ordner für echte Teams
- Nützliche Namenskonventionen
- Was soll eingegeben werden und was NICHT?
shared - So überprüfen Sie, ob Ihre aktuelle Struktur ×10 unterstützt
03 — Komponentenarchitektur
- Komponenten zu groß
- Komponenten mit zu vielen Verantwortlichkeiten
- Intelligente vs. dumme Komponenten
- Container/Präsentation im modernen Angular
- Komponentenzusammensetzung
- Wann wiederverwendet werden sollte und wann NICHT
- So entwerfen Sie saubere Komponenten-APIs
- Ein-/Ausgänge vs. Signale vs. Dienste
- Typische Probleme in Vorlagen
- So erkennen Sie Komponenten, die schwer zu warten sind
04 — Realer Zustand in Angular
- Welche Staatstypen gibt es?
- So erkennen Sie Staatsmissbrauch
- Lokaler Status vs. gemeinsamer Status vs. globaler Status vs. Serverstatus
- Signale vs. RxJS
- Staatliche Platzierung
- Wann der Dienststatus verwendet werden soll
- Wann sollten Signalspeicher verwendet werden?
- Wann ist NgRx zu verwenden?
- So erkennen Sie eine Überzentralisierung
- So erkennen Sie verteiltes Chaos
- Typische Fehler bei Nebenwirkungen
- Zustandsnormalisierung
- Status-Checkliste
05 — Kommunikation und Datenfluss
- Daten runter / Ereignisse hoch
- Korrekte Kommunikation zwischen Komponenten
- Falsche Kommunikation zwischen Komponenten
- Kommunikation zwischen Funktionen
- Anzeichen einer versteckten Kopplung
- Nutzung von Diensten zur Kommunikation
- Mit Signalen kommunizieren
- Wenn ein Eventbus eine schlechte Idee ist
- So überprüfen Sie Abhängigkeitsadressen
- So erkennen Sie schwer nachvollziehbare Datenströme
06 — Datenschicht und API-Zugriff
- Dienste vs. Repositorys
- DTOs vs. Modelle
- Transformationen und Mapping
- Wohin mit den Adaptern?
- Typische Fehler beim Konsumieren von APIs
- So entkoppeln Sie das Frontend vom Backend
- Wiederholung, Caching, Paginierung
- Unendliches Scrollen
- REST vs. GraphQL aus der Architektur
- So überprüfen Sie, ob Ihre Datenschicht sauber oder gemischt ist
07 — Routing-Architektur
- Gestalten Sie Routen mit Absicht
- UX + SEO in Routen
- Faule Routen
- Wachen
- Lösen
- URL als Statusquelle
- Deep-Linking
- Gekoppelte Routen
- Schlecht durchdachte Routen
- Checkliste zur Überprüfung der Navigation und Skalierbarkeit
08 — Rendering und globale Strategie
- SPA, SSR, SSG, ISR
- So wählen Sie je nach Kontext aus
- SEO vs. Komplexität
- Leistung vs. Kosten
- Angular SSR-Architektur
- Hydratation und architektonische Wirkung
- Wann SSR NICHT verwendet werden sollte
- So überprüfen Sie, ob eine App eine andere Rendering-Strategie benötigt
09 — Leistungsarchitektur
- Änderungserkennung, OnPush, Signale und Leistung
- Lazy Loading echt
- Code-Splitting- und Bundle-Strategie
- Caching
- Virtuelles Scrollen und Auswendiglernen
- Leistungsbudgets
- So erkennen Sie architektonische Engpässe
- Was vor der „Optimierung“ zu prüfen ist
- So unterscheiden Sie ein Codeproblem von einem Architekturproblem
10 — Architektur testen
- Was zu testen ist und was nicht
- Einheit vs. Integration vs. e2e
- Testbarkeit durch Design
- So erkennen Sie schwer zu testenden Code
- Mit Sinn verspotten
- Fragilität beim Testen und Übertesten
- Vertragstests Frontend-Backend
- Checkliste, um zu prüfen, ob eine Architektur das Testen begünstigt oder verbietet
11 — Nx und echtes Monorepo
- Wann es sich lohnt und wann nicht
- Apps vs. Bibliotheken, Grenzen, Abhängigkeitsdiagramm
- Gemeinsam genutzte Bibliotheken sind gut und schlecht gemacht
- Betroffen, Caching, Codebesitz
- So skalieren Sie auf mehrere Teams
- Monorepo-Anti-Muster
- Überprüfen Sie die Checkliste
12 — Microfrontends und Modulföderation
- Wann ja und wann nein
- Welches wirkliche Problem lösen sie?
- Versteckte Kosten
- Host vs. Remotes, Versionierung, Kommunikation zwischen MFEs
- Unabhängiger Einsatz und organisatorische Komplexität
- Checkliste, um zu entscheiden, ob es sich lohnt
13 — Nützliche Designsysteme
- Welches Problem lösen sie und wann ist kein ernstes Problem nötig?
- Komponentenbibliotheken, Token, Themes, Varianten
- Konsistenz vs. Flexibilität
- Storybook, Design-Entwicklung-Synchronisierung
- Typische Fehler
- So überprüfen Sie, ob Ihr UI-System skaliert oder abstürzt
14 — Frontend-Sicherheit
- XSS, CSRF, Desinfektion
- Authentifizierungsarchitektur: JWT, Aktualisierungstoken
- Guards und rollenbasierter Zugriff
- Sicherheitsprobleme in SSR
- Praktische Revisions-Checkliste
15 — Beobachtbarkeit und Wartung
- Protokollierung, Fehlerverfolgung, Sentry, Metriken
- Konzeptionelle Nachverfolgung, Feature-Flags, A/B-Tests
- So erkennen Sie tote Winkel
- So überprüfen Sie, ob eine App in der Produktion lauffähig ist
16 — DevEx und Plattformdenken
- Entwicklererfahrung und Tools
- CI/CD, Generatoren, Schaltpläne, Automatisierung
- So erkennen Sie unnötige Reibung
- Wie man Architektur für Teams entwirft und nicht nur Code
17 — Kompromisse und Entscheidungsfindung
- Wie man Entscheidungen rechtfertigt
- Kosten vs. Nutzen, Komplexität vs. Skalierbarkeit, Geschwindigkeit vs. Wartbarkeit
- Bauen vs. Kaufen
- Wie schreibt man ADRs?
- Wie man eine Entscheidung in einem Vorstellungsgespräch oder im echten Job verteidigt
18 — Anti-Patterns für Winkelarchitekten
- Overengineering, nutzlose Schichten, vorzeitige Abstraktionen
sharedschlecht gestalteter, unnötiger globaler Zustand- Kreuzabhängigkeiten, stille Kopplung
- Schlechte Modularisierung, reale Metriken ignorieren
- Checkliste für rote Flaggen
19 — Praktische Prüfung von Angular-Apps
- So überprüfen Sie eine vorhandene App
- Worauf Sie zuerst achten sollten
- Welche Anzeichen deuten auf eine schwere Verschuldung hin?
- So priorisieren Sie Probleme
- Was Sie zuerst reparieren und was Sie noch nicht anfassen sollten
- So führen Sie eine nützliche Architekturbewertung durch
20 — Echte Fälle und Training
- E-Commerce-Audit
- SaaS-Dashboard-Audit
- Backoffice-Audit für Unternehmen
- Öffentliches App-Audit mit SEO
- App-Design von Grund auf
- Chaotisches App-Redesign
- Interviewfragen
- Erkennungs-, Entscheidungs- und Verbesserungsübungen
Modul 0 – Systembasis
Punkt 0 ist kein Inhaltsmodul. Es ist die Sichtweise, die Sie in der gesamten Roadmap verwenden werden.
Bevor Sie über spezifische Probleme in Angular sprechen, müssen Sie eine Frage beantworten:
Wie betrachten Sie eine App, die Sie nicht kennen, und entscheiden, ob sie gut oder schlecht ist?
Dafür gibt es vier Grundfertigkeiten.
1. Analysieren Sie eine App, ohne den Code zu berühren
Das erste Lesen einer App erfolgt nicht im Editor. Es liegt in der Struktur. Bevor Sie eine einzelne Datei öffnen, können Sie Informationen extrahieren:
- Wie heißen die Ordner? Sagen die Namen, was sie tun?
- Gibt es einen Ordner
shared, der mehr wiegt als alles andere? - Wie viele Verschachtelungsebenen hat die Struktur?
- Verfügen die Module oder Features über Domänennamen oder technische Namen?
- Wo sind die Dienste? Locker oder innerhalb der Merkmale?
Das verrät bereits viel darüber, ob der Entwickler der App in geschäftlichen oder technischen Aspekten gedacht hat.
2. Überprüfen Sie die Architektur auf praktische Weise
Beim Überprüfen wird der Code nicht von oben nach unten gelesen. Es werden Fragen mit folgenden Kriterien gestellt:
- Wo lebt die Geschäftslogik?
- Wer weiß was in jeder Schicht?
- Wie viele Websites müssen Sie ändern, um eine neue Funktion hinzuzufügen?
- Gibt es Abhängigkeiten, die in die falsche Richtung gehen?
Ein leitender Architekt beginnt nicht mit der komplexesten Komponente. Beginnen Sie mit den Punkten mit dem höchsten Risiko: gemeinsame Dienste, globaler Status und die Datenzugriffsschicht.
3. Erkennen Sie Probleme vor dem Programmieren
Die meisten architektonischen Schäden entstehen durch frühe Entscheidungen, die irrelevant erscheinen:
- „Ich stelle dies vorerst auf einen gemeinsamen Dienst“
- „Die übergeordnete Komponente verwaltet diesen Status, dann verschieben wir ihn“
- „Wir verwenden NgRx für alles, daher ist es konsistent“
Diese Entscheidungen haben Monate später echte Konsequenzen. Das architektonische Kriterium besteht darin, zu wissen, was jede Entscheidung kauft und welche Schulden sie verursacht.
4. Wandeln Sie die Theorie in eine echte Checkliste um
Jedes Konzept, das wir in dieser Roadmap sehen werden – intelligente/dumme Komponenten, Zustandsplatzierung, Gottesdienste usw. – muss in einer Frage enden, die Sie sich beim Überprüfen von echtem Code stellen können:
- Weiß diese Komponente, woher die Daten kommen?
- Gibt es mehr als einen Grund, diesen Dienst zu ändern?
- Existiert dieser Staat an zwei verschiedenen Orten?
Wenn Sie ein Konzept nicht in eine Überprüfungsfrage umwandeln können, haben Sie es noch nicht verinnerlicht.
Modul 1 – So analysieren Sie eine Angular-App, ohne den Code zu berühren
Die erste Überprüfung der Architektur erfolgt vor dem Öffnen des Editors. Allein aus der Ordnerstruktur und den Dateinamen lassen sich bereits eindeutige Qualitätsmerkmale erkennen. Dies ist, was ein leitender Architekt in den ersten 10 Minuten mit einer unbekannten App tun würde.
Warum ist das wichtig?
- Wenn es lange dauert, Architekturprobleme zu erkennen, steigen die Kosten für deren Behebung exponentiell.
- Eine vom ersten Tag an schlecht gestaltete Struktur wird zu einer technischen Schuld, die das Team Monate später blockiert.
- Durch die Entwicklung eines schnellen visuellen Urteilsvermögens können Sie bessere Entscheidungen treffen, bevor Sie eine einzige Codezeile schreiben.
Schritt 1 – Lesen Sie die Ordnerstruktur als Karte
Die Ordnerstruktur ist die erste sichtbare architektonische Entscheidung. Es zeigt Ihnen, wie das Team seine mentale Welt organisiert hat: Denken sie in Bezug auf Technologie oder in Bezug auf das Geschäft?
Was ist eine Funktion?
Ein Feature ist eine vollständige Geschäftsfunktionalität. Kein Dateityp. Keine technische Schicht.
Denken Sie an eine E-Commerce-App. Die Funktionen sind:
- Der Produktkatalog
- Der Warenkorb
- Der Checkout-Prozess
- Das Benutzerprofil
- Auftragsverwaltung
Jedes davon ist ein Geschäftszweig, der für sich genommen Sinn macht. Ein Benutzer betritt den Katalog, durchsucht ihn, legt ihn in den Warenkorb und checkt aus. Das sind Features.
Modell 1 – Organisation nach technischen Ebenen (im Maßstab problematisch)
Das macht fast jeder, wenn er anfängt, weil es ordentlich erscheint:
src/app/
components/
product-card.component.ts
product-list.component.ts
cart-item.component.ts
checkout-form.component.ts
user-profile.component.ts
services/
product.service.ts
cart.service.ts
checkout.service.ts
user.service.ts
models/
product.model.ts
cart.model.ts
user.model.ts
Das eigentliche Problem: Sie müssen den Checkout-Ablauf ändern. Um zu verstehen, worum es geht, navigieren Sie zwischen drei verschiedenen Ordnern – Sie suchen die Komponente in components/, den Dienst in services/, das Modell in models/. Wenn es eine bestimmte Checkout-Pipe gibt, wird diese in pipes/ mit Pipes aus anderen Features gemischt.
Um eine einzelne Funktion zu ändern, navigieren Sie durch die gesamte App. Das ist Kopplung durch Struktur. Wenn das Team wächst, greifen zwei Personen, die an unterschiedlichen Funktionen arbeiten, ständig auf dieselben Ordner zu → Konflikte im Git, Schwierigkeiten zu wissen, wem was gehört.
Modell 2 – Organisation nach Merkmalen (welche Maßstäbe)
src/app/
features/
catalog/
components/
product-card.component.ts
product-list.component.ts
services/
product.service.ts
models/
product.model.ts
catalog.routes.ts
cart/
components/
cart-item.component.ts
cart-summary.component.ts
services/
cart.service.ts
cart.routes.ts
checkout/
components/
checkout-form.component.ts
order-confirmation.component.ts
services/
checkout.service.ts
checkout.routes.ts
shared/
core/
Warum das funktioniert: Wenn Sie auf „Zur Kasse gehen“ tippen, ist alles an der Kasse zusammen. Ein neuer Entwickler weiß genau, wo er suchen muss. Eine Person kann Eigentümer einer gesamten Funktion sein. Sie können ein gesamtes Feature löschen, indem Sie nur seinen Ordner löschen. Git-Konflikte zwischen verschiedenen Features verschwinden fast vollständig.
Die wichtigste Faustregel: Wenn Sie eine Funktion löschen, können Sie dann den gesamten Ordner löschen, ohne etwas anderes anzufassen? Wenn die Antwort „Ja“ lautet, ist die Funktion gut isoliert. Wenn Sie in der gesamten App nach Teilen suchen müssen, ist dies nicht der Fall.
Schritt 2 – Lesen Sie die Namen
Namen sind Dokumentation. Ein schlechter Name verbirgt Absichten und erhöht die kognitive Belastung für jede Person, die den Code liest.
shared/ – was es enthalten sollte und was nicht
shared/ ist für Dinge, die von mehreren Funktionen verwendet werden und KEINE eigene Geschäftslogik haben.
Richtig in shared/:
shared/
components/
button/
modal/
spinner/
avatar/
pipes/
date-format.pipe.ts
truncate.pipe.ts
directives/
click-outside.directive.ts
validators/
email-validator.ts
Es handelt sich um wiederverwendbare UI-Teile oder reine Dienstprogramme. Sie wissen nichts über das Geschäft. Ein ButtonComponent weiß nicht, ob es sich um eine Checkout- oder Benutzerprofil-Schaltfläche handelt. Er weiß nur, wie man ein Knopf ist.
Falsch in shared/:
shared/
services/
cart.service.ts ← lógica de negocio aquí
user-auth.service.ts ← pertenece a auth/core
product-filter.service.ts ← pertenece a catalog
report-generator.service.ts ← pertenece a reporting
Wenn Sie Dienste mit Geschäftslogik in shared/ sehen, bedeutet das, dass jemand nicht wusste, wo er sie ablegen sollte, und sie dort abgelegt hat. Mit der Zeit wird shared/ zum Allheilmittel der App.
core/ – was es ist und was nicht
core/ ist für eine Singleton-Infrastruktur gedacht, die die gesamte App einmal benötigt.
Richtig in core/:
core/
services/
auth.service.ts
logger.service.ts
error-handler.service.ts
interceptors/
auth.interceptor.ts
error.interceptor.ts
guards/
auth.guard.ts
models/
user-session.model.ts
Falsch in core/:
core/
components/
dashboard.component.ts ← eso es una feature
home.component.ts ← igual
services/
product.service.ts ← pertenece a catalog
report-generator.service.ts ← pertenece a reporting
Dies sind Dinge, die einmal instanziiert werden und sich auf die gesamte App auswirken. Der Authentifizierungs-Interceptor fängt alle HTTP-Anfragen für die gesamte App ab, weshalb er sich in core/ befindet.
Vage Namen – Warnsignale
Ein vager Name ist eine aufgeschobene Entscheidung. Wenn jemand data.service.ts erstellt, hat er noch nicht entschieden, über welche Daten dieser Dienst spricht.
| was du siehst | Was es bedeuten kann |
|---|---|
shared/ sehr groß |
Alles, was sonst nirgendwo hinpasste. Es entsteht eine bunte Mischung. |
common/ |
Das Gleiche wie shared/, aber mit schlechterem Namen. Ohne Kriterien dafür, was reinkommt. |
utils/ mit Diensten |
Als Nutzen getarnte Geschäftslogik. Ernsthafte rote Fahne. |
helpers/ |
Identisch mit utils/. Der Name sagt nichts über Verantwortung aus. |
components/ im Stammverzeichnis |
Keine Organisation nach Domäne. Alle Komponenten zusammen. |
core/ mit 40 Dateien |
Schlecht definierter Kern. Als zweites wurde shared/ verwendet. |
app.service.ts |
Ein Gottesdienst, der darauf wartet, zu wachsen. Maximales Alarmsignal. |
data.service.ts |
Daten zu was? Unbestimmte Verantwortung aus dem Namen. |
helper.service.ts |
Am Ende handelt es sich um einen Dienst mit unabhängigen Methoden. |
main.component.ts |
Was ist „Haupt“? Allgemeiner Name, der echte Verantwortung verbirgt. |
Namensregel: Wenn der Dateiname nicht genau sagt, was er tut, macht die Datei wahrscheinlich zu viel oder ist schlecht lokalisiert.
Konkrete Beispiele für vage Namen und was sie verbergen:
utils/format.tsmit 800 Zeilen: Mischung aus Datumsformatierung + Formularvalidierung + API-Transformation.helper.service.ts: endet als Gottesdienst mit unabhängigen Methoden.app.service.ts: ein als gesamte App bezeichneter Dienst, der für die gesamte App zuständig ist.
Schritt 3 – Zählen und messen, ohne Dateien zu öffnen
Bevor Sie den Code lesen, können Sie diese Beobachtungen direkt anhand der Struktur machen:
Komponentengröße als Zeichen
| Zeichen | Was bedeutet es? |
|---|---|
| +300-400 Zeilen in einer Komponente | Du machst fast immer zu viel. Es handelt sich nicht um eine absolute Regel, aber es lohnt sich, sie zu untersuchen. |
| +10 Ein- und Ausgänge | Zu komplexe API. Der Kandidat muss in mehrere Komponenten unterteilt werden. |
| Direkte HTTP-Aufrufe in der Komponente | Kombinieren Sie Präsentation mit Datenzugriff. Serviceschicht fehlt. |
| 1–2 Komponenten pro Funktion | Sie machen wahrscheinlich zu viel. Mangel an interner Spaltung. |
| +20 globale Anbieter | Zu viel Staat und zentralisierte Logik. Nicht alles muss global sein. |
Globale Dienstleistungen – die Gefahr von providedIn: 'root'
Ein globaler Dienst bedeutet, dass jede Komponente einer beliebigen Funktion diese einspeisen und nutzen kann. Dadurch entstehen unsichtbare Abhängigkeiten zwischen Features, die unabhängig sein sollten.
// Servicio que DEBERÍA ser local a la feature de catalog:
@Injectable({ providedIn: 'root' }) // ← señal de problema
export class ProductFilterService { ... }
// Ahora cualquier componente de cualquier feature puede usarlo.
// Si catalog cambia su lógica de filtrado, puede romper
// algo en una feature aparentemente no relacionada.
Schritt 4 – app.module.ts oder app.config.ts: Worauf Sie achten müssen
In Apps mit Modulen (Angular < 17 oder älter)
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
RouterModule,
AuthModule, // ← bien, infraestructura singleton
ProductModule, // ← señal de problema
CartModule, // ← señal de problema
CheckoutModule, // ← señal de problema
UserModule, // ← señal de problema
DashboardModule, // ← señal de problema
// Si hay 15+ módulos de features aquí,
// el lazy loading no está funcionando.
],
providers: [
ProductService, // ← si hay 20+ providers aquí,
CartService, // hay demasiada centralización
UserService,
AuthService,
]
})
Feature-Module sollten verzögert (bei Bedarf) geladen und nicht direkt in das Root-Modul importiert werden. Wenn sie alle vorhanden sind, werden sie alle beim Start geladen, auch wenn der Benutzer sie nie benötigt.
In eigenständigen Apps (Angular 17+)
// app.config.ts
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes, withLazyLoading()), // ← correcto
provideHttpClient(withInterceptors([authInterceptor])),
provideAnimations(),
ProductService, // ← esto NO debería estar aquí
CartService, // ← pertenece a la feature de cart
]
}
Globale Konfigurationsregel: Die globale Konfiguration sollte nur eine Infrastruktur haben, die sich auf die gesamte App auswirkt: Router mit Lazy Loading,
HttpClientmit globalen Interceptoren, Animationen, Infrastruktur-Singleton-Dienste (Authentifizierung, Logger, Fehlerhandler). Wenn Sie Feature-Services in der globalen Konfiguration sehen, registriert jemand die Dinge global aus Bequemlichkeit und nicht aus Notwendigkeit.
Vollständige Checkliste – Erstes Lesen einer Angular-App
Struktur
- Ist die Struktur nach Funktionen (Geschäftsbereich) oder nach technischen Schichten organisiert?
- Kann ich eine gesamte Funktion löschen, indem ich nur ihren Ordner lösche, ohne etwas anderes zu berühren?
- Verfügen die Funktionen über geschäftliche Domänennamen (
checkout,catalog) oder technische Namen (list,form,detail)? - Gibt es Ordner mit vagen Namen:
utils,helpers,common,misc,data?
shared/ und core/
- Enthält
shared/nur UI-Komponenten und Dienstprogramme ohne Geschäftslogik? - Enthält
core/nur Singleton-Infrastruktur (Abfangjäger, Wachen, Authentifizierungsdienst)? - Gibt es Dienste mit Geschäftslogik in
shared/? - Verfügt
core/über Funktionskomponenten oder Domänendienste?
Dienste und Anbieter
- Sind die Geschäftsdienste innerhalb Ihres Leistungsumfangs enthalten oder global verteilt?
- Gibt es mehr als 20 globale Anbieter?
- Importiert das Root-Modul oder
app.config.tsFeature-Module direkt (ohne Lazy)? - Gibt es Dienste mit
providedIn: 'root', die lokal für eine Funktion sein sollten?
Namen
- Sagen die Dateinamen genau, was sie tun?
- Gibt es Dateien, deren Name auf irgendeinen Teil der App zutreffen könnte?
- Gibt es eine Datei mit dem Namen
app.service.ts,data.service.tsoderhelper.service.ts? - Wiegt
shared/mehr als jedes einzelne Merkmal?
Übung
Suchen Sie auf GitHub nach einem beliebigen öffentlichen Angular-Projekt – es kann Ihr eigenes oder ein Open-Source-Projekt sein. Ohne irgendwelche Dateien zu öffnen, schauen Sie sich einfach die Ordnerstruktur und Namen an:
- Welches Organisationsmodell verwenden Sie: Funktionen oder technische Schichten?
- Welche Namen wecken bei Ihnen Zweifel oder Misstrauen?
- Wo vermuten Sie die Geschäftslogik?
- Welcher Ordner hat Ihrer Meinung nach die größte Mischung an Verantwortlichkeiten?
- Könnten Sie eine Funktion löschen, ohne etwas anderes zu berühren?
Teilen Sie mit, was Sie in der Sitzung beobachtet haben, und wir überprüfen es gemeinsam, wie es ein leitender Architekt tun würde.
Eingabeaufforderung: Analysieren Sie Ihr Projekt anhand der 4 Punkte
Kopieren Sie diese Eingabeaufforderung und verwenden Sie sie mit einer beliebigen KI (ChatGPT, Claude, Copilot), indem Sie ihr den Ordnerbaum Ihres Projekts übergeben:
Analysieren Sie die Projektarchitektur anhand dieser 4 Punkte der Säule 1 und erstellen Sie einen Bericht.
PUNKT 1 – Ordnerstruktur
Analysieren Sie apps/ und libs/ und antworten Sie:
- Erfolgt die Organisation nach Funktionen (Geschäftsbereich) oder nach technischen Ebenen?
- Können Sie eine gesamte Funktion löschen, indem Sie nur ihren Ordner löschen?
- Haben die Features Domänennamen (
checkout,catalog) oder technische Namen (list,form,detail)? - Gibt es Ordner mit vagen Namen:
utils,helpers,common,misc,data? - Zeigt den tatsächlichen Ordnerbaum an, den Sie gefunden haben.
PUNKT 2 – Datei- und Ordnernamen
Durchsuchen Sie das gesamte Projekt und die Liste:
– Dateien mit vagen Namen: data.service.ts, helper.service.ts, app.service.ts, main.component.ts, utils mit darin enthaltenen Diensten.
– Dienste mit Geschäftslogik innerhalb von shared/.
– Komponenten oder Domänendienste innerhalb von core/.
- Wiegt
shared/mehr als jedes einzelne Merkmal? Anzahl der Dateien.
PUNKT 3 – Globale Dienste
Durchsuchen Sie das gesamte Projekt:
– Alle Dienste mit providedIn: 'root' – listet auf, um welche Dienste es sich handelt und ob sie lokal für ein Feature sein sollen.
- Zählt, wie viele globale Anbieter es insgesamt gibt.
- Identifiziert global registrierte Geschäftsdienste, wenn sie in Ihrem Feature enthalten sein sollten.
- Suchen Sie in
libs/services/nach Diensten, die eindeutig zu einer bestimmten Domain gehören.
PUNKT 4 – Globale Konfiguration (app.config.ts oder app.module.ts)
Suchen Sie die Root-Konfigurationsdatei jeder App und analysieren Sie:
- Was ist global registriert, was nicht sein sollte?
- Werden die Feature-Module mit Lazy Loading geladen oder direkt importiert?
- Gibt es Business Services in der globalen Konfiguration?
- Wie viele Anbieter sind weltweit insgesamt registriert?
BERICHTSFORMAT
Verwenden Sie für jeden Punkt genau diese Struktur:
✅ Was ist gut
(konkrete Liste mit echten Codebeispielen)
⚠️ Zu überprüfende Schilder
(konkrete Liste mit Dateipfad und warum es ein Zeichen ist)
❌ Klare Probleme
(konkrete Liste mit Dateipfad, Problem und tatsächlicher Auswirkung)
Im Endeffekt beinhaltet es:
Zusammenfassung
Eine Tabelle mit den 4 Punkten, einem Status-Emoji (✅ ⚠️ ❌) und einer Abschlusszeile pro Punkt.
Priorisierte nächste Schritte
Liste von maximal 5 spezifischen Aktionen, sortiert nach Auswirkung, mit dem genauen Pfad der Datei oder des Ordners, die berührt werden sollen.
Seien Sie direkt. Erklären Sie nicht, was ein Merkmal oder eine Theorie ist. Analysieren Sie einfach dieses spezifische Projekt und liefern Sie echte Erkenntnisse.
