Section 13

Architecture practice: from capability maps to katas

The day-to-day craft of a solution or enterprise architect in a large, regulated organisation: mapping what the business does, making quality attributes measurable, planning cloud migrations and mainframe modernisation, shaping teams, evolving APIs and events safely, choosing front-end and edge patterns, and practising it all with katas. Documents, ADRs, NFRs and frameworks live in Section 12; patterns such as strangler fig and DDD live in Section 11.

13.1 Enterprise architecture toolkit Added

A small set of tools that turn "what does the business do, and what runs it?" into pictures and decisions: capability maps, value streams, portfolio rationalisation, roadmaps, a technology radar and principles.

๐Ÿงฉ Business capability map

What the business does, not how or who. Stable for years, even when processes and systems change.

  • L1: Payments, Lending, Customer
  • L2: Payment initiation, Clearing & settlement
  • L3: finer detail, only where needed

โžก๏ธ Value streams

The end-to-end stages that deliver value to a customer. "Open an account": discover โ†’ apply โ†’ verify โ†’ fund โ†’ use. Map each stage to the capabilities it needs.

๐Ÿ—‚๏ธ Application portfolio

Link every application to the capabilities it supports. Spot duplicates (three apps for one capability), end-of-life tech and high run costs.

๐Ÿงญ Architecture principles

Name, statement, rationale and implications. E.g. "API first", "Reuse, then buy, then build", "Data is owned and classified".

Heat-mapping a capability map

Colour each capability by one measure at a time: business value, technical health, risk, cost or number of applications. Always show the legend and the data source.

Portfolio rationalisation: the TIME model (Gartner)

QuadrantBusiness valueTechnical fitAction
TolerateLowHighKeep running. Minimum spend
InvestHighHighEnhance and extend
MigrateHighLowModernise or move to a new platform
EliminateLowLowRetire or consolidate

Current โ†’ transition โ†’ target

Current (baseline)what runs today
โ†’
Transition 1runs in production, delivers value
โ†’
Transition 2a stable plateau
โ†’
Target2โ€“3 years out, revisited yearly

๐Ÿ—บ๏ธ Roadmap

Work packages placed on a timeline, grouped into transition architectures, with dependencies, funding and risks. TOGAF phases E and F cover this (see 12.13).

๐Ÿ“ก Technology radar

Rings from Thoughtworks: Adopt, Trial, Assess, Caution (called Hold until Volume 34, April 2026). Quadrants: techniques, tools, platforms, languages & frameworks. Run an internal radar so teams know what is approved, being trialled or on the way out.

  • Capabilities describe what, not how. Keep the map stable and owned by business and architecture together.
  • A heat map is only as good as its measure. State the measure, the source and the date.
  • Every transition architecture must run on its own in production and deliver value. No "big bang" target.
  • Principles without implications are slogans. Say what each one forces you to do or stop doing.

The most useful slide an enterprise architect can bring is a heat map ๐Ÿ—บ๏ธ

๐Ÿงฉ Start with a capability map: what the business does, not who does it or which system does it

๐ŸŽจ Colour it by one lens at a time: business value, technical health, risk, cost

๐Ÿ”€ Overlay the lenses: high value + poor health is where the money should go

๐Ÿ—‚๏ธ Then sort the apps with TIME: Tolerate, Invest, Migrate, Eliminate

๐Ÿชœ Roadmap in transition steps that each deliver value on their own

Executives don't fund architecture diagrams. They fund red boxes turning green. What's your favourite EA artefact?

#EnterpriseArchitecture #CapabilityMapping #ITStrategy #SolutionArchitecture

13.2 Quality attributes & trade-off analysis Added

Quality attributes (the "-ilities") shape an architecture more than features do. Make them measurable with scenarios, rank them in a utility tree, test the design against them in a workshop, and guard them with automated fitness functions.

ISO/IEC 25010:2023 product quality model

The 2023 edition has nine characteristics. Usability became interaction capability, portability became flexibility (now including scalability), and safety is new.

CharacteristicThe question it asks
Functional suitabilityDoes it do the right things, correctly?
Performance efficiencyIs it fast enough, with sensible resource use?
CompatibilityDoes it co-exist and interoperate with other systems?
Interaction capabilityCan the intended users use it, including with accessibility needs?
ReliabilityIs it available, fault tolerant and recoverable?
SecurityConfidentiality, integrity, accountability, resistance to attack
MaintainabilityIs it modular, testable and easy to change?
FlexibilityCan it adapt, scale, install and be replaced?
SafetyDoes it avoid endangering people, property or the environment?

