Five Things Every Developer Should Know about Software Architecture • Simon Brown • GOTO 2020

GOTO Conferences
18 Jan 202129:44

Summary

TLDRThe speaker addresses common myths about software architecture, emphasizing the importance of a balanced approach between 'big design up front' and agility. They discuss the evolution from waterfall models to agile and iterative development, highlighting the Agile Manifesto's preference for responding to change over sticking to a plan. The talk explores the concept of 'just enough' design, which involves making significant decisions that are hard to change later, such as technology choices, while remaining flexible and open to feedback. The speaker also stresses the role of software architects in coding, coaching, and collaboration, advocating for a continuous involvement throughout the project lifecycle. They debunk the necessity of UML for architecture and introduce the C4 model as a tool for creating hierarchical diagrams to communicate architecture effectively. Finally, they argue that a good architecture enables agility, allowing for rapid, incremental development and continuous improvement, and advise against adopting trends like microservices without careful consideration of the specific needs and structure of the project.

Takeaways

  • 🚫 **Myth Dispelling**: The speaker emphasizes that 'big design up front' and software architecture are not the same, and that the former has been largely debunked in favor of agile and iterative approaches.
  • 🔄 **Agile Manifesto**: The manifesto prioritizes responding to change over following a plan, which challenges traditional waterfall methodologies and encourages a more flexible approach to software development.
  • ⚖️ **Balanced Design**: Both extremes of 'no design' and 'big design up front' are not ideal. The speaker advocates for a balanced approach, suggesting that 'just enough' upfront design is necessary.
  • 🛠️ **Technical Leadership**: Every team needs some degree of technical leadership to guide architecture decisions and avoid chaos, such as big balls of mud or inconsistent code bases.
  • 🤝 **Collaborative Architecture**: The old-fashioned, dictatorial approach to architecture is outdated. Instead, architects should code, coach, and collaborate with development teams throughout the project lifecycle.
  • 👥 **Team Maturity**: Different levels of team maturity require different leadership styles. Inexperienced teams might need more direct guidance, while experienced teams benefit from autonomy and the removal of blockers.
  • 💻 **Architects Should Code**: Good software architects are also skilled developers, which allows them to stay connected with the code base and ensure that architectural decisions are practical and followed.
  • 📈 **Risk Management**: Identifying and mitigating the highest priority risks should be a part of the architecture process. Techniques like 'risk storming' can help teams collaboratively identify these risks.
  • 📝 **Documentation and Experimentation**: Documentation should be light but sufficient to guide development. Concrete experiments, such as prototypes or spikes, are crucial to validate architectural decisions.
  • 📐 **C4 Model**: The C4 model provides a hierarchical set of diagrams to describe software systems at different levels of abstraction, which can be used to communicate effectively without prescribing specific notation.
  • 🔧 **Architecture for Agility**: A good architecture enables agility by being well-structured and modular, allowing for faster and more isolated changes, which is crucial for responding to volatile business requirements.

Q & A

  • What is the first myth the speaker wants to dispel about software architecture?

    -The first myth the speaker wants to dispel is the notion that software architecture is synonymous with 'big design up front.' Historically, there was a tendency towards this approach, but the speaker emphasizes that this is not the same as software architecture, which can be more iterative and flexible.

  • What does the speaker say about the concept of 'big design up front'?

    -The speaker points out that 'big design up front' was a predominant approach in the past, particularly in the 80s, 90s, and early 2000s. However, Winston Royce, who described the waterfall model in the 1970s, actually warned against this approach, stating that it was risky and could invite failure.

  • What is the Agile Manifesto's stance on responding to change versus following a plan?

    -The Agile Manifesto, created in 2001, values responding to change over following a plan. This principle challenges the traditional approach of 'big design up front' and encourages a more flexible and adaptive methodology in software development.

  • What does Dave Thomas say about the extremes of 'big design up front' and doing no design at all?

    -Dave Thomas is quoted as saying that 'big design up front' is done for various reasons, and that doing no design up front is even more foolish. This underscores the need for a balanced approach to software architecture that avoids both extremes.

  • What is the concept of 'just enough' design?

    -'Just enough' design refers to doing the minimum amount of upfront design necessary to establish a good starting point and set an initial direction for the project. It emphasizes the need for a foundation that can evolve and adapt as more is learned through feedback and experimentation.

  • What is the significance of the term 'architecture' as defined by Grady Booch?

    -Grady Booch defines 'architecture' as representing significant decisions, where significance is measured by the cost of change. This definition highlights that some design decisions are more important than others due to their long-term impact and the difficulty of changing them later on.

  • Why is it important for software development teams to have technical leadership?

    -Technical leadership is important because it guides the team in making significant decisions about the architecture and technology choices that will affect the system's maintainability, scalability, and overall quality. It also helps to prevent chaos and ensure that the team's efforts are directed towards a coherent vision.

  • What is the role of an architect in the context of coding and coaching?

    -The role of an architect is not just to design the system but also to engage in coding, coaching, and collaboration with the development team. This approach moves away from a dictatorship model to a more collaborative one, where architects work closely with developers to ensure that the design is practical and adhered to.

  • Why should architects write production code?

    -Architects should write production code to maintain a pulse on the code base, ensure that guidelines are followed, and to keep the design and code base moving in the right direction. It also helps architects to understand the trade-offs involved in design decisions and to assess the impact of those decisions on the system.

  • What is the C4 model and how does it help in describing software architecture?

    -The C4 model is a set of hierarchical diagrams that can be used to describe different levels of abstraction in software systems. It stands for Context, Containers, Components, and Code. The model provides a structured way to visualize and communicate the architecture at various levels, from a high-level context diagram to detailed code structure.

  • How does a good architecture enable agility in software development?

    -A good architecture enables agility by being well-structured and highly modular. This allows changes to be isolated to specific parts of the code base, reducing the complexity and risk associated with making changes. It supports the ability to move fast and adapt quickly to changing requirements, which is a key aspect of agile software development.

