The building metaphor that is so often applied to software development is broken. Why do we need to start with the foundations first? The roof we’re building is virtual, it can float! So why not build it first? Or even better just the part that we need first.
We’re so used to building software from the bottom up that we don’t even realise that it involves an incredible amount of guess work and ultimately results in a lot of hidden waste. In this talk I examine and challenge current thinking about the order in which we build software, thinking which I believe has been perpetuated by the building metaphor we use when we teach new software developers and when we communicate with non-developers in the industry.
33. Gravity in the software world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
34. Gravity in the software world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Need to
guess all
the way to
the point of
input
guessing = hard, time consuming, open mistakes
35. Gravity in the software world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
…
…
…
Program.Load()
Greater the
distance
from point
of input,
greater the
more
guessing
needed
39. Code in direction of execution
Start at point
of input
Code in
direction
of
execution
40. Code in direction of execution
Program.Main(string[] args)
Start at point
of input
Code in
direction
of
execution
41. Code in direction of execution
Program.Main(string[] args)
Program.Calculate()
Start at point
of input
Code in
direction
of
execution
42. Code in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Start at point
of input
Code in
direction
of
execution
43. Code in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Start at point
of input
Code in
direction
of
execution
44. Refactor in direction of execution
Start at point
of input
Refactor in
direction
of
execution
45. Refactor in direction of execution
Program.Main(string[] args)
Start at point
of input
Refactor in
direction
of
execution
46. Refactor in direction of execution
Program.Main(string[] args)
Program.Calculate()
Start at point
of input
Refactor in
direction
of
execution
47. Refactor in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Start at point
of input
Refactor in
direction
of
execution
48. Refactor in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Start at point
of input
Refactor in
direction
of
execution
49. Abstract in direction of execution
Start at point
of input
Abstract in
direction
of
execution
50. Abstract in direction of execution
Program.Main(string[] args)
Start at point
of input
Abstract in
direction
of
execution
51. Abstract in direction of execution
Program.Main(string[] args)
ICalculator.Calculate()
Start at point
of input
Abstract in
direction
of
execution
52. Abstract in direction of execution
Program.Main(string[] args)
ICalculator.Calculate()
AlwaysZeroCalculator.Calculate()
Start at point
of input
Abstract in
direction
of
execution
53. Abstract in direction of execution
Program.Main(string[] args)
ICalculator.Calculate()
RealDealValidator.Calculate()
Start at point
of input
Abstract in
direction
of
execution
54. Abstract in direction of execution
Program.Main(string[] args)
ICalculator.Calculate()
RealDealValidator.Calculate()
IRepository.Load()
…
Start at point
of input
Abstract in
direction
of
execution
58. Manifests in the
software world as
Code is hard to
change so it
needs to be built
right the first
time
59. Hard to change in the software
world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
60. Hard to change in the software
world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load() Build all of
this
61. Hard to change in the software
world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Then build
all of this
62. Hard to change in the software
world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Then build
all of this
63. Hard to change in the software
world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Before you
get to the
point of
input
65. Gravity in the software world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Risk
building
unneeded
or incorrect
things
66. Gravity in the software world
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Takes long
to build,
can only get
feedback
when point
of input is
reached
70. Iterate in direction of execution
Start at point
of input
Iterate in
direction
of
execution
71. Iterate in direction of execution
Program.Main(string[] args)
Start at point
of input
Iterate in
direction
of
execution
Only
building as
much as
you need
72. Iterate in direction of execution
Program.Main(string[] args)
Program.Calculate()
Start at point
of input
Iterate in
direction
of
execution
Only
building as
much as
you need
73. Iterate in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Start at point
of input
Iterate in
direction
of
execution
Only
building as
much as
you need
74. Iterate in direction of execution
Program.Main(string[] args)
Program.Calculate()
Program.Find()
Program.Load()
Start at point
of input
Iterate in
direction
of
execution
Only
building as
much as
you need
79. Three rules of building the roof
first
1. Start at the point of input that
adds the most value.
2. Build in the direction of
execution.
3. Only build enough to know
what to build next in the
direction of execution.
Think about:
The titles we use. How you identified yourself earlier.
The phrases we use. Architecture, build, design, develop, patterns, systems.
There are two things with “hard to change” to consider, first is the effort required to make a change once all thinking has been done, secondly the effort that goes into the thinking behind the change. Hard to change in this context does not refer to the thinking portion only the effort required to make the change itself. Interestingly in the physical world making the change is more effort than the thinking and in the software world this is inverted.
Any point where data enters the system
Button click
Incoming HTTP call
Command line input
Sensor input
TODO:
- Invert call stack
- Change Save to Load
- Have a slide just to explain that these are functions that call into each other
In the physical world you can’t build on top of nothing.
In the software world conventional wisdom is that you can’t call something that doesn’t exist (compile failure).
Encourages us to build software against the direction of execution.
Encourages us to build software against the direction of execution.
Encourages us to build software against the direction of execution.
Encourages us to build software against the direction of execution.
Encourages us to build software against the direction of execution.
Encourages us to build software against the direction of execution.
This means you normally start far away from the point of input.
Cost
You need to know/guess/plan all of the code from the point of input to the end of the chain of execution.
You risk getting some or all of that code wrong and only realizing it when you get to the point of input.
Cost
You need to know/guess/plan all of the code from the point of input to the end of the chain of execution.
You risk getting some or all of that code wrong and only realizing it when you get to the point of input.
Cost
You need to know/guess/plan all of the code from the point of input to the end of the chain of execution.
You risk getting some or all of that code wrong and only realizing it when you get to the point of input.
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
Hidden option
Build software with in the direction of execution.
Interfaces do allow you to call something doesn’t exist without compile failures
Refactoring allows you to pull out methods for concepts that belong lower in the call stack after the code has been built
In the software world conventional wisdom is that you can’t call something that doesn’t exist (compile failure).
In the physical world things are hard to change once built, usually you have to destroy them to change them.
In the software world the conventional wisdom is that code is hard to change so it needs to be built right the first time.
Encourages building all of the code in the area you are working in before moving onto the next area.
Because this usually starts faraway from the point of input, a lot of planning is required as you need to know (guess) the signatures of all those callers from the point of input to where you are starting.
Encourages building all of the code in the area you are working in before moving onto the next area.
Because this usually starts faraway from the point of input, a lot of planning is required as you need to know (guess) the signatures of all those callers from the point of input to where you are starting.
Encourages building all of the code in the area you are working in before moving onto the next area.
Because this usually starts faraway from the point of input, a lot of planning is required as you need to know (guess) the signatures of all those callers from the point of input to where you are starting.
Encourages building all of the code in the area you are working in before moving onto the next area.
Because this usually starts faraway from the point of input, a lot of planning is required as you need to know (guess) the signatures of all those callers from the point of input to where you are starting.
Encourages building all of the code in the area you are working in before moving onto the next area.
Because this usually starts faraway from the point of input, a lot of planning is required as you need to know (guess) the signatures of all those callers from the point of input to where you are starting.
In the physical world you can’t build on top of nothing.
Cost
Risk building unneeded or incorrect things, and building all of them.
Long feedback loops because you can’t show anything until you get to the point of input
Cost
Risk building unneeded or incorrect things, and building all of them.
Long feedback loops because you can’t show anything until you get to the point of input
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
Hidden option
Don’t build or plan a whole layer (area) at once.
Start from the point of input, and only build as much as you need in order to know what to build next in the direction of execution.
In the physical world you can’t build on top of nothing.