<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://boblail.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://boblail.com/" rel="alternate" type="text/html" /><updated>2021-05-22T14:26:00+00:00</updated><id>https://boblail.com/feed.xml</id><title type="html">Bob Lail</title><subtitle>boblail.com</subtitle><entry><title type="html">Most Of What I’ve Learned, in Five Verbs</title><link href="https://boblail.com/2019/09/15/most-of-what-ive-learned-in-five-verbs.html" rel="alternate" type="text/html" title="Most Of What I’ve Learned, in Five Verbs" /><published>2019-09-15T00:00:00+00:00</published><updated>2019-09-15T00:00:00+00:00</updated><id>https://boblail.com/2019/09/15/most-of-what-ive-learned-in-five-verbs</id><content type="html" xml:base="https://boblail.com/2019/09/15/most-of-what-ive-learned-in-five-verbs.html">&lt;p&gt;This year I started a new job. I wanted to approach my craft with a beginner’s mind, so I purposefully set aside the processes, tools, and language I knew so well. These were things I’d helped to evolve through years of iteration, and after setting them aside, something unexpected happened. I started finding it difficult to access the lessons that led me to those solutions. Trying to recall and apply them felt like rummaging through a junk drawer. 😕 The lessons, apparently, were not organized and not handy.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;I dumped out the junk drawer and arranged its contents different ways. Some lessons were patently similar. For example, &lt;strong&gt;&lt;em&gt;Write small methods&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Deploy in small batches&lt;/em&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;em&gt;Slice tasks vertically&lt;/em&gt;&lt;/strong&gt; clustered around a theme of &lt;em&gt;smallness.&lt;/em&gt; I wondered why. (Were there other clusters like that?)&lt;/p&gt;

&lt;p&gt;I thought I was looking for principles (clusters around &lt;em&gt;Why?&lt;/em&gt;) so, of each acquired habit, I asked &lt;em&gt;Why do I do this?&lt;/em&gt; recursively. It wasn’t helpful. I “discovered” that I write small methods to produce readable and malleable code — and that I value readability and malleability because they help a team deliver value through time. In fact, that objective — helping a team deliver value through time — turned out to be the ultimate &lt;em&gt;Why?&lt;/em&gt; of every habit in my drawer!&lt;/p&gt;

&lt;p&gt;Eventually I noticed that &lt;u&gt;&lt;strong&gt;&lt;em&gt;Write small methods&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Slice tasks vertically&lt;/em&gt;&lt;/strong&gt; are more similar in their &lt;em&gt;How?&lt;/em&gt; than their &lt;em&gt;Why?&lt;/em&gt;&lt;/u&gt; When I started asking &lt;em&gt;How?&lt;/em&gt; of my acquired habits, I found clusters, &lt;em&gt;immediately compelling clusters,&lt;/em&gt; around verbs. They were simple to understand but hard to master, few in number, and the lessons around them crossed contexts and scales.&lt;/p&gt;

&lt;p class=&quot;nomargin&quot;&gt;These are the verbs that emerged from my experience so far:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#1-explaining-why&quot;&gt;Explaining Why&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#2-slicing&quot;&gt;Slicing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#3-holding-your-action-&quot;&gt;Holding your Action&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#4-automating&quot;&gt;Automating&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#5-failing-early&quot;&gt;Failing Early&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1-explaining-why&quot;&gt;1. Explaining Why&lt;/h2&gt;
&lt;h3 id=&quot;personal-rules&quot;&gt;Personal Rules&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Pick intention-revealing names&lt;/li&gt;
  &lt;li&gt;Use commit messages to describe your goal&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Why?&lt;/em&gt; is the most valuable documentation of any process&lt;/li&gt;
  &lt;li&gt;Why a customer requests a feature is more valuable than What they request &lt;a href=&quot;#endnote1&quot;&gt;¹&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;(Indoctrinate in the Commander’s Intent) &lt;a href=&quot;#endnote2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-goal&quot;&gt;The Goal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Explaining Why empowers your audience to change.&lt;/strong&gt; It links your solution to the problem it solves. This &lt;em&gt;de-risks&lt;/em&gt; change the way that unit tests do — by allowing future colleagues to check whether a new solution (process, UI, architecture, etc) also solves the original problem. And it &lt;em&gt;invites&lt;/em&gt; change the way an expiration date does — by revealing the conditions under which the existing solution is no longer needed.&lt;/p&gt;

&lt;p&gt;Neglecting to Explain Why hamstrings your future teammates. Faced with a change but unable to say why the current code, process, or roadmap exists, they must choose between caution and recklessness: either changing too slowly or taking preventable risks.&lt;/p&gt;

&lt;h3 id=&quot;what-to-practice&quot;&gt;What to Practice&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Dig for it.&lt;/strong&gt; &lt;em&gt;Why&lt;/em&gt; can be hard to write because it’s often, at least partially, implicit. A plan will seem sensible to us (or code smelly or a process natural) because of subconscious factors like our beliefs and habits — because of what we believe the problem and goal to be and because of what tradeoffs and judgments we are accustomed to making. In both cases, some of what we need to verbalize to Explain Why must be dredged up from nonverbal places.&lt;/p&gt;

&lt;p&gt;The goal of writing code, commit messages, handbooks, design docs, and feature requests is not to lob information over a fence to a stranger but to come alongside a friend and give them a warm handoff. Explaining Why invites someone into your thought process and encourages them to see the problem, tradeoffs, and solution as you do. It is gentle, cordially persuasive writing.&lt;/p&gt;

