Architecture with Agility
Every system has an architecture, whether accidental or intentional, and regardless of whether it was put in place by a nominated architect or whether it emerged from the decisions and discussions of a team. All too often the focus of what is often described as architecture is centred around a specific set of platform technologies, which forms only one part of the set of concerns an architecture should. And all too often architecture is seen as a separate concern from development process, whereas the two are intertwined — what you build is influenced by how you build it, and vice versa.
The Architecture with Agility course looks at the relationship between Agile processes and good architecture, taking in development process models, architectural styles, requirements techniques, sufficient modelling techniques, design patterns and testing practices. This course includes a number of practical exercises so that attendees can see how the different activities fit together. There is also plenty of opportunity for discussion.
OBJECTIVES
- Outline the relationship between development process and architecture
- Appreciate the roles and failure modes of testing, modelling and technology platforms
- Explore different architectural styles and design patterns
- Try out concepts and practices in a series of exercises
AUDIENCE
Software architects and lead developers looking to both broaden and sharpen their skills in the disciplines touched on by software architecture, not just specific technologies.
LECTURE CONTENT
Software Architecture
- The scope of architecture
- Significance of design decisions
- Architectural knowledge
- Reactive design
Development Process
- Value–driven versus risk–driven approaches
- Sequential versus iterative and incremental
- Visualising progress
- Deming's Plan–Do–Study–Act (PDSA) cycle
- Agility
- Lean thinking
Architectural Expression
- Vision and communication
- Architectural viewpoints and properties
- Use cases and user stories
- Documentation, tests and code
- Models and Modelling
- System context
Development Practice
- Feedback
- Exploration and prototyping
- Reviews
- Testing as learning
- Test-driven development (TDD)
- Sufficiency versus overdesign
- Simplicity and usability
Patterns
- Recurring designs
- Context dependency
- Lone patterns
- Combining patterns
- Pattern stories and pattern languages
- Pattern examples and counterexamples
- Architectural Styles
Execution Architecture
- Optimisation and pessimisation
- Cross–cutting concerns and emergent qualities
- Physical considerations
- The effect of concurrency and distribution
Dependency Management
- Partitioning and organisation
- External dependencies
- The dependency horizon
- Partitioning with respect to uncertainty and change
Refactoring and Re-engineering
- Continuous improvement
- Kinds of changes
- Decremental development
- Smells and technical debt
- Refactoring, re-engineering and rewriting
PRACTICAL CONTENT
Exercises
- Define scope of software architecture
- Explore interaction of interruption of and progress
- Identify consequences of intentional and accidental design decisions in attendee projects
- List risks and challenges in actual and example projects
Kevlin is an independent consultant, speaker, writer and trainer. His development interests, contributions and work with companies covers programming, people and practice. He has contributed to open- and closed-source codebases, been a columnist for a number of magazines and sites and has been on far too many committees (it has been said that "a committee is a cul-de-sac down which ideas are lured and then quietly strangled"). He is co-author of A Pattern Language for Distributed Computing and On Patterns and Pattern Languages, two volumes in the Pattern-Oriented Software Architecture series. He is also editor of 97 Things Every Programmer Should Know and 97 Things Every Java Programmer Should Know. He lives in Bristol and online.