Skip to content

applicationdesignframework/applicationdesignframework.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

79 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Application Design Framework (ADF)

Purpose

Reduce lead time by bridging product-to-engineering gaps.

Definitions

Application boundary [1]:

  • A body of code that's seen by developers as a single unit
  • A group of functionality that business customers see as a single unit
  • An initiative that those with the money see as a single budget

Architecture [2][3]:

  • An architecture describes how components work together. How components communicate and interact is often the focus of architecture diagrams.

Component [4]:

  • Software components are things that are independently replaceable and upgradeable.

Mindset

Application is an ownership boundary.

Application boundary should evolve with organizational and software changes.

Guidelines

  1. Describe use case (Sales, Marketing, Product) to clarify problem and solution. Describe business flow using domain storytelling and/or event storming. Consider writing press release/frequently asked questions (PR/FAQ) narrative (example) or pitch. Identify features, bounded contexts and external dependencies. Describe business requirements.

  2. Define architecture (Product, Engineering) to address business requirements. Define technical flow (e.g., load balancer → API → database) based on business flow. Use “fracture planes” [5] to help decide on application boundaries: 1/ profit and loss group 2/ business domain bounded context 3/ regulatory compliance 4/ change cadence 5/ team location 6/ risk 7/ performance isolation 8/ technology 9/ user personas. Consider the following integration dimensions [6]: 1/ service discovery (e.g., IP addresses, DNS) 2/ data format (e.g., binary, XML, JSON, protobuf, Avro) 3/ interaction type (e.g., sync, async) 4/ interaction style (e.g., messaging, RPC, query, GraphQL). Identify application boundaries and components. Define technical requirements.

  3. Choose technologies (Engineering) to address technical requirements. Consider building proof of concept (POC) for new technologies to validate feasibility. Review decisions based on the following pillars [7]: 1/ operational excellence 2/ security 3/ reliability 4/ performance efficiency 5/ cost optimization. Document decisions using architectural decision records (ADRs).

  4. Write stories (Product, Engineering) to scope implementation. Use the following story types: 1/ User Story – “As a [type of user] I [want this thing] so that [I can accomplish this goal]” (e.g., “As a site visitor, I want to see new content when I come to the site, so I come back more often”) 2/ Job Story – “When [situation], I want to [motivation], so I can [expected outcome]” (e.g., “When it’s dinner time tonight, I want to have pizza so I can easily feed my friends”) 3/ Feature-Driven Development (FDD) – “[action] the [result] [by/for/of/to] a(n) [object]” (e.g., “Generate a unique identifier for a transaction”). Map stories to features.

  5. Create one or more repositories and a single pipeline per application (Engineering) to reduce blast radius and increase delivery performance.

  6. Organize resources configuration and business logic code by application components (Engineering) to align architecture with code.

Examples

Templates

Related frameworks

  • AWS Well-Architected Framework - apply architectural best practices for designing and operating reliable, secure, efficient, cost-effective, and sustainable systems.
  • Operational Readiness Review - ensure a consistent review of operational readiness, with a specific focus on eliminating known, common causes of impact

Related guidance

Ongoing research

  • A mechanism for introducing ADF into organization (inputs, tools, adoption, inspection, iteration, outputs).
  • Organizing ADF information for multiple use cases and applications.
  • Using conditions of satisfaction (acceptance criteria) together with or instead of the requirements section.
  • Linking architecrual decision records (ADRs) to requirements and stories (e.g., referencing the related requirement(s) and story(ies) in ADR context) to check impact of an architectural change during design phase.

References

  1. Martin Fowler - ApplicationBoundary
  2. AWS Well-Architected Framework - Definitions
  3. Neal Ford and Mark Richards - Software Architecture: the Hard Parts
  4. Martin Fowler - SoftwareComponent
  5. Matthew Skelton - Designing organizations for responsiveness
  6. Gregor Hohpe - The Many Facets of Coupling
  7. AWS Well-Architected Framework - Pillars