Quality-attribute scenarios

"Must be fast" can't be tested. A six-part scenario can. Write NFRs this way (see NFRs in 12.9).

Utility tree

A tree from "utility" to attributes, refinements and concrete scenarios. Rate each scenario (importance, difficulty) as H/M/L, then analyse the (H,H) ones first.

AttributeRefinementScenarioRating
AvailabilityZone failureOne zone fails at peak; payments continue, RTO under 5 min(H,H)
SecurityData protectionAn engineer queries prod; card numbers are tokenised(H,M)
MaintainabilityNew payment typeAdd a scheme in under 4 weeks, without touching the ledger(M,M)

ATAM-lite in a workshop

ATAM (Architecture Tradeoff Analysis Method) comes from the SEI. The full method takes days. A "lite" version fits in half a day with architects, product owner, ops and security.

1. Drivers & design

Business goals in 10 minutes. Then the architecture, ideally as C4 diagrams (12.10).

2. Utility tree

Agree the top 5โ€“8 scenarios together. This alone surfaces hidden disagreements.

3. Walk each scenario

Which decisions support it? Where does it break? Record what you find.

4. Outputs

Risks grouped into themes, new or updated ADRs (12.7), follow-up spikes.

FindingMeaningExample
Sensitivity pointOne decision strongly affects one attributeKafka partition count drives max consumer throughput
Trade-off pointOne decision affects two attributes in opposite waysSync cross-region replication: better RPO, worse latency
RiskA decision that may make a scenario failSingle shared database for all payment types
Non-riskA decision that is fine, and whyStateless API tier scales out behind the load balancer

Fitness functions

Automated checks that keep a quality attribute from silently getting worse. They run in CI/CD or on a schedule (also see 12.15).

AttributeFitness functionRuns
MaintainabilityDomain must not reference infrastructureEvery build
PerformanceLoad test: p95 within budget, or the pipeline failsNightly / pre-release
SecurityNo critical CVEs; no secrets in codeEvery build
CompatibilityConsumer contract tests pass (see 13.6)Before deploy
ReliabilityZone failover drill meets RTOQuarterly
  • If you can't write a response measure, it isn't a requirement yet.
  • Trade-off points are where architects earn their pay. Name both sides and who decided.
  • Turn the top scenarios into fitness functions, so the review doesn't end when the meeting does.
How to implement it
Fitness functionPackageUse it for
Dependency rulesTngTech.ArchUnitNET.xUnitLayering and naming rules as unit tests (example in 17.15)
Micro-benchmarksBenchmarkDotNetCatch regressions in hot paths (serialisers, mappers, parsers)
Load tests in C#NBomber commercial licencep95/p99 gates in CI. Free for personal use only. k6 or Azure Load Testing are alternatives
Vulnerable packagesbuilt-in dotnet list package --vulnerableSecurity fitness check in every build

"The system must be fast and secure" is not a requirement ๐Ÿ™…

๐ŸŽฏ Write quality-attribute scenarios: source, stimulus, artifact, environment, response, measure

๐ŸŒณ Rank them in a utility tree by importance and difficulty

โš–๏ธ Walk the top ones through the design: find sensitivity points, trade-off points and risks

๐Ÿค– Automate the important ones as fitness functions in CI

ISO/IEC 25010:2023 renamed usability to interaction capability and portability to flexibility, and added safety. Do your NFR templates still use the 2011 names?

#SoftwareArchitecture #NFR #ATAM #QualityAttributes

13.3 Cloud migration strategies: the 7 Rs Added

Pick one strategy per workload, move workloads in waves onto a landing zone that is already in place, and treat every cutover as a rehearsed, reversible event followed by hypercare.

AWS 7 RsAzure CAF nameUse when
RetireRetireLittle or no business value; barely used
Retain (revisit)RetainCompliance, latency or dependencies block a move for now
Rehost (lift & shift)RehostData-centre exit deadline; no change for 2+ years
Relocate (hypervisor level)Counted as rehostMove a VMware estate as-is, e.g. to a cloud VMware service
Replatform (lift & reshape)ReplatformSwap to managed DB or containers with small code changes
Repurchase (drop & shop)ReplaceA SaaS product covers the need
Refactor / re-architectRefactor, Rearchitect, RebuildStrong case to go cloud-native; CAF splits by depth of change

AWS advises against refactoring during a large migration: rehost, relocate or replatform first, then modernise once the workload is stable in the cloud.

Cutover planning

๐ŸŽญ Rehearsals

At least two full dress rehearsals on production-like data. Time every step. The real run follows the rehearsed runbook.