&lt;h2 id=&quot;2-slicing&quot;&gt;2. Slicing&lt;/h2&gt;
&lt;h3 id=&quot;personal-rules-1&quot;&gt;Personal Rules&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Isolate responsibilities (in methods, objects, microservices)&lt;/li&gt;
  &lt;li&gt;Make commits atomic&lt;/li&gt;
  &lt;li&gt;Slice tasks vertically &lt;a href=&quot;#endnote3&quot;&gt;³&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Keep deploys small&lt;/li&gt;
  &lt;li&gt;(Break monolith organizations into small, autonomous teams) &lt;a href=&quot;#endnote4&quot;&gt;⁴&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-goal-1&quot;&gt;The Goal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Slicing improves flow.&lt;/strong&gt; It allows work to move through a system in smaller batches. (Picture the difference between an animation at 30fps and one at 5fps or between an hourglass filled with sand and another filled with gravel.) Slicing &lt;em&gt;tasks&lt;/em&gt; lets you start delivering value sooner, be more transparent about your progress, and get blocked less often.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Complexity is also a batch:, a set of things that must be comprehended together.&lt;/u&gt; Slicing &lt;em&gt;methods&lt;/em&gt; and &lt;em&gt;objects&lt;/em&gt; until they have just one responsibility (and one level of abstraction) improves the flow of reading and makes maintenance easier.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Breaking down a complex thing into understandable chunks is essential for understanding, perhaps the essence of understanding.
&lt;span class=&quot;author&quot;&gt;Bret Victor&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;what-to-practice-1&quot;&gt;What to Practice&lt;/h3&gt;
&lt;p&gt;Find the seams. The ideal batch size is one: one thought at a time, an atomic change, a single responsibility. These Batches of One are obvious &lt;em&gt;after&lt;/em&gt; we slice but seldom before. Prior to slicing, we tend to find thoughts, responsibilities, and tasks tangled together, and their seams aren’t easy to see.&lt;/p&gt;

&lt;p class=&quot;nomargin&quot;&gt;It’s possible to slice &lt;em&gt;across seams.&lt;/em&gt; For example, we might slice a project into tasks that have to do with the same layer of the architecture:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Create all the models&lt;/li&gt;
  &lt;li&gt;Create all the controllers&lt;/li&gt;
  &lt;li&gt;Create all the views&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;nomargin&quot;&gt;Or we might break up a large &lt;code&gt;Person&lt;/code&gt; model by extracting into modules:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;All the methods that have to do with contact information&lt;/li&gt;
  &lt;li&gt;All the methods that have to do with employment&lt;/li&gt;
  &lt;li&gt;All the methods that have to do with posts and comments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These crosscuts aren’t Batches of One, however, because they aren’t independent of each other. The three tasks &lt;em&gt;deliver no value until all of them are completed.&lt;/em&gt; And the three modules don’t reduce the complexity of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Person&lt;/code&gt; at all; they just spread it across more files. Instead of achieving the benefits of Slicing, these examples introduce a new obstacle: they make it harder to see the &lt;em&gt;true&lt;/em&gt; seams in the original project and model. To make progress in this situation, it’s often helpful to merge the bad slices and start fresh.&lt;/p&gt;

&lt;p&gt;Good slices are independent of each other. To slice effectively, we learn to find seams that create standalone chunks of work or thought. Each task ships a sliver of value. Each commit could be deployed by itself. Each method or object owns a single tiny responsibility.&lt;/p&gt;

