98
don’t demo facts. demo stories! @girba

Don't demo facts. Demo stories!

Embed Size (px)

Citation preview

Page 1: Don't demo facts. Demo stories!

don’t demo facts. demo stories!

@girba

Page 2: Don't demo facts. Demo stories!

I help developers not read code

@girba

Page 3: Don't demo facts. Demo stories!

I help developers not read code

@girba

Page 4: Don't demo facts. Demo stories!

designing value

Page 5: Don't demo facts. Demo stories!

designing value?

Page 6: Don't demo facts. Demo stories!

designing value?something someone is willing to pay something for

Page 7: Don't demo facts. Demo stories!

designing value?

Page 8: Don't demo facts. Demo stories!

designing value?choosing beautiful tradeoffs within given constraints

Page 9: Don't demo facts. Demo stories!

designing value?

Page 10: Don't demo facts. Demo stories!
Page 11: Don't demo facts. Demo stories!
Page 12: Don't demo facts. Demo stories!
Page 13: Don't demo facts. Demo stories!
Page 14: Don't demo facts. Demo stories!

designing value?

Page 15: Don't demo facts. Demo stories!

track value?

Page 16: Don't demo facts. Demo stories!
Page 17: Don't demo facts. Demo stories!
Page 18: Don't demo facts. Demo stories!
Page 19: Don't demo facts. Demo stories!
Page 20: Don't demo facts. Demo stories!

usability

Page 21: Don't demo facts. Demo stories!

usability habitability

https://www.dreamsongs.com/Files/PatternsOfSoftware.pdf

Page 22: Don't demo facts. Demo stories!

track value?let developers show the value

Page 23: Don't demo facts. Demo stories!

feedback is key

Page 24: Don't demo facts. Demo stories!

expose your assumptions

Page 25: Don't demo facts. Demo stories!

present your assumptions

Page 26: Don't demo facts. Demo stories!

present

Page 27: Don't demo facts. Demo stories!
Page 28: Don't demo facts. Demo stories!
Page 29: Don't demo facts. Demo stories!

2 hours 20 people

1 man week every iteration

Page 30: Don't demo facts. Demo stories!

a review is an investment

Page 31: Don't demo facts. Demo stories!

if there is no feedback, it’s useless

Page 32: Don't demo facts. Demo stories!

if it does not affect product decisions, it’s useless

Page 33: Don't demo facts. Demo stories!

present

Page 34: Don't demo facts. Demo stories!

• presenting • is not • bullet • pointing

Page 35: Don't demo facts. Demo stories!

presenting is not even slide showing

Page 36: Don't demo facts. Demo stories!

presenting is story telling

Page 37: Don't demo facts. Demo stories!

demoing is story showing

Page 38: Don't demo facts. Demo stories!

as a

I want to

so that

Page 39: Don't demo facts. Demo stories!

as a user

I want to be able to search in any folder

so that I can find files and folders of interest

Page 40: Don't demo facts. Demo stories!

I navigate to a folder where I think I have some folders and files of interest.

I just do not know exactly their names.

Would it not be cool to search in place and then continue the navigation?

Page 41: Don't demo facts. Demo stories!

context I navigate to a folder where I think I have some folders and files of interest.

conflict I just do not know exactly their names.

resolution Would it not be cool to search in place and then continue the navigation?

Page 42: Don't demo facts. Demo stories!
Page 43: Don't demo facts. Demo stories!
Page 44: Don't demo facts. Demo stories!
Page 45: Don't demo facts. Demo stories!
Page 46: Don't demo facts. Demo stories!
Page 47: Don't demo facts. Demo stories!
Page 48: Don't demo facts. Demo stories!
Page 49: Don't demo facts. Demo stories!
Page 50: Don't demo facts. Demo stories!
Page 51: Don't demo facts. Demo stories!
Page 52: Don't demo facts. Demo stories!
Page 53: Don't demo facts. Demo stories!
Page 54: Don't demo facts. Demo stories!
Page 55: Don't demo facts. Demo stories!
Page 56: Don't demo facts. Demo stories!
Page 57: Don't demo facts. Demo stories!

demoing is story showing

Page 58: Don't demo facts. Demo stories!

demoing is story showing

(the story behind the user story)

Page 59: Don't demo facts. Demo stories!

content form

Page 60: Don't demo facts. Demo stories!

content form

Page 61: Don't demo facts. Demo stories!