โ†ฉ๏ธ Rollback

Written criteria, one named decision-maker, a time box and a clear point of no return. Keep reverse sync running until then.

๐Ÿ”„ Data sync

Bulk load, then CDC until the final delta. Reconcile counts, sums and hash totals (see 06 data migration).

๐ŸงŠ Freeze windows

Avoid month-end, payday, end of financial year and peak trading. Agree the change freeze with every team that touches the system.

๐Ÿ“ฃ Comms

Stakeholder plan, customer notices, support scripts and a status channel. Announce "done" only after validation.

๐Ÿฉบ Hypercare

War room, extra alerts and dashboards, a fast fix path and agreed exit criteria (e.g. 10 days without a P1 or P2).

  • Migrate first, modernise second, unless the app would need rework within two years anyway.
  • Waves follow dependencies, not org charts. Chatty apps move together.
  • No landing zone, no wave 1. Retrofitting networking and policy costs far more.
  • The source isn't migrated until it's switched off and its costs stop.

Cloud migration is not one decision. It's one decision per application โ˜๏ธ

๐Ÿ—‘๏ธ Retire and ๐Ÿ…ฟ๏ธ Retain: the cheapest migrations are the ones you don't do

๐Ÿšš Rehost / Relocate: fast data-centre exit, modernise later

๐Ÿ”ง Replatform: managed DB or containers with small code changes

๐Ÿ›’ Repurchase: swap for SaaS. ๐Ÿ—๏ธ Refactor: when cloud-native really pays off

Then rehearse the cutover twice, keep a rollback path until the point of no return, and run hypercare. What's the hardest app in your portfolio to classify?

#CloudMigration #AWS #Azure #CloudAdoption #Architecture

13.4 Legacy & mainframe modernisation Added

Modernise legacy and mainframe systems in small, reversible steps: wrap them with APIs, stream their changes out as events, move capabilities one at a time, and prove each step with reconciliation before switching anything off.

Gartner's seven options, from least to most change

OptionWhat changesEffort & risk
EncapsulateWrap existing functions and data with APIsLow
RehostMove to new infrastructure, no code changeLow
ReplatformNew runtime platform, minimal code changeLowโ€“medium
RefactorRestructure code, same external behaviourMedium
RearchitectNew architecture, e.g. split into servicesHigh
RebuildRewrite from scratch, same scopeHigh
ReplaceBuy a package or SaaS productMediumโ€“high (data and process change)

Patterns that work together

๐Ÿงฑ API facade

Expose mainframe transactions through an API layer. Channels stop depending on the legacy interface, so the back end can change later.

๐ŸŒฟ Strangler fig

Route capability by capability to new services behind the facade. Details in 11.8.

๐Ÿ“ค CDC into events

Log-based CDC from mainframe databases into Kafka. Publish business events, not raw table changes. See 06 CDC.

๐Ÿชž Data replication

Copy data to cloud read stores for queries and analytics. Fewer reads on the mainframe often means lower running costs.

๐Ÿ“ฆ Batch โ†’ events

Publish events alongside the nightly file. Move consumers one by one. Keep the batch as a reconciliation control until the end.

๐Ÿ›ก๏ธ Anti-corruption layer

Translate legacy codes and record layouts into a clean domain model, so they don't leak into new services (11.10).

Managing the risk

โš–๏ธ Prove it

  • Parallel run: both systems process the same inputs, the old one stays master, outputs are compared.
  • Reconciliation: counts, amount totals, hash totals and field-level diffs, with a daily break report.
  • Slice traffic by product, branch or customer segment, with a fast route back.

๐Ÿง“ Skills risk

  • COBOL and mainframe experts are retiring. Capture business rules now, as tests and docs.
  • Pair experts with newer engineers. Use code-analysis tools to map programs and data.
  • AI tools can help explain old code, but check every rule against real outputs.
  • Encapsulate first: a stable API in front buys you freedom to change what's behind it.
  • Never switch master until reconciliation has been clean for an agreed period, including a month-end.
  • Big-bang rewrites of core systems have a poor track record. Move one capability at a time.
How to implement it
Library / APIPackageUse it for
Facade / strangler routingYarp.ReverseProxyRoute each path to the legacy back end or the new service; change routes by config
Consume CDC eventsConfluent.KafkaBuild read models from change events streamed off the mainframe
Traffic slicingMicrosoft.FeatureManagement.AspNetCoreSend a percentage or a segment to the new path, with instant rollback
Reconciliation jobsbuilt-in BackgroundServiceCompare old and new outputs on a schedule and publish a break report