Outlines

00:00

🏛️ Debunking Software Architecture Myths

The speaker begins by addressing common misconceptions about software architecture, emphasizing the shift from 'big design up front' to more agile and iterative approaches. The historical context of software development is provided, referencing the waterfall model and its pitfalls as highlighted by Winston Royce. The Agile Manifesto's preference for responding to change over following a plan is discussed, along with the importance of finding a balanced approach between extremes. The concept of 'just enough' upfront design is introduced, tailored to the context and needs of the project, whether in an enterprise environment or a startup.

05:00

🔍 Prioritizing Significant Design Decisions

The paragraph focuses on the importance of identifying and prioritizing significant architectural decisions based on their cost of change. It discusses the concept of software architecture as defined by Grady Booch, where architecture represents decisions with lasting impact. The speaker differentiates between major technology choices, which are significant, and minor coding preferences, which are not. The role of concrete experiments in validating architectural decisions is also highlighted, along with the importance of risk-driven approaches to software development.

10:01

🤼‍♀️ Collaborative Software Architecture

The speaker dispels the myth of the isolated architect, advocating for a collaborative approach to software architecture. The traditional 'dictatorship' model of architecture is critiqued in favor of continuous technical leadership throughout the project lifecycle. Different leadership styles for teams of varying maturity levels are discussed, emphasizing the need for adaptation. The importance of soft skills in architecture is highlighted, along with the value of architects writing production code to maintain a pulse on the codebase.

15:01

📈 The Role of Diagrams in Architecture

This section discusses the importance of diagrams in communicating software architecture effectively. The speaker criticizes the common practice of poor diagramming and introduces the C4 model as a structured approach to creating hierarchical diagrams that serve as visual maps of the system. The C4 model is described as notation-independent, allowing for various diagramming styles. The Structurizer DSL is introduced as a tool for generating diagrams from a single source file, promoting a more thoughtful and effective approach to diagram creation.

20:02

🚀 Enabling Agility with Good Architecture

The speaker argues that agility is not just a process but also a quality attribute that can be designed into the architecture of a system. The concept of agility is explored in terms of the ability to move fast and embrace change. Good architecture is described as being well-structured and highly modular, which enables agility by isolating changes to specific parts of the codebase. The importance of making thoughtful architectural decisions is emphasized, rather than following trends or hype, to achieve a structure that supports the desired level of agility.

Mindmap

Keywords

💡Software Architecture

Software architecture refers to the high-level design and structure of a software system, which includes the selection of the software's components and the way these components interact with each other. In the video, the speaker discusses the myths surrounding software architecture and emphasizes the need for a balanced approach that is neither 'big design up front' nor 'no design at all'. It is central to the video's theme of finding the right amount of up-front design in software development.

💡Agile Manifesto

The Agile Manifesto is a set of principles that guide the development of software through an iterative and incremental approach, valuing flexibility and customer collaboration. The video mentions the Agile Manifesto to highlight the shift from the traditional 'waterfall' approach to more adaptive planning and design, which is crucial for responding to change effectively in software development.

💡Iterative and Incremental Development

Iterative and incremental development is a software development approach where the work is broken down into smaller parts, or increments, and developed through a series of repeated cycles or iterations. The video emphasizes this approach as a contrast to the 'big design up front' methodology, advocating for a more flexible and responsive design process that can evolve with feedback and changing requirements.

💡Minimum Viable Product (MVP)

A Minimum Viable Product (MVP) is a version of a product with just enough features to satisfy early customers and provide feedback for future development. The speaker uses the concept of MVP to illustrate the approach startups might take when they are uncertain about the market's needs and require validation through customer interaction and experimentation.

💡Evolutionary Design

Evolutionary design is a process where an initial, basic design is created and then iteratively improved upon based on feedback and experience. The video references a blog post by Josh Kirievsky on evolutionary design to explain the need for an initial design that is flexible enough to evolve, emphasizing the importance of starting with a 'primitive whole' and building upon it.

💡Technical Leadership

Technical leadership involves guiding the technical direction and decisions within a software project. The video stresses that every software development team requires some level of technical leadership to prevent chaos and ensure that architectural decisions are made thoughtfully and consistently. It is portrayed as a key factor in maintaining the integrity and quality of the software system.

💡Architectural Decisions

Architectural decisions are significant choices made during the design of a software system that can have long-term implications on its structure and functionality. The speaker, quoting Grady Booch, explains that these decisions are measured by the cost of change, meaning that once made, they can be difficult and expensive to alter. The video underscores the importance of making informed and justifiable architectural decisions.

💡Risk Storming

Risk storming is a collaborative technique for identifying and prioritizing risks associated with a software project. The video introduces this method as a more effective approach than having a single individual list perceived risks. It allows a team to collectively brainstorm and visualize potential issues, making the risk identification process more democratic and comprehensive.

💡C4 Model

The C4 model is a set of hierarchical diagrams used to describe different levels of abstraction in software systems. It stands for Context, Containers, Components, and Code. The video presents the C4 model as a tool for creating a visual ubiquitous language that can effectively communicate the architecture of a system. It allows for structured conversations about the system's design with various stakeholders.

💡Diagrams as Code

Diagrams as Code is a technique where diagrams are created using a textual format, such as a domain-specific language or programming language code. The video discusses this approach, mentioning the Structurizer DSL as an example, which allows for the generation of multiple diagrams from a single source file. This method promotes consistency and maintainability of diagrams, which is essential for clear communication of the software architecture.

💡Agility

Agility in software development refers to the ability to respond quickly to change and deliver value to customers in a timely manner. The video clarifies that agility is not in opposition to architecture but rather is complemented by good architectural practices. A well-structured architecture enables agility by providing a solid foundation that supports rapid, incremental changes and iterations.

Highlights

Dispelling myths around software architecture, emphasizing that big design up front and iterative design are not the same.