yesterday’s weather

Page 62: Don't demo facts. Demo stories!
Page 63: Don't demo facts. Demo stories!

30%

Page 64: Don't demo facts. Demo stories!

30% 90%

Page 65: Don't demo facts. Demo stories!

yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM andTopCurrentENM: topCurrentENM | currentVersions previousClassHistoriesSortedByWENM yesterdayWeatherHits last2VersionsTopHistories last2Versions last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories previousVersionsTopHistoriesNames over | currentVersions := OrderedCollection new. currentVersions addLast: (self allVersionNames at: 1).

yesterdayWeatherHits := 0.

(2 to: self allVersionNames size) do: [: i | self smelly: 'this algorithm is too big and complex'.

previousClassHistoriesSortedByWENM := (self classHistories selectFromReferenceVersionCollection: currentVersions) sortBy: [:a :b | a value getWENM >= b value getWENM]. currentVersions addLast: (self allVersionNames at: i).

previousVersionsTopHistories := OrderedCollection new.

x := previousClassHistoriesSortedByWENM first value getWENM. valuesCount := 0.

previousClassHistoriesSortedByWENM do: [ :each | (each value getWENM ~= x) ifTrue: [ valuesCount := valuesCount + 1. x:= each value getWENM]. (valuesCount < topPreviousWENM) ifTrue: [ previousVersionsTopHistories addLast: each] ].

last2VersionsTopHistories := OrderedCollection new.

last2Versions := OrderedCollection new. last2Versions addLast: (self allVersionNames at: (i-1)). last2Versions addLast: (self allVersionNames at: i). last2HistoriesSortedByENM := (self classHistories selectFromReferenceVersionCollection: last2Versions)

Page 66: Don't demo facts. Demo stories!

(valuesCount < topPreviousWENM) ifTrue: [ previousVersionsTopHistories addLast: each] ].

last2VersionsTopHistories := OrderedCollection new.

last2Versions := OrderedCollection new. last2Versions addLast: (self allVersionNames at: (i-1)). last2Versions addLast: (self allVersionNames at: i). last2HistoriesSortedByENM := (self classHistories selectFromReferenceVersionCollection: last2Versions) sortBy: [:a :b | a value getWENM >= b value getWENM].

x := last2HistoriesSortedByENM first value getENM. valuesCount := 0. last2HistoriesSortedByENM do: [ :each | (each value getENM ~= x) ifTrue: [ valuesCount := valuesCount + 1. x:= each value getENM]. (valuesCount < topCurrentENM) ifTrue: [ last2VersionsTopHistories addLast: each] ]. previousVersionsTopHistoriesNames := previousVersionsTopHistories collect: [ :each | each value name]. over := false.

last2VersionsTopHistories do: [:each | ((previousVersionsTopHistoriesNames includes: (each value name)) and: [over not]) ifTrue: [ yesterdayWeatherHits := yesterdayWeatherHits + 1. over := true]. ]. ].

^yesterdayWeatherHits/(self size - 1) asFloat.

Page 67: Don't demo facts. Demo stories!

yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM andTopCurrentENM: topCurrentENM | currentVersions previousClassHistoriesSortedByWENM yesterdayWeatherHits last2VersionsTopHistories last2Versions last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories previousVersionsTopHistoriesNames over | currentVersions := OrderedCollection new. currentVersions addLast: (self allVersionNames at: 1).

yesterdayWeatherHits := 0.