You don't replace a mainframe. You make it smaller, one capability at a time ๐Ÿฆ

๐Ÿงฑ Put an API facade in front, so channels stop caring what's behind it

๐Ÿ“ค Stream changes out with CDC and build read models off the mainframe

๐ŸŒฟ Move one capability to a new service and run it in shadow mode

โš–๏ธ Reconcile every day: counts, totals, field-level diffs

๐Ÿง“ Capture the business rules while the people who know them are still here

Encapsulate, stream, strangle, reconcile, retire. Which step is hardest where you work?

#Mainframe #LegacyModernisation #StranglerFig #CDC #Banking

13.5 Team & org architecture Added

Systems end up shaped like the teams that build them, so design team boundaries, team interactions and cognitive load together with the software architecture.

๐Ÿข Conway's law (1968)

Organisations design systems that mirror their own communication structure. Three teams building a compiler get a three-pass compiler.

๐Ÿ”„ Inverse Conway manoeuvre

Shape the teams first to get the architecture you want. Want independent payments and lending services? Give them independent, long-lived teams.

Team Topologies (Skelton & Pais, 2019)

๐ŸŒŠ Stream-aligned

Owns a flow of change for a product or customer journey, end to end. Most teams should be this type.

๐Ÿ› ๏ธ Platform

Provides self-service internal products (pipelines, Kafka, observability) so stream teams go faster.

๐Ÿง‘โ€๐Ÿซ Enabling

Specialists who coach other teams in a new skill for a limited time, then move on.

๐Ÿงฎ Complicated-subsystem

Owns a part that needs deep expertise, e.g. a fraud-scoring model or a pricing engine.

Interaction modeWhenWatch out
CollaborationDiscovering something new togetherExpensive. Time-box it
X-as-a-ServiceThe boundary is clear and stableNeeds good docs and a product mindset
FacilitatingA team needs a new capabilityCoach, don't do the work for them

Cognitive load

A team can only own as much as it can understand. Three kinds: intrinsic (the problem itself), extraneous (tooling and process friction) and germane (learning the domain). Platforms should remove extraneous load. Signs of overload: slow onboarding, constant hand-offs, nobody understands a service fully.

Platform engineering & internal developer platforms

๐Ÿ›ค๏ธ Golden paths

Templates and pipelines for the common case (a new API, a new consumer) with security, logging and policy built in. Optional, but the easiest route.

๐ŸŽญ Backstage

Open-source developer portal created at Spotify, now a CNCF incubating project: software catalog, templates and TechDocs.

๐Ÿ“ฆ Platform as a product

Real users, a roadmap, adoption metrics and support. Measure delivery with DORA metrics (15.1) plus developer surveys.

Deep dive: 13.9 Platform engineering.

  • Draw the team map next to the architecture diagram. If they don't match, one of them will change.
  • Default to stream-aligned teams. Add platform, enabling and subsystem teams only to reduce their load.
  • Collaboration is a phase, not a permanent state. Aim for X-as-a-Service.

Your architecture diagram and your org chart are the same picture. Conway said so in 1968 ๐Ÿข

๐ŸŒŠ Stream-aligned teams own a flow of change end to end

๐Ÿ› ๏ธ Platform teams sell self-service internally, like a product

๐Ÿง‘โ€๐Ÿซ Enabling teams coach, then leave

๐Ÿงฎ Complicated-subsystem teams own the deep-expertise parts

Want microservices? Start with the teams: the inverse Conway manoeuvre. Which came first in your organisation, the teams or the services?

#TeamTopologies #ConwaysLaw #PlatformEngineering #DevEx

13.6 API & event evolution Added

Change APIs and event schemas without breaking consumers: prefer additive changes, know your compatibility mode, version only when you must, and retire old versions with clear Deprecation and Sunset signals.

Versioning strategies

StrategyExampleProsCons
URL path/v2/paymentsVisible, easy to route and cacheNew URL for each major version
Query string?api-version=2.0Simple; Azure APIs use itEasy to forget; caching keys
Headerapi-version: 2.0Clean URLsInvisible in links and logs
Media typeapplication/vnd.bank.v2+jsonVersions the representationHarder for clients and tools

REST basics are in 08.2; gateway versions vs revisions are in 09.5.

Compatibility, in plain words

TypeMeaningUpgrade first
BackwardThe new version still works with old clients or old dataProvider / consumers of events
ForwardOld clients or consumers can handle the new version's dataProducers of events
FullBoth at onceEither, in any order

โœ… Usually non-breaking

  • Add a new endpoint or operation
  • Add an optional request field
  • Add a response field (clients must ignore unknowns)
  • Relax validation

