let's not rewrite it all
TRANSCRIPT
LET’S NOT REWRITE IT ALLMICHELLE BRUSH
I’M TIRED OF BUILDING METAPHORS.
BUT I’M GOING TO USE ONE…
VIVALAS VEGAS!
TEXTDidier B, CC 2004https://commons.wikimedia.org/wiki/File:Boardwalk-Casino.jpg
1200 BRAND NEW ENGINEERS
TEXTDidier B, CC 2004https://commons.wikimedia.org/wiki/File:Boardwalk-Casino.jpg
HOME OF THE VDARA HOTEL
DEATH RAY
$1.84 million
free
- OR -
$9.2 Billion
© Copyright Nigel Williams, CC
TEXTDidier B, CC 2004https://commons.wikimedia.org/wiki/File:Boardwalk-Casino.jpg
EVOLUTIONARY ARCHITECTURE
OR TWO…
"Almost no buildings adapt well. They're designed not to adapt..."
"When we deal with buildings we deal with
decisions taken long ago for remote reasons."
"In wider use, the term architecture always means 'unchanging deep structure'“
How Buildings Learn
PURPOSE, NOT MODERNIZATION, DRIVES CHANGE
SHEARING LAYERS OF CHANGE TYPES OF REWRITES
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
PARADIGM…
SHEARING LAYERS OF CHANGE TYPES OF REWRITES
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
PARADIGM…
REFACTOR BAD CODE, DON’T REWRITE IT
RULE 0:
for(int i = 0; i < count1; ++i) { for(int j = 0; j < count2; ++j) { for(int k = 0; k < count3; ++k) { for(int l = 0; l < count4; ++l) { for(int m = 0; m < count5; ++m) { for(int n = 0; n < count6; ++n) { for(int o = 0; o < count7; ++o) { for(int p = 0; p < count8; ++p) { for(int q = 0; q < count9; ++q) { for(int r = 0; r < count10; ++r) { for(int s = 0; s < count 11 for(int t = 0; t < count for(int u = 0; for(int v = 0 for(int w for(i fo
FOR-NADO?
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
VIRTUAL MACHINE
HOW TO MIGRATE SOFTWARE
HOW SOFTWARE LEARNS
MINIMIZE THE SCOPERULE 1:
?
core business logic
core business logic
core business logic
core business logic
core business logic
core business logic
core business logic
core business logic
core business logic
WHAT WERE WE REALLY TRYING TO DO?
GET RID OF THIS
DEFINE AND STICK TO A SMALL SET OF OBJECTIVES.
COROLLARY 1.1:
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
Reduce overall memory utilization of core algorithms.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
Reduce overall memory utilization of core algorithms.
Increase responsiveness of application during key workflows.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
Reduce overall memory utilization of core algorithms.
Increase responsiveness of application during key workflows.
Reduce time to implement new workflows.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
Reduce overall memory utilization of core algorithms.
Increase responsiveness of application during key workflows.
Reduce time to implement new workflows.
Eliminate unsupported or unmanageable technical dependencies.
EXAMPLE OBJECTIVES
Improve the time it takes for data to be available in applications.
Increase resiliency of pipeline to system failures.
Reduce overall memory utilization of core algorithms.
Increase responsiveness of application during key workflows.
Reduce time to implement new workflows.
Eliminate unsupported or unmanageable technical dependencies.
EXAMPLE OBJECTIVES
PURPOSE, NOT MODERNIZATION, DRIVES CHANGE
CREATE A TECHNICAL VISIONRULE 2:
THE POWER OF HEURISTICS
THE POWER OF HEURISTICS
BREADTH-FIRST SEARCH
THE POWER OF HEURISTICS
BREADTH-FIRST SEARCH
DJIKSTRA’S ALGORITHM
THE POWER OF HEURISTICS
BREADTH-FIRST SEARCH
DJIKSTRA’S ALGORITHM
A*
MAKE EVERYONE UNDERSTANDS IT.
COROLLARY 2.1:
We will never cross the streams.
We monitor everything.
Assume nothing about connectivity.
ENFORCE IT.
COROLLARY 2.2:
We will never cross the streams.
We monitor everything.
Assume nothing about connectivity.
REDUCE COMPLEXITYRULE 3:
LOOK FOR OPPORTUNITIES TO ELIMINATE WASTE.
150
130 components
75 essential
LOOK FOR OPPORTUNITIES TO ELIMINATE WASTE.
150
130 components
75 essential
black list
WORK IN THIN SLICESRULE 4:
UNBOUNDED QUEUE OF CHANGE REQUESTS
UNBOUNDED QUEUE OF CHANGE REQUESTS
“THE REWRITE”
“THE REWRITE”
3 YEAR REWRITE COST 7 YEARS OF FEATURE DEVELOPMENT
UNBOUNDED QUEUE OF CHANGE REQUESTS
“THE REWRITE”
UNBOUNDED QUEUE OF CHANGE REQUESTS
“THE REWRITE”
MIGRATION
MIGRATION
MIGRATION
WHAT IS MOST LIKELY TO CHANGE?
SLICES
SLICESSupports continued development of unaffected layers.
Minimizes opportunities for cross-layer improvements.
SLICESAligns with functional
understanding of the system.
Allows testing of full stack assumptions more quickly.
SLICESDATA SETS
SLICES
IDENTIFY PATTERNS
& RISKS.
RAPIDLY MIGRATE LAYERS.
EACH COMPONENT IS STYLED
CONSISTENTLY.
PLAN TO BUILD ADAPTERS & ABSTRACTIONS
COROLLARY 3.1:
ACCEPT YOU MAY HAVE TO WRITE THROWAWAY CODE
COROLLARY 3.2:
SLICES
PURPOSE, NOT MODERNIZATION, DRIVES
CHANGE
BUILD YOUR TESTS FIRSTRULE 5:
WHAT’S YOUR BETTER THAN NOTHING?
pieces that are constantly changing
BOUNDARY THAT IS FIXED AND UNCHANGING
(for each slice)
pieces that are constantly changing
BOUNDARY THAT IS FIXED AND UNCHANGING
(for each slice)
INPU
T
OUTP
UT
pieces that are constantly changing
BOUNDARY THAT IS FIXED AND UNCHANGING
(for each slice)
INPU
T
OUTP
UTTESTS
shortest pathfinding algorithm
<SO
URCE
, DES
TINAT
ION>
LIST<
MANE
UVER
S>
375,000 RANDOMLY GENERATED ROUTES
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
DATA ACCESS
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
Oracle'
DATA ACCESS
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
Oracle'
DATA ACCESS
JAVA SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE
JDBC
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
Oracle'
DATA ACCESS
JAVA SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE JAVA
SERVER
SERVICE SERVICE SERVICE
JDBC
(Yes, it’s a monolith.)
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
Oracle'
DATA ACCESS
TRY NOT TO MESS WITH YOUR INTERFACES.
COROLLARY 5.1:
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
C++ SERVER
Oracle'
DATA ACCESS
PRIORITIZE BUG FIXES.
COROLLARY 5.2:
EMBRACE OPERATIONS EARLYRULE 6:
SHEARING LAYERS OF CHANGE TYPES OF REWRITES
LANGUAGE
ARCHITECTURE USER INTERFACE
DESIGNAPI/FRAMEWORK
CODE
PARADIGM…
v v
Stream
Batch
NO MODIFICATION TO THE INTERFACES.
WELL-ENCAPSULATED BUSINESS LOGIC.
CLEAR OBJECTIVE: REDUCE LATENCY.
STRATEGY FOR INCREMENTAL VALUE
SLICESSupports continued development of unaffected layers.
Minimizes opportunities for cross-layer improvements.
OPERATIONS
Dashboards and reports that relied on older forms of operational data had to be rewritten.
OPERATIONS
Engineers were addicted to rebuilding the world when pseudo-reference data changed.
OPERATIONS
Performance expertise was lacking.
OPERATIONS
Our definition of “good” needed radical adjustment.
OPERATIONS
WE HAD TO TOUCH EVERYTHING.
OPERATIONS
WE HAD TO TOUCH EVERYTHING.
WE HAD TO TOUCH EVERYTHING.
SUPPORT CULTURE
DEPLOYMENT STRATEGY
TESTING STRATEGY
MONITORING BEHAVIOR
RISK TOLERANCE
TEAM EXPERTISE
PERFORMANCE MEASUREMENTS
JARGON
CAPACITY PLANNING
DISASTER RECOVERY
ESTIMATION
WE HAD TO TOUCH EVERYTHING.
COROLLARY 6.1:DOCUMENT OPERATIONAL RISKS AND ASSUMPTIONS AS YOU GO
INVEST IN LEARNINGRULE 7:
JUST IN TIME
MULTIMODAL
OBJECTIVE-BASED
LAYERED
WHAT DO WE WANT PEOPLE TO GET OUT OF THIS?
JUST IN TIME
MULTIMODAL
OBJECTIVE-BASED
LAYERED
IS IT AVAILABLE JUST BEFORE THEY
NEED IT?
JUST IN TIME
MULTIMODAL
OBJECTIVE-BASED
LAYERED
DOES IT COVER MULTIPLE VIEWS OF THE SYSTEM?
JUST IN TIME
MULTIMODAL
OBJECTIVE-BASED
LAYERED
DOES IT COME IN VARIOUS SHAPES
AN SIZES?
CREATE LEARNING MATERIALS AS YOU GO.
COROLLARY 7.1:
/** * Documentation is an obvious example of this. * Create and gather assets like: * @param blogs * @param diagrams * @param snippets * @param principles */
CURATE LEARNING MATERIALS REGULARLY.
COROLLARY 7.2:
/** * Documentation is an obvious example of this. * Create and gather assets like: * @param blogs * @param diagrams * @param snippets * @param principles */
We will never cross the streams.
We monitor everything.
Assume nothing about connectivity.
CURATE LEARNING MATERIALS REGULARLY.
COROLLARY 7.2:
/** * Documentation is an obvious example of this. * Create and gather assets like: * @param blogs * @param diagrams * @param snippets * @param principles */
We will never cross the streams.
We monitor everything.
Assume nothing about connectivity.
MAKE THE RIGHT THING EASYRULE 8:
PEOPLE CAN BE LAZY.
PEOPLE CAN BE LAZY.ACCEPT IT
MAKE THE WRONG THING HARDRULE 8:
150
55 components
75 essential
black list
PURPOSE, NOT MODERNIZATION, DRIVES CHANGE
© Copyright Nigel Williams, CC
EVOLUTIONARY ARCHITECTURE
HOME OF THE VDARA HOTEL
DEATH RAY
Engineering Director, Cerner Corporation Chapter Leader, Kansas City Girl Develop It Conference Organizer, Midwest.io
@michellebrush
MICHELLE BRUSH
Population Health
55 million unique people.
3 petabytes of healthcare data
processing on an 800 node Hadoop cluster
more data is always arriving