Historical context of software development trends, from waterfall to agile methodologies.

The Agile Manifesto's prioritization of responding to change over following a plan.

Critique of both extremes of design approaches: too much upfront and no design at all.

The concept of evolutionary design, starting with a primitive whole and iteratively improving.

Importance of making significant decisions measured by the cost of change.

Technical leadership as a key component of every development team's architecture.

Different leadership styles required for teams of varying maturity levels.

Collaboration and soft skills are crucial for effective architectural practice.

Architects should be involved throughout the entire lifecycle of a project, not just at the beginning.

The role of architects also involves coding and coaching to maintain a pulse on the code base.

The C4 model as a hierarchical set of diagrams to describe different levels of software systems.

Diagrams as code, using textual formats to create diagrams, offering flexibility and avoiding tool lock-in.

The Structurizer DSL, an open-source domain-specific language for creating C4 model diagrams.

Agility in architecture is about the ability to move fast and is a quality attribute that can be designed for.

Good architecture enables agility by being well-structured and highly modular.

Architecture should be thought out and not just following trends or hype, such as with microservices.

The importance of making significant, hard-to-change decisions carefully in architecture.

Transcripts

play00:00

[Music]

play00:13

really this talk is

play00:14

about dispelling a bunch of myths that

play00:17

i've seen over the past decade or so

play00:18

when i've been traveling

play00:19

the world and doing consulting and

play00:20

training and that sort of thing and the

play00:22

first

play00:23

myth i wanted to spell is probably the

play00:25

biggest one

play00:26

and whenever people think about software

play00:28

architecture they normally think about

play00:29

big design up front and and these two

play00:31

things are not

play00:32

the same so of course historically there

play00:34

has been a tendency towards big design

play00:36

upfront

play00:37

this is very predominant in the 80s and

play00:39

90s and maybe the early 2000s to some

play00:41

extent

play00:42

this is the old waterfall thing kind of

play00:43

looks like this we've seen this a

play00:45

thousand times before

play00:46

this diagram this image actually comes

play00:48

from a paper written in the 1970s by

play00:51

winston royce

play00:53

and he's describing different approaches

play00:54

to software development

play00:56

and he actually says this underneath the

play00:58

illustration

play00:59

i believe in this concept but the

play01:01

implementation described above is risky

play01:03

and invites failure

play01:04

so what he's actually saying all those

play01:06

years ago is this kind of makes sense

play01:07

but please don't do it

play01:08

and if you read further what he actually

play01:10

talks about is what we really now know

play01:12

as

play01:12

the agile and iterative and incremental

play01:14

approaches to software development

play01:16

so a bunch of stuff happens through the

play01:17

80s 90s including some of the

play01:20

uh the very early adore stuff and rapid

play01:22

application development and dsdm and

play01:24

things

play01:24

and eventually we get to 2001 and the uh

play01:27

creation of the agile manifesto

play01:29

the actual manifesto says this on the

play01:30

front page we value responding to change

play01:33

over following

play01:33

a plan and of course at face value this

play01:36

seems to throw

play01:37

everything we've ever known on its head

play01:39

and what i've seen over the past

play01:40

20 years or so is that many

play01:42

organizations have flipped from doing

play01:44

big deal upfront to literally nothing at

play01:46

all

play01:47

and both of these extremes are not

play01:51

great and there's a great quote i'd like

play01:53

to use here by dave thomas and he says

play01:54

this

play01:55

big design upfront is done i agree for a

play01:58

whole bunch of reasons

play01:59

and doing no design upfront is even

play02:01

dumber

play02:02

and this really epitomizes what i've

play02:04

seen over the past uh couple of decades

play02:06

or so

play02:07

so the big question everybody's kind of

play02:10

really wanting to

play02:11

have answered is well how much up front

play02:13

design should you do

play02:15

now of course wall tool says do all of

play02:16

it and agile on the face of it anyway

play02:19

seems to suggest not doing any at all

play02:22

and the answer is well you need to

play02:24

figure out what it is you're doing and

play02:26

it depends what does it depend on

play02:28

sometimes you know what you're doing and

play02:29

sometimes you don't so if you're working

play02:31

in

play02:31

a big enterprise environment and you

play02:33

might be doing a system replacement

play02:35

you might have a fairly good fixed idea

play02:36

of what you want to be delivering

play02:39

if you are creating a startup company

play02:41

and putting a product out into the

play02:42

market for the first time you've got to

play02:44

do the mvp thing and get some feedback

play02:46

and experimentation and so on and so

play02:48

forth

play02:49

so in that situation you might need to

play02:50

take a slightly different approach

play02:53

so the general way of describing how

play02:55

much upfront design should you need to

play02:56

do is really what we need to do just

play02:58

enough

play02:59

right what does that actually mean i

play03:02

think

play03:02

the problem with upfront design is that

play03:06

it paints a picture of putting a perfect

play03:10

blueprint a perfect end goal

play03:13

an end state um and that's not really

play03:15

what we're trying to do here i i don't

play03:17

think we're trying to create that

play03:18

perfect end state or complete

play03:20

architecture i think we're trying to do

play03:21

something else

play03:22

instead there's a great blog post by

play03:25

josh kirievsky

play03:26

it's called evolutionary design

play03:28

subtitled beginning with the primitive

play03:30

whole

play03:31

and this is the thing we've seen a

play03:32

thousand times before as well so

play03:34

you put out a first version of something

play03:36

and then you add features get some

play03:37

feedback and so on and so forth

play03:40

the thing very few people talk about is

play03:42

how do we actually get to that first

play03:44

version

play03:45

so in order to do the iterative and

play03:47

incremental thing we need to have a good

play03:49

set of foundations we need to choose in

play03:52

this case

play03:53

the overall shape the starting materials

play03:57

potentially the extension points we

play03:58

think we might want to use in the future

play04:00

and so on and so forth

play04:02

so we need to put some design some

play04:04

thinking into that initial first version