โŒ Breaking

  • Remove or rename a field
  • Change a type, format or unit
  • Make an optional field required
  • Tighten validation or change error shape
  • Change status codes, paging or auth scopes
  • Add an enum value clients switch on

๐Ÿ“– Tolerant reader

Consumers read only the fields they need and ignore unknown ones. This makes adding fields safe.

โ†”๏ธ Expand / contract

Add the new field next to the old one, move consumers over, then remove the old field. Also called parallel change.

๐Ÿ“œ Consumer-driven contracts

Each consumer publishes what it relies on (Pact). The provider's CI checks every contract before deploy.

Deprecation and Sunset

HTTP/1.1 200 OK
Deprecation: @1798761600
Sunset: Wed, 30 Jun 2027 23:59:59 GMT
Link: <https://developer.example.com/payments/v1-retirement>; rel="deprecation"

Event schema evolution with a schema registry

ModeChecks thatAllowed changes (Avro)Upgrade first
BACKWARD (Confluent default)New schema can read data written with the last oneDelete fields; add fields with defaultsConsumers
FORWARDLast schema can read data written with the new oneAdd fields; delete fields with defaultsProducers
FULLBoth directionsAdd or delete fields with defaults onlyAny order
*_TRANSITIVESame, against all earlier versionsAs aboveAs above
NONENothingAnything. Avoid for shared topicsCoordinate by hand

Avro

Give every new field a default. Rename with aliases. Never change a type in an incompatible way.

Protobuf

Never reuse or change a field number. Mark removed numbers and names as reserved.

JSON Schema

Compatibility depends on whether the schema is open or closed to extra properties. Decide this up front.

Schema registries and data contracts are also covered in 10.3 and 07.8.

  • Additive change plus tolerant readers removes most of the need for new versions.
  • A new major version is a migration project for every consumer. Budget for it, and for running two versions.
  • BACKWARD: upgrade consumers first. FORWARD: upgrade producers first. Use TRANSITIVE for long-retention topics.
  • Deprecation says "stop building on this". Sunset says "this will stop working on this date".
How to implement it
Library / APIPackageUse it for
API versioningAsp.Versioning.Http (minimal APIs) / Asp.Versioning.MvcURL, query, header or media-type versions; sunset and (10.x) RFC 9745 deprecation policies
One OpenAPI doc per versionMicrosoft.AspNetCore.OpenApi + Asp.Versioning.OpenApiPer-version documents that carry deprecation and sunset info
Schema registry serdesConfluent.SchemaRegistry.Serdes.Avro / .Protobuf / .JsonRegister and check schemas when producing; resolve them when consuming
Consumer-driven contractsPactNetConsumers write pacts; provider CI verifies them before deploy
builder.Services.AddApiVersioning(o =>
{
    o.ReportApiVersions = true;   // api-supported-versions / api-deprecated-versions
    o.ApiVersionReader = new UrlSegmentApiVersionReader();
    o.Policies.Sunset(1.0)        // adds Sunset + Link headers to v1 responses
        .Effective(new DateTimeOffset(2027, 6, 30, 23, 59, 59, TimeSpan.Zero))
        .Link("https://developer.example.com/payments/v1-retirement")
            .Title("Payments v1 retirement")
            .Type("text/html");
});

var app = builder.Build();
var payments = app.NewVersionedApi("Payments");

var v1 = payments.MapGroup("/v{version:apiVersion}/payments")
                 .HasDeprecatedApiVersion(1.0);
v1.MapGet("/{id}", (string id) => Results.Ok(new { id, amount = 10.50m }));

var v2 = payments.MapGroup("/v{version:apiVersion}/payments")
                 .HasApiVersion(2.0);
v2.MapGet("/{id}", (string id) =>
    Results.Ok(new { id, amount = new { value = 10.50m, currency = "AUD" } }));

Most API versions are self-inflicted ๐Ÿฉน

โž• Additive changes plus tolerant readers avoid most breaking changes

โ†”๏ธ Expand / contract: add the new field, move consumers, then remove the old one

๐Ÿ“œ Consumer-driven contracts catch breaks before deploy, not after

๐Ÿงฌ Events: know your schema registry mode. BACKWARD = upgrade consumers first, FORWARD = producers first

๐ŸŒ… Retire with standard headers: Deprecation (RFC 9745) and Sunset (RFC 8594)

How long do you keep an old API version alive after the replacement ships?

#APIDesign #SchemaRegistry #Kafka #APIVersioning #dotnet

