Hammock Driven Development - Rich Hickey
Hammock Driven Development
Reflection on Effort and Confidence
When was the last time you thought hard about something for
an hour?
a day?
a month?
a year?
When was the last time you felt assured tackling something new?
Bugs: Cost and Prevention
Most expensive in production.
Expensive in QA.
Cheaper to fix during development.
Least expensive to avoid in design.
Misconception vs Implementation in Software Issues
Most of the biggest problems in software are problems of misconception not implementation
testing and type systems are of limited use here.
Analysis and Design
It is not about UML or exhaustive plans.
Analysis and design should focus on two things:
Identifying problems that we are trying to solve
Evaluating proposed solutions against these problems.
Solving Problems vs. Adding Features
Features are outcomes, not objectives
Accumulating features does not guarantee problem resolution and might introduce new ones.
Don't let users specify answers.
Avoiding problems != solving them.
Solving problems requires understanding, recognizing and stating them.
The importance of practice
Humans get good at what they practice
Practice problem solving → get good at problem solving.
Practice methodology X → get good at methodology X
Problem articulation and understanding
State the problem clearly
say it out aloud
write it down
Understand the problem
What do you know?
Facts
context
constraints
What don't you know?
Are there related problems?
Write it all down?
Critical evaluation and Iteration
Be discerning
Find the problems in your solutions and address them.
Acknowledge uncertainties and seek more input for better output.
More input, better output
You can't connect things you don't know about.
Read in and around your space
Look (critically!) at other solutions.
Trade-offs and Decision-making
Everyone says design is about trade-offs.
You need to enumerate two or more possible solutions and the attributes and deficits of each in order to make a trade-off.
Focus and Distraction
In the tranquility of contemplation(the “hammock”) , focus is undisturbed.
Limit distractions, delegate, and communicate your unavailability.
The computer is a prime source of distraction
You can't do everything
balls will be dropped
Let loved ones know you are going to be 'gone'
Waking mind vs Background Mind
Waking mind:
Good at critical thinking
very analytical
good at tactics
make short term decisions
prone to finding local maxima.
not good at finding other tracks.
Use waking time to assign tasks to background mind and to analyze its products.
Background mind:
Good at making connections, synthesis, strategy, abstracts, analogies.
Solver of most non-trivial problems.
Unfortunately you can only feed it, not direct it.
Utilizing Sleep for Problem-Solving
As we snooze, our brain is busily processing the information we have learned during the day.
Sleep makes memories stronger, and it even appears to weed out irrelevant details and background information so that only the important pieces remain.
Our brain also works during slumber to find hidden relations among memories and to solve problems we were working on while awake.
Optimizing Thinking Capacity
7 +-2 problem is the limit of how many things we can think about at the same time.
Many designs have > 9 components.
Write proposed solution down.
Yes, with pictures maybe.
Go over and over, different orders
Hammock time is important mind's eye time.
Allow time for insight
Patience is crucial
Wait, sleep over it, and avoid hasty conclusions.
Sometimes months of contemplation are necessary for breakthroughs.
So work on more than one thing.
Transitioning to Action
Eventually, coding is required.
Type sparingly, with confidence
Feedback loop is important - remain open to feedback and improvement
Embracing change and learning
You will think of better ideas.
Adapt to new facts and ideas.
Mistakes and evolving thoughts are natural; embrace them.
It is okay to confront uncertainty. Don’t fear the unknown.