play04:07

and that's really what i'm talking about

play04:10

here it's about adding

play04:11

that starting point creating that

play04:13

starting point

play04:15

why do we want to do this imagine

play04:17

starting out with a new software

play04:18

development project or product

play04:20

and you're sketching out some ideas on a

play04:22

whiteboard when you are sketching out

play04:24

those ideas either on your own or

play04:25

collaboratively and we'll talk about

play04:26

that later

play04:28

you really want to be able to answer two

play04:30

basic

play04:31

questions number one do the diagrams we

play04:34

are drawing do they reflect what we

play04:36

think we actually want to go and build

play04:38

and question number two how confident

play04:40

are we that design that

play04:42

solution is actually going to work and

play04:44

be feasible

play04:46

in order to get to the point of drawing

play04:48

diagrams on whiteboards you need to make

play04:49

some decisions and

play04:51

there's a really nice quote by grady

play04:52

booch where he talks about the

play04:54

definition of architecture

play04:56

or his definition of architecture and he

play04:58

says this architecture represents the

play05:00

significant decisions

play05:01

where significance is measured by cost

play05:03

of change

play05:05

and the reason i like this definition of

play05:07

software architecture

play05:09

is that it really says some in some

play05:12

design decisions

play05:13

are more important than others if you

play05:16

were to

play05:17

go and write down all of the decisions

play05:19

you've ever made on your current

play05:22

product or project and try to sort

play05:25

them by how important or significant

play05:28

they are

play05:29

what you'll find very quickly is it it's

play05:31

very hard to draw a line between all of

play05:34

this stuff up here is significant

play05:35

and all of this stuff down here is not

play05:37

significant

play05:38

so it's a it's a gradient of different

play05:41

types of decisions with different levels

play05:43

of significance

play05:44

the ones we really want to be focusing

play05:46

on the ones that are hard to change

play05:48

ultimately are things like choice of

play05:50

language

play05:51

so is this going to be a java monolith

play05:53

or ruby monolith you know

play05:55

once we've chosen our language that's

play05:56

kind of hard to change

play05:58

the overall structure of the thing we're

play06:00

building so if we choose to build a

play06:02

monolith

play06:03

converting that to microservices

play06:04

architecture is

play06:06

something that involves quite a lot of

play06:07

time and effort and of course the

play06:09

opposite is true

play06:10

so really a lot of these significant

play06:11

decisions revolve around

play06:14

technology choices major technology

play06:17

choices the things that become ingrained

play06:19

into our code bases and the way that we

play06:22

use these technologies

play06:23

in terms of the structure and the

play06:24

modularity

play06:26

one of the things to be careful of here

play06:28

is many teams will say

play06:30

it doesn't really matter about

play06:32

technology choices because what we're

play06:34

going to do is we're going to build a

play06:35

java monolith and we're going to use

play06:37

ports and adapters or uncle bob martin's

play06:39

clean architecture

play06:40

so we're going to isolate all of our

play06:41

business logic and make all of our tech

play06:43

choices

play06:44

deferrable and decoupled from our code

play06:46

base

play06:48

that's fine but that has a set of

play06:50

trade-offs

play06:51

and the significant decision you just

play06:53

made is one around structure

play06:55

and that has its own set of tradeoffs

play06:58

so what's not important curly braces

play07:01

white's face

play07:02

tabs all of that stuff don't care about

play07:04

i know we have all these religious

play07:06

debates but

play07:06

it really doesn't matter we can just

play07:07

chuck some tawning on it and fix it one

play07:09

might be or the other

play07:11

there's lots of material out there on

play07:13

agile architecture uh something i like

play07:15

is scott ambler's approach and he has a

play07:17

great

play07:17

essay on agile architecture that you can

play07:19

basically summarize in one sentence like

play07:21

this you should base your architecture

play07:23

on your requirements

play07:24

so in other words don't make decisions

play07:26

unless you have reason for making those

play07:27

decisions

play07:28

travel light so do the just enough thing

play07:31

you know be agile

play07:32

and make sure you prove your

play07:34

architecture with concrete experiments

play07:36

what's a concrete experiment is nothing

play07:38

more than these things

play07:40

uh proof of concept uh prototype of

play07:42

spiker tracer we have lots different

play07:43

names for the same thing

play07:44

the same thing is basically writing some

play07:46

code to prove our hypothesis

play07:49

and i like to include the concrete

play07:51

experimentation as a part of my upfront

play07:53

design process

play07:55

one of the more interesting questions

play07:56

here as well how do i know which

play07:58

concrete experiments to run how do i

play08:00

know which bits my system

play08:02

i want to prototype before i start

play08:04

getting into writing lots of production

play08:06

code

play08:08

something that the rational unified

play08:10

process said all those years ago rupp

play08:12

is that we should identify and mitigate

play08:15

our highest

play08:16

priority risks and i think this is a

play08:18

great thing to do today

play08:19

rupp was a risk-driven approach to

play08:21

building software and

play08:22

it front loaded all of the big

play08:26

risky stuff to the the start of the

play08:28

project life cycle

play08:30

there's a bit of unpacking to do here

play08:33

which we don't have time for but feel

play08:34

free

play08:35

feel free to ask some questions

play08:36

afterwards you know what's a higher

play08:37

priority risk versus low priority risk

play08:40

and also how do you identify risks in

play08:42

the first place

play08:43

one of the typical techniques we've used

play08:45

is we'll get the single project manager

play08:47

or the single architect

play08:48

to go write a list of all the risks that

play08:50

they perceive with that solution

play08:52

that's not particularly a good way to do

play08:54

it because risks much like estimates are

play08:56

subjective

play08:57

so there's a technique i created a while

play08:59

back it's called risk storming

play09:01

and it's a visual collaborative kind of

play09:03

game storming inspired approach to

play09:05

identifying risks

play09:07

collaborative collaboratively as the

play09:09

groups that's something you can go look

play09:10

