<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>jbrains.ca</title>
    <description>I can help you profit from your software projects sooner. Or, I can help increase your chances of surviving them. I live where programming meets the business.
</description>
    <link>https://blog.jbrains.ca/</link>
    <atom:link href="https://blog.jbrains.ca/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 01 May 2026 01:01:00 -0300</pubDate>
    <lastBuildDate>Fri, 01 May 2026 01:01:00 -0300</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
    
      
      
        <item>
          <title>Playing Well With Others: An Example</title>
          <description>&lt;blockquote&gt;
&lt;p&gt;[I]f an application meets expectations and passes all external tests (functional and quality), should one care what’s inside? Development would consist of coming up with those tests: TDD&lt;/p&gt;
&lt;p&gt;— Ken Pugh, in a comment on LinkedIn&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I love comments such as these, because even though they are short, they act as a rich source of practice in various aspects of what I affectionately call “Playing Well With Others”. Analyzing comments such as these along with my immediate response to them helps me both understand and more-effectively use the various principles that form the basis of how I Play Well (at least Better) With Others.&lt;/p&gt;
&lt;h1 id=&quot;tldr&quot;&gt;TL;DR&lt;/h1&gt;
&lt;p&gt;Let me list the ideas, principles, guidelines, and practices I used to think about this comment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Law of Generous Interpretation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The powerful question template “What would have to be true for me to…?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Satir Interaction Model, also known as The Ingredients of An Interaction, notably the Interpretation part&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Betteridge’s Law of Headlines&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The risks of Best Practices thinking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The risks associated with the word “should”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transforming Survival Rules Into Guides&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bringing assumptions to the surface in order to challenge them&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s a lot! It’s a lot to do, to remember, to learn. I didn’t learn it all at once and I needed years to practise it all confidently and effectively. &lt;a href=&quot;https://experience.jbrains.ca&quot;&gt;Would you like help learning and practising? because I know a guy.&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;back-to-the-comment&quot;&gt;Back To the Comment&lt;/h1&gt;
&lt;p&gt;Let me analyze the comment for a moment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It seems like a rhetorical question, so I can interpret it as a statement, and using Betteridge’s Law, the answer is probably “no”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It tries to identify a simple rule to govern complex behavior. Some folks would interpret this as a firm rule that one must always follow; others would interpret this as a guideline that one ought to keep in mind, but freely break.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It seems to promote a Best Practice, which always makes me nervous.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The word “should” raises many alarms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The indirect statement “One should never care…” almost always stands in for the much more personal statement “I would rather never care…”.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s a lot for just a short comment!&lt;/p&gt;
&lt;p&gt;Based on my analysis, the statement seems more like this:&lt;/p&gt;
&lt;p&gt;“If an application meets expectations and passes all external tests, both functional and quality, then I would rather never care about what’s inside. I would focus instead on coming up with those tests, which I do when I practise TDD.”&lt;/p&gt;
&lt;p&gt;This starts to sound more like a statement I could easily agree with, rather than a statement that I would quickly and easily tear apart. That sounds like progress to me towards Playing Well With Others.&lt;/p&gt;
&lt;h1 id=&quot;the-statement-itself&quot;&gt;The Statement Itself&lt;/h1&gt;
&lt;p&gt;When someone proposes an absolute rule, I tend to ask about the situations in which I would break the rule. When someone proposes an absolute rule with assumptions, I tend to challenge the assumptions or, at least, ask what would make those assumptions false. Let me try that here.&lt;/p&gt;
&lt;p&gt;“An application meets expectations and passes all external tests, both functional and quality.”&lt;/p&gt;
&lt;p&gt;I mean… it &lt;em&gt;could&lt;/em&gt; happen. I guess it sometimes happens. Whose expectations? The “people who matter”, I suppose, whoever they are in the organization where we might apply this rule.&lt;/p&gt;
&lt;p&gt;I get nervous when folks present these as binary assumptions/outcomes, but I can usually safely interpret that as shorthand for something closer to reality:&lt;/p&gt;
&lt;p&gt;“An application meets the expectations of the people who matter well enough for their purposes &lt;strong&gt;and&lt;/strong&gt; passes all external tests, both functional and quality.”&lt;/p&gt;
&lt;p&gt;I note that the second part of this assumption contains evidence of the first part: I imagine that those tests include tests that encode some of the expectations of the people who matter. I feel confident that there are some Programmer Tests in there, too. Let me tweak the comment to make this relationship clearer.&lt;/p&gt;
&lt;p&gt;“An application meets the expectations of the people who matter well enough for their purposes, &lt;strong&gt;as evidenced by&lt;/strong&gt; passing all external tests, both functional and quality.”&lt;/p&gt;
&lt;p&gt;I like that. Now: when faced with such an application, when would I care about what’s inside?&lt;/p&gt;
&lt;h2 id=&quot;a-magic-question&quot;&gt;A Magic Question&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What would have to be true&lt;/strong&gt; for me to care about what’s inside an application that meets the expectations of the people who matter well enough for their purposes, as evidenced by passing all external tests, both functional and quality?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I don’t understand the tests well enough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even if I understand individual tests well enough, I don’t understand well enough how the tests work together to describe the system so that I can build a workable mental model of it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I don’t have enough confidence in the tests being exhaustive enough to specify a system that does what we (the entire project community, customer base, and user base) need it to do.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I’m curious about what’s inside.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I want to build a similar application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I want to extract reusable/recombinable components from it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s often easier to build the system than to specify it with examples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is theoretically impossible to specify everything I care about a system from a combination of example-based tests and property-based tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don’t consider this list complete, but I only thought about it for a few minutes. This provides enough to continue.&lt;/p&gt;
&lt;p&gt;I judge some of these reasons as arbitrary and personal, such as my curiosity. I judge some of them as perhaps begging the question. For example, wanting to build a similar application: if I can regenerate this application from its tests, then presumably I also have the tools to generate a new application from similar tests. I judge some of these reasons as true, but useless. For example, it’s theoretically impossible to specify a system completely through tests, but we can usually get close enough to drive the risk down far enough for our purposes. None of this makes these reasons &lt;em&gt;bad&lt;/em&gt; or &lt;em&gt;pointless&lt;/em&gt;, but it merely reminds us that these reasons are not enough on their own to answer a clear “yes” or “no” to Ken’s opinion.&lt;/p&gt;
&lt;p&gt;The question “What would have to be true (for me to behave (like that))?” engages my creativity to look for unspoken assumptions about the context, so that I can speak them, pay attention to them, and not become blindsided by being wrong about them. I find this question particularly powerful as a result.&lt;/p&gt;
&lt;p&gt;For example: sometimes I’m just curious about what’s inside. I feel better when I retain the option to look and the skill to at least try to understand. Why not? I mean… you could pay me not to ask, but you don’t have enough money to make me not wonder.&lt;/p&gt;
&lt;h1 id=&quot;the-claim-behind-the-claim&quot;&gt;The Claim Behind the Claim&lt;/h1&gt;
&lt;p&gt;Roughly speaking, I think Ken is claiming something like this:&lt;/p&gt;
&lt;p&gt;“If you practise TDD, then you have the option to stop caring about what’s inside the application, as long as it passes all its tests and you have written tests that specify everything that the project community cares about.”&lt;/p&gt;
&lt;p&gt;I’m taking liberties now, so I might have missed something important. &lt;a href=&quot;https://tell.jbrains.ca&quot;&gt;Let me know.&lt;/a&gt; I tried to paraphrase and infer faithfully, interpreting generously.&lt;/p&gt;
&lt;p&gt;Even in this form, I can’t quite agree, and for one key reason: it’s not theoretically possible to specify everything that the project community cares about through tests. We have been thinking about this for decades now: if we have tests, can we simply throw the production code away and rewrite it from scratch? Is this possible even in principle?&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;We could get arbitrarily close, but then we would have another problem: eventually it would become “too expensive” to write those tests, even when we knew exactly what to write. I see two possibilities:&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;It would not be worth the effort, even if we did it perfectly correctly, &lt;strong&gt;or&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- --&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;It would become at least as difficult as writing the code. Getting the tests wrong would become as likely getting the production code wrong.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;We would then need something like TDD to help us write the tests.&lt;/strong&gt; The tests would become a new kind of production code, and we would end up back where we are now.&lt;/p&gt;
&lt;p&gt;And all that ignores the fact that (some, many!) programmers (still) like to program (even though the industry seems to be trying very hard to stamp that out of them). Many of them would want to look inside; they would be curious.&lt;/p&gt;
&lt;h1 id=&quot;why-go-through-all-this&quot;&gt;Why Go Through All This?!&lt;/h1&gt;
&lt;p&gt;…over a LinkedIn comment? Rly?&lt;/p&gt;
&lt;p&gt;Rly.&lt;/p&gt;
&lt;p&gt;This feels &lt;em&gt;so much better&lt;/em&gt; than merely telling Ken that he’s wrong in public. For twelve reasons, maybe fifteen.&lt;/p&gt;
&lt;p&gt;I mean, what he wrote is wrong on its face, but there is true and helpful content in there. I prefer to focus on that part. Doing this makes me feel a lot better and makes me a lot more enjoyable to work with and to be around.&lt;/p&gt;
&lt;p&gt;That’s my gift to you.&lt;/p&gt;
</description>
          <pubDate>Wed, 15 Apr 2026 00:00:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/playing-well-with-others-an-example</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/playing-well-with-others-an-example</guid>
          
          
          <category>Playing Well With Others</category>
          
          <category>The Selfish Team Player</category>
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Psychological Safety</category>
          
          <category>Powerful Questions</category>
          
        </item>
      
    
      
      
        <item>
          <title>When You Can Safely Leave Sprints Behind</title>
          <description>&lt;blockquote&gt;
