simplicity
DESCRIPTION
Building working software is hard. But it's so much harder to build software that is easy to change. Yet this is a prerequisite for being truly agile, and a key enabler of agility is simplicity. But what exactly does simplicity mean and why is it so hard to achieve? It looks like complexity creeps in as soon as you stop paying attention, and most of it is accidental. Luckily, there are practical ways to get to simplicity by following good design principles and choosing simpler tools.TRANSCRIPT
![Page 3: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/3.jpg)
inspired by
DanNorth
RichHickey
J.B. Rainsberger
Michael Feathers
![Page 4: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/4.jpg)
Edsger Dijkstra (1980)
Computing's central challenge,"How not to make a mess of it",
has not been met.
![Page 5: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/5.jpg)
agile
![Page 6: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/6.jpg)
agile
continuous improvementbased on frequent feedback
![Page 7: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/7.jpg)
iterative development
![Page 8: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/8.jpg)
![Page 9: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/9.jpg)
![Page 10: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/10.jpg)
![Page 11: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/11.jpg)
![Page 12: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/12.jpg)
![Page 13: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/13.jpg)
incremental development
![Page 14: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/14.jpg)
![Page 15: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/15.jpg)
![Page 16: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/16.jpg)
![Page 17: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/17.jpg)
![Page 18: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/18.jpg)
![Page 19: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/19.jpg)
![Page 20: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/20.jpg)
DONE
![Page 21: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/21.jpg)
embrace the transient natureof your code
![Page 22: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/22.jpg)
Russ Miles
Complexity is the silent killer of delivering change at the right time.
![Page 23: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/23.jpg)
simplicity is prerequisite for agility
![Page 24: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/24.jpg)
what is simplicity ?
![Page 25: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/25.jpg)
Nothing is more simplethan a single giant button
MacBook Wheel
![Page 26: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/26.jpg)
what "simple" isn’t ...
![Page 27: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/27.jpg)
what "simple" isn’t ...
familiar / convenient
![Page 28: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/28.jpg)
what "simple" isn’t ...
familiar / convenient
small / concise
![Page 29: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/29.jpg)
what "simple" isn’t ...
familiar / convenient
small / concise
beautiful / elegant
![Page 30: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/30.jpg)
![Page 31: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/31.jpg)
“Simplicity -- the art of maximizing the amount of work not done -- is essential.”
from the agile principles
![Page 32: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/32.jpg)
YAGNI
from the agile principles
“Simplicity -- the art of maximizing the amount of work not done -- is essential.”
![Page 33: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/33.jpg)
“Technical excellence andgood design enhances agility.”
from the agile principles
![Page 34: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/34.jpg)
Martin Fowler
Design is there to enable you tokeep changing the software easily.
![Page 35: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/35.jpg)
when it comes to design ...
![Page 36: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/36.jpg)
COMPLEXITY SUCKS
SIMPLICITY RULES
![Page 37: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/37.jpg)
COMPLEXITY SUCKS ...
![Page 38: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/38.jpg)
COMPLEXITY SUCKS ...… your brain power
![Page 39: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/39.jpg)
COMPLEXITY SUCKS ...… your brain power
![Page 40: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/40.jpg)
Rich Hickey
Once your software is of a certain size, complexity is gonna
dominate what you can do.
![Page 41: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/41.jpg)
![Page 42: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/42.jpg)
![Page 43: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/43.jpg)
essentialcomplexity
![Page 44: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/44.jpg)
essentialcomplexity
your code
![Page 45: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/45.jpg)
essentialcomplexity
your code
libra
ries
frameworks
![Page 46: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/46.jpg)
essentialcomplexity
langua
geruntime
your code
libra
ries
frameworks
![Page 47: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/47.jpg)
accidental
complexity
essentialcomplexity
![Page 48: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/48.jpg)
SIMPLICITY RULES ...
![Page 49: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/49.jpg)
SIMPLICITY RULES ...… are …
![Page 50: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/50.jpg)
SIMPLICITY RULES ...… are …
The 4 Rules of Simple Design
![Page 51: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/51.jpg)
SIMPLICITY RULES ...… are …
The 4 Rules of Simple Design1) passes all tests
![Page 52: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/52.jpg)
SIMPLICITY RULES ...… are …
The 4 Rules of Simple Design1) passes all tests
2) clear, expressive names
![Page 53: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/53.jpg)
SIMPLICITY RULES ...… are …
The 4 Rules of Simple Design1) passes all tests
2) clear, expressive names3) no duplication
![Page 54: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/54.jpg)
SIMPLICITY RULES ...… are …
The 4 Rules of Simple Design1) passes all tests
2) clear, expressive names3) no duplication4) minimal
![Page 55: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/55.jpg)
rule #4: minimal
![Page 56: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/56.jpg)
the less code,the better
![Page 57: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/57.jpg)
code folding
![Page 58: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/58.jpg)
codegenerators
![Page 59: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/59.jpg)
dependencymanagers
![Page 60: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/60.jpg)
stop typing.
think!
![Page 61: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/61.jpg)
test-first(TDD / BDD)
![Page 62: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/62.jpg)
rule #3: no duplication
![Page 63: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/63.jpg)
primitive obsession
duplication in behavior
![Page 64: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/64.jpg)
data clump
duplication in structure
![Page 65: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/65.jpg)
refactoring
![Page 66: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/66.jpg)
rule #2: clear, expressive names
![Page 67: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/67.jpg)
small, focused methods
reduce cyclomatic complexity
![Page 68: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/68.jpg)
small, focused classes
single responsibility
![Page 69: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/69.jpg)
AccountService
AccountManager
AccountHandler
AccountUtils
AccountHelper
AccountImpl
AccountData
AccountDTO
AccountInfo
AccountDetails
AccountObject
AbstractAccount
BaseAccount
CustomAccount
SimpleAccount
![Page 70: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/70.jpg)
refactoring
![Page 71: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/71.jpg)
rule #1: passes all tests
![Page 72: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/72.jpg)
unit testing
![Page 73: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/73.jpg)
testability & good design
![Page 74: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/74.jpg)
testability & good design
(but not integration tests)
![Page 75: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/75.jpg)
inheritance-based design
![Page 76: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/76.jpg)
wget -qO- http://c2.com/ | tr -cs '[:alpha:]' '\n' | sort | uniq
composition
![Page 77: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/77.jpg)
dependencies
![Page 78: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/78.jpg)
auto-import
![Page 79: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/79.jpg)
refactoringtools
![Page 80: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/80.jpg)
A
G
F
DC
introduce indirection
![Page 81: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/81.jpg)
A
B
E G
F
DC
introduce indirection
![Page 82: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/82.jpg)
A
B
E G
F
DC
followthe law of Demeter
introduce indirection
![Page 83: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/83.jpg)
modularity
![Page 84: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/84.jpg)
coupling
![Page 85: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/85.jpg)
add an interface?
![Page 86: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/86.jpg)
layered architectures
![Page 87: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/87.jpg)
add remoting?
SOAP
![Page 88: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/88.jpg)
enterprise grade decoupling?
ESB
![Page 89: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/89.jpg)
enterprise grade decoupling?
ESB
assumptions
assumptions
![Page 90: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/90.jpg)
interface segregation
![Page 91: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/91.jpg)
tell, don’t ask
high cohesion
![Page 92: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/92.jpg)
dependency inversion
role
![Page 93: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/93.jpg)
anti-corruption layer
adapter
role
![Page 94: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/94.jpg)
notify
Payment Order
Auditor
FinancialEvent
Listener
Mongo Audit Trail
log
AuditTrail
MongoAudit
Recordsinsert
![Page 95: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/95.jpg)
Payment Order
AuditDAO
AuditDAOImpl
insert
![Page 96: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/96.jpg)
further decoupling
queue
publish subscribe
![Page 97: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/97.jpg)
use cases& business rules
framework
persist
ence
fram
ewor
k
web
DB
infrastructure
messagingQUEUE
task
scheduler
WS
![Page 98: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/98.jpg)
DomainLogic
FrameworkFramework
![Page 99: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/99.jpg)
DomainLogicDomainLogic
FrameworkFramework
accidentalcomplexity
complexityleak
![Page 100: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/100.jpg)
@Entity@Table(name = "orders", schema = "com"})public class Order implements Serializable {
@Id @GeneratedValue(strategy = SEQUENCE, generator = "order_seq") @Column(name = "ID", unique = true, nullable = false) private Integer id;
@Column(name = "NUMBER", nullable = false, length = 8) private String number;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name = "order_items", catalog = "com", joinColumns = {@JoinColumn(name = "ORDER_ID", updatable = false, nullable = false)}, inverseJoinColumns = {@JoinColumn(name = "ITEM_ID", updatable = false, nullable = false)}) private Set<Item> items = new HashSet<Item>();
}
![Page 101: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/101.jpg)
the law of leaky abstractions
![Page 102: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/102.jpg)
home-grownframeworks
![Page 103: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/103.jpg)
libraries
![Page 104: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/104.jpg)
state& side effects
![Page 105: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/105.jpg)
values& pure functions
![Page 106: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/106.jpg)
functional style imperative style
![Page 107: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/107.jpg)
functional style
expressions
imperative style
statements
![Page 108: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/108.jpg)
functional style
expressions
immutable values
imperative style
statements
mutable state
![Page 109: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/109.jpg)
functional style
expressions
immutable values
data transformations
imperative style
statements
mutable state
side effects
![Page 110: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/110.jpg)
functional style
expressions
immutable values
data transformations
recursion &polymorphism
imperative style
statements
mutable state
side effects
looping &branching
![Page 111: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/111.jpg)
stepping out ofcomfort zone
![Page 112: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/112.jpg)
Edsger Dijkstra (1980)
Computing's central challenge,"How not to make a mess of it",
has not been met.
![Page 113: Simplicity](https://reader034.vdocuments.us/reader034/viewer/2022042814/54c774da4a7959cc418b45c0/html5/thumbnails/113.jpg)
I‘mdone