up online

play09:11

to go back to the how much upfront

play09:13

design should we do question

play09:15

what we're really trying to do here is

play09:17

we're trying to do enough upfront design

play09:19

in order to put that starting point in

play09:21

place

play09:22

and set an initial direction

play09:26

and i do want to stress that's an

play09:28

initial direction so i'm

play09:29

quite happy for the set of decisions and

play09:32

the solution

play09:33

to change as we deliver stuff and get

play09:36

feedback and have real users using our

play09:38

software

play09:39

but any changes we make should be done

play09:41

in a

play09:42

structured and justified manner

play09:48

one of the other ways to think about

play09:49

offline design is well when do we stop

play09:51

and i think upfront design is an issue

play09:53

of an incremental process

play09:55

so it might be something you need to do

play09:57

um one or more times

play09:59

and you should stop when you can do this

play10:01

type of stuff so you have a good idea of

play10:03

what your context is what the scope the

play10:04

system is you're building

play10:06

how it fits into the world around it

play10:07

what the key requirements are

play10:09

what the key non-functional requirements

play10:11

are and those sorts of things so

play10:13

so really that's my kind of one takeaway

play10:16

slide

play10:16

about how much upfront design should we

play10:18

do and where should we stop

play10:21

so that's thing number one

play10:25

thing number two is that every team

play10:27

needs to think about all that stuff

play10:30

what happens if teams don't think about

play10:31

architecture you get a mess

play10:34

chaos chaos manifests itself in a whole

play10:36

bunch of different ways

play10:37

big balls of mud spaghetti code systems

play10:40

you know code bases are just horrible to

play10:41

work with

play10:42

code bases with an inconsistent

play10:44

approaches to solving the same problems

play10:46

so i've seen

play10:46

a number of codebases over the years

play10:48

with multiple logging frameworks and the

play10:50

same monolith multiple database access

play10:53

frameworks in the same monolith

play10:55

monolithic code base and so on and so

play10:56

forth i've seen systems that that are

play10:59

hard to deploy hard to look after hard

play11:01

to maintain logging is a problem

play11:03

or they don't have appropriate quality

play11:06

attributes like scaling and security

play11:08

performance

play11:09

so that's the category of stuff that i

play11:11

think doing some upfront design

play11:13

and architecture really helps to address

play11:15

and all of that stuff is applicable to

play11:17

every team

play11:19

one of the ways i like to think about

play11:20

software architecture is that it's about

play11:22

technical leadership

play11:23

and when you think about it that way you

play11:26

kind of quickly realize that actually

play11:27

every software development team

play11:29

needs some degree of technical

play11:30

leadership if you're a one-person team

play11:32

you need a small amount of technical

play11:34

leadership if you're a hundred

play11:35

two hundred thousand person team then

play11:38

you need a much

play11:39

bigger degree of technical leadership

play11:40

but nonetheless you need technical

play11:42

leadership

play11:43

i'm also going to say this every

play11:45

software system or every product

play11:47

also needs technical leadership and the

play11:50

reason i say this is because i see lots

play11:52

of teams these days

play11:53

adopting things like the spotify model

play11:55

where you've got

play11:57

squads who are working on business

play11:58

features and they might be

play12:00

given autonomy and authority to change

play12:04

multiple pieces of code and multiple

play12:06

repositories

play12:08

on multiple products

play12:12

if that scales up what i've tended to

play12:15

see happen is that because you've got

play12:16

all of these teams potentially changing

play12:18

the same

play12:19

code bases because there's no

play12:22

single ownership of those code bases

play12:24

sometimes the teams start making changes

play12:26

in very inconsistent ways

play12:28

so do also think about technical

play12:30

leadership from that perspective as well

play12:35

number three the software architecture

play12:38

role

play12:39

is about coding coaching and

play12:41

collaboration

play12:42

so this is a myth i want to dispel

play12:44

because again the

play12:45

the old-fashioned approach to software

play12:47

architecture is the dictatorship

play12:49

approach

play12:50

where architects work on their own they

play12:52

produced a huge bid document and they

play12:53

basically give that document to a team

play12:55

of developers and just tell them to go

play12:57

get on with it

play12:58

that's not how we should be doing stuff

play13:00

that's how we used to do stuff in the

play13:01

past

play13:02

and these architects also often used to

play13:04

use these documents

play13:05

as batons in a relay race

play13:08

i don't like this approach i call this

play13:10

approach ass it's just

play13:12

architecture as a service it's just a

play13:14

one-way stream of architecture decisions

play13:17

with ultimately no feedback loops

play13:20

and one of the things i like to tell

play13:21

teams is that your technical leadership

play13:23

should be continuous

play13:25

so don't think about getting an

play13:26

architect in for the first two or four

play13:28

weeks of your project lifecycle

play13:29

you need to have someone doing the

play13:31

architecture role throughout the entire

play13:33

life cycle

play13:34

that could be one person or it could be

play13:35

a whole bunch of people that's entirely

play13:37

up to you and we'll talk about that in a

play13:38

second

play13:42

different types of teams need different

play13:44

leadership styles so this is something i

play13:46

realized a few years back and royal

play13:47

shrove has a great book called elastic

play13:49

leadership that

play13:50

talks about this problem from a team

play13:53

leader perspective

play13:54

i think the same issue happens from a

play13:56

technical leadership perspective

play13:59

so if you've got a team of developers

play14:01

and they're fairly

play14:02

junior and they don't really know what

play14:04

they're doing because they don't have

play14:05

much experience

play14:07

generally telling them what to do and

play14:09

helping them in a much more direct way

play14:11

in the kind of commanding control

play14:13

way that makes that team go faster

play14:17

if you have a team of rockstar ninja

play14:20

10xs or whatever silly tone we use to

play14:22

describe really experienced developers

play14:24

don't micromanage them just remove the

play14:26

blockers and

play14:27

get out of their way so different levels

play14:30

of maturity