&lt;p&gt;Two-week sprints are dead. I think Agile is dead, too. — Charles Fry in &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:share:7447996867197419521/?originTrackingId=iPKmKK2BTqyqUO96wD%2FRFQ%3D%3D&quot;&gt;a post on LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This doesn’t surprise me. When I first saw “Naked Planning”&lt;a href=&quot;#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;, I guessed that “weekly planning” or “iterations” or “sprints” would be among the first of the various Agile rituals for functioning workgroups to leave behind.&lt;a href=&quot;#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; If we talk daily and release frequently, then there is no need to let an iteration be 2-4 weeks long, nor even a week!&lt;/p&gt;
&lt;p&gt;Even so, I never quite bought the whole “sprints are dumb/waste” meme. Just because you don’t need it, doesn’t mean nobody needs it. Just because you aren’t making good use of it doesn’t mean that nobody makes good use of it. 🤷&lt;/p&gt;
&lt;h1 id=&quot;when-iterationssprints-help&quot;&gt;When Iterations/Sprints Help&lt;/h1&gt;
&lt;p&gt;If your group needs to establish heartbeat-type habits, then you’d probably benefit from iterations/sprints as a way to build those habits. Habits such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;replanning as you learn about your group’s capacity to deliver&lt;/li&gt;
&lt;li&gt;talking to each other throughout the day or throughout the week&lt;/li&gt;
&lt;li&gt;reviewing each other’s work more often than merely when you think it’s ready to publish&lt;/li&gt;
&lt;li&gt;showing partially-completed features to stakeholders to check that you’re on the right track&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have these habits, you might find timebox iterations superfluous. You might even find that they hold you back!&lt;/p&gt;
&lt;p&gt;If your group needs to establish the habit of actually &lt;em&gt;shipping&lt;/em&gt; features, rather than merely making progress on them indefinitely until someone gets tired and gives in, then you’d probably benefit iterations/sprints as a way to focus on finishing work. Of course, WIP limits can also do this job, but I like letting 10000 flowers bloom. Once you have this habit, you probably don’t need an arbitrary deadline to remind you to ship something.&lt;/p&gt;
&lt;p&gt;Do you need iterations/sprints? Maybe.&lt;/p&gt;
&lt;p&gt;I think it’s slightly better to do them and not need them than to need them and not do them. Even so, I sometimes help groups realize that they have the habits they need under their fingers and can stop waiting until the end of the month or a 4-week boundary to run their retrospective and update their planning boards.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;Arlo Belshee introduced me to this idea in the early 2000s and you’d likely recognize it today as the Kanban Method: WIP limits, visualization, and a single “express lane” for expediting urgent, unplanned work. &lt;strong&gt;One&lt;/strong&gt; item at a time fits in the express lane.&lt;a href=&quot;#fnref1&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;Similarly, if you actually talk to each other daily, then do you really need retrospectives? And if you actually talk to each other throughoout the day, then do you really need the Daily Standup? Maybe and maybe.&lt;a href=&quot;#fnref2&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
          <pubDate>Mon, 13 Apr 2026 00:00:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/when-you-can-safely-leave-sprints-behind</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/when-you-can-safely-leave-sprints-behind</guid>
          
          
          <category>Unquestionably Agile</category>
          
        </item>
      
    
      
      
        <item>
          <title>Your Inbox As Options, Not Obligations</title>
          <description>&lt;p&gt;I’ve heard this many times over the years:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;… getting everything out of your head into a million projects and tasks feels like you are asked to do a little of everything.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bsky.app/profile/deejaygraham.bsky.social/post/3mfu3lh7oe22n&quot;&gt;https://bsky.app/profile/deejaygraham.bsky.social/post/3mfu3lh7oe22n&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This leads to conclusions that I don’t share, such as “Getting Things Done pushes people towards multitasking [and I agree that multitasking is generally a mistake]”. I understand how reaching this conclusion can sour a person on Getting Things Done, but I see that conclusion as both a pity and avoidable.&lt;/p&gt;