(2 to: self allVersionNames size) do: [: i | self smelly: 'this algorithm is too big and complex'.

previousClassHistoriesSortedByWENM := (self classHistories selectFromReferenceVersionCollection: currentVersions) sortBy: [:a :b | a value getWENM >= b value getWENM]. currentVersions addLast: (self allVersionNames at: i).

previousVersionsTopHistories := OrderedCollection new.

x := previousClassHistoriesSortedByWENM first value getWENM. valuesCount := 0.

previousClassHistoriesSortedByWENM do: [ :each | (each value getWENM ~= x) ifTrue: [ valuesCount := valuesCount + 1. x:= each value getWENM]. (valuesCount < topPreviousWENM) ifTrue: [ previousVersionsTopHistories addLast: each] ].

last2VersionsTopHistories := OrderedCollection new.

last2Versions := OrderedCollection new. last2Versions addLast: (self allVersionNames at: (i-1)). last2Versions addLast: (self allVersionNames at: i). last2HistoriesSortedByENM := (self classHistories selectFromReferenceVersionCollection: last2Versions)

Page 68: Don't demo facts. Demo stories!

yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM andTopCurrentENM: topCurrentENM | currentVersions previousClassHistoriesSortedByWENM yesterdayWeatherHits last2VersionsTopHistories last2Versions last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories previousVersionsTopHistoriesNames over | currentVersions := OrderedCollection new. currentVersions addLast: (self allVersionNames at: 1).

yesterdayWeatherHits := 0.

(2 to: self allVersionNames size) do: [: i | self smelly: 'this algorithm is too big and complex'.

previousClassHistoriesSortedByWENM := (self classHistories selectFromReferenceVersionCollection: currentVersions) sortBy: [:a :b | a value getWENM >= b value getWENM]. currentVersions addLast: (self allVersionNames at: i).

previousVersionsTopHistories := OrderedCollection new.

x := previousClassHistoriesSortedByWENM first value getWENM. valuesCount := 0.

previousClassHistoriesSortedByWENM do: [ :each | (each value getWENM ~= x) ifTrue: [ valuesCount := valuesCount + 1. x:= each value getWENM]. (valuesCount < topPreviousWENM) ifTrue: [ previousVersionsTopHistories addLast: each] ].

last2VersionsTopHistories := OrderedCollection new.

last2Versions := OrderedCollection new. last2Versions addLast: (self allVersionNames at: (i-1)). last2Versions addLast: (self allVersionNames at: i). last2HistoriesSortedByENM := (self classHistories selectFromReferenceVersionCollection: last2Versions)

Page 69: Don't demo facts. Demo stories!
Page 70: Don't demo facts. Demo stories!
Page 71: Don't demo facts. Demo stories!

present

Page 72: Don't demo facts. Demo stories!

present

past

Page 73: Don't demo facts. Demo stories!

present

past future

Page 74: Don't demo facts. Demo stories!

present

past future

Page 75: Don't demo facts. Demo stories!

present

past future

Page 76: Don't demo facts. Demo stories!

present

past future

prediction hit

Page 77: Don't demo facts. Demo stories!

present

past future

YesterdayWeatherHit(present):

past:=all.topChanged(beginning, present) future:=all.topChanged(present, end)

past.intersect(future).notEmpty()

prediction hit

Page 78: Don't demo facts. Demo stories!

hit hit hit

YW = 3 / 8 = 37%

hit hit hit hit hit hit hit

YW = 7 / 8 = 87%

Page 79: Don't demo facts. Demo stories!

yWFor: yesterdayCheck for: tomorrowCheck | hits | hits := (self detailedYWFor: yesterdayCheck for: tomorrowCheck) sum: [ :each | each isEmpty ifTrue: [0] ifFalse: [1]]. ^ hits / (self versions size - 2)

yWFor: yesterdayCheck for: tomorrowCheck ^ ( 3 to: self versions size ) collect: [ :i | | yesterday tomorrow | yesterday := self selectByExpression: yesterdayCheck appliedFromVersionIndex: 1 toVersionIndexAndPresentInIt: i - 1. tomorrow := self selectByExpression: tomorrowCheck appliedFromVersionIndexAndPresentInIt: i - 1 toVersionIndex: self versions size. yesterday intersectWith: tomorrow ]

Page 80: Don't demo facts. Demo stories!

content form

Page 81: Don't demo facts. Demo stories!
Page 82: Don't demo facts. Demo stories!
Page 83: Don't demo facts. Demo stories!

content form

Page 84: Don't demo facts. Demo stories!
Page 85: Don't demo facts. Demo stories!
Page 86: Don't demo facts. Demo stories!
Page 87: Don't demo facts. Demo stories!
Page 88: Don't demo facts. Demo stories!
Page 89: Don't demo facts. Demo stories!
Page 90: Don't demo facts. Demo stories!
Page 91: Don't demo facts. Demo stories!
Page 92: Don't demo facts. Demo stories!

content form

Page 93: Don't demo facts. Demo stories!
Page 94: Don't demo facts. Demo stories!
Page 95: Don't demo facts. Demo stories!
Page 96: Don't demo facts. Demo stories!

content form

Page 97: Don't demo facts. Demo stories!

content form

Page 98: Don't demo facts. Demo stories!

don’t demo facts. demo stories!

@girba