play14:31

you know different types of teams with

play14:32

different levels of maturity need

play14:34

different leadership styles

play14:36

even with the immature team the

play14:38

inexperienced team you still need to

play14:40

give them some time and space

play14:42

so that they can start to understand and

play14:45

solve their own problems and therefore

play14:47

become more mature so that's the other

play14:49

thing to to kind of bear in mind here

play14:52

and the reason i bring left this up is

play14:54

because teams often ask me should we

play14:55

have one person doing the architectural

play14:57

or should we have many people

play14:58

you know should we share the role out

play14:59

amongst the entire team and it's up to

play15:01

you

play15:02

my advice and a good starting point is

play15:04

to do pair architecting

play15:06

and this is what i used to practice

play15:08

myself when i uh built software for

play15:10

consulting companies back in london all

play15:11

those years ago

play15:12

so it used to be myself and another

play15:14

person typically another architect but

play15:17

not always

play15:17

um you know two heads to bed and one etc

play15:20

etc

play15:22

in order to do that you need your

play15:24

collaboration skills and this really

play15:25

points to having good soft skills in

play15:27

general so this is

play15:28

an aspect to the software architectural

play15:30

that we don't talk about enough in the

play15:32

industry

play15:33

but really this is kind of the make or

play15:36

break stuff if you

play15:37

if you can't lead people well if you

play15:39

can't collaborate well if you can't

play15:41

influence a team well

play15:42

you're going to have a really hard time

play15:43

doing the architectural so i would urge

play15:46

you if

play15:47

especially if you're moving into your

play15:48

first architecture roles to put some

play15:50

time

play15:50

and effort into learning some of that

play15:52

soft skill stuff

play15:55

let's not forget the tech stuff should

play15:57

architects write code

play15:59

my opinion on this is most definitely

play16:01

yes and my preferred approach here is

play16:03

the architect's right production code

play16:06

this is definitely what i do as far as

play16:08

possible

play16:09

the reason i like this approach is

play16:10

because then you as an architect

play16:12

have a pulse on the code base you can

play16:15

see what's going on

play16:16

you can see that people are following

play16:19

the guidelines that we've all agreed to

play16:21

collaboratively

play16:22

and you can make sure the code base is

play16:24

going in the right direction

play16:25

if you're a bit more hands-off that's

play16:27

much much harder to do

play16:30

most of the good software architects i

play16:32

know are also good software developers

play16:34

so again they have a good technical

play16:36

background that they might be

play16:38

specialists in building java server side

play16:40

apps or dotnet apps or rubric apps or

play16:42

ios apps or oracle database driven apps

play16:45

so they have some deep specialism but

play16:47

they also have a broader range of

play16:50

design knowledge architecture knowledge

play16:53

knowledge about non-functional

play16:54

requirements and cross-cutting concerns

play16:56

and logging and operability and all that

play16:58

sort of stuff

play16:59

and this is super important because if

play17:00

you're designing software you need to

play17:02

understand technology in order to assess

play17:04

trade-offs

play17:05

unfortunately there's no perfect silver

play17:08

bullet solution to

play17:09

any problem so you know any decision we

play17:11

make is going to have us have trade-offs

play17:13

and if you don't have the pre-requisite

play17:15

technical skills again you can't answer

play17:17

these two questions i

play17:18

outlined before so the software

play17:20

architecture role

play17:21

it can be done by one or many people but

play17:23

it's multifaceted it requires good

play17:25

tech skills and good non-tech skills

play17:32

four my favorites uh you don't need to

play17:34

use uml

play17:35

this is one of the things that for some

play17:37

reason scares people off doing a

play17:39

software architectural

play17:40

when i do these talks in front of a live

play17:42

audience i i ask people

play17:44

how many people here use uml and

play17:46

typically it's in the kind of one out of

play17:48

ten ratio there are a few exceptions

play17:50

this

play17:51

varies country to country cultures

play17:53

culture but generally it's about one out

play17:54

of ten people so not a huge number of

play17:56

people these days using uml

play17:58

why i've heard every excuse you can

play18:01

possibly imagine

play18:03

um it's too complicated it's too

play18:05

detailed the tooling sucks

play18:07

you'll be seen as old-fashioned or in

play18:10

the case of this guy he said it's a very

play18:12

elaborate waste of time

play18:14

that might be true if you overuse uml i

play18:17

mean uml is just a language

play18:18

it's just a notation you can overuse it

play18:21

you can under use it it's entirely up to

play18:22

you

play18:24

what is the recommended advice these

play18:27

days in terms

play18:28

of diagramming and presenting

play18:31

your designs in a visual manner well the

play18:34

answer many people give you is

play18:35

just use a whiteboard

play18:39

and that's that's okay you know that's a

play18:42

decent piece of advice

play18:43

but unfortunately it provides absolutely

play18:45

no guidance

play18:47

so one of the things i i typically do

play18:49

when i'm allowed to travel and we're not

play18:50

in a

play18:51

pandemic is i get to travel around the

play18:54

world and i run

play18:54

architecture carter's architecture

play18:56

workshops design workshops

play18:58

where we get people into groups we give

play18:59

them some requirements and we say go

play19:01

away for like an hour and a half and

play19:02

do some design and draw some diagrams to

play19:05

illustrate and showcase your solution

play19:08

and the diagrams look like this

play19:10

autumnally so this is boxes and snow

play19:12

lines this is my favorite this is like

play19:15

the airline route map

play19:17

so that green blob is amsterdam skipple

play19:19

or london at the heathrow it's like a

play19:21

big airport

play19:21

lots of routes around the world this one

play19:24

here doesn't even tell you anything

play19:25

about the business domain it just says

play19:27

business logic in the middle well this

play19:30

one has no tech choices

play19:33

this one is a bunch of c-sharp things

play19:36

floating around a database of these

play19:38

components or modules or microservices i

play19:40

have no idea

play19:41

this one is like an adventure game start

