behaviour-driven development – a road to effective design and clean code
DESCRIPTION
In this talk, Dan contrasts the traditional top-down and bottom-up approaches with a proven "outside-in" approach based on real life experience - engaging with and listening to our stakeholders. He shows how this can allow us to stay firmly on track, leading to clean code and effective design that provides maximum value to our stakeholders, not just the famous Scrum Product Owner Watch a video at http://www.bestechvideos.com/2009/07/17/behaviour-driven-development-a-road-to-effective-design-and-clean-codeTRANSCRIPT
Behaviour-Driven Development
A road to effective design and clean code
Dan North - ThoughtWorks
© 2008 Dan North, ThoughtWorks
My name is Dan
• I am a developer•
I am a coach•
I am your guide
2
© 2008 Dan North, ThoughtWorks
Part 1: ineffective design and ugly code
3
© 2008 Dan North, ThoughtWorks
Project failures - a field guide
• The project comes in too late• or costs too much to finish
• The application does the wrong thing• It is unstable in production• It breaks the rules• The code is impossible to work with
4
© 2008 Dan North, ThoughtWorks
How we deliver software
• Top-down•
Bottom-up•
Why do we do this?
5
© 2008 Dan North, ThoughtWorks
Part 2: effective design and clean code
© 2008 Dan North, ThoughtWorks
If we could deliver better
• Only focus on high-value features• Flatten the cost of change
• of anything, at any stage
• Prioritise often, change often• Adapt to feedback•
Learn!
7
© 2008 Dan North, ThoughtWorks
What we would need
• Streaming requirements• Evolving design• Code we can change• Frequent code integration• Run all the regression tests often
8
© 2008 Dan North, ThoughtWorks
Part 3: Getting there with BDD
© 2008 Dan North, ThoughtWorks
A definition of BDD
“Behaviour-driven development is about implementing an application by
describing it from the point of view of its stakeholders”
- Me :)
10
© 2008 Dan North, ThoughtWorks
BDD is derivative
• “Second generation” agile methodology• - XP, especially TDD and CI• - Domain-Driven Design• - Acceptance Test-Driven Planning• - Neurolinguistic Programming (NLP)• - Systems Thinking
11
© 2008 Dan North, ThoughtWorks
What makes BDD?• Getting the words right• Enough is enough
• ...agree on “Done”
• Outside-in• Interactions•
People over Process!
12
© 2008 Dan North, ThoughtWorks
“Getting the words right”
• “When I use a word”, said Humpty Dumpty in a rather scornful tone, “it means just what I
want it to mean, neither more nor less”
• Lewis Carroll - Through the Looking Glass
13
© 2008 Dan North, ThoughtWorks
“Getting the words right”
• Model your domain• ...and identify your core domain
• Create a shared language• ...and make it ubiquitous
• Determine its bounded context• ...and think about what happens at the edges
14
© 2008 Dan North, ThoughtWorks
“Enough up-front thinking”
• Identify the desired outcomes• Do enough to feel safe to estimate
• ...and keep a note of your assumptions
• Then “blink estimate” - with people you trust• ...because anything else is false confidence
•
Estimation is fractal - don’t misunderestimate!
15
© 2008 Dan North, ThoughtWorks
A story is a unit of delivery
As an Anaesthetist
I want to view the Patient’s surgical history
So that I can choose the most suitable gas
Story 28 - View patient details
16
© 2008 Dan North, ThoughtWorks
Try to focus on the value
In order to choose the most suitable gas
an Anaesthetist
wants to view the Patient’s surgical history
Story 28 - View patient details
17
© 2008 Dan North, ThoughtWorks
Try to focus on the value
Story 29 - Log patient details
In order to choose the most suitable gas
an Anaesthetist
wants other Anaesthetists to log the Patient’s surgery details for later retrieval
18
© 2008 Dan North, ThoughtWorks
Agree on “Done”Define acceptance criteria as scenarios
Scenario: existing patient with history
Given we have a patient on file
And the patient has had previous surgery
When I request the Patient’s history
Then I should see all the previous treatments
19
© 2008 Dan North, ThoughtWorks
Automate the scenariosEach step corresponds to running code
Given we have a patient on file
In Ruby:
Given “we have a patient on file” do @patient = Patient.createend
In Java:
@Given(“we have a patient on file”)public void createPatient() { patient = patientFactory.create();}
20
© 2008 Dan North, ThoughtWorks
Code-by-Example to implement
• Also known as TDD• Start at the edges with what you know• Implement outermost objects and operations• Discover collaborators, working inwards
• and mock them out for now
• Repeat until “Done”
21
© 2008 Dan North, ThoughtWorks
Then bring it all together
• Examples become code tests• …and documentation•
Scenarios become acceptance tests• ...which become regression tests•
Automation is key
22
© 2008 Dan North, ThoughtWorks
Inside-out - an example
• Map<int, Map<int, int>> portfoliosByTraderId;
if (portfolioIdsByTraderId.get(trader.getId()) .containsKey(portfolio.getId())) {...}
•
Becomes:•
if (trader.canView(portfolio)) {...}
23
© 2008 Dan North, ThoughtWorks
The team
• The stakeholders• The BAs• The QAs• The developers• The project manager
24
© 2008 Dan North, ThoughtWorks
The destination
© 2008 Dan North, ThoughtWorks
Effective Design andClean Code
• ...has tangible stakeholder value• ...is delivered on time, incrementally• ...is easy to deploy and manage• ...is robust in production• ...is easy to understand and communicate•
BDD is a step in the right direction26
© 2008 Dan North, ThoughtWorks
Thank you
• Any questions?
• http://dannorth.net
• http://lizkeogh.com• http://jbehave.org
• http://rspec.info
27
© 2008 Dan North, ThoughtWorks
Bibliography
• Extreme Programming explained (2nd edition) - Kent Beck
• Domain-Driven Design - Eric Evans• The Art of Systems Thinking
• and
• The Way of NLP - Joseph O’Connor
28