Turning Development Outside – In @ KevlinHenney
Turning
Development
Outside–In
@KevlinHenney
What We Talk About
When We Talk About
Development
@KevlinHenney
What We Talk About
When We Talk About
Requirements
@KevlinHenney
Too often we push the problem
into the background because we
are in a hurry to proceed to a
solution.
If you read most software
development texts thoughtfully,
you will see that almost everything
is about the solution; almost
nothing is about the problem.
Analysis Design Code Test
Analysis Design Code Test
Analysis Design Code Test
It's expensive to
know everything
up front.Kolton Andrus
You have to finish things —
that's what you learn from,
you learn by finishing things.
Neil Gaiman
SCRUM: A Pattern
Language for
Hyperproductive
Software
Development Teams
Mike Beedle, Martine Devos,
Yonat Sharon,Ken Schwaber,
and Jeff Sutherland
SCRUM Master
Sprint
Backlog
SCRUM Meetings
Demo After Sprint
SCRUM Master
Sprint
Backlog
SCRUM Meetings
Demo After Sprint
Problem
You want to balance the needs of developers to work
undisturbed and the needs of management and the
customer to see real progress, as well as control the
direction of that progress throughout the project.
Solution
Divide the project in Sprints. A Sprint is a period of
approximately 30 days in which an agreed amount of
work will be performed to create a deliverable. Each
Sprint takes a pre-allocated amount of work from the
Backlog.
Sprint
Analysis
Sprint
Design
Sprint
Code
Sprint
Test
Sprint
Analysis DesignCodeTest
Analysis DesignCodeTest
Analysis DesignCodeTest
Analysis DesignCodeTest
Develop Develop Develop Develop
Develop
If a plot works out exactly
as you first planned, you're
not working loosely enough
to give room to your
imagination and instincts.
/ WordFriday
pantser, noun▪ Writer who writes by the seat of their pants.
▪ In contrast to a plotter, a pantser doesn't
work to (or have) an outline.
Your Customers
Do Not Mean
What They Say
Nate Jackson
I’ve never met a customer yet that
wasn’t all too happy to tell me what
they wanted—usually in great detail.
The problem is that customers don’t
always tell you the whole truth.
Nate Jackson
They generally don't lie.
They use their terms and their contexts.
They leave out significant details.
They make assumptions.
Nate Jackson
This is compounded by the fact that
many customers don’t actually know
what they want in the first place!
Nate Jackson
Systems have properties
— capabilities, features,
characteristics, etc. —
inside and out.
Development should
discover the specific
properties desired
and make them so.
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
Try to leave
out the part
that readers
tend to skip.Elmore Leonard
▪
▪
▪
▪
▪
▪
Stack{new, push, pop, depth, top}
GivenWhenThen
an empty stackan item is pushedit should not be empty
GivenWhenThen
an empty stackan item is pushedif it's OK with you, I think that, perhaps, it should probably not be empty, don't you think?
Omit needless words.
William Strunk and E B White
The Elements of Style
Make definite assertions.
Avoid tame, colourless, hesitating, noncommittal language.
When a sentence is made stronger, it usually becomes shorter. Thus brevity is a by-product of vigour.
William Strunk and E B White
The Elements of Style
GivenWhenThen
an empty stackan item is pushedit is not empty
GivenWhenThenAnd
an empty stackan item is pushedit has a depth of 1the top item is the item that was pushed
Given_an_empty_stack_When_an_item_is_pushed_Then_it_has_a_depth_of_1_And_the_top_item_is_the_item_that_was_pushed
Non-EmptyEmpty
depth depthtoppushpop [depth > 1]
push
pop [depth = 1]
new
public class Stack_spec{
public static class A_new_stack{
@Testpublic void is_empty()
}
public static class An_empty_stack{
@Test()public void throws_when_queried_for_its_top_item() @Test()public void throws_when_popped() @Testpublic void acquires_depth_by_retaining_a_pushed_item_as_its_top()
}
public static class A_non_empty_stack{
@Testpublic void becomes_deeper_by_retaining_a_pushed_item_as_its_top() @Testpublic void on_popping_reveals_tops_in_reverse_order_of_pushing()
}}
public classStack_spec
{public static class
A_new_stack{
@Testpublic void is_empty()
}
public static class
An_empty_stack{
@Test()public void throws_when_queried_for_its_top_item() @Test()public void throws_when_popped() @Testpublic void acquires_depth_by_retaining_a_pushed_item_as_its_top()
}
public static class
A_non_empty_stack{
@Testpublic void becomes_deeper_by_retaining_a_pushed_item_as_its_top() @Testpublic void on_popping_reveals_tops_in_reverse_order_of_pushing()
}}
public classStack_spec
{public static class
A_new_stack{
@Testpublic void is_empty()
}
public static class
An_empty_stack{
@Test()public void throws_when_queried_for_its_top_item() @Test()public void throws_when_popped() @Testpublic void acquires_depth_by_retaining_a_pushed_item_as_its_top()
}
public static class
A_non_empty_stack{
@Testpublic void becomes_deeper_by_retaining_a_pushed_item_as_its_top() @Testpublic void on_popping_reveals_tops_in_reverse_order_of_pushing()
}}
Systems have properties
— capabilities, features,
characteristics, etc. —
inside and out.
Functional
Operational
Developmental
We want our code
to be unit testable.
What is a unit test?
A test is not a unit test if:
▪ It talks to the database
▪ It communicates across the network
▪ It touches the file system
▪ It can't run at the same time as any of your other
unit tests
▪ You have to do special things to your environment
(such as editing config files) to run it.
Michael Feathershttp://www.artima.com/weblogs/viewpost.jsp?thread=126923
A unit test is a test of behaviour
whose success or failure is wholly
determined by the correctness of
the test and the correctness of the
unit under test.
Kevlin Henneyhttp://www.theregister.co.uk/2007/07/28/what_are_your_units/
What do we want
from unit tests?
When a unit test
passes, it shows
the code is correct.
When a unit test
fails, it shows the
code is incorrect.
As aI wantSo that
$Role$Feature$Benefit
As aI wantSo that
developer of the software$Feature$Benefit
As aI wantSo that
developer of the softwareclean code$Benefit
As aI wantSo that
customer of the software$Feature$Benefit
As aI wantSo that
user of the software$Feature$Benefit
As aI wantSo that
$Rolelogging$Benefit
As aI wantSo that
developer of the softwarelogging$Benefit
As aI wantSo that
customer of the softwarelogging$Benefit
As aI wantSo that
$Roledocumentation$Benefit
As aI wantSo that
$Rolean agile process$Benefit
As aI wantSo thatAs shown by
$Role$Feature$Benefit$Evidence
Design an architectural
space to accommodate
a specific program,
experience, or intent.