&lt;h2 id=&quot;the-apparent-moral-goodness-of-never-saying-no&quot;&gt;The Apparent Moral Goodness of Never Saying “No”&lt;/h2&gt;
&lt;p&gt;You might have been conditioned to do (maybe literally) whatever people ask you to do. Some well-meaning adults might have taught you to do this &lt;a href=&quot;https://www.amazon.com/Myth-Normal-Illness-Healing-Culture/dp/B09B83215L?tag=jbrains.ca-20&quot;&gt;when you were too young to question it.&lt;/a&gt; They taught you the virtues of helping, of being of service, of doing for others what you hope they would do for you when you needed it. Entire populations are taught the undeniable moral goodness of behaving this way. Religion aside, all this generally guides young people to become helpful, reliable members of society.&lt;/p&gt;
&lt;p&gt;Sadly, &lt;strong&gt;it also risks teaching young people that they can’t say “No”&lt;/strong&gt;. They grow up with a vague, unexplained, visceral, undeniable aversion to rejecting people’s requests to do things for them. They feel over-responsible for disappointing people, so they keep committing to more and more and more. And this becomes why they need a system such as Getting Things Done in the first place!&lt;/p&gt;
&lt;p&gt;Folks struggling with Too Much To Do and Constantly Disappointing Everyone (Especially Themselves!) have &lt;strong&gt;a big, messy Inbox in their head&lt;/strong&gt;: a master list of things they need to figure out when they’re going to do. Some of them also have some structure in their mind resembling Projects and Next Actions. Mostly, however, they have a jumble of &lt;strong&gt;too many tasks&lt;/strong&gt; that they are &lt;strong&gt;constantly expediting&lt;/strong&gt; and &lt;strong&gt;constantly forgetting&lt;/strong&gt; and rediscovering. It feels really painful. It saps their energy. It sends them back to bed. Or worse.&lt;/p&gt;
&lt;p&gt;Along comes Getting Things Done, which encourages them to start by bringing order to the chaos: write everything down and put it in The Inbox. &lt;strong&gt;Gather everything into The Inbox.&lt;/strong&gt; Once you’ve got things safely in The Inbox, you can begin to figure out what you’ll do when, in what order: how you’ll manage to follow through on your commitments. It claims that this is a path to no longer having deadlines sneak up on them. It helps them stop letting important tasks fall through the cracks until they become urgent (and expensive!). It allows them to forget &lt;em&gt;safely,&lt;/em&gt; so that they can &lt;strong&gt;focus on one thing at a time&lt;/strong&gt; until, almost like magic, things are routinely getting done.&lt;/p&gt;
&lt;p&gt;Sadly, &lt;strong&gt;it also risks freaking them out&lt;/strong&gt; when they realize just how much they’ve committed to doing. And since The Universe keeps asking them to do things, they see The Inbox growing and growing and growing. &lt;strong&gt;The more they work The System, the farther behind they fall!&lt;/strong&gt; They conclude that &lt;a href=&quot;https://ronjeffries.com/xprog/articles/jatbaseball/&quot;&gt;Getting Things Done hasn’t worked&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you’re in this situation, or worried about this becoming your future, I have a proposal for you!&lt;/p&gt;
&lt;h2 id=&quot;options-not-obligations&quot;&gt;Options, Not Obligations&lt;/h2&gt;
&lt;p&gt;When you look at The Inbox and your Projects and Next Actions, what do you see? I suspect you see long lists of commitments, stretching as far as the eye can see. Commitments. Future Broken Promises. &lt;strong&gt;&lt;em&gt;Obligations.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Guess what? &lt;strong&gt;You can choose.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It probably doesn’t feel like it, but you can choose. Over time, you can learn to see what’s in your Trusted System as options, not obligations. I suggest you start with The Inbox.&lt;/p&gt;
&lt;h3 id=&quot;detour-software-development-and-backlogs&quot;&gt;Detour: Software Development and Backlogs&lt;/h3&gt;
&lt;p&gt;In the world of software development, they talk often about &lt;strong&gt;Backlogs&lt;/strong&gt; as a fundamental tool of planning. They have Product Backlogs (what we have to do in order to ship the product) and Iteration Backlogs (what we have to do in order to declare victory over the next 2 weeks or month). They probably have other kinds of Backlogs that they didn’t even read about in a book. These Backlogs are glorified, vaunted, revered, and feared &lt;strong&gt;shared “to do” lists&lt;/strong&gt;. The details don’t matter much for this discussion, it might shock you to learn that these Backlogs are a source of significant confusion, debate, and dysfunction in the world of professional software development. &lt;a href=&quot;https://www.jbrains.ca/working-sessions&quot;&gt;I help clients with these problems.&lt;/a&gt; Many of those problems are problems of their own creation. (No shade; just facts. The struggle is real.)&lt;/p&gt;
&lt;p&gt;Just like you and seeing The Inbox as frightening, painful obligations.&lt;/p&gt;
&lt;p&gt;One big problem for software development professionals is that they see the Backlog as an immutable list of commitments. Once they put items in their various Backlogs, &lt;strong&gt;negotiation stops&lt;/strong&gt;. They don’t adjust the plan to match emerging reality, such as workers quitting, getting sick, or going on vacation. Or learning that &lt;em&gt;this&lt;/em&gt; key feature that we bet on is not going to sell. Or learning that &lt;em&gt;that&lt;/em&gt; key feature is going to take 4 times as long to build as everyone thought, because technology. In professional software development, &lt;strong&gt;they cling to the misguided notion that they first plan, then they execute the plan, then they profit&lt;/strong&gt;. In this environment, they turn Backlogs into immutable plans. Backlogs become constant reminders that they’ve bitten off more than they can chew. They feel like prisons.&lt;/p&gt;
&lt;p&gt;Software development professionals use some of the tools of planning, &lt;strong&gt;but they forget to &lt;em&gt;plan&lt;/em&gt;&lt;/strong&gt;: to adjust their expectations as they encounter unpleasant surprises, to change their minds as they find out that their plan isn’t going to work, to react to the changing personnel and cash flows and market pressures.&lt;/p&gt;
&lt;h3 id=&quot;this-is-not-about-software-development&quot;&gt;This Is Not About Software Development&lt;/h3&gt;
&lt;p&gt;Maybe you do this, too. You intend to volunteer at your child’s school, but then you find out that it takes 3 times as much time and energy to do as you’d expected, and now you’re stuck. You tried to clean the garage last weekend, but once you started, you found out that it would cost way too much money to haul away all the stuff you wanted to donate and you didn’t have the heart to throw it all into a landfill, so you gave up. You keep staring at the piano, imagining how much fun it would be to play for an hour (or two!), but then you see the stack of papers on your desk and can’t justify the self-indulgence. And somehow you don’t take care of the papers, either. Who has the strength? I’ll watch a movie instead.&lt;/p&gt;
&lt;p&gt;Stop the world. I want to get off!&lt;/p&gt;
&lt;h2 id=&quot;ceci-nest-pas-un-backlog&quot;&gt;Ceci N’est Pas Un Backlog&lt;/h2&gt;
&lt;p&gt;I propose you start here: The Inbox is Not a Backlog.&lt;/p&gt;
&lt;p&gt;Instead of treating The Inbox like a list of commitments, &lt;strong&gt;treat it as a list of options&lt;/strong&gt;: ideas, possibilities, things to reconsider later, idle thoughts to spend 10 minutes thinking more deeply about on Friday, potentialities… but not obligations. &lt;strong&gt;You need to make it safe in your own mind to put things in The Inbox without assuming that you actually have to do them!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I tell my software development clients to do this, but they often struggle, because there are many people in their project community, each with their own needs. They have competing objectives. They have differing philosophies. They care about different things. Any change to their working environment requires consent and getting that consent takes effort. &lt;strong&gt;Some people simply don’t feel ready&lt;/strong&gt; to try to treat their Backlogs as anything less than obligations to do things under threat of losing their job. And, you know, their managers and executives routinely remind them about this threat every week!&lt;/p&gt;
&lt;p&gt;You have an advantage: it’s just you in there! You can choose. &lt;strong&gt;You can experiment with making it safe to see The Inbox as options, not obligations.&lt;/strong&gt; Nobody else can see inside your head. You can try and fail and try and fail and try fail until you suddenly succeed. Until you feel the &lt;strong&gt;&lt;em&gt;click&lt;/em&gt;&lt;/strong&gt;. Until you start seeing The Inbox as a collection of options, not obligations.&lt;/p&gt;
&lt;h1 id=&quot;feeling-safe-in-the-inbox&quot;&gt;Feeling Safe in The Inbox&lt;/h1&gt;
&lt;p&gt;When you see The Inbox as options instead of obligations, it becomes safe to capture everything in The Inbox. You’re not going to do it all, anyway. You can’t. You don’t have enough time, energy, and money to do it all. You’re going to have more ideas and you need the freedom to sit and think about them. To mull them over, even when you’re not in the shower. You’re going to need to negotiate with The Universe regarding what you can reasonably commit to and what you can’t. &lt;strong&gt;You’re going to need to make room for doing things for yourself&lt;/strong&gt;, because if you don’t, then you will run entirely out of energy and everything will stop! (We call this “burnout” and even “depression”.)&lt;/p&gt;
&lt;p&gt;When you make The Inbox a safe place to capture every little idea, these big things happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You let yourself have ideas without fear of having to do anything with them. Your creativity kicks into high gear—or at least springs back to life.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You build a daily practise of scratching tasks off your list. You literally practise saying “No” to The Universe, but inside your own mind, where it’s safe because they can’t hear you and you don’t have face their disappointment. You can build confidence in your “No”, so that you can say it when you need to say it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You focus more deeply and fully on the tasks you actually do, so you complete them sooner and with more energy. Sometimes you even have fun doing them!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You do more of the things you want to do and fewer of the things that you don’t. (No, really!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You feel more confident in the commitments you keep, because you have increasingly clear evidence of what you can do and what you can’t do, of what you have space to do and what you don’t. You become the reliable, helpful person that those well-meaning (or maybe not) adults taught you to become.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the saying goes, if you can’t say “No”, then your “Yes” means nothing. I prefer to say this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once you make peace with saying “No” to folks, you recapture the purest joy that comes from being able to say “Yes!” and meaning it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And that starts with seeing The Inbox as full of options, not obligations. You can choose.&lt;/p&gt;
&lt;h1 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h1&gt;
&lt;p&gt;Spend 10 minutes with some paper and a pen and write all your uncompleted tasks (and projects) down. Just write. Write down anything you’re worried about forgetting. Don’t edit anything yet; just write. Write down the things you’ve always wanted to do, but never found time to do. Write it all down and &lt;strong&gt;don’t read any of it&lt;/strong&gt;. Write down all the little things, too. The obvious things. The mundane, everyday things. Just write. &lt;strong&gt;This is The Inbox.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How do you feel now?&lt;/p&gt;
&lt;p&gt;Once you have The Inbox, you can decide what to do with those items: scratch some off, put some deadlines or appointments on your calendar, &lt;a href=&quot;https://www.followupthen.com&quot;&gt;set a reminder&lt;/a&gt; for Friday to spend 20 minutes thinking more about That Project You Maybe Want To Do, and then pick some things that you’ve already committed to, or that you want to get out of the way, or that you genuinely want to do today. (What? Meeting my own needs? &lt;em&gt;In this economy?!)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now put The Inbox away. You don’t ever have to look at it again, unless you want to spend more time processing it. Maybe what you’ve done now is enough to clarify what you need to today, for the rest of the week, and to begin next week. Maybe on Monday you can spend 10 minutes with some paper and pen and do this all again.&lt;/p&gt;
&lt;p&gt;This is enough to get started. You’re doing Getting Things Done! It’s happening!&lt;/p&gt;
&lt;p&gt;At some point, &lt;strong&gt;rewriting The inbox every Monday is going to become annoying&lt;/strong&gt;. Or you might need to do it more often. Or less often. This means you’re ready for the next trick. Maybe then you have the energy to &lt;a href=&quot;https://www.amazon.com/dp/0143126563?tag=jbrains.ca-20&quot;&gt;read the book.&lt;/a&gt; Or to &lt;a href=&quot;https://blog.jbrains.ca/feed.xml&quot;&gt;come back here for the next trick&lt;/a&gt;. Or to &lt;a href=&quot;https://ask.jbrains.ca&quot;&gt;send me a complaint or ask me a question,&lt;/a&gt; so that I can write about it.&lt;/p&gt;
&lt;h1 id=&quot;epilogue-or-future-work&quot;&gt;Epilogue, or Future Work&lt;/h1&gt;
&lt;p&gt;Once you feel comfortable seeing The Inbox as options, not obligations, then you can imagine seeing your Projects and Next Actions as merely options, not obligations. (🤯?)&lt;/p&gt;
&lt;h1 id=&quot;related-reading&quot;&gt;Related Reading&lt;/h1&gt;
&lt;p&gt;Gabor Maté, &lt;em&gt;The Myth of Normal&lt;/em&gt;. Very young brains seem to behave a lot like adult brains in a hypnotic trance. If this is true, then you were literally hypnotized to believe what adults told you when you were a small child. This would explain why those Survival Rules seem automatic and impossible to ignore!&lt;/p&gt;
</description>
          <pubDate>Mon, 23 Mar 2026 00:00:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/your-inbox-as-options-not-obligations</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/your-inbox-as-options-not-obligations</guid>
          
          
          <category>Psychological Safety</category>
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Getting Things Done</category>
          
        </item>
      
    
      
      
        <item>
          <title>Deadlines As An Act Of Love</title>
          <description>&lt;p&gt;When you think of deadlines you likely think of &lt;strong&gt;deadline pressure&lt;/strong&gt;. Most business environments make deadline pressure part of their culture. Moreover, as we talk more about folks having difficulties with executive function, we have become more aware of the challenges they have with deadlines, resulting in more acceptance but also more stigma. Given all this, &lt;strong&gt;the larger We has a complicated relationship with deadlines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Fortunately, we have the chance to reframe this situation to make all this work more with us than against us. Join me!&lt;/p&gt;
&lt;p&gt;I propose &lt;strong&gt;deadlines as an act of love&lt;/strong&gt;. (I’ve made this sound saccharine and grandiose on purpose, so that you might remember it, but I also genuinely believe it to be true.) You might resist this and &lt;a href=&quot;https://www.amazon.com/Why-We-What-Understanding-Self-Motivation/dp/0140255265?tag=jbrains.ca-20&quot;&gt;see deadlines as an attempt to control&lt;/a&gt;, a way for some folks to exert power over others, as an imposition on others’ time on one side of the transaction or as an unfair demand on the other side. Let’s reject all that!&lt;/p&gt;
&lt;p&gt;(I mean, yes: some folks will try to wield deadlines as a weapon, but we don’t have to optimize for those folks, even if our financial situation might require us to tolerate and even accept them.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I want people to give me clear deadlines&lt;/strong&gt; for some straightforward reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A deadline allows me to schedule my work.&lt;/li&gt;
&lt;li&gt;A deadline allows me to judge reasonably accurately whether I can fulfill their request or not.&lt;/li&gt;
&lt;li&gt;A deadline helps me infer something about how the requester sees the urgency of a request, if that’s not already clear.&lt;/li&gt;
&lt;li&gt;A deadline helps me decide whether I can accept the cost of missing the deadline as compared to the cost of hitting it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Framing the situation this way, &lt;strong&gt;people are doing me a favor&lt;/strong&gt; by giving me a clear deadline!&lt;/p&gt;
&lt;p&gt;I want to give other people clear deadlines because I want to give them the same clarity they give me. &lt;strong&gt;We can really decide to let it be that simple.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond this, I can refer to the mounting experience of &lt;a href=&quot;https://www.youtube.com/results?search_query=getting+things+done+adhd&quot;&gt;folks with executive function difficulties who &lt;em&gt;need&lt;/em&gt; and even &lt;em&gt;embrace&lt;/em&gt;&lt;/a&gt; the &lt;a href=&quot;https://en.wikipedia.org/wiki/Self-determination_theory&quot;&gt;controled motivation&lt;/a&gt; associated with deadlines in order to actually get around to the task I’m asking them to do. This seems especially true when I’m asking them to do something that they would not otherwise do spontaneously, voluntarily, and happily.&lt;/p&gt;
&lt;p&gt;In order for this to work, however, we need to reframe deadlines more generally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I propose that we treat deadlines as statements of value or vulnerability about constraints, not as demands&lt;/strong&gt;. The more of us who agree to do this, the better the whole system works, and the more harmoniously we can work and live together. You might notice that I’ve used words like “request” and “ask” here, rather than “requirement” or “demand”. I do this because, no matter how much you have been conditioned to believe in deadlines as demands and requirements, they are always requests and statements of value. “I need this by Friday” means “If you can’t do this for me by Friday, then I need to find someone else to do it, because its value to me after Friday drops to nothing”. Something like that. A person who gives you a deadline for a task is showing vulnerability by sharing with you something about the value of completing the task to them or about the constraints they face if they fail to deliver their work to someone else. &lt;strong&gt;They are trusting you to help them reach their objectives. They are hoping (often desperately!) that you will be able and willing to help them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes, &lt;strong&gt;even when they are yelling or barking orders to take advantage of their positional authority over you&lt;/strong&gt;. The yelling manager is often covering for insecurity about something they’re trying to deliver to someone else. If we show them compassion now, maybe they will learn to show us compassion later.&lt;/p&gt;
&lt;p&gt;This feels different to me than it does to consider deadlines as a cynical attempt to extract more output from me sooner. Again: some folks will try to do this, but if you sense this, then you can fall back to this classic adage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you owe the bank $10 thousand, that’s your problem; when you owe the bank $100 million, that’s the bank’s problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At some point, &lt;strong&gt;the person standing before you barking orders at you increasingly loudly, threatening you with deadline after deadline has to understand that they need you more than you need them&lt;/strong&gt;. You can tell them this, even gently, but you can’t learn it for them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ecosia.org/search?q=nonviolent+communication+clear+requests&quot;&gt;Nonviolent communication practice&lt;/a&gt; encourages us to make clear requests to others so that they have enough information to decide safely and accurately how able they are to help us. &lt;strong&gt;This frees everyone up to act freely, to choose consciously, to say “yes” or “no” based on real constraints and capacity&lt;/strong&gt;, rather than based on their mental relationship scorecard of accumulated unbalanced favors over time and the need to exert power over others in order to feel more in control of one’s own life. Clear deadlines represent a way to talk to each other more honestly and &lt;a href=&quot;https://en.wikipedia.org/wiki/Man%27s_Search_for_Meaning&quot;&gt;gives us more space to react consciously&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can turn deadlines into an act of love, but &lt;strong&gt;it starts with choosing to see deadlines as an act of love&lt;/strong&gt;, even if buried under crusty layers of controling motivation and contempt. It starts with recognizing that &lt;strong&gt;a deadline is merely helpful information when we negotiate with someone to do a task for us&lt;/strong&gt;. It starts with remembering that &lt;strong&gt;“no” is always an answer we can accept&lt;/strong&gt;. (Right?)&lt;/p&gt;
&lt;p&gt;That seems to me like a modest concession for a huge shared victory. What do you think?&lt;/p&gt;
</description>
          <pubDate>Fri, 20 Feb 2026 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/deadlines-as-an-act-of-love</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/deadlines-as-an-act-of-love</guid>
          
          
          <category>Psychological Safety</category>
          
          <category>Free Your Mind to Do Great Work</category>
          
        </item>
      
    
      
      
        <item>
          <title>Adopting Tricky Design Concepts Safely</title>
          <description>&lt;blockquote&gt;
&lt;p&gt;Quick question, if you want to implement a design that leverage a particular tricky concept but it’s a good technical decision for the software you’re building, what should you focus on?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What kind of “good” is that good technical decision? Who will need to change that code after you finish writing it?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An example that immediately comes to mind would be something like writing Front-End components using the Atomic Design Pattern. It makes writing modular components simpler but the pattern can be difficult to understand at first and apply properly at first.&lt;/p&gt;
&lt;p&gt;Would mostly apply to Front-End &amp;amp; UI Devs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I can see how to refactor safely from What We Typically Do to the Desired Future Standard Design, then that would make it safer to advocate for the DFSD while falling back to WWTD. Yes, it takes time to refactor, but in exchange, I don’t have to view the dilemma as all or nothing. Meantime, it’s hard to say where I’d focus, but I’d always be prepared for the group to decide that they’re just not going to accept the DFSD yet. Then I can decide which strategy to adopt: enlist a trusted colleague, demonstrate a pilot project, extract a Warm Dry Place with freedom to choose…&lt;/p&gt;
&lt;p&gt;Typically, when technical leaders treat such a dilemma as “all or nothing” and “now or never”, then they get into trouble. This often creates more problems than it solves. Decision making like this is either an ongoing negotiation or a dictatorship. Pick one. (I can respect both choices.)&lt;/p&gt;
&lt;p&gt;BTW: I didn’t know about Atomic Design, but I made some guesses, then I read a few articles. I mostly guessed correctly. This approach is not new. It has been proposed and discarded several times over the last 3 decades, especially during the Early Mainstream Adoption of OO design.&lt;/p&gt;
&lt;p&gt;I believe (based on evidence from similar discussions in the past) that the conflict lies mostly in viewing software design as an activity of “First figure out the correct boxes, then carefully put each line of code in the correct box, and get it right the first time.” Even when programmers don’t say this explicitly, their objections and complaints reveal a bias towards deciding every little thing correctly the first time. Notably, they view changing decisions as “mistakes” and “avoidable rework”.&lt;/p&gt;
&lt;p&gt;I propose that we radically change this attitude.&lt;/p&gt;
&lt;p&gt;This is why I promote understanding how to refactor towards patterns such as Atomic Design: when we feel competent and confident doing this, then we are free to “get it wrong”, secure in the knowledge that we will gradually converge towards a reliable pattern as we need it.&lt;/p&gt;
&lt;p&gt;I find patterns and styles such as Atomic Design more helpful when I know how to break them without disastrous consequences. Sometimes, we need to break the rules for a while, to achieve some other goal, then later bring the design in line with our established patterns and guidelines.&lt;/p&gt;
&lt;p&gt;When programmers feel the freedom to change their minds, they can live in the best of both worlds: the security of a reliable pattern or guideline or framework without seeing those things as prisons that prevent them from Getting This Simple Stupid Thing Done Sooner.&lt;/p&gt;
&lt;p&gt;One more thing: when we resolve to refactor in the direction of the pattern, then we stop arguing about “how to apply the pattern correctly” and instead simply nudge the design in the direction of the pattern relentlessly. We’re more likely to get there with less drama.&lt;/p&gt;
</description>
          <pubDate>Thu, 15 Jan 2026 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/adopting-tricky-design-concepts-safely</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/adopting-tricky-design-concepts-safely</guid>
          
          
          <category>Unquestionably Agile</category>
          
          <category>Software Design</category>
          
          <category>Psychological Safety</category>
          
        </item>
      
    
      
      
        <item>
          <title>A Central Conflict in &apos;Readable&apos; Code</title>
          <description>&lt;p&gt;&lt;a href=&quot;/permalink/the-trouble-with-readable-code&quot;&gt;I have written before about why I don’t like to label code as “readable” or “unreadable”&lt;/a&gt;, but sadly, this has not stopped the world from doing this. I have lodged complaints with the appropriate departments.&lt;/p&gt;
&lt;p&gt;I believe that programmers generally want to spend less energy trying to understand code. Since humans are energy-conserving machines, this feels like a reasonable belief. Programmers, then, want code that costs less to understand so that they can change it safely and accurately. “Costs less” can be (somewhat) measured by time, energy, or even money. I’ll assume, for the rest of this article, that &lt;strong&gt;we share the goal of making code less expensive to understand&lt;/strong&gt;. I might even call this the primary goal of “software design”.&lt;/p&gt;
&lt;p&gt;In order to make code less expensive to understand, you have two key strategies: simplifying it or becoming more familiar with it.&lt;/p&gt;
&lt;p&gt;By “simplifying” code, I mean &lt;strong&gt;reducing the number of things you need to know in order to understand the code&lt;/strong&gt;. This tends to mean things such as moving irrelevant details out of the way and making relevant details easier to see. Becoming familiar with code usually only happens by spending time engaging with the code, such as by reading it or testing it or trying to change it.&lt;/p&gt;
&lt;p&gt;It makes sense to try to simplify code, because this activity both reduces the amount of code you need to become familiar with and is itself an activity that causes programmers to work with code and become more familiar with it. &lt;strong&gt;The act of trying to simplify code helps programmers understand code sooner both by reducing the necessary investment and by also being part of making that investment&lt;/strong&gt;. It seems like a win-win.&lt;/p&gt;
&lt;p&gt;This is why we refactor, remove duplication, improve names, introduce abstractions, add tests… all the things that we have been talking about and debating over the decades.&lt;/p&gt;
&lt;h1 id=&quot;whats-the-catch&quot;&gt;What’s the Catch?!&lt;/h1&gt;
&lt;p&gt;Sadly, &lt;strong&gt;in order to simplify code, we risk making it less familiar&lt;/strong&gt;. This happens because we:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;introduce libraries that not everyone knows&lt;/li&gt;
&lt;li&gt;introduce abstractions that not everyone has participated in choosing&lt;/li&gt;
&lt;li&gt;need to name new design elements and we’re not excellent at naming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not only that, but while we are in the relatively early stages of learning to do these things, we have to overdo them in order to form the judgment to do them correctly and appropriately and judiciously.&lt;/p&gt;
&lt;p&gt;Simplifying code therefore risks making it less familiar. When we do this, we are betting that the savings from simplifying will be greater than the additional costs of losing familiarity. We’re also betting that it will become cheaper to invest in restoring our previous levels of familiarity.&lt;/p&gt;
&lt;p&gt;When we simplify code in a way that makes the code less familiar, then I recommend focusing on improving names to make the code more familiar to your intended audience. In the process, according to &lt;a href=&quot;https://blog.thecodewhisperer.com/permalink/putting-an-age-old-battle-to-rest&quot;&gt;The Simple Design Dynamo&lt;/a&gt;, you would iterate through removing duplication and improving names until you reached a new balance point where you judged the code as “good enough” to move on. When does this happen? Probably when the act of simplifying the code has given you a chance to become familiar with it again. &lt;strong&gt;Your subjective experience of becoming familiar with the new design informs your choices to remove duplication and improve names in a way that helps the code be more familiar to the other programmers not actively involved in your work&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In short, you’d start by focusing on simplifying the code, then you’d gradually transition to making the code (more likely to seem) more familiar before declaring victory and moving on.&lt;/p&gt;
&lt;h1 id=&quot;so-what&quot;&gt;So What?!&lt;/h1&gt;
&lt;p&gt;And here is the key point: &lt;strong&gt;we must be prepared to make the code less familiar for some time in order to simplify it.&lt;/strong&gt; I believe the real power of the work lies here. If we are not prepared to let the code be less familiar for some time, then we will only ever simplify it when there is a clear, obvious way to simplify it. That can help, too, but I believe you would miss out on powerful opportunities to improve the design if you stuck with such a conservative, passive strategy.&lt;/p&gt;
&lt;p&gt;Many of those programmers arguing heatedly in meetings about refactoring are objecting to changes (or refusing to merge PRs) &lt;strong&gt;only because the code has become less familiar to them&lt;/strong&gt;. Their reaction seems perfectly reasonable to me, but I believe it is ultimately self-limiting. When you add to this situation the tendency to conflate complicated code and unfamiliar code as “unreadable”, &lt;strong&gt;those arguments become nearly impossible to resolve&lt;/strong&gt; without resorting to dysfunctions such as deferring to the Highest Paid Person In the Room or the Loudest Person In the Room. You need another tool to avoid this fate:&lt;/p&gt;
&lt;p&gt;If you want code to become less expensive to understand over time, then I argue that &lt;strong&gt;you must be willing to risk the code becoming unfamiliar; otherwise, you will miss your best opportunities to simplify it&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;p&gt;Do you struggle with technical leadership issues such as this one? Do you want to take advice like this, but feel emotional obstacles that you don’t quite understand or know yet how to deal with? I believe I can help. It’s not free, but software development professionals are getting the help they need as part of &lt;a href=&quot;https://experience.jbrains.ca&quot;&gt;The jbrains Experience&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</description>
          <pubDate>Thu, 04 Dec 2025 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/a-central-conflict-in-readable-code</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/a-central-conflict-in-readable-code</guid>
          
          
          <category>Simple Design</category>
          
          <category>Unquestionably Agile</category>
          
          <category>Software Design</category>
          
        </item>
      
    
      
      
        <item>
          <title>In the Age of Generative AI, Better Design Remains Up to Us</title>
          <description>&lt;p&gt;As we use LLMs to generate more code, Common Practice will become even more common, which creates an amplifying feedback loop entrenching Common Practice, even when what people are commonly doing seems unwise.&lt;a href=&quot;#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; This means that we’ll see more code with more code smells that could be improved. &lt;strong&gt;More opportunities.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As we rely on LLMs to generate more code, there will be mounting pressure to do more with less. Programmers tend to react to that pressure by writing more code sooner (so let the LLMs generate it) and feeling pressure to look less carefully at the results (even when they know they need to monitor what the LLM produces quite carefully), even when that’s (clearly) unwise (and they know better). This means that we’ll see more code with code smells that simply won’t be improved, even in spite of everyone’s best efforts. More people will have &lt;strong&gt;less time (and less energy!) to seize the obvious opportunities&lt;/strong&gt; in front of them.&lt;/p&gt;
&lt;p&gt;The optimist in me hopes that the companies with “better” designs&lt;a href=&quot;#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; will realize the benefits that come with “better” designs and stand out even more from the crowd with their ability to adapt to changing market forces. They would pivot sooner and more easily, feeling less resistance to make difficult business decisions and to take reasonable, calculated risks.&lt;/p&gt;
&lt;p&gt;I am worried, however, that there will merely be a bigger population of mediocre companies for the average companies to (barely) outpace. As a result, those average companies will &lt;strong&gt;still have designs that mire programmers in frustrating busywork&lt;/strong&gt;, rather than allowing them to better meet the demands of (reasonably) impatient stakeholders and customers.&lt;/p&gt;
&lt;h1 id=&quot;where-have-i-heard-this-before&quot;&gt;Where Have I Heard This Before?&lt;/h1&gt;
&lt;p&gt;Patrick Lencioni wrote that &lt;a href=&quot;https://www.amazon.com/Five-Dysfunctions-Team-Leadership-Lencioni-ebook/dp/B006960LQW?tag=jbrains.ca-20&quot;&gt;teamwork was the business world’s richest untapped competitive advantage&lt;/a&gt;. Even decades after he wrote this, from what I can tell, not much has changed. Not enough folks understand the power of teamwork and find themselves with the combination of influence and opportunity to demonstrate its power. I think we’ll be writing in similar terms and more intensely about “better” software design in the next ten years or so.&lt;/p&gt;
&lt;p&gt;I only know that I enjoy my programming work more when I get to live in habitable code. Maybe that’s how it will be: we will meet each other from time to time in warm, dry places where we invest in our own comfort and joy, whether our employers like it or not, as much as we can, for as long as we can.&lt;/p&gt;
&lt;p&gt;Same as it ever was, I think.&lt;/p&gt;
&lt;p&gt;See you there.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;In a LinkedIn post, Joshua Kerievsky pointed out the proliferation of design risks (“code smells”) in the code that LLMs were generating. He raised the example of discovering a race condition made worse by polling, where it would probably help more to introduce explicit events to handle the concurrency.&lt;a href=&quot;#fnref1&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;I don’t like to refer to designs as “better” or “worse”, because that glosses over the complexities of software design. Even so, we occasionally need to resort to shorthand for brevity, such as I’m doing here. When I write about “better” design, I mean organizing the source code in ways that reduce the cost of a human understanding it so that they can change it safely and accurately.&lt;a href=&quot;#fnref2&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
          <pubDate>Mon, 01 Dec 2025 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/in-the-age-of-gen-ai-better-design-remains-up-to-us</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/in-the-age-of-gen-ai-better-design-remains-up-to-us</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
        </item>
      
    
      
      
        <item>
          <title>Blue Tape and Inbox Technique</title>
          <description>&lt;p&gt;Michael Lopp’s article, &lt;a href=&quot;https://randsinrepose.com/archives/the-blue-tape-list/&quot;&gt;“The Blue Tape List”&lt;/a&gt; reached me today and I feel very glad that I took the time to read it. (I, too, have a backlog of thousands of articles waiting for me to read them.) While I read this delightful article, I noticed how much I liked the metaphor of Blue Tape and how it immediately sounded like something I teach regularly: Inbox Technique.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ecosia.org/search?q=site%253Ablog.jbrains.ca+inbox+technique&quot;&gt;Inbox Technique&lt;/a&gt; boils down to writing things down so that they don’t distract you while you’re trying to focus on a task. I teach this to programmers as a centerpiece to working effectively, as I described in detail in &lt;a href=&quot;/permalink/avoid-distractions-while-programming&quot;&gt;“Avoiding Distractions While Programming”&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Putting blue tape on something that needs fixing sounds writing down a particular kind of item in my inbox: “Do something about X!” (or probably just “X!!!”)&lt;/p&gt;
&lt;p&gt;From here, the corresponding parts of the Blue Tape metaphor and Inbox Technique/Getting Things Done start leaping to mind.&lt;/p&gt;
&lt;p&gt;While working on a task, when a distraction comes up, write it down (add blue tape). Writing it down is not a commitment to doing the new thing, but rather a commitment to at least &lt;em&gt;consider&lt;/em&gt; (address) the new thing. During this task, you will complete some of what you’ve added into the Inbox, and then when you can pause, you need to do something with what’s left in the Inbox. Do what?&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Delete, defer, delegate, or do. (All ways to address the items.)&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;what-happens-next&quot;&gt;What Happens Next?&lt;/h1&gt;
&lt;p&gt;When I teach Inbox Technique to folks, I primarily want them to experience the feeling of focus, but they tend to worry first about what to do with their Inboxes. Not every item that I write down becomes a new task, so it doesn’t always feel obvious what I ought to do with these inbox items, since I can’t always responsibly delete them.&lt;/p&gt;
&lt;p&gt;Over the years, I’ve learned strategies such as converting these items into certain kinds of tasks that I put into my Trusted System. I find it helpful to phrase those items as &lt;em&gt;tasks&lt;/em&gt;, which means that when I read them, I need to know how to &lt;em&gt;do&lt;/em&gt; them. I phrase them as &lt;em&gt;actions&lt;/em&gt;. Let me provide some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Spend 10 minutes deciding whether to do X.”&lt;/li&gt;
&lt;li&gt;“Choose when to start working on Y.”&lt;/li&gt;
&lt;li&gt;“Decide once and for all whether to bother doing Z.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these provides an example of how to address the blue tape without assuming that we actually have to &lt;em&gt;fix&lt;/em&gt; what the blue tape is alerting us to. As Michael points out:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You will notice my homework to new hires did not commit to fixing everything they saw, I committed to addressing it. This could mean fixing the issue, but it could also mean responding and clearly explaining my reasoning why I didn’t think fixing the issue was the right move.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Similarly, you are not obliged to do everything that you write in your Inbox. &lt;strong&gt;I consider this point critical&lt;/strong&gt;, because if you thought of Inbox items as commitments to future projects, then &lt;strong&gt;you would gradually stop writing things down out of self defence&lt;/strong&gt;. You would feel too afraid of overburdening yourself by overcommitting. And if you didn’t write these things down, then &lt;strong&gt;you’d never feel the freedom that comes with truly, deeply focusing on the current task&lt;/strong&gt;. You would be missing the point of Inbox Technique in particular and of Getting Things Done more generally!&lt;/p&gt;
&lt;p&gt;Whether you think of this as Inbox Technique or Blue Tape doesn’t much matter to me. I merely want you to feel this power of focusing on the current task because you trust yourself to handle future tasks as you need to and when you need to. That’s the power of Getting Things Done. And if you need to internalize this as a Blue Tape list to get those benefits, I’m happy. The only rule is that it has to work.&lt;/p&gt;
&lt;h1 id=&quot;whats-new-in-blue-tape&quot;&gt;What’s New in Blue Tape?&lt;/h1&gt;
&lt;p&gt;More than providing another way to understand Inbox Technique and Getting Things Done, I really like Michael’s explanation of the special context in which these distractions are coming to mind: you’re in a new context and you are constantly seeing things that you will eventually start to ignore when they become more familiar. Michael’s invites you to make use of seeing these things while you so easily notice them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s a surprise when a month passes, and you review your blue tape list and discover how items that seemed urgent at the time now seem entirely irrelevant. You are learning so much every single minute of a new gig; you are gathering so much context. You are continually updating your understanding, your context of the team, your role, and the company. Your understanding after three months of work isn’t remotely complete, but it is exponentially more complete than at the end of month two.&lt;/p&gt;
&lt;p&gt;You still address every item on the blue tape list. Every item gets a response. If you’re planning on fixing the issue, explain how and when. If you’re not planning on fixing it, explain why. If you still aren’t sure about relative importance, think about how you might find it.&lt;/p&gt;
&lt;p&gt;A large new context is uncomfortable. It’s an emotional time because that which was daily familiar is now wholly foreign. The high alert your brain defaults to is stressful, but it’s a lens that allows you to see defects the old guard can no longer see.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I see this as part of what makes Inbox Technique powerful: &lt;strong&gt;it allows you to notice things without feeling weighed down by them&lt;/strong&gt;. When you feel weighed down by noticing things, then you train yourself to stop noticing, which destroys the value of noticing. I want the benefits of noticing, so &lt;strong&gt;I make it less expensive and less painful to notice things&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This last point corresponds directly to one of the points underlying Extreme Programming theory: &lt;a href=&quot;/permalink/how-test-driven-development-works-and-more&quot;&gt;feedback has value, but only when we get it in time to do something with it&lt;/a&gt;, otherwise it becomes merely painful in the form of regret. And we generally don’t handle regret well. Accordingly, we seek feedback not because “it’s good for us” or “someone wrote it in a book somewhere”, but rather because &lt;strong&gt;we have a strategy for doing something with it&lt;/strong&gt;. I use Getting Things Done as one of my strategies for making use of the feedback that I give myself in the form of distractions surfacing while I’m trying to focus on a task. Without Inbox Technique, I would merely be distracted, feel uncomfortable, make more mistakes, and work more slowly.&lt;/p&gt;
&lt;p&gt;As Michael points out in his article, when you know your brain will be sensitive to distractions, it helps to have a system for making use of those distractions. Blue Tape, Inbox, whatever you call it, I encourage you to build a system for letting those distractions be as they are, such as by making them constructive, rather than by trying to push them away. When you push them away, they tend to react by never, ever leaving you in peace.&lt;/p&gt;
</description>
          <pubDate>Thu, 20 Nov 2025 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/blue-tape-and-inbox-technique</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/blue-tape-and-inbox-technique</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
        </item>
      
    
      
      
        <item>
          <title>An Alternative Formulation of Getting Things Done</title>
          <description>&lt;p&gt;It’s easy to see &lt;em&gt;Getting Things Done&lt;/em&gt;—both the book and the concept—as being only about making lists and setting reminders. They are the easiest parts of GTD to describe, which makes it easy to &lt;a href=&quot;/permalink/getting-started-with-getting-things-done&quot;&gt;find articles about them&lt;/a&gt;, but they’re not the most powerful benefits. Unfortunately, when we write and talk about Big Picture Issues, such as figuring out what you really want to do in life and cultivating “the courage to say ‘No’”, we run the risk of sounding like Woo Merchants with Big-Sounding Ideas but Nothing Helpful. I’d rather not do that, so I’m considering a different question.&lt;/p&gt;
&lt;p&gt;What would happen if you practised GTD? What could you expect that goes beyond making lists and setting reminders?&lt;/p&gt;
&lt;h1 id=&quot;getting-things-done-milestones&quot;&gt;Getting Things Done Milestones&lt;/h1&gt;
&lt;p&gt;When I practised the techniques I learned from &lt;em&gt;Getting Things Done&lt;/em&gt;, I noticed at least two significant milestones along the way. These are skills that I cultivated by practising GTD. Skills that I didn’t even realize I needed, would come to rely on, and would eventually dearly love.&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;safely &lt;em&gt;forgetting&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;safely &lt;em&gt;ignoring&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The list-making and reminder-setting habits helped me learn to &lt;strong&gt;safely forget&lt;/strong&gt; things, so that I could balance concentrating on finishing tasks with thinking about the wider picture. Doing this over the period of a few years freed up both the time and (mental, emotional) space I needed to reach the next milestone. My attention turned naturally to whether I truly needed to be doing all these things. This helped me learn to &lt;strong&gt;safely ignore&lt;/strong&gt; things, such as projects that I could leave to someone else or that &lt;a href=&quot;/permalink/you-aint-gonna-do-it&quot;&gt;didn’t need to be done at all&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Some folks write about these abilities as your latent superpowers and when you’re drowning in projects, it can seem like pure fantasy to imagine reaching a stage in your life in which you could say “no” to people and focus on what you care about, rather than what the world demands of you. Reading their article, you could be forgiven for feeling like they’re blaming you for not taking control of your workload—like they’re telling you that you’re Doing Life Wrong. I don’t want to do that. Instead, I’d like you to know that practising the tedious techniques of making lists and setting reminders, along with the other techniques from &lt;em&gt;Getting Things Done&lt;/em&gt; provides a path towards developing the skills, the confidence, and the courage to get there. You don’t have to have been born with it. You don’t have to have learned it by luck. You can cultivate these skills, starting with simple tricks such as the &lt;a href=&quot;/permalink/the-two-minute-rule&quot;&gt;Two-Minute Rule&lt;/a&gt; and &lt;a href=&quot;/permalink/avoid-distractions-while-programming&quot;&gt;Inbox Technique&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can do this and you can find &lt;a href=&quot;/permalink/getting-started-with-getting-things-done&quot;&gt;straightforward places to start&lt;/a&gt;. It won’t be easy, but imagine how it would feel the first time you forgot something safely, with confidence, and without consequence! How would your life change if you knew how to forget or even ignore certain tasks or projects or things? If you could do these things safely? If you could do them responsibly? If you could do them openly in a way that didn’t feel like a temporary vacation or a guilty pleasure?&lt;/p&gt;
&lt;p&gt;That’s what I believe you could learn from &lt;em&gt;Getting Things Done&lt;/em&gt;. I imagine there are other ways to get there, but I suspect they’d all go through these milestones eventually: &lt;strong&gt;safely forgetting&lt;/strong&gt;, along the path towards &lt;strong&gt;safely ignoring&lt;/strong&gt;.&lt;/p&gt;
</description>
          <pubDate>Mon, 30 Dec 2024 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/an-alternative-formulation-of-getting-things-done</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/an-alternative-formulation-of-getting-things-done</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Psychological Safety</category>
          
        </item>
      
    
      
      
        <item>
          <title>How I&apos;d Like Automation Engineers to Support Delivering Features</title>
          <description>&lt;blockquote&gt;
&lt;p&gt;Hi, I’m a Quality Engineer at my organization and I recently watched your video about integration tests being a scam.&lt;a href=&quot;#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; We’re rearchitecting a lot of our system and exploring ways to better automate our testing to ensure we can deploy faster and with more confidence and I’m exploring ways the quality team can support this. How do you see a quality team working in a world where integration tests aren’t helpful in reducing bugs/mistakes? If the focus is on low level unit tests which are often better facilitated by developers, what can automation engineers do to support the product?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’d like to start by clarifying a key point: I find integrated tests &lt;em&gt;helpful&lt;/em&gt; in reducing bugs/mistakes, but I rely on them less than other people do. I tend to avoid mistakes with mostly microtests and integrated tests at the boundaries. I tend to use integrated tests to explore unexpected problems, then I tend to replace those integrated tests with microtests as I pinpoint the source of the problem.&lt;/p&gt;
&lt;p&gt;All this means that if an integrated test finds a defect, then we ask, “Why didn’t we find this defect with a unit test?” And &lt;strong&gt;we ask this question in an open way, not in a blaming way&lt;/strong&gt;: most of the time, we notice that we missed a unit test that we would have written if we had had all the time in the world, but &lt;strong&gt;sometimes we find a defect that nobody saw coming&lt;/strong&gt;, and that’s when we feel grateful for the integrated test.&lt;/p&gt;
&lt;p&gt;I say this not as a form of “well, actually…”, but because &lt;strong&gt;explaining that provides some context that makes it more convenient to answer the question&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;How do I prefer to work with automation engineers? First, let me describe how I prefer to work with human testers, then how the automation engineers act as a bridge between programmers and testers.&lt;/p&gt;
&lt;h2 id=&quot;behold-the-human-tester&quot;&gt;Behold the Human Tester&lt;/h2&gt;
&lt;p&gt;First, imagine the role of the human tester. In The Bad Old Days, a programmer would write code, then throw it over a wall where it would land on a human tester. The human tester would then run some “tests”, probably by following a Test Script or a Test Plan, to do what we now call &lt;strong&gt;“routine checking” in the Michael Bolton&lt;a href=&quot;#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; sense&lt;/strong&gt;. &lt;a href=&quot;https://ronjeffries.com/xprog/articles/automatedtesting/&quot;&gt;Some folks saw this testing role as waste&lt;/a&gt;, so we decided one day that programmers ought to become testers and we called it “Test-First Programming”, which later became known as “Test-Driven Development”. From that point forward, &lt;strong&gt;the programmer took primary responsibility for routine checking&lt;/strong&gt;, leaving the human tester to do… what, exactly?&lt;/p&gt;
&lt;p&gt;The human tester no longer needed to do routine checking, because the programmer was doing it. This meant that the human tester could &lt;strong&gt;turn their attention to more interesting risks in the system&lt;/strong&gt;. We use names such as “Exploratory Testing” and “Soap Opera Testing” to describe a kind of &lt;strong&gt;extraordinary testing&lt;/strong&gt;, the kind that goes &lt;strong&gt;beyond the kinds of routine checking that “even a programmer” could be trusted to do&lt;/strong&gt;. As a programmer, what I then need from the human tester is no longer to automate routine checks, but instead to explore the product, to challenge assumptions, and to subvert expectations. Instead of playing the role of parent cleaning the child’s face with a wet cloth, &lt;strong&gt;the human tester now has the programmer’s back in a fight&lt;/strong&gt; (presumably against the defects in their system?). The programmer feels comfortable doing the routine checking, &lt;strong&gt;confident that the human tester covers their blind spots&lt;/strong&gt;. They communicate; they compensate for each other’s weaknesses; they complement each other.&lt;/p&gt;
&lt;h2 id=&quot;enter-the-automation-engineer&quot;&gt;Enter the Automation Engineer&lt;/h2&gt;
&lt;p&gt;Now we come to how I ask the automating engineer to help: &lt;strong&gt;establish a pipeline for automating the human tester’s work when they uncover a test that the programmer would like to adopt as a routine check&lt;/strong&gt;. The automation engineer helps the human tester &lt;strong&gt;avoid falling back into the trap of mindlessly running routine checks&lt;/strong&gt;. True: these new routine checks are more interesting and more powerful than the previous ones, but &lt;strong&gt;the purpose of automation is to do repetitive things so that humans are free to become even more creative&lt;/strong&gt;.&lt;a href=&quot;#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; The automation engineer plays a pivotal role as an agent of the human tester, relieving them of the burden of executing the same checks over and over again. The human tester explores the system and as they find interesting behavior, &lt;strong&gt;the resulting tests transform gradually into checks&lt;/strong&gt;. The automation engineer automates those checks, so that the programmer can benefit from them as an ever-improving pool of change detectors.&lt;/p&gt;
&lt;p&gt;Moreover, I’d like the automation engineer and the programmer to work together to transform bigger-scope (integrated) tests into smaller-scope (micro-) tests, because the automation engineer understands enough software design and testing to bridge the communication gap. The programmer doesn’t have to become an expert tester, nor does the tester have to become an expert programmer, but rather &lt;strong&gt;the automation engineer understands both groups and facilitates the transition from larger-scope extraordinary tests to smaller-scope routine checks&lt;/strong&gt;.&lt;a href=&quot;#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Moreover moreover, &lt;strong&gt;the programmer is allowed to focus on unit tests, so they write more of them&lt;/strong&gt;, which strengthens those tests as a mechanism for finding defects and supporting refactoring. Consequently, &lt;strong&gt;the tester is less-often distracted by silly mistakes&lt;/strong&gt; that the programmers really could have found or avoided on their own. The tester has more time and energy to devote to &lt;strong&gt;finding even more interesting problems before the end users do&lt;/strong&gt;. In this way, the testers become free to act as &lt;strong&gt;agents of the end user or customer&lt;/strong&gt;. They can think more about the system as a product from the end user’s point of view, rather than being relegated to treating the system as a bunch of bug-riddled software components in need of constant attention. Over the longer term, the tester develops a greater understanding of how the product might satisfy the customer—and even delight them!&lt;/p&gt;
&lt;p&gt;Everyone wins. Let’s go!&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;I strongly strongly strongly prefer people to watch &lt;a href=&quot;https://www.youtube.com/watch?v=fhFa4tkFUFw&quot;&gt;this version of the talk&lt;/a&gt; to any of the previous versions of the talk. And if you’ve seen one of the older versions, then please &lt;a href=&quot;https://www.youtube.com/watch?v=NGs23Q8WHxA&quot;&gt;watch this next&lt;/a&gt;.&lt;a href=&quot;#fnref1&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn2&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;No, not &lt;a href=&quot;https://www.youtube.com/watch?v=YFood_bTOX4&quot;&gt;that one&lt;/a&gt;, and not &lt;a href=&quot;https://www.youtube.com/watch?v=XASNM1XEQPs&quot;&gt;that one&lt;/a&gt;, either, but &lt;a href=&quot;https://www.youtube.com/watch?v=gaN1wrsdLI8&quot;&gt;this one&lt;/a&gt;.&lt;a href=&quot;#fnref2&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn3&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;Something something generative AI something something.&lt;a href=&quot;#fnref3&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&quot;fn4&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.imdb.com/title/tt0017136&quot;&gt;The mediator between Programmer and Tester may be the Automation Engineer&lt;/a&gt;.&lt;a href=&quot;#fnref4&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
          <pubDate>Fri, 18 Oct 2024 00:00:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/how-id-like-automation-engineers-to-support-delivering-features</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/how-id-like-automation-engineers-to-support-delivering-features</guid>
          
          
          <category>Questions and Answers</category>
          
        </item>
      
    
      
      
        <item>
          <title>Making Use of &apos;Silly&apos; Advice: Part 3</title>
          <description>&lt;p&gt;“We didn’t need it, therefore you don’t need it, so don’t do it.”&lt;/p&gt;
&lt;p&gt;⚠ Caution. ⚠&lt;/p&gt;
&lt;p&gt;When someone posts this, &lt;strong&gt;they might mean well and they might be very misguided&lt;/strong&gt;. When you read this, I encourage you to look beyond the words to what might lie behind them.&lt;/p&gt;
&lt;p&gt;I can think of at least two very different possibilities:&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;They are falling prey to damaging “Best Practices” thinking.&lt;/li&gt;
&lt;li&gt;They have recently discovered that they could freely and safely stop doing something, because it was no longer necessary, and they want to remind the rest of the world to be aware of such opportunities in their context.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I find it difficult to tell the difference from here, outside their mind.&lt;/p&gt;
&lt;p&gt;(I should mention now that if we spent another 15 minutes, we could probably find a few other ways to interpret those words, but I think these two interpretations make my point well enough, so I stopped.)&lt;/p&gt;
&lt;p&gt;✅ Try this instead: ✅&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pretend&lt;/strong&gt; they said or wrote this: “We didn’t need it (any more), therefore you might not need it (any more), so consider not doing it (any more)!”&lt;/p&gt;
&lt;p&gt;The word &lt;strong&gt;“consider”&lt;/strong&gt; stands out most to me.&lt;/p&gt;
&lt;p&gt;We build habits in order to reduce the cost of helpful behavior. Unfortunately, habits often work best when they become autonomic, which means that we stop thinking about doing them. And &lt;strong&gt;we always risk habits becoming empty rituals&lt;/strong&gt;. When the ritual becomes empty, the behavior stops helping us. At best, it merely gets a little in the way; at worst, it actively hurts us.&lt;/p&gt;
&lt;p&gt;For that reason, we remind ourselves to inspect our ways of working every so often. Doing these inspections, we reconsider what we need to do, so that we can stop doing whatever has become unnecessary. And &lt;strong&gt;that’s how these words can become helpful&lt;/strong&gt;: “We didn’t need it, therefore you don’t need it, so don’t do it.”&lt;/p&gt;
&lt;p&gt;You can think of them as a somewhat unskillful way of saying “Do you really still need to do that? Does it still help you? Has it outlived its purpose? or did it never live up to its promise in the first place? &lt;strong&gt;What would happen if you stopped?&lt;/strong&gt;” By interpreting those words more generously, we’ve turned them from apparently-mindless “Best Practices” thinking to a helpful reminder not to fall into &lt;a href=&quot;https://en.wikipedia.org/wiki/Grace_Hopper#Early_life_and_education&quot;&gt;the Grace Hopper trap&lt;/a&gt;: “We’ve always done it this way.” Even unskillful acts can help, if we remain open to how they might help.&lt;/p&gt;
&lt;p&gt;Whenever you read or hear advice outside its context, I encourage you take it seriously without immediately assuming that you ought to follow it. I also encourage you to join me in resisting the impulse to tell them how wrong they are, because &lt;strong&gt;they’re often (but not always!) right in their context, even if they’re wrong in your context&lt;/strong&gt;. It works even better to interpret their possibly unskillful act as a well-meaning attempt to help you. At some point in the future, you’ll probably wish that they’d interpreted your unskillful act that way.&lt;/p&gt;
</description>
          <pubDate>Fri, 02 Aug 2024 10:00:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/making-use-of-silly-advice-3</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/making-use-of-silly-advice-3</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Psychological Safety</category>
          
          <category>Quick Win</category>
          
        </item>
      
    
      
      
        <item>
          <title>Forecast Costs Responsibly</title>
          <description>&lt;p&gt;I think the typical software development group (team, department, …) has many more urgent matters to attend to than forecasting when tasks will be done. I don’t think it’s a bad idea to try to forecast more accurately; I merely believe that most organizations, most of the time, would benefit more from addressing other issues and letting this particular issue be as it is.&lt;/p&gt;
&lt;p&gt;At the same time, almost everyone all the time wants to know when it’ll be done, for all kinds of meanings of “it”. And it therefore seems reasonable and urgent to try to forecast more accurately. This is merely a trick that the brain plays on us. We would have to train ourselves to resist the temptation to act on this source of &lt;strong&gt;false urgency&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I urge you not to bother trying to forecast the cost of tasks, even features, more accurately, but instead to work on other ways to improve. I can help you figure out what to focus on in your context, but maybe you’d rather start doing that on your own. In that case, start with the question of what’s interfering with &lt;em&gt;delivering&lt;/em&gt; value to customers, then start chipping away at those obstacles. What’s &lt;em&gt;valuable&lt;/em&gt; and when is it well and truly finally &lt;em&gt;delivered&lt;/em&gt;? As you deliver more value to more paying customers, you’ll have more resources (including cash!) with which to figure out where to improve next. There’s more to it, but that’s a particularly helpful place to start (on average).&lt;/p&gt;
&lt;p&gt;And if you insist on trying to forecast costs more accurately, then &lt;a href=&quot;https://improvingflow.com/2024/04/10/forecasting-projects.html&quot;&gt;read Mike Bowler’s recent article&lt;/a&gt; on the topic.&lt;/p&gt;
</description>
          <pubDate>Wed, 10 Apr 2024 10:33:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/forecast-costs-responsibly</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/forecast-costs-responsibly</guid>
          
          
          <category>Unquestionably Agile</category>
          
          <category>Free Your Mind to Do Great Work</category>
          
        </item>
      
    
      
      
        <item>
          <title>Slack&apos;s Role in Managing Software Projects: Revisited</title>
          <description>&lt;p&gt;I remember reading &lt;a href=&quot;https://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658?&amp;amp;linkCode=ll1&amp;amp;tag=jbrains.ca-20&amp;amp;linkId=ec96897b6efae9d659ce3d449b37fba4&quot;&gt;&lt;em&gt;Extreme Programming Explained&lt;/em&gt;&lt;/a&gt;, the second edition, and being surprised by the advice to put extra stories/tasks into the weekly iteration plan to use as ballast in the face of unplanned work. It seemed to me at the time like sandbagging—intentionally doing less than we could actually do. I didn’t understand the purpose of it.&lt;/p&gt;
&lt;p&gt;At the time, I thought, “If we’re going to add more items into the weekly plan, then why not merely add the next stories in the priority list?!” Why would we choose to do anything but whatever would come next, especially since we assumed (thanks to Yesterday’s Weather) that we almost certainly wouldn’t get there anyway?&lt;/p&gt;
&lt;p&gt;I didn’t understand much at the time about the psychological factors involved.&lt;/p&gt;
&lt;p&gt;Now, I think of it like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s wise to put some items in the weekly plan that we don’t feel confident we can finish, just in case we get lucky and finish early what we expected to finish.&lt;/li&gt;
&lt;li&gt;It’s risky for the extra items in the weekly plan to be items that the stakeholders care deeply about, because &lt;strong&gt;we’re setting them up for constant disappointment when we suggest that we might finish items that they care about, but routinely don’t finish&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It’s therefore wise for the extra items in the weekly plan to be &lt;strong&gt;items of significance that are not yet urgent&lt;/strong&gt;, because there is a small chance that we might get to them, and if we don’t take advantage of that opportunity, then we might never get around to them… until they become urgent problems for us.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It would probably help everyone if our stakeholders never treated our weekly plan like a commitment, but that’s not how most people behave. Even the most attentive, caring, and collaborative stakeholders are humans and &lt;strong&gt;humans are easily disappointed&lt;/strong&gt;. We react more sharply to loss and remember it longer than we do getting more than what we expected. I think it’s wise to choose an approach that reduces the likelihood of disappointment, all other things being equal.&lt;/p&gt;
&lt;p&gt;After all, we always have the option of changing our minds and squeezing in a high-value story at the end of the week, thereby delighting some of the stakeholders. That sounds helpful, no?&lt;/p&gt;
</description>
          <pubDate>Thu, 28 Mar 2024 11:28:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/slack-s-role-in-managing-software-projects-revisited</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/slack-s-role-in-managing-software-projects-revisited</guid>
          
          
          <category>Unquestionably Agile</category>
          
          <category>Free Your Mind to Do Great Work</category>
          
        </item>
      
    
      
      
        <item>
          <title>Making Use of &apos;Silly&apos; Advice: Part 2</title>
          <description>&lt;p&gt;To avoid arguments with strangers who are wrong on the internet, consider the following substitution in your mind as you read.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You shouldn’t do X” or “Don’t do X” or “Stop doing X”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You might not need to do X (especially merely because some book seems to recommend it). You might still choose to do X, but ask yourself whether that was a conscious choice, and if it wasn’t, then reconsider.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not as pithy, but much more accurate. And no need to correct internet strangers. That’s probably quite close to what they mean, anyway.&lt;/p&gt;
&lt;h1 id=&quot;some-theory&quot;&gt;Some Theory&lt;/h1&gt;
&lt;p&gt;You probably remember a parent or other authority figure telling you that you can’t change &lt;em&gt;them&lt;/em&gt;, but you always have the power to change &lt;em&gt;yourself&lt;/em&gt;. I offer this trick as an example of how to do that.&lt;/p&gt;
&lt;p&gt;You might feel annoyed that &lt;em&gt;they&lt;/em&gt; don’t express themselves more precisely, resorting to blunt instruments such as “Don’t do X” when they really mean something much more nuanced. I understand that impulse, but I have found it helpful to imagine that they struggle to express themselves that way, even though it seems pretty easy to me. I know that, in moments of great stress, I fail to express myself with such &lt;em&gt;emotional granularity&lt;/em&gt; as I can ordinarily do. Perhaps they’re under that kind of stress right now and that’s what motivated them to write about their advice, anyway!&lt;/p&gt;
&lt;p&gt;What have we seen at work here? It depends on how you learned about it. I know these phrases and labels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blaming stance&lt;/li&gt;
&lt;li&gt;giraffe ears&lt;/li&gt;
&lt;li&gt;emotional granularity&lt;/li&gt;
&lt;li&gt;“Under stress, we fall back on our training.”&lt;/li&gt;
&lt;li&gt;I am entirely responsible for my own emotional state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don’t need to believe in or agree with all these, but perhaps one of two of them speaks to you.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</description>
          <pubDate>Tue, 12 Mar 2024 10:06:00 -0300</pubDate>
          <link>https://blog.jbrains.ca/permalink/making-use-of-silly-advice-2</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/making-use-of-silly-advice-2</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Psychological Safety</category>
          
          <category>Quick Win</category>
          
        </item>
      
    
      
      
        <item>
          <title>Our Collective Struggle Over Technical Debt</title>
          <description>&lt;p&gt;The term “Technical Debt” has changed quite a lot in general meaning over the years, but one fact remains: it is not a sensible goal to eliminate all Technical Debt, at least when you are truly trying to deliver software incrementally.&lt;/p&gt;
&lt;p&gt;Wait… what?!&lt;/p&gt;
&lt;p&gt;Fine, I’m being provocative for marketing purposes. Let me clarify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I’m using the term “Technical Debt” &lt;strong&gt;as it is commonly understood&lt;/strong&gt; these days: the accumulation of artifacts (code, documentation, …) that interferes with our ability to deliver the next valuable change.&lt;/li&gt;
&lt;li&gt;Most projects would &lt;strong&gt;benefit from reducing&lt;/strong&gt; Technical Debt.&lt;/li&gt;
&lt;li&gt;Technical Debt tends to accumulate &lt;strong&gt;if we don’t train ourselves to attend to it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Technical Debt is an &lt;strong&gt;unavoidable and normal consequence&lt;/strong&gt; of delivering software incrementally.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;a-problem&quot;&gt;A Problem&lt;/h2&gt;
&lt;p&gt;The confusion about Technical Debt typically comes from the &lt;strong&gt;apparent contradiction between&lt;/strong&gt; “Technical Debt is unavoidable” and “We should reduce Technical Debt”. This happens when we act as Maximizers. Hilariously, some of this reflects the success of XP: “If this thing we do is good, then why not do it all the time?!” That’s the “X” in XP.&lt;/p&gt;
&lt;p&gt;Even so, &lt;strong&gt;maximizing everything creates suffering&lt;/strong&gt;. We often encounter tradeoffs, where two benefits oppose each other and so trying to maximize one hurts the other. We often fail to notice tradeoffs. We often disagree whether two forces are trading off or we can safely maximize one of them.&lt;/p&gt;
&lt;p&gt;It’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Cynefin_framework&quot;&gt;Complex&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-this-problem-is-a-problem&quot;&gt;Why This Problem is a Problem&lt;/h2&gt;
&lt;p&gt;When we assume that we should maximize…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Technical Debt is unavoidable” transforms into “There’s nothing we can do about Technical Debt” becomes “Our current level of Technical Debt is not only fine, not only expected, not only normal, but there’s nothing we can do about it, so let’s just ignore it.”&lt;/li&gt;
&lt;li&gt;“You (almost certainly) should reduce Technical Debt” becomes “We need to relentlessly push for less Technical Debt” transforms into “We need to push for zero Technical Debt, and any goal less ambitious than that is a moral weakness and doomed to fail.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve exaggerated for effect, but not by as much as you think.&lt;/p&gt;
&lt;h2 id=&quot;what-now&quot;&gt;What Now?!&lt;/h2&gt;
&lt;p&gt;I claim that these two statements are true at the same time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You almost certainly would profit from &lt;strong&gt;reducing&lt;/strong&gt; Technical Debt.&lt;/li&gt;
&lt;li&gt;You almost certainly would profit from &lt;strong&gt;embracing&lt;/strong&gt; Technical Debt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technical Debt is &lt;strong&gt;the price you pay for delivering increments sooner&lt;/strong&gt;. Eliminating Technical Debt would mean delaying the delivery of features.&lt;/p&gt;
&lt;p&gt;Technical Debt &lt;strong&gt;compounds so we must agree to reduce it&lt;/strong&gt;. Without that agreement and a strategy to reduce Technical Debt, the compounding effect would cause it to pile up until it overwhelmed our capacity. Letting Technical Debt grow uncontroled would mean delaying the delivery of new features.&lt;/p&gt;
&lt;p&gt;Unfortunately, &lt;strong&gt;we don’t know how to measure “the right” amount of Technical Debt for you&lt;/strong&gt;—at least not directly. As far as I can see, the best we can do involves looking for delays related to delivering features and diagnosing them as “cleaning up too much” or “not cleaning up enough”. We need to adjust our behavior continually. We can’t simply “set it and forget it”. Like I said, &lt;a href=&quot;https://en.wikipedia.org/wiki/Cynefin_framework&quot;&gt;it’s Complex&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-bigger-problem-behind-the-problem&quot;&gt;The (Bigger) Problem Behind “The Problem”&lt;/h2&gt;
&lt;p&gt;And we’ll probably disagree loudly about whether we’re not cleaning up enough or cleaning up too much. And different people will have different preferences about how much to clean up and when. And different people will have different needs, so optimizing for the individual would create even more conflict for the group. And Survivorship Bias guarantees that some people will assume that whatever they did in the past is the right strategy for this (other) group and this (other) project. And Confirmation Bias guarantees that some well-meaning, caring, opinionated folks will keep coming back to the group with article after article supporting their opinion. &lt;strong&gt;And it will probably never stop.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;resolve-the-issue-by-not-resolving-it&quot;&gt;Resolve the Issue By Not Resolving It&lt;/h2&gt;
&lt;p&gt;This is yet another case where Best Practices thinking is likely to let you down. This is yet another case where there is no solution. &lt;strong&gt;If you want to deliver changes incrementally and sooner, then you will need to manage Technical Debt. Forever.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Don’t let it run wild and don’t resolve to eliminate it. Don’t squelch the arguments about it. Indeed, &lt;strong&gt;arguing about Technical Debt is the way forward&lt;/strong&gt;. It’s how we continually adjust. It’s how we decide to clean up a little more here and a little less there. It’s how information flows about whether we’re doing enough or too much.&lt;/p&gt;
&lt;p&gt;Of course, you probably prefer to argue more constructively and more harmoniously than you have the opportunity to do now. Your experience of trying to argue about this, whether with co-workers or random strangers on the internet, has likely felt more damaging than helpful. You’re probably afraid, maybe even terrified, of what would happen if you tried to argue openly and freely with your co-workers. It feels so much safer to retreat to Best Practices thinking or to give up on managing Technical Debt altogether. I understand.&lt;/p&gt;
&lt;p&gt;Our collective struggle over Technical Debt seems much more to me to have been &lt;strong&gt;a clear signal of our collective trust deficit&lt;/strong&gt; than a signal of our competence as software developers. I think we need to trust each other more to make any meaningful progress here.&lt;/p&gt;
&lt;p&gt;What do we do about &lt;em&gt;that&lt;/em&gt;? The answer fills bookshelves. One of my favorite places to start is Patrick Lencioni’s &lt;a href=&quot;https://www.amazon.ca/Five-Dysfunctions-Team-Leadership-Fable/dp/0787960756&quot;&gt;&lt;em&gt;The Five Dysfunctions of a Team&lt;/em&gt;&lt;/a&gt;. If you have a favorite first resource on the topic of increasing trust, then share it with the world!&lt;/p&gt;
</description>
          <pubDate>Wed, 24 Jan 2024 00:00:00 -0400</pubDate>
          <link>https://blog.jbrains.ca/permalink/our-collective-struggle-over-technical-debt</link>
          <guid isPermaLink="true">https://blog.jbrains.ca/permalink/our-collective-struggle-over-technical-debt</guid>
          
          
          <category>Free Your Mind to Do Great Work</category>
          
          <category>Psychological Safety</category>
          
          <category>Unquestionably Agile</category>
          
        </item>
      
    
  </channel>
</rss>
