Software Architecture
for Developers
@simonbrown
Five things every developer should
know about software architecture
1. Software architecture isn't
about big design up front
Historically there’s been
a tendency towards
big design up front
“Waterfall”
“ ”
I believe in this concept, but the
implementation described above
is risky and invites failure.
Managing the development of large software systems
Dr Winston W. Royce
“ ”
Responding to change
over
following a plan
Moving fast, embracing change,
delivering value early, getting feedback
vs
Understanding everything up front,
defining a blueprint for the team to “follow”
Big design
up front
vs
Software
Architecture
Document
No design
up front
“ ”
Big design up front is dumb.
Doing no design up front
is even dumber.
Dave Thomas
How much up front design
should you do?
0% 100%
“ ”
just enough
It’s not about creating a
perfect end-state or
complete architecture
You need a
starting point
Evolutionary Design
Beginning With A Primitive Whole
If you don’t engage in the problem, you end up with
a very simplified and superficial view of the solution
1. Is that what we’re going to build?
2. Is it going to work?
“ ”
Architecture represents the
significant decisions, where significance
is measured by cost of change.
Grady Booch
Architecture Programming language
Monolith, microservices or hybrid approach
Design
Implementation Curly braces on the same or next line
Whitespace vs tabs
Identify and mitigate
your highest priority risks
“ ”
Base your architecture on
requirements, travel light
and prove your architecture
with concrete experiments.
Agile Architecture: Strategies for Scaling Agile Development
Scott Ambler
Concrete experiment
Proof of concept, prototype, spike, tracer, vertical slice,
walking skeleton, executable reference architecture, …
Just enough up front design to create
firm and sufficient foundations
Thinking about
software architecture lets you
stack the odds of success
in your favour
2. Every software team needs
to consider software
architecture
What happens if a software
development team doesn’t
think about architecture?
Chaos
Big ball of mud, spaghetti code, inconsistent
approaches to solving the same problems,
quality attributes are ignored, deployment
problems, maintenance issues, etc
Every team needs
technical leadership
3. The software architecture
role is about coding, coaching
and collaboration
Software development
is not a relay sport
Software
Architecture
Document
AaaS
Architecture as a Service
Continuous
technical
leadership
Different types of teams need
different leadership styles
Pair architecting
Soft skills
(leadership, communication, presentation, influencing,
negotiation, collaboration, coaching and mentoring,
motivation, facilitation, political, etc)
Good software architects
are typically
good software developers
The people designing software must
understand technology …
all decisions involve trade-offs
1. Is that what we’re going to build?
2. Is it going to work?
Should software architects
write code?
Production code, prototypes,
frameworks, foundations, code
reviews, experimenting, etc
Don’t code all of the time!
Software architects
should be
master builders
Experience is important …
software architecture is not a rank!
Progress Toward an Engineering Discipline of Software
Mary Shaw
The software architecture role
is multi-faceted
(technical depth, technical breadth, soft skills)
4. You don't need to use UML
Do you use UML?
In my experience, optimistically,
1 out of 10 people use UML
1. Is that what we’re going to build?
2. Is it going to work?
A common set of abstractions
is more important
than a common notation
Software System
Container Container Container
lient-side web app, server-side web app, console application, (e.g. client-side web app, server-side web app, console application, (e.g. client-side web app, server-side web app, console applic
obile app, microservice, database schema, file system, etc) mobile app, microservice, database schema, file system, etc) mobile app, microservice, database schema, file system, e
Component Component Component
Class Class Class
A software system is made up of one or more containers,
each of which contains one or more components,
which in turn are implemented by one or more classes (or code).
C4
c4model.com
Diagrams are maps
that help software developers navigate a large and/or complex codebase
Software Guidebook
(maps, points of interest, sights, itineraries,
history, culture, practical information, etc)
“ ”
What tools do you
recommend?
public static void main(String[] args) throws Exception {
Workspace workspace = new Workspace("Getting Started", "This is a model of
Model model = workspace.getModel();
Person user = model.addPerson("User", "A user of my software system.");
SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System",
user.uses(softwareSystem, "Uses");
ViewSet views = workspace.getViews();
SystemContextView contextView = views.createSystemContextView(softwareSyste
contextView.addAllSoftwareSystems();
contextView.addAllPeople();
Styles styles = views.getConfiguration().getStyles();
styles.addElementStyle(Tags.SOFTWARE_SYSTEM).background("#1168bd").color("#
styles.addElementStyle(Tags.PERSON).background("#08427b").color("#ffffff").
}
static void Main()
{
Workspace workspace = new Workspace("Getting Started", "This is a model of
Model model = workspace.Model;
Person user = model.AddPerson("User", "A user of my software system.");
SoftwareSystem softwareSystem = model.AddSoftwareSystem("Software System",
user.Uses(softwareSystem, "Uses");
ViewSet viewSet = workspace.Views;
SystemContextView contextView = viewSet.CreateSystemContextView(softwareSys
contextView.AddAllSoftwareSystems();
contextView.AddAllPeople();
Styles styles = viewSet.Configuration.Styles;
styles.Add(new ElementStyle(Tags.SoftwareSystem) { Background = "#1168bd",
styles.Add(new ElementStyle(Tags.Person) { Background = "#08427b", Color =
}
For more information about
software architecture
diagrams and documentation…
5. A good software
architecture enables agility
Agile is about moving fast,
embracing change, releasing often,
getting feedback, …
Agile is about a mindset of
continuous improvement
A good architecture
enables agility
Modular
Microservices
monolith
Modularity
Monolithic Distributed
big ball of mud big ball of mud
Number of deployment units
Agility is a
quality attribute
A good architecture rarely
happens through
architecture-indifferent design
Five things every developer should
know about software architecture
1. Software architecture isn't about big design up front
2. Every software team needs to consider software architecture
3. The software architecture role is about coding, coaching and collaboration
4. You don't need to use UML
5. A good software architecture enables agility
[email protected]
@simonbrown