This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Main() { | |
Iterate { | |
IdentifyNextThread() | |
For each Thread { | |
PullThread() | |
} | |
} | |
} | |
function IdentifyNextThread() { | |
Ask("Tell me THE MOST/NEXT important thing this product does?") | |
For each Thread candidate { | |
Ask("Is this a valuable feature? Is this a selling-point?") | |
ApplySIRI() | |
if isValuable() or | |
isCoreFeature() | |
then | |
Capture(Thread) | |
} | |
} | |
function PullThread(Thread) { | |
IdentifyChallenges(Thread) | |
For each Challenge { | |
IdentifyBigPatterns(Challenge) | |
For each Pattern { | |
ExtractITDs(Pattern) | |
} | |
} | |
} | |
function IdentifyChallenges(Thread) { | |
Challenges = Ask("What was hard about doing this thing? What problem were you trying to solve?") | |
For each Challenge candidate { | |
Ask("Why is this hard? Am I missing something?") | |
ApplySIRI() | |
if isHard() and | |
isImportant() | |
then | |
Capture(Challenge) | |
} | |
return valid Challenges | |
} | |
function IdentifyBigPatterns(Challenge) { | |
Patterns = Ask("What were the big patterns you used to solve that problem? Walk me through the flow.") | |
For each Pattern candidate { | |
Ask("Why did you use this pattern? How does it solve the problem?") | |
ApplySIRI() | |
if isRealPattern() and | |
isRealSolutionToTheChallenge() | |
then | |
Capture(Pattern) | |
} | |
return valid Patterns | |
} | |
function ExtractITDs(Pattern) { | |
Ask("What did you have to do to apply that pattern to your problem space?" | |
"What important data-structures did you use?" | |
"What core algorithms did you use?") | |
AskCuriousQuestions() | |
For each ITD candidate { | |
ApplySIRI() | |
if isImportant() and | |
isTechnical() and | |
isRationalDecision() | |
then | |
Capture(ITD) | |
// Most valuable ITD types are: | |
// - TechDiffs | |
// - DataStructures and DataFlows | |
// - Algorithms | |
} | |
} | |
function ApplySIRI(Idea) { | |
Iterate { | |
Simplify(Idea) | |
Internalize(Idea) | |
Replay(Idea) | |
if isSimple(Idea) and | |
isCorrect(Idea) and | |
isUnderstood(Idea) | |
then | |
break | |
} | |
} | |
Yes, your intuition about the IdentifyThreads() function is correct. I've adjusted it to reflect that.
I'd still like to add these though, but without adding complexity:
- AskCuriousQuestions() is something that could happen at almost any level (just like ApplySIRI), I need to reflect that.
- New threads can be identified along the way? How are those captured/pulled?
Thanks Marc!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
IdentifyThreads() function is missing. Is it Ask("Tell me THE MOST/NEXT important thing this product does?")?
Neat code. It looks pretty complete, simple and easy to understand.