&lt;h2 id=&quot;3-holding-your-action-&quot;&gt;3. Holding your Action &lt;a href=&quot;#endnote5&quot;&gt;⁵&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;personal-rules-2&quot;&gt;Personal Rules&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Write the simplest thing that could work, then refactor&lt;/li&gt;
  &lt;li&gt;Design from the outside in&lt;/li&gt;
  &lt;li&gt;Measure before you optimize&lt;/li&gt;
  &lt;li&gt;Don’t build a feature before it’s needed (i.e. &lt;a href=&quot;https://martinfowler.com/bliki/Yagni.html&quot;&gt;Yagni&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Adjust roadmaps continually&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-goal-2&quot;&gt;The Goal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Holding your action reduces waste.&lt;/strong&gt; Hitting pause on work that isn’t needed &lt;em&gt;yet&lt;/em&gt; avoids wasted effort in the form of overproduction, overthinking, and overspecifying. Wasted effort is plainly bad, but the unneeded features and decisions themselves can be worse. While seeming harmless (valuable even), maintaining, revisiting, and following-through on them ties the team up in pointless work.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;There is surely nothing quite so useless as doing with great efficiency what should not be done at all.
&lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;https://hbr.org/1963/05/managing-for-business-effectiveness&quot;&gt;Peter Drucker&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;what-to-practice-2&quot;&gt;What to Practice&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Apply the brakes.&lt;/strong&gt; In the midst of overproducing, overthinking, or overspecifying, our activity will not feel like waste. (It isn’t yet! We will only know that in hindsight.) Instead, we will be caught up in the momentum of excitement, anxiety, or inevitability. An engineer will be eager to solve an edge case that’s just occurred to her. A project sponsor will be anxious to seize a possible opportunity. A team will feel obligated to fulfill all the expectations fueled by their roadmap.&lt;/p&gt;

&lt;p&gt;To check a momentum-fueled goose chase, get in the habit of taking a few seconds to ask, &lt;em&gt;“Do I need to build/decide/answer this right now?”&lt;/em&gt; If your answer is “no,” then ask two followup questions: &lt;em&gt;“When the need arises, will I realize it?”&lt;/em&gt; and &lt;em&gt;“When the need arises, will I be able to build/decide/answer this then?”&lt;/em&gt; If your answer to either followup question is “no,” is there a way to adjust your process that will switch it to “yes”?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is the future cost of doing nothing now?
&lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xi3DClfGuqQ&quot;&gt;Sandi Metz&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;4-automating&quot;&gt;4. Automating&lt;/h2&gt;
&lt;h3 id=&quot;personal-rules-3&quot;&gt;Personal Rules&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Handle alerts once&lt;/li&gt;
  &lt;li&gt;Create jigs &lt;a href=&quot;#endnote6&quot;&gt;⁶&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Automate deploys&lt;/li&gt;
  &lt;li&gt;Use information-radiators&lt;/li&gt;
  &lt;li&gt;(Don’t make a hundred decisions when one will do) &lt;a href=&quot;#endnote7&quot;&gt;⁷&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-goal-3&quot;&gt;The Goal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Automating builds momentum.&lt;/strong&gt; In the book &lt;em&gt;&lt;a href=&quot;https://amzn.to/2LxqYy5&quot;&gt;Good to Great&lt;/a&gt;,&lt;/em&gt; Jim Collins evoked the image of a giant, heavy &lt;a href=&quot;https://www.jimcollins.com/concepts/the-flywheel.html&quot;&gt;flywheel&lt;/a&gt;. You push it. It turns slowly at first, but as it builds momentum it moves faster and faster. With each turn, you apply the same effort as before, but the flywheel’s momentum works for you and your effort is magnified. The flywheel accelerates because, with each turn, you &lt;em&gt;compound&lt;/em&gt; the kinetic energy you have transferred to it. In a similar way, teams accelerate when they offload work to their environment: to toolchains, processes, cadences, simple rules, dashboards, and other automata.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’ve known people who have not mastered their tools who are good programmers, but not a tool master who remained a mediocre programmer.
&lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;https://twitter.com/kentbeck/status/398623270917771264&quot;&gt;Kent Beck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;what-to-practice-3&quot;&gt;What to Practice&lt;/h3&gt;
&lt;p&gt;Notice what pulls you away from your essential work. The flywheel can build momentum in negative directions as easily as it can in positive directions. Automations can create busywork for humans. They can entrench work that wasn’t necessary in the first place, masking an inefficient process. So first focus on what your essential work is. Then be rigorous about not doing what you don’t need to do.&lt;/p&gt;

&lt;p&gt;Your essential work may differ from what you do day-to-day. Your daily tasks might include a host of helpful activities that &lt;em&gt;can&lt;/em&gt; be offloaded to the environment. By doing these, though, you spend less time doing the hard (but critical) work of empathizing with your customers, learning, brainstorming, analyzing, recognizing patterns, and articulating your intentions. Your essential work is what &lt;em&gt;can’t&lt;/em&gt; be offloaded to the environment, not just what isn’t obvious to offload.&lt;/p&gt;

&lt;p&gt;Notice friction, repetitive tasks, non-value-add work, checklists (a regular task that takes more than one step), rework (like when you do a task infrequently but have to figure it out each time), waiting (like for a script to finish), extra context-switches (like if you’re waiting for a script to finish and it takes just long enough for you to check your email). These are jobs that can be offloaded to your environment — to scripts, chat bots, policies, information radiators, and all sorts of nonhuman collaborators.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Design your environment so that it nudges and motivates you to do the stuff you believe you should be doing.
&lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;https://twitter.com/RyanMcGreal/status/281445643262763009&quot;&gt;Ryan McGreal&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;5-failing-early&quot;&gt;5. Failing Early&lt;/h2&gt;
&lt;h3 id=&quot;personal-rules-4&quot;&gt;Personal Rules&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Write unit tests&lt;/li&gt;
  &lt;li&gt;Raise exceptions at root causes not symptoms&lt;/li&gt;
  &lt;li&gt;Do the riskiest task first&lt;/li&gt;
  &lt;li&gt;Ship the smallest thing that will let you start testing assumptions (e.g. &lt;a href=&quot;http://theleanstartup.com/principles#develop_mvp&quot;&gt;MVP&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-goal-4&quot;&gt;The Goal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Failing Early reduces risk.&lt;/strong&gt; It converts assumptions into hypotheses and then tests them. In so doing, it minimizes the downsides of failure (its impact on customers, the time it takes to correct it) by reducing the distance between a failure and the first sign of it. An assumption about user behavior that is falsified &lt;em&gt;sooner&lt;/em&gt; costs less in wasted effort. Similarly, an exception raised &lt;em&gt;nearer&lt;/em&gt; its root cause is easier to troubleshoot than one triggered by a distant side-effect.&lt;/p&gt;

&lt;h3 id=&quot;what-to-practice-4&quot;&gt;What to Practice&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Anticipate Failure.&lt;/strong&gt; To fail early, we must get in the habit of &lt;em&gt;creating hypotheses of failure.&lt;/em&gt; Then we can test those hypotheses by writing specs, asserting a method’s preconditions, or A/B testing a feature. Testing assumptions is easy compared to identifying them! How do we get better at noticing what our brains are taking for granted? In his book &lt;em&gt;&lt;a href=&quot;https://amzn.to/2LvKqLB&quot;&gt;Design Paradigms&lt;/a&gt;,&lt;/em&gt; Henri Petroski asserts that judgment (by which he means the ability to anticipate failure) is an engineer’s most important faculty — and that the best way of improving our judgment is to study failures. By doing incident reviews, by reading postmortems and case studies, we sensitize ourselves to our own assumptions and get better at anticipating failures.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In case after case, the proper anticipation of failure has always been the mark of the most successful of engineers.
&lt;span class=&quot;author&quot;&gt;Henri Petroski&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;h3 id=&quot;synergies&quot;&gt;Synergies&lt;/h3&gt;
&lt;p&gt;Certain pairs of these skills play well together and enable &lt;a href=&quot;https://en.wikipedia.org/wiki/Combo_(video_gaming)&quot;&gt;combo moves&lt;/a&gt;. A few examples include:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Slicing methods, objects, and services creates the need for more names; and clear names reveal seams.&lt;/li&gt;
  &lt;li&gt;Slicing tasks may reveal work that can be held until later.&lt;/li&gt;
  &lt;li&gt;Holding your Action will keep you from obviating every anticipated failure and steer you toward designing better signals of failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;optimizing-the-system&quot;&gt;Optimizing the System&lt;/h3&gt;
&lt;p&gt;All of these skills are aimed at removing waste, but they don’t all remove work. Explaining Why, for example, &lt;em&gt;adds&lt;/em&gt; work at every step. This would be inefficient if we were optimizing ourselves; but we’re not. We’re optimizing a system which includes the team of humans we work with, whoever will join later, and &lt;a href=&quot;https://blog.atomist.com/principles-of-collaborative-automation/&quot;&gt;the robots on our team&lt;/a&gt; that run specs, perform deploys, and deliver information to us.&lt;/p&gt;

&lt;h3 id=&quot;fractals&quot;&gt;Fractals&lt;/h3&gt;
&lt;p&gt;These skills apply at different scales because the work itself is fractal. We apply the same principles when we slice tasks and teams as when we slice methods and objects. We can leverage that. In &lt;em&gt;&lt;a href=&quot;https://amzn.to/2QaBVtT&quot;&gt;The Art of Learning&lt;/a&gt;,&lt;/em&gt; Joshua Waitzkin described his technique for elite performance:&lt;a href=&quot;#endnote8&quot;&gt;⁸&lt;/a&gt; he translates mastery from the small to the large. He practices simple moves (a basic punch, a chessboard with just 3 or 4 pieces) until he deeply internalizes the forces and constraints at play. When the same forces and constraints apply in more complex scenarios, his intuition is primed to perceive them. Software development is staggeringly complex, but it is a fractal. A few skills (maybe even some of these) apply at every level.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It is rarely a mysterious technique that drives us to the top, but rather a profound mastery of what may well be a basic skill set.
&lt;span class=&quot;author&quot;&gt;Josh Waitzkin&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 class=&quot;endnotes&quot; id=&quot;endnotes&quot;&gt;Endnotes&lt;/h3&gt;

&lt;dl class=&quot;endnotes&quot;&gt;
  &lt;dt&gt;¹&lt;a name=&quot;endnote1&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;The customer’s &lt;em&gt;Why?&lt;/em&gt; comes from their deep knowledge of the &lt;a href=&quot;https://medium.com/@nikhilgupta08/problem-space-vs-solution-space-f970d4ace5c&quot;&gt;Problem Space&lt;/a&gt;. &lt;em&gt;What?&lt;/em&gt; is a point in the Solution Space. Your map of the Solution Space is likely better than your customer’s, but their map of the Problem Space is better than yours — they &lt;em&gt;live&lt;/em&gt; there. Your ability to create value for them depends entirely on how well you can acquire their map. (See Clayton Christensen’s &lt;a href=&quot;https://www.christenseninstitute.org/jobs-to-be-done/&quot;&gt;Jobs to Be Done&lt;/a&gt; framework and the first three chapters of &lt;em&gt;&lt;a href=&quot;https://amzn.to/2O5Hx5F&quot;&gt;About Face&lt;/a&gt;&lt;/em&gt;) &lt;a href=&quot;#1-explaining-why&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;²&lt;a name=&quot;endnote2&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;I’ve included with my “Personal Rules” a few parenthesized statements: these are not lessons I learned directly by experience but principles I’ve read about that seem to fit with one of the five verbs. This principle, &lt;em&gt;&lt;strong&gt;Indoctrinate in the Commander’s Intent&lt;/strong&gt;,&lt;/em&gt; is how the modern military decentralizes decision-making while coordinating effort. (See chapter 9 of &lt;em&gt;&lt;a href=&quot;https://amzn.to/2Lz4TiA&quot;&gt;The Principles of Product Development Flow&lt;/a&gt;&lt;/em&gt;) &lt;a href=&quot;#1-explaining-why&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;³&lt;a name=&quot;endnote3&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;“Vertically” refers to slicing a cake or a sandwich. If you cut a sandwich vertically, across its layers, you get smaller sandwiches. If you cut it horizontally, with its layers, you get bread, meat, or a slice of cheese — &lt;em&gt;not a sandwich.&lt;/em&gt; Tasks should be sliced so each delivers a smaller piece of value. &lt;a href=&quot;#2-slicing&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;⁴&lt;a name=&quot;endnote4&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;“The way to grow an organization is similar to the way to grow a code base. Whether it’s a monolith organization or monolith code base, you constantly figure out how to do cell divide, how to decompose or break apart so that you can get stronger boundaries and the ability to iterate in a way that you can make changes that don’t ripple through everything else so that you can reason about them independently.” (&lt;a href=&quot;https://news.greylock.com/zooming-out-from-engineering-43c7c92b9797&quot;&gt;Interview with Alyssa Henry, April 2019&lt;/a&gt;) &lt;a href=&quot;#2-slicing&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;⁵&lt;a name=&quot;endnote5&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;I borrowed the phrase “Holding your action” from Dungeons &amp;amp; Dragons. In a round of combat, a player gets one or more actions. Instead of using them immediately, they may choose to “hold their action” by saying so and describing the trigger that would release their action. For example, “I will hold my action until I can see the Gnoll and then I will fire a crossbow bolt.” &lt;a href=&quot;#3-holding-your-action-&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;⁶&lt;a name=&quot;endnote6&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;“Jig” is a woodworking term for a custom tool that makes an action repeatable. A crosscut sled is a simple jig that holds a workpiece perpendicular to a table saw. By pouring your effort into creating a perfect crosscut sled &lt;em&gt;once,&lt;/em&gt; you get the ability to replicate square corners endlessly. &lt;a href=&quot;#4-automating&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;⁷&lt;a name=&quot;endnote7&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Advice given to Jim Collins by Peter Drucker (&lt;a href=&quot;https://tim.blog/2019/02/18/jim-collins/&quot;&gt;Interview with Jim Collins, February 2019&lt;/a&gt;) and expanded on in &lt;a href=&quot;https://awealthofcommonsense.com/2019/03/from-chaos-to-concept/&quot;&gt;this blog post&lt;/a&gt;. &lt;a href=&quot;#4-automating&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
  &lt;dt&gt;⁸&lt;a name=&quot;endnote8&quot;&gt;&lt;/a&gt;&lt;/dt&gt;
  &lt;dd&gt;Josh is an International Master chess-player and World Champion Tai Chi Chuan combatant. The book and film &lt;em&gt;Searching for Bobby Fischer&lt;/em&gt; are based on his childhood. &lt;a href=&quot;#fractals&quot; class=&quot;back&quot;&gt;back&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;</content><author><name></name></author><summary type="html">This year I started a new job. I wanted to approach my craft with a beginner’s mind, so I purposefully set aside the processes, tools, and language I knew so well. These were things I’d helped to evolve through years of iteration, and after setting them aside, something unexpected happened. I started finding it difficult to access the lessons that led me to those solutions. Trying to recall and apply them felt like rummaging through a junk drawer. 😕 The lessons, apparently, were not organized and not handy.</summary></entry><entry><title type="html">Testing 101: Structural Patterns</title><link href="https://boblail.com/videos/2017/05/19/testing-101.html" rel="alternate" type="text/html" title="Testing 101: Structural Patterns" /><published>2017-05-19T00:00:00+00:00</published><updated>2017-05-19T00:00:00+00:00</updated><id>https://boblail.com/videos/2017/05/19/testing-101</id><content type="html" xml:base="https://boblail.com/videos/2017/05/19/testing-101.html">&lt;div style=&quot;padding:62.5% 0 0 0; position:relative;&quot;&gt;
  &lt;iframe src=&quot;https://player.vimeo.com/video/218208271?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;script src=&quot;https://player.vimeo.com/api/player.js&quot;&gt;&lt;/script&gt;</content><author><name></name></author><category term="videos" /><summary type="html"></summary></entry><entry><title type="html">ActiveRecord Patterns</title><link href="https://boblail.com/videos/2017/02/03/active-record.html" rel="alternate" type="text/html" title="ActiveRecord Patterns" /><published>2017-02-03T00:00:00+00:00</published><updated>2017-02-03T00:00:00+00:00</updated><id>https://boblail.com/videos/2017/02/03/active-record</id><content type="html" xml:base="https://boblail.com/videos/2017/02/03/active-record.html">&lt;div style=&quot;padding:62.5% 0 0 0; position:relative;&quot;&gt;
  &lt;iframe src=&quot;https://player.vimeo.com/video/202445507?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;script src=&quot;https://player.vimeo.com/api/player.js&quot;&gt;&lt;/script&gt;</content><author><name></name></author><category term="videos" /><summary type="html"></summary></entry><entry><title type="html">About Face</title><link href="https://boblail.com/book-reports/2015/05/09/about-face.html" rel="alternate" type="text/html" title="About Face" /><published>2015-05-09T00:00:00+00:00</published><updated>2015-05-09T00:00:00+00:00</updated><id>https://boblail.com/book-reports/2015/05/09/about-face</id><content type="html" xml:base="https://boblail.com/book-reports/2015/05/09/about-face.html">&lt;figure class=&quot;book-cover&quot;&gt;
  &lt;img src=&quot;/assets/about-face.jpg&quot; /&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Engineering departments follow rigorous methods that ensure the &lt;em&gt;feasibility&lt;/em&gt; and quality of the technology. Similarly, marketing, sales, and other business units follow methods for ensuring the commercial &lt;em&gt;viability&lt;/em&gt; of new products. What’s left out is a repeatable, predictable, and analytical process for ensuring &lt;strong&gt;&lt;em&gt;desirability&lt;/em&gt;&lt;/strong&gt;.
&lt;span class=&quot;author&quot;&gt;p9, 4th ed.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;three-degrees-of-separation&quot;&gt;Three degrees of separation&lt;/h3&gt;
&lt;p&gt;The obstacle to building a desirable product is seldom technical. It is &lt;a href=&quot;https://uxmyths.com/post/715988395/myth-you-are-like-your-users&quot;&gt;the difference between you and your customer&lt;/a&gt;. There are counterexamples, of course — like James Dyson, Mary Kay, &lt;a href=&quot;https://zachholman.com/talk/how-github-uses-github-to-build-github/&quot;&gt;GitHub&lt;/a&gt;, and 37Signals — who have built products for themselves (&lt;a href=&quot;https://archive.uie.com/articles/self_design&quot;&gt;and people like them&lt;/a&gt;) with great success. But most of us are separated from those we intend to help by three things: identity, space/time, and intermediaries. I mean:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We are not our customers&lt;/li&gt;
  &lt;li&gt;We do not work &lt;em&gt;physically&lt;/em&gt; with them (and so do not get “live” feedback)&lt;/li&gt;
  &lt;li&gt;We do not communicate &lt;em&gt;directly&lt;/em&gt; with them (but listen through a support team’s ears and reply through an interface)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Designing for oneself is exciting. You get the benefit of instant, visceral feedback as to whether your product is desirable or not. You get that same feedback when designing for others, of course, but &lt;em&gt;then&lt;/em&gt; &lt;a href=&quot;https://uxmyths.com/post/715988395/myth-you-are-like-your-users&quot;&gt;it can be misleading&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Alan Cooper’s &lt;em&gt;&lt;a href=&quot;https://www.amazon.com/dp/0470084111/ref=asc_df_04700841115833972&quot;&gt;About Face&lt;/a&gt;&lt;/em&gt; details a process for building the &lt;em&gt;right product.&lt;/em&gt; And the first step is to tackle those three degrees of separation.&lt;/p&gt;

&lt;h3 id=&quot;understanding-customers&quot;&gt;Understanding customers&lt;/h3&gt;
&lt;blockquote&gt;
  &lt;p&gt;If you want to create good design solutions, there is no avoiding the hard work of really understanding the people who will interact with your product.
&lt;span class=&quot;author&quot;&gt;xxxiii&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;“Really understanding” customers goes deeper than identifying their chief complaints with the competition, recording all your conversations with them, or identifying the tasks they need to perform. These methods are quite enough to create lists of features to develop; but they can not discover whether those features are, in the end, &lt;em&gt;desirable&lt;/em&gt; to your customers.&lt;/p&gt;

&lt;p&gt;It’s impossible to know if something will be desirable just by listening to what the customer asks for — or even by looking at what the customer &lt;em&gt;does.&lt;/em&gt; One must understand her &lt;em&gt;context&lt;/em&gt; and her &lt;em&gt;motivations&lt;/em&gt; as well.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Goals, not features, are the key to product success
&lt;span class=&quot;author&quot;&gt;p25&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Goals are the centerpiece of Cooper’s method. He outlines how to conduct research to ascertain them and how to design in light of them.&lt;/p&gt;

&lt;h3 id=&quot;research&quot;&gt;Research&lt;/h3&gt;
&lt;p&gt;The Research phase begins with &lt;strong&gt;ethnographic interviews.&lt;/strong&gt; These are in-person interviews where the interviewer behaves like an apprentice to the customer: watching the customer’s behavior &lt;em&gt;in-context&lt;/em&gt; and asking questions to elicit her thought-processes and motivations.&lt;/p&gt;

&lt;p&gt;Back at the office, researchers identify the ways their subjects’ behavior varied, map subjects to those &lt;strong&gt;behavior variables&lt;/strong&gt;, and look for patterns among them. Goals are deduced from patterns of behavior; and clusters of goals are fleshed out into &lt;strong&gt;personas&lt;/strong&gt;. (Personas are not average or stereotypical users but exemplary users with specific goals.)&lt;/p&gt;

&lt;p&gt;Understanding customers’ goals gives us the insight we need to make desirable products; but taking the extra step to collect them into personas nets us two more benefits:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Personas elicit empathy and become a shorthand for empathic knowledge (which boosts the accuracy and usefulness of our built-in, visceral barometer of desirability).&lt;/li&gt;
  &lt;li&gt;Personas are typically ranked (and this gives us the perspective to say “no” to any feature for a secondary persona that would detract from the success of the primary persona).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;design&quot;&gt;Design&lt;/h3&gt;
&lt;p&gt;Armed with an understanding of the customer’s goals, a product team is poised to do something it would otherwise have no hope of: &lt;a href=&quot;https://businessofsoftware.org/2013/02/kathy-sierra-building-the-minimum-badass-user-business-of-software-a-masterclass-in-thinking-about-software-product-development/&quot;&gt;help the customer be awesome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Interaction Designers at Cooper pivot from Research to Design by storyboarding &lt;strong&gt;scenarios&lt;/strong&gt; of ideal interactions between the customer and the still-imaginary product. These scenarios define the customer’s needs; and those needs form the product’s vision: a statement of the problem the product is solving.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It is absolutely critical to define and agree upon the &lt;em&gt;what&lt;/em&gt; before we move on to the next questions: &lt;em&gt;how&lt;/em&gt; the product looks, behaves, operates, and feels.
&lt;span class=&quot;author&quot;&gt;p114&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without that clear vision, there’s no way of testing the fitness of a design (which results in development taking a more meandering/expensive path to success). &lt;em&gt;With&lt;/em&gt; that kind of focus, however, &lt;a href=&quot;https://medium.com/@stewart/we-dont-sell-saddles-here-4c59524d650d&quot;&gt;every team member can see how every detail of their work contributes to the customer’s success&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;interaction-design&quot;&gt;Interaction Design&lt;/h3&gt;
&lt;p&gt;Alan Cooper calls this process Interaction Design. It differs from Visual Design (which concerns itself less with behavior and more with brand to achieve an emotional response) and Architectural Design (which concerns itself more with the organization of code), although they are closely related. Interaction Design determines in large part &lt;em&gt;what&lt;/em&gt; the product does, how it makes its state and options apparent, and how it responds to users’ input.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Humans treat and respond to computers and other interactive products as if they were people. We should thus pay real attention to the “personality” projected by our digital products.
&lt;span class=&quot;author&quot;&gt;p218&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Understanding customers’ goals enables interaction designers to articulate features in customers’ terms rather than implementation terms and to put users’ needs ahead of the computer’s. A deep understanding of—and empathy for—them makes it easier to see what tasks are superfluous and can be eliminated, what error messages or notices are irrelevant, and what input constraints do more to serve the database than the customer. The result is a product with a more courteous, intelligent, and respectful “personality”: a more likable product.&lt;/p&gt;</content><author><name></name></author><category term="book-reports" /><summary type="html">Engineering departments follow rigorous methods that ensure the feasibility and quality of the technology. Similarly, marketing, sales, and other business units follow methods for ensuring the commercial viability of new products. What’s left out is a repeatable, predictable, and analytical process for ensuring desirability. p9, 4th ed.</summary></entry><entry><title type="html">How to read a project’s dependencies directly from git</title><link href="https://boblail.com/ruby/2012/09/07/read-dependencies.html" rel="alternate" type="text/html" title="How to read a project’s dependencies directly from git" /><published>2012-09-07T00:00:00+00:00</published><updated>2012-09-07T00:00:00+00:00</updated><id>https://boblail.com/ruby/2012/09/07/read-dependencies</id><content type="html" xml:base="https://boblail.com/ruby/2012/09/07/read-dependencies.html">&lt;p&gt;I have a program that lists all of my company’s projects and various statistics about them. Between little APIs, background services, and large applications, we’re getting quite a collection of Rails projects. I decided to add a column to show which version of Rails each was running—a column that would be automatically updated.&lt;/p&gt;

&lt;p&gt;It turns out, it’s pretty easy to do with &lt;a href=&quot;https://github.com/mojombo/grit&quot;&gt;grit&lt;/a&gt; and &lt;a href=&quot;https://github.com/bundler/bundler&quot;&gt;bundler&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;grit&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundler&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Grit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Repo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;PROJECT_PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lockfile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;tree&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Gemfile.lock&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;locked_gems&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Bundler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;LockfileParser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lockfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rails&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;locked_gems&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;specs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rails&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rails&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="ruby" /><summary type="html">I have a program that lists all of my company’s projects and various statistics about them. Between little APIs, background services, and large applications, we’re getting quite a collection of Rails projects. I decided to add a column to show which version of Rails each was running—a column that would be automatically updated.</summary></entry><entry><title type="html">The Design of Everyday Things</title><link href="https://boblail.com/book-reports/2012/05/05/the-design-of-everyday-things.html" rel="alternate" type="text/html" title="The Design of Everyday Things" /><published>2012-05-05T00:00:00+00:00</published><updated>2012-05-05T00:00:00+00:00</updated><id>https://boblail.com/book-reports/2012/05/05/the-design-of-everyday-things</id><content type="html" xml:base="https://boblail.com/book-reports/2012/05/05/the-design-of-everyday-things.html">&lt;figure class=&quot;book-cover&quot;&gt;
  &lt;img src=&quot;/assets/the-design-of-everyday-things.jpg&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;good-design&quot;&gt;Good Design&lt;/h3&gt;

&lt;p&gt;In the first chapter of &lt;em&gt;The Design of Everyday Things,&lt;/em&gt; Donald Norman pokes fun at &lt;em&gt;bad&lt;/em&gt; designs. He mocks smooth, beautiful doors that give no indication of how to open them and complex office phones with more functions than buttons. But users rarely see these as failures of design. People are more prone to &lt;em&gt;blame themselves&lt;/em&gt; for being unable to figure out how poorly designed things work.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;When a person uses a device, she builds a mental model of it: a conjecture, an imaginary explanation of how it works. To have success with—and to &lt;em&gt;enjoy using&lt;/em&gt;—the device, that mental model must be consistent with the way the system really works. Design, says Norman, is “an act of communication” between designers and users. In this conversation, “all communication takes place through the system image.” The “system image” is the whole appearance and operation of a device including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How it indicates what state it is in&lt;/li&gt;
  &lt;li&gt;How it indicates what actions are available (and which are not)&lt;/li&gt;
  &lt;li&gt;How it indicates the results of a potential action (before &lt;em&gt;and after&lt;/em&gt; the action is taken)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A device that clearly communicates its state, available actions, and their consequences “disappears,” says Norman; and the user is able to “work directly on the problem at hand without having to be aware of the device.”&lt;/p&gt;

&lt;h3 id=&quot;tools-for-design&quot;&gt;Tools for Design&lt;/h3&gt;

&lt;p&gt;How can a device so effectively communicate its image? Norman enumerates several tools: Visibility, Natural Mappings, Affordances, Constraints, Feedback.&lt;/p&gt;

&lt;dl class=&quot;doet&quot;&gt;
  &lt;dt&gt;Visibility&lt;/dt&gt;
  &lt;dd&gt;A device’s functions should be &lt;u&gt;visible.&lt;/u&gt; Less frequently used functions may be hidden to reduce the apparent complexity of the device; but at all times, it should be apparent to the user what actions are available and how to perform them.&lt;/dd&gt;

  &lt;dt&gt;Natural Mappings&lt;/dt&gt;
  &lt;dd&gt;As much as possible, controls should bear a metaphorical relationship to the real world: they should have a “&lt;u&gt;natural mapping&lt;/u&gt;”. (Norman draws several examples from the layouts of light switches and compares them to the positions of the lamps they control.) Any design that &lt;em&gt;requires&lt;/em&gt; labels, diagrams, or instructions, he says, is probably faulty: unnaturally mapped.&lt;/dd&gt;

  &lt;dt&gt;Affordances&lt;/dt&gt;
  &lt;dd&gt;&lt;u&gt;Affordances&lt;/u&gt;, like natural mappings, are clues (often visual) that &lt;em&gt;suggest&lt;/em&gt; how a control may be manipulated. Handles on doors &lt;em&gt;afford&lt;/em&gt; grasping and extruded buttons &lt;em&gt;afford&lt;/em&gt; pushing. Affordances help users to discover &lt;em&gt;how&lt;/em&gt; to evoke the actions a device has made visible.&lt;/dd&gt;

  &lt;dt&gt;Constraints&lt;/dt&gt;
  &lt;dd&gt;“Affordances suggest the range of possibilities, &lt;u&gt;constraints&lt;/u&gt; limit the number of alternatives.” Constraints make it harder to commit errors. The mechanisms that make it difficult for you to lock your keys in your car are a kind of constraint. (In chapter four, Norman discusses four categories of constraints: physical, semantic, cultural, and logical.)&lt;/dd&gt;

  &lt;dt&gt;Feedback&lt;/dt&gt;
  &lt;dd&gt;There are two aspects of action: execution and evaluation. After executing an action, we watch for its effects, see that it accomplished what we expected, and adjust our expectations or intentions. Rich &lt;u&gt;feedback&lt;/u&gt; about actions gives users confidence about a device and emboldens them to explore it.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;the-process-of-design&quot;&gt;The Process of Design&lt;/h3&gt;

&lt;p&gt;Much of &lt;em&gt;The Design of Everyday Things&lt;/em&gt; is dedicated to the tools listed above; but its last two chapters reflect on the difficulties of the design &lt;em&gt;process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The gap between designer and user makes it just as difficult for the designer to understand the user as for the user to understand the device. Norman &lt;em&gt;widens&lt;/em&gt; that gap with two observations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;First, there is a difference in how designers and users &lt;em&gt;approach&lt;/em&gt; a device: “designers often become experts with the &lt;em&gt;device&lt;/em&gt; itself,” whereas “users are experts at the &lt;em&gt;task&lt;/em&gt; they are trying to perform with the device.”&lt;/li&gt;
  &lt;li&gt;A second difficulty is that “most designers…are separated from the end users by multiple layers of corporate bureaucracy, marketing, customer services, etc. These people believe they know what customers want and feedback from the real world is limited by the filters they impose.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How can the gap be managed? To some extent it may be closed. “Much good design evolves.” Wherever possible, design and release in smaller increments. When design iterations and user feedback happen in smaller cycles, the conversation between designer and user approaches real-time.&lt;/p&gt;

&lt;p&gt;For avoiding pitfalls in the gap between designers and users, Norman offers a few bits of advice:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Problems dominate users’ perspective; design for the problem case.&lt;/strong&gt; Norman devotes an entire—excellent—chapter to thinking about errors.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Resist the temptation to design primarily for aesthetics.&lt;/strong&gt; The primary goal of a device is rarely to “wow” an audience, to win an award, or to please a client. Keep its purpose in terms of its users in focus.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fight creeping featurism.&lt;/strong&gt; “Feature creep” has become a familiar byword, but Norman offers an insightful solution to it: modularize. This is similar to the single purpose rule in programming: each function should do just one thing and each class should represent a single concept. Higher up the software model, the best applications solve a single problem—and cooperate with applications that solve related problems.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="book-reports" /><summary type="html">Good Design In the first chapter of The Design of Everyday Things, Donald Norman pokes fun at bad designs. He mocks smooth, beautiful doors that give no indication of how to open them and complex office phones with more functions than buttons. But users rarely see these as failures of design. People are more prone to blame themselves for being unable to figure out how poorly designed things work.</summary></entry><entry><title type="html">The Principles of Product Development Flow</title><link href="https://boblail.com/book-reports/2012/05/05/the-principles-of-product-development-flow.html" rel="alternate" type="text/html" title="The Principles of Product Development Flow" /><published>2012-05-05T00:00:00+00:00</published><updated>2012-05-05T00:00:00+00:00</updated><id>https://boblail.com/book-reports/2012/05/05/the-principles-of-product-development-flow</id><content type="html" xml:base="https://boblail.com/book-reports/2012/05/05/the-principles-of-product-development-flow.html">&lt;figure class=&quot;book-cover&quot;&gt;
  &lt;img src=&quot;/assets/the-principles-of-product-development-flow.jpg&quot; /&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;In the past you may have been told that the key to economic success is efficiency…[or] conformance to plan… I would suggest that both of these popular beliefs are fundamentally wrong. The key to economic success is &lt;u&gt;making good economic choices&lt;/u&gt; with &lt;u&gt;the freshest possible information&lt;/u&gt;.
&lt;span class=&quot;author&quot;&gt;p235, emphasis mine&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--more--&gt;

&lt;p&gt;Armed with the wrong definition of economic success, we would naturally measure—and &lt;em&gt;optimize&lt;/em&gt;—the wrong things. At best this wastes effort, at worst it invites failure. Reinertsen’s goal in &lt;em&gt;The Principles of Product Development Flow&lt;/em&gt; is to identify flaws in the conventional wisdom and to equip the reader with modern insights into product development. In support of his arguments, he draws on fields as diverse as lean manufacturing, economic theory, queueing theory, telecommunications, operating system design, and maneuver warfare.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Principles of Product Development Flow&lt;/em&gt; is organized into 9 chapters and 175 brief principles.&lt;/p&gt;

&lt;h3 id=&quot;making-good-economic-choices&quot;&gt;Making Good Economic Choices&lt;/h3&gt;
&lt;blockquote&gt;
  &lt;p&gt;Perhaps the single most important weakness of the current orthodoxy is its failure to correctly quantify economics.
&lt;span class=&quot;author&quot;&gt;p4&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Product developers measure things like cycle time, value-add time, and other “proxy variables”. What we don’t measure is how these variables interact. As a result, we can’t answer questions like &lt;em&gt;Which is less expensive: a 1-month delay or a $5,000 increase in expense?&lt;/em&gt; or &lt;em&gt;Is this feature worth pursuing if it will take twice as long to implement?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To answer these questions we must express metrics in a common unit, lifecycle profits. Converting everything to dollars also reveals a critical insight: &lt;u&gt;the best business plan is seldom the optimization of a &lt;em&gt;single&lt;/em&gt; proxy variable.&lt;/u&gt; (It’s seldom the &lt;em&gt;most efficient&lt;/em&gt; or &lt;em&gt;quickest-to-market&lt;/em&gt; plan.) The best plan tends to be a “u-curve optimization” that optimizes the &lt;em&gt;trade-offs&lt;/em&gt; between single variables.&lt;/p&gt;

&lt;h3 id=&quot;the-freshest-possible-information&quot;&gt;The Freshest Possible Information&lt;/h3&gt;
&lt;blockquote&gt;
  &lt;p&gt;To manage product development effectively, we must recognize that valuable new information is constantly arriving throughout the development cycle.
&lt;span class=&quot;author&quot;&gt;p38&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reinertsen likens product development to warfare. There are significant unknowns; new threats and opportunities appear continually; small advantages or disadvantages can yield disproportionate results. &lt;em&gt;Payoff&lt;/em&gt; changes constantly: endeavors become more or less costly and more or less profitable, continually altering the optimal strategy.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;When the best-laid plans have short shelf lives, learning becomes a vital competence.&lt;/u&gt; Faster feedback, earlier validation, and shorter cycles all fuel learning and enable product developers to make good economic choices with fresh information.&lt;/p&gt;

&lt;h3 id=&quot;queues&quot;&gt;Queues&lt;/h3&gt;

&lt;p&gt;Optimizing trade-offs and maximizing learning are insights basic to Reinertsen’s view of product development, but they are not the focus of his book. Reinertsen spends more time developing the powerful concept of queues.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Today we realize that inventory is the biggest source of waste in manufacturing. Work product lying idle on the factory floor destroys quality, efficiency, and cycle time.
&lt;span class=&quot;author&quot;&gt;p34&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Queues are invisible inventory. &lt;u&gt;Long queues of work-in-progress destroy quality, efficiency, and cycle time.&lt;/u&gt; They have many detrimental effects, but because intellectual work-in-progress is difficult to see, queues often go unmeasured.&lt;/p&gt;

&lt;p&gt;Queue size is an invaluable metric, but like any proxy variable we do best to express it in economic terms. Estimating the &lt;strong&gt;cost of delay&lt;/strong&gt; for a feature or product enables us to manage queues from economic facts.&lt;/p&gt;

&lt;h3 id=&quot;recommendations&quot;&gt;Recommendations&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The Principles of Product Development Flow&lt;/em&gt; contains 175 principles. Many of them cluster around a few important themes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Make queues visible.&lt;/strong&gt; A Kanban can be used to show work-in-progress in real time while Continuous Flow Diagrams give many insights into queues over time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reduce batch size.&lt;/strong&gt; Iterating quickly minimizes the impact of queues without adding resources. It also accelerates feedback and learning. Focus on reducing transaction cost—the cost of releasing a batch—to make smaller batches more affordable. Unit Testing and Continuous Integration are strategies for lowering transaction cost in software development.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Plan in advance for flexibility.&lt;/strong&gt; Flexibility enables you to react to emerging queues. Reinertsen’s most frequent example of planned flexibility is cross-training employees. Hiring reserves is another.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prize initiative.&lt;/strong&gt; Those closest to a problem can react quickest—and with the freshest possible information. Empower them to seize opportunities while coordinating a team’s efforts by establishing a shared vision and setting parameters for decisions.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Co-locate workers.&lt;/strong&gt; The best way to shrink transaction cost in communication and to foster a shared vision within a team is to put teammates in the same room.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="book-reports" /><summary type="html">In the past you may have been told that the key to economic success is efficiency…[or] conformance to plan… I would suggest that both of these popular beliefs are fundamentally wrong. The key to economic success is making good economic choices with the freshest possible information. p235, emphasis mine</summary></entry></feed>