13.7 Front-end & edge architecture Added

Choose where the HTML is built (browser, server, build time or a mix), put a BFF and a gateway between clients and services, push cacheable work to the edge, and design mobile apps to keep working offline.

Rendering options

OptionHTML builtGood forWatch out
SPA (client-side)In the browser, from JSApp-like, logged-in screensBig bundles, slow first load, SEO
SSROn the server, per requestFast first paint, personalised pagesServer cost, hydration cost
SSGAt build timeMarketing pages, docs, rates tablesRebuild on every content change
IslandsStatic page + small interactive partsContent pages with a few widgetsNeeds a framework that supports it

๐ŸŽฏ BFF

One backend per client experience (web, mobile). It aggregates calls and keeps tokens on the server, with only a secure cookie in the browser. See 11.4.

๐Ÿงฉ Micro-frontends

Teams own and release slices of one UI. Composed at build time, at run time (module federation, web components) or at the edge. Worth it with many teams and real release friction; not with one or two teams.

๐Ÿšช Gateway at the edge

WAF, DDoS protection, rate limits and token checks before traffic reaches your network. See 09.8.

๐ŸŒ CDN & edge compute

Cache static files and cacheable GETs. Small edge functions handle redirects, geo rules, A/B tests and header checks. See 05.6.

Mobile offline-first sync

Conflict strategyHowFits
Last writer winsNewest timestamp or version winsSettings, low-value data. Can lose edits
Field-level mergeMerge fields changed on different sidesProfiles, forms
Server decides / ask userReject with 409; show both versionsAnything with money or legal meaning
CRDTsData types that always merge cleanlyCollaborative notes and lists

Banking: never execute a payment offline. Queue the intent, show it as pending, and confirm it online with an idempotency key (08.7).

  • Pick rendering per page type, not per app: SSG for content, SSR or SPA for logged-in screens.
  • BFF keeps tokens out of the browser and lets each channel change at its own pace.
  • Micro-frontends solve a team-scaling problem, not a technical one. They cost performance and consistency.
  • Offline-first = local DB + sync queue + idempotency + a conflict rule per entity.
How to implement it
Library / APIPackageUse it for
Blazor render modesbuilt-in Blazor Web App (.NET 8+)Static SSR, Interactive Server (SignalR circuit), Interactive WebAssembly, Interactive Auto (server first, then WebAssembly). Per page or component
BFF proxyYarp.ReverseProxy; Duende.BFF commercial licenceCookie session in the browser, tokens on the server, proxy to APIs
Real-time updatesbuilt-in SignalR; Microsoft.Azure.SignalR to scale outPush status changes (payment settled) to web and mobile clients
Offline sync (MAUI)CommunityToolkit.Datasync.Client + .ServerLocal SQLite store, queued changes, delta pull, conflict detection
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents()
    .AddInteractiveWebAssemblyComponents();

var app = builder.Build();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode()
    .AddInteractiveWebAssemblyRenderMode()
    .AddAdditionalAssemblies(typeof(Client._Imports).Assembly);

// In a component: static SSR by default, opt in per page
// @rendermode InteractiveAuto

"Blazor United" was only the early code name. The product is the Blazor Web App template with render modes.

SPA, SSR, SSG or islands? Wrong question: pick per page ๐Ÿ–ฅ๏ธ

๐Ÿ“„ Content and rates pages โ†’ SSG on a CDN

๐Ÿ” Logged-in banking screens โ†’ SSR or SPA behind a BFF that keeps tokens server-side

๐Ÿงฉ Micro-frontends โ†’ only when many teams fight over one release train

๐ŸŒ Edge โ†’ WAF, rate limits, caching and small functions before traffic reaches you

๐Ÿ“ฑ Mobile โ†’ local DB, sync queue, idempotency keys, a conflict rule per entity

Where does your app build its HTML today, and would you choose that again?

#FrontendArchitecture #BFF #MicroFrontends #Blazor #OfflineFirst

13.8 Reference architectures & architecture katas Added

Reference architectures give you a proven starting point; architecture katas give you practice. Start from a published design, then rehearse requirements, characteristics and trade-offs against the clock.

Where to find reference architectures

SourceWhat you get
Azure Architecture CenterReference architectures, design patterns, Well-Architected guidance
AWS Architecture Center + Prescriptive GuidanceReference designs, migration and modernisation guides, step-by-step patterns
Google Cloud Architecture CenterReference architectures, design guides, framework best practices

โœ… Use them well

  • Check the date and the services it assumes.
  • Map it against your NFRs and regulatory needs (residency, resilience).
  • Swap in your identity, network and logging standards.
  • Record every deviation in an ADR.

