and operation units, with large degrees of freedom for their implementation • Former technical detail (deployment architecture) as first class architectural design principle • Network communication as hard-to-cross boundary, enforcing encapsulation • Isolation • Autonomy • Scalability • Resilience • Speed • Experimentation • Rapid Feedback • Flexibility • Replaceability
it can evolve as much as possible over the course of (ideally indefinite) time • Separation of large domain into “islands of change” • Design for replacement, not for re-use • Minimization of shared dependencies • Cell metaphor: Renewal over time • Experimentation with different micro architecture approaches possible
does not match business domain separation • Technical drivers prioritized over business drivers • Lack of awareness for stakeholder needs • Reuse driver furthers single platform approach • Microservices hype • Technical complexity • Conflicting stakeholder needs require coordination • Organizational bottlenecks due to centralized components with highly concurrent requests
structure is roles and technical capabilities, not business domain • Matches classical company structure • Division of labor in divisions, department, teams • Projects as exceptions to change something that works • Inter-departmental politics over business needs • Conflicting project and disciplinary hierarchies and stakeholders • Blameshifting
with maximum authority over all aspects of a set of capabilities • Decisions are made locally on all aspects of a solution • Success is measured via customer-oriented KPIs • Cross-functional team with biz, dev, ops skills • Customer/end user focus • Decentralized delivery capability • Speed as #1 priority • “Full-stack” requirement for developers and other roles • Redundancy instead of centralization
possible • A few hundred lines of code or less • Triggered by events • Communicating asynchronously Description: As seen on: • Any recent Fred George talk • Serverless Architecture • AWS Lambda
dependency • Common interfaces, multiple invocations • Similarity to actor-based environments • Emerging behavior (a.k.a. “what the hell just happened?”) • Well suited to decomposable/“fuzzy” business problems Consequences:
Need for resilience/stability patterns for invocations • High cost of coordination (versioning, compatibility, …) • High infrastructure demand • Often combined with parallel/streaming approach • Well suited to environments with extreme scalability requirements Consequences:
a monolithic frontend application that contains most of the business logic • (Perceived) necessary for homogenous UX • Very few developers with frontend knowledge • (Perceived) lack of frontend platform standardization • Architects with focus on backend • Strong dependency on individual frameworks and/or tooling • Bottlenecks during development • Complex and time- consuming evolution due to lack of modularity
+ UI (if present) • Able to autonomously serve requests • Light-weight integration, ideally via front-end • No extra infrastructure needed • Well suited if goal is decoupling of development teams Consequences:
unit of deployment application • Standard application • Internal modularity • No artificially introduced distribution • Single unit of development and evolution • Straightforward development • Easy to refactor • Homogeneous technical choices • Ideally suited for single small team