play19:44

at the top

play19:45

go down follow the different arrows no

play19:47

matter which path you choose you always

play19:49

die and end up in the trap on the

play19:50

left-hand side it's rather unfortunate

play19:53

this one here has a couple of unlabeled

play19:55

users that i call stormtroopers they're

play19:57

just

play19:58

faceless anonymous clones attacking this

play20:00

reporting service

play20:02

or you get a mess now i've got

play20:05

gigabytes and gigabytes and thousands of

play20:08

photos

play20:08

uh kicking around on on hard disks from

play20:11

my workshops over the past 10 years and

play20:13

they all look like this

play20:15

and people often say well what happens

play20:17

if you let these groups use a tool and

play20:19

not pen and paper well guess what the

play20:21

same thing

play20:22

happens just in a tool and you can see

play20:24

this yourself if you go

play20:25

to google and you do a search for

play20:26

software architecture diagram you get

play20:28

the same garbage but it just looks nicer

play20:30

we've got nice colors and fonts and then

play20:32

shading things but

play20:33

we've got different size boxes for

play20:35

unknown reasons we've got acronyms

play20:36

unlabeled lines

play20:38

it's just a mess the reason i put so

play20:41

much focus on diagrams is because

play20:44

if your diagrams don't make sense you

play20:46

can't answer these two questions

play20:48

right you can't have the right

play20:49

conversations to even start answering

play20:51

these two questions

play20:52

so i think teams need a ubiquitous

play20:55

language to communicate effectively and

play20:56

i'm not talking about a ddd domain

play20:58

driven design ubiquitous language i'm

play21:00

talking about

play21:01

a visual ubiquitous language to describe

play21:03

software architecture

play21:05

now we could use uml i mean ul is a

play21:07

perfectly good ubiquitous language for

play21:09

describing architecture but nobody wants

play21:10

to use it

play21:11

for a whole bunch of reasons so

play21:13

something i came up with a number of

play21:14

years ago it's called the c4 model

play21:17

and it's a set of hierarchical diagrams

play21:20

that

play21:20

you can use to describe different levels

play21:23

of abstraction

play21:24

in your software systems yet c4 stands

play21:27

for context contains components and code

play21:30

and the easiest way to think about this

play21:31

is it's like diagrams as

play21:33

maps so if you go into google maps

play21:36

and you start a very high level you know

play21:38

you're flying over the landscape of 30

play21:40

000 feet the lower you go the more

play21:43

detail you see so it's same thing with

play21:45

the software architecture diagrams we've

play21:46

got different levels of diagrams that

play21:48

show you

play21:48

different levels of detail and those

play21:50

different levels of diagrams allow you

play21:52

to therefore

play21:53

have different conversations and tell

play21:55

different stories with different

play21:57

audiences

play21:59

the c4 model does not prescribe any

play22:02

particular notation so it's notation

play22:04

independent you can use boxes and lines

play22:06

and that's what most people tend to do

play22:08

you can also use uml or csml or

play22:11

archimedes

play22:12

i do see teams occasionally do this but

play22:15

um typically these boxes and lines

play22:17

and if you're going to have boxes lines

play22:18

you need a diagram key that's the

play22:21

the most important thing here so really

play22:23

the c4 model is about having

play22:25

a common set of abstractions and a

play22:28

variable of varying notation

play22:31

you can find more information about that

play22:32

on c4model.com

play22:35

one of the questions people always ask

play22:36

me is what tooling do you recommend

play22:40

and something i was pleased to see in

play22:42

the thoughtworks

play22:43

tech radar a couple of weeks ago that

play22:45

the new version that came out is that

play22:46

diagrams as

play22:47

code got a mention it blips on the radar

play22:50

in trial

play22:51

as well as the techniques so this is

play22:53

where you're creating diagrams using a

play22:55

textual

play22:55

format uh like a domain a domain

play22:59

specific language or maybe

play23:00

actual programming language code itself

play23:03

so when we were in lockdown deep in like

play23:05

april may time

play23:06

because i had nothing much to do i built

play23:08

a domain specific language it's called

play23:10

the structurizer dsl

play23:12

and it's it was specifically designed to

play23:14

support the stifle model

play23:16

and it lets you create c4 model diagrams

play23:18

with quite a succinct

play23:20

domain specific language it also

play23:22

supports things like cloud architecture

play23:24

diagrams because lots of people seem to

play23:25

be wanting to draw those sorts of things

play23:27

these days with all the amazon icon sets

play23:29

and stuff like that

play23:32

the most powerful feature about the

play23:34

structurizer dsl and the structurizer

play23:35

dsl

play23:36

is accompanied with uh the

play23:38

structuralizer command line interface

play23:40

and both of these things

play23:41

are open source and available on github

play23:44

the

play23:44

the most powerful thing about

play23:45

structurizer dsl is you create a single

play23:48

file

play23:48

a single source file that contains

play23:51

essentially it defines a model of your

play23:53

software system from different levels of

play23:54

abstraction

play23:55

and then using the structurizer cli the

play23:58

command line interface

play23:59

you can then generate multiple diagrams

play24:02

from that single source file and you can

play24:04

also generate those multiple diagrams in

play24:06

multiple

play24:06

formats so you can use multiple

play24:08

rendering tools

play24:10

to essentially render those diagrams

play24:13

so in this slide here i've got a single

play24:16

source

play24:17

file and that's been rendered using

play24:19

plant uml

play24:20

mermaid iliograph and my own

play24:23

structurizer tooling

play24:24

so that's a really nice way to get a

play24:25

bunch of diagrams very quickly and try

play24:27

out lots of tools without actually

play24:28

getting locked into any of them

play24:32

so that's my thoughts on diagramming uh

play24:34

the last thing i want to very briefly

play24:36

talk about

play24:36

is that a good architecture enables

play24:40

and gives you agility so one of the

play24:43

things we've

play24:44

kind of heard over the past couple of

play24:45