โŒ Common mistakes

  • Copying the diagram without the reasoning.
  • Ignoring cost: samples often show the premium tier.
  • Assuming "reference" means "approved" in your organisation.

Architecture katas

Created by Ted Neward: a short brief from a fictional client, a small team, a fixed time box, then a presentation and critique. Like a coding kata, the point is repetition: you get better at trade-offs by making many of them.

๐Ÿง‘ Solo

  • Set a 45-minute timer. Speak your reasoning out loud, as in an interview.
  • Write the top three characteristics before drawing anything.
  • Finish with one ADR and a list of risks.
  • Next day, redo it with a different top three and compare.

๐Ÿ‘ฅ Team

  • Groups of 3โ€“5, same brief, 45โ€“60 minutes.
  • Each team pitches for 3 minutes; others play the client and challenge.
  • Score on reasoning and trade-offs, not on boxes and arrows.
  • Rotate the "client" role each session.

Kata prompts for banking and payments are in Section 25; the interview framework is in 20.2.

  • A reference architecture is where your design starts, not where it ends.
  • In a kata the diagram matters least. The characteristics you picked and what you gave up matter most.
  • Always end with an ADR: decision, options, consequences.

Architects rarely get to practise. Katas fix that ๐Ÿฅ‹

๐Ÿ“„ Take a short brief from a fictional client

๐ŸŽฏ Pick the top 3 characteristics before drawing a single box

๐Ÿงฑ Sketch components and data flow in 20 minutes

โš–๏ธ Name what you gave up, then write one ADR

๐Ÿ›๏ธ Start from a reference architecture, but record every deviation

One kata a week does more for interview performance than another certificate. When did you last design something against the clock?

#ArchitectureKatas #SolutionArchitecture #SystemDesign #InterviewPrep

13.9 Platform engineering and internal developer platforms Added

An internal developer platform (IDP) is a self-service product, built by a platform team for developers, that makes the secure, compliant way to build and run software also the easiest way.

From ticket-ops to self-service

How it works

๐Ÿ“ฆ Platform as a product

  • Customers are developers.
  • Product manager, roadmap, user research, docs, SLOs.
  • Optional: win adoption, don't mandate it.

๐Ÿ›ค๏ธ Golden paths

  • Also called paved roads.
  • Opinionated, supported route for the common case.
  • Security, logging and policy built in.
  • Teams may leave the path, but then own the extra work.

โš™๏ธ Self-service

  • Templates: new service in minutes.
  • Environments: ephemeral, on demand.
  • Pipelines: shared, versioned CI/CD.
  • APIs or CLI, not tickets.

๐Ÿชถ Thinnest viable platform

The smallest set of APIs, docs and tools that speeds teams up. Grow it from real demand, not a big up-front build.

๐ŸŽญ Developer portal

Backstage (CNCF incubating): software catalog (who owns what), software templates, TechDocs. Scorecards come from plugins and rate services against standards.

๐Ÿง  Team Topologies

A platform team serves stream-aligned teams X-as-a-Service and removes extraneous cognitive load (see 13.5).

How to measure it

MeasureExample
Adoption% of services on the golden path
Lead timeIdea or new repo to first prod deploy
DORADeploy frequency, lead time, change failure rate, recovery time
SatisfactionDeveloper survey, NPS, onboarding time

When to use / when not

โœ… Build a platform when

  • Many teams repeat the same setup.
  • Tickets and hand-offs dominate lead time.
  • Compliance needs consistent controls.

โŒ Anti-patterns

  • Mandated platform nobody wants.
  • Ticket-ops: a portal that just files tickets.
  • Big-bang build before any user.
  • Only a few teams: use shared docs instead.
  • The platform's customers are developers. Run it like a product.
  • Golden paths are paved, not walled: easiest route, not the only route.
  • Start with the thinnest viable platform and grow from demand.
  • Self-service means APIs, templates and pipelines. A form that creates a ticket is still ticket-ops.
  • Measure adoption, lead time, DORA and satisfaction, not features shipped.
