Don't demo facts. Demo stories!

Preview:

Citation preview

don’t demo facts. demo stories!

@girba

I help developers not read code

@girba

I help developers not read code

@girba

designing value

designing value?

designing value?something someone is willing to pay something for

designing value?

designing value?choosing beautiful tradeoffs within given constraints

designing value?

designing value?

track value?

usability

usability habitability

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

track value?let developers show the value

feedback is key

expose your assumptions

present your assumptions

present

2 hours 20 people

1 man week every iteration

a review is an investment

if there is no feedback, it’s useless

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

present

• presenting • is not • bullet • pointing

presenting is not even slide showing

presenting is story telling

demoing is story showing

as a

I want to

so that

as a user

I want to be able to search in any folder

so that I can find files and folders of interest

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?

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?

demoing is story showing

demoing is story showing

(the story behind the user story)

content form

content form

yesterday’s weather

30%

30% 90%

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)

(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.

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)

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)

present

present

past

present

past future

present

past future

present

past future

present

past future

prediction hit

present

past future

YesterdayWeatherHit(present):

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

past.intersect(future).notEmpty()

prediction hit

hit hit hit

YW = 3 / 8 = 37%

hit hit hit hit hit hit hit

YW = 7 / 8 = 87%

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 ]

content form

content form

content form

content form

content form

don’t demo facts. demo stories!

@girba

Recommended