decades is that you've got this agile

play24:47

thing you've got this architecture thing

play24:48

and

play24:49

they're somehow different and they're

play24:50

competing and that's actually not the

play24:51

case

play24:52

from my perspective they're actually

play24:54

complementary

play24:57

what is agile about you have a number of

play25:00

different ways to think about agile for

play25:02

some people it's about moving fast

play25:04

and embracing change and getting

play25:05

feedback and delivering value quickly

play25:07

and and ready for me that's the process

play25:11

or mechanical side

play25:12

of agile software development and in

play25:15

essence really it's just

play25:16

incremental and iterative development

play25:18

done really well and really rapidly

play25:20

for other people agile is more about a

play25:22

mindset of continuous improvement so

play25:24

whenever just doing stuff all the time

play25:27

without looking at what we've done how

play25:28

we can improve it

play25:29

and i think this is really what we we

play25:32

want to be

play25:33

kind of more aligning ourselves with

play25:36

from that perspective then one of the

play25:38

things i like to

play25:41

say to teams says well think about

play25:42

agility which is the ability to move

play25:44

fast

play25:45

as a quality attribute and think about

play25:48

where you need that agility do you need

play25:51

that level of agility across your entire

play25:53

code base

play25:54

or maybe do you only need agility in

play25:56

certain parts of your code base that

play25:58

represent

play25:59

particularly volatile parts of your

play26:01

business process for example

play26:03

once you have that in mind you can then

play26:05

figure out how to support

play26:07

the appropriate level of agility so do

play26:09

you go monolith you go

play26:10

microservices you go a hybrid approach

play26:11

maybe have most of your stuff in a

play26:13

monolith with some stuff

play26:14

around the outside of your monolith as

play26:17

microservices because that's

play26:19

more volatile and that's we need more

play26:20

agility maybe

play26:22

a good architecture buys you agility

play26:27

so a good architecture enables agility

play26:30

what do i mean by a good architecture

play26:31

it's kind of subjective but for me a

play26:33

good architecture is really

play26:36

it's really talking about something

play26:38

that's well structured

play26:39

and highly modular and this kind of

play26:42

makes sense doesn't it if you've ever

play26:43

worked on a code base that's a horrible

play26:45

big ball of mud

play26:46

when you change something over here all

play26:48

this stuff down here breaks and you're

play26:49

not really sure why

play26:51

that slows you down on the other hand if

play26:54

you've worked on

play26:56

a software system that's very well

play26:58

structured and when you make a change

play27:00

that

play27:00

changes isolated into a small block

play27:03

small unit

play27:04

of your code base that clean structure

play27:07

allows you to move much faster

play27:10

you don't get that characteristic for

play27:13

free though

play27:14

you don't get agility just by hacking

play27:16

out some code and kind of hoping for the

play27:17

best so you need to put some thought

play27:18

into this

play27:20

george fairbanks has a great book on

play27:23

software architecture called just enough

play27:24

software architecture

play27:26

and in that book he says this a good

play27:28

architecture rarely happens through

play27:30

architecture in different design

play27:33

what's architecture in different design

play27:35

it's basically just

play27:36

choosing a solution it's making

play27:38

decisions because

play27:39

that's what we've always done in the

play27:40

past so i see that a lot especially big

play27:42

companies

play27:44

or people are making decisions because

play27:46

of trend hype

play27:48

and fashion and i see this a lot

play27:51

these days especially with things like

play27:53

microservices

play27:54

and serverless based architectures so

play27:58

you're going to see a new team like

play27:59

we're going to build a new system and

play28:01

we're going to use microservices we're

play28:02

going to use functions as a service

play28:03

and we're going to stick everything else

play28:04

in kubernetes like why and now because

play28:07

why not

play28:07

that's not a good way to make decisions

play28:12

a couple of years ago a couple years ago

play28:13

more won that five years ago i threw

play28:16

this tweet out

play28:17

and i said if people can't belong this

play28:19

properly please don't adopt

play28:20

microservices because it's not going to

play28:22

help you

play28:22

and i still see this today i still i see

play28:25

large organizations and they have these

play28:27

legacy 10 15 year olds

play28:30

java co bases and they're just horrible

play28:32

big balls and mud the horrible

play28:33

monolithic applications and they think

play28:35

the only way to fix this is to go

play28:37

microservices and what they do is they

play28:39

they start essentially from scratch

play28:42

with a view to rewrite their monolith as

play28:44

a collection of microservices

play28:46

they have the same mindset and what they

play28:48

basically end up with

play28:49

is a distributed version of what they

play28:51

had before because they don't realize

play28:52

they need to take a different design

play28:54

approach

play28:55

and then at two years down the line like

play28:56

oh this is really slow and brittle and

play28:58

we have to lock that deploy everything

play28:59

up like i know

play29:00

you're thinking about this the wrong way

play29:02

so you need to put some thoughts into

play29:04

what you're doing

play29:05

so that tweet got a bunch of retweets

play29:08

which i was quite impressed with

play29:09

but then i got completely outclassed by

play29:11

the architect clippy

play29:12

i see you have a poorly structured

play29:13

monolith would you like me to convert it

play29:15

into poorly structured set of

play29:16

microservices

play29:17

no so again just make sure you think

play29:19

about these decisions before we make

play29:21

them

play29:21

you know significant decisions are the

play29:23

things that are hard to change

play29:25

so that's me five things every developer

play29:27

should know about software architecture

play29:29

thanks for listening

play29:44

you

Rate This

5.0 / 5 (0 votes)

Related Tags
Software ArchitectureAgile DevelopmentIterative DesignDesign MythsUpfront DesignTechnical LeadershipCoding CoachingCollaborationArchitecture RoleRisk ManagementDiagrammingC4 ModelStructurizer DSLAgility in ArchitectureIncremental DevelopmentArchitectural DecisionsDesign Trade-offsMicroservicesMonolithic DesignDeveloper Insights