How to implement it
Library / toolPackageUse it for
Golden-path templatedotnet new built-inPack a service template as a NuGet package (PackageType = Template)
Template authoringMicrosoft.TemplateEngine.Authoring.Templatesdotnet new templatepack scaffolds the template package
Template testsMicrosoft.TemplateEngine.Authoring.TemplateVerifierSnapshot-test the generated output in CI
Local dev environmentAspire: Aspire.AppHost.Sdk + Aspire.Hosting.* (e.g. Aspire.Hosting.PostgreSQL)One F5 starts the API and its database, with a dashboard
// content/GoldenPath.Api/.template.config/template.json
{
  "$schema": "http://json.schemastore.org/template",
  "author": "Platform team",
  "classifications": ["Web", "API", "GoldenPath"],
  "identity": "Acme.GoldenPath.Api",
  "name": "Golden-path API (logging, health, OTel, CI)",
  "shortName": "gp-api",
  "sourceName": "GoldenPath.Api",
  "tags": { "language": "C#", "type": "project" }
}

// The template also ships an Aspire AppHost for local dev
var builder = DistributedApplication.CreateBuilder(args);
var db = builder.AddPostgres("pg").AddDatabase("appdb");
builder.AddProject<Projects.GoldenPath_Api>("api")
       .WithReference(db).WaitFor(db);
builder.Build().Run();

// Developers:  dotnet new install Acme.GoldenPath.Templates
//              dotnet new gp-api -n Payments.Api

If your developer platform needs a ticket, it isn't a platform ๐ŸŽซ

๐Ÿ“ฆ Treat it as a product: developers are the customers

๐Ÿ›ค๏ธ Build golden paths: the secure way should be the easiest way

๐Ÿชถ Start with the thinnest viable platform, then grow from demand

๐ŸŽญ A portal like Backstage shows every service, its owner and its score

๐Ÿ“ˆ Measure adoption, lead time, DORA and developer happiness

A mandated platform nobody wants is just a new bottleneck. How do you know your platform is helping?

#PlatformEngineering #DeveloperExperience #Backstage #TeamTopologies #dotnet

โšก Quick-fire Q&A

What is a business capability, and how is it different from a process?

A capability is what the business does (e.g. "Payment initiation"), described independently of people, process and systems. A process is how it's done, step by step, and changes far more often. Capability maps stay stable for years, so they're a good anchor for heat maps, portfolios and roadmaps.

Explain the TIME model.

Gartner's portfolio rationalisation model plots each application on business value and technical fit. Tolerate (low value, good fit): keep it running cheaply. Invest (high, high): enhance it. Migrate (high value, poor fit): modernise or move it. Eliminate (low, low): retire or consolidate.

Sensitivity point vs trade-off point?

A sensitivity point is a decision that strongly affects one quality attribute, e.g. partition count and throughput. A trade-off point affects two or more attributes in opposite directions, e.g. synchronous cross-region replication improves RPO but worsens latency. Both come out of ATAM-style reviews and belong in ADRs.

Which migration strategy would you choose for a large data-centre exit?

Mostly rehost, relocate and replatform, plus retire for anything unused. AWS advises against refactoring during a large migration because it mixes two risky projects. Move first, stabilise, then modernise the workloads that justify it. Retain anything blocked by compliance or dependencies, with a review date.

How would you move a capability off a mainframe safely?

Put an API facade in front, stream changes out with CDC, build the new service behind the facade and run it in shadow mode while the mainframe stays master. Reconcile daily (counts, totals, field diffs) through at least one month-end, switch by segment with a fast route back, and only then retire the mainframe code.

What is the inverse Conway manoeuvre?

Conway's law says systems mirror the communication structure of the organisation. The inverse manoeuvre uses that on purpose: design the team structure (e.g. long-lived stream-aligned teams per domain) so the architecture you want, such as independent services, emerges naturally.

Schema registry: BACKWARD vs FORWARD, which side do you upgrade first?

BACKWARD (Confluent's default) means the new schema can read old data, so upgrade consumers first. FORWARD means old schemas can read new data, so upgrade producers first. FULL allows either order. The TRANSITIVE variants check against every earlier version, which matters for topics with long retention or replay.

When are micro-frontends worth it?

When several teams work on one large web app and the shared release train really slows them down. They add cost: duplicated dependencies, slower pages, harder UI consistency, and they need a shared design system. With one or two teams, a well-structured modular front-end is simpler.

What is a golden path, and should it be mandatory?

A golden path (or paved road) is the opinionated, supported way to do a common task, such as creating a new API, with security, logging, pipelines and policy built in. It should be the easiest route, not the only one: teams may leave it, but then own the extra work. Mandating a platform nobody wants hides its problems instead of fixing them.

How do you know an internal developer platform is working?

Measure outcomes, not features: adoption (share of services on the golden path), lead time from new repo to first production deploy, the DORA metrics, and developer satisfaction from surveys and onboarding time. If teams still raise tickets to get an environment, it is ticket-ops, not self-service.

โ† 12 ยท Architecture Documents