<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thoughtbot="https://thoughtbot.com/feeds/" xmlns:feedpress="https://feed.press/xmlns" xmlns:media="http://search.yahoo.com/mrss/" xmlns:podcast="https://podcastindex.org/namespace/1.0">
  <feedpress:locale>en</feedpress:locale>
  <link rel="hub" href="https://feedpress.superfeedr.com/"/>
  <title>Giant Robots Smashing Into Other Giant Robots</title>
  <subtitle>Written by thoughtbot, your expert partner for design and development.
</subtitle>
  <id>https://robots.thoughtbot.com/</id>
  <link href="https://thoughtbot.com/blog"/>
  <link href="https://feed.thoughtbot.com/" rel="self"/>
  <updated>2026-05-15T00:00:00+00:00</updated>
  <author>
    <name>thoughtbot</name>
  </author>
  <entry>
    <title>6 key insights from Startup Grind Global 2026</title>
    <link rel="alternate" href="https://feed.thoughtbot.com/link/24077/17341576/6-key-insights-from-startup-grind-global-2026"/>
    <author>
      <name>Ferdia Kenny</name>
    </author>
    <id>https://thoughtbot.com/blog/6-key-insights-from-startup-grind-global-2026</id>
    <published>2026-05-15T00:00:00+00:00</published>
    <updated>2026-05-11T12:54:13Z</updated>
    <content type="html"><![CDATA[<p>Last week I attended <a href="https://www.startupgrind.tech/agenda?utm_source=bevy&amp;utm_medium=homepage">Startup Grind Global</a> in Redwood City, CA. I find it can be helpful to get boots on the ground to hear first hand what’s happening in the industry. Here are my six key takeaways, grouped by theme.</p>

<p>As you can probably guess, there was a lot of AI talk, so please bear in mind there is always going to be some hyperbole and exaggeration at conference talks; it benefits people to big up their industry. The core concepts shared in our <a href="https://youtube.com/playlist?list=PL8tzorAO7s0g1yRO1qDZJemq8fI1gr3eE&amp;si=k_di_aRbISvVZfA4">“AI for Business” livestream series</a> still ring true; start with a problem you want to solve, look at your processes from end-to-end and then look at tools that can help you.</p>

<p>Recordings of all the talks are available on <a href="https://www.youtube.com/@StartupGrind/videos">Startup Grind’s YouTube</a>.</p>

<p><img src="https://images.thoughtbot.com/9678epx8zi8w786aqwbiyow1kake_SG%202026%20Justin%20Khan.jpg" alt='A dark auditorium at the startup grind conference. Two men are on stage with a large screen behind them and a small "s" and "g" red sign on the right of the stage'></p>
<h2 id="pace-of-change-in-ai">
  
    Pace of change in AI
  
</h2>

<p>You don’t need to spend long walking the streets of San Francisco to see that change is afoot. The pace of this change is what surprised me most though, with many speakers at Startup Grind labelling companies formed pre 2022 as “legacy companies”.</p>

<p>It certainly feels like a land-grab is underway with enterprises under pressure from their boards to pick their AI tools in the next 6-9 months. It’s accelerating, and AI-native companies seem to have an edge (although I believe some of this is smoke and mirrors).</p>

<p>What seems to be more concrete is that <a href="https://www.youtube.com/watch?v=LYAyTCpiUcg">we’re moving from “rented intelligence” to “owned intelligence”</a>. Large frontier models have been used as a general purpose solution to solve many problems. Now though, smaller models trained on specific customer data are coming to the fore. This is because you don’t need frontier level intelligence to solve a lot of tasks. The question is not which model is the smartest, but which model is the most efficient at completing a task without compromising quality.</p>

<p>The future is likely some combination of the two approaches. Some problems will be solved by large frontier models, but many others will be better suited to models that are trained specifically on your own customer data. <strong>Therefore, it is important to own the stack; the model and the data.</strong> That’s the most valuable layer, and you need to own it.</p>
<h2 id="what-still-matters">
  
    What still matters
  
</h2>

<p>One thing I heard consistently across most talks is that taste and judgement are the most valuable skills to have in this rapidly changing space.</p>

<p><a href="https://www.youtube.com/watch?v=7FuGwn8ec4E">You may have expertise in a specific tool or process</a>, but if that workflow gets replaced or automated, those expertise become less valuable. However, even if we reach a point where an individual is managing a team of productive agents, there could be even more work for you to do on the back of all that output. <a href="https://www.youtube.com/watch?v=269Ab1fzsww">You’re going to have to make those critical judgement calls for all the agents’ work</a>.</p>

<p>So it’s important to make AI work for you, not the other way around. It’s a tool, but you need to make the decisions. Being opinionated helps in this regard. And if you want to explore some of thoughtbot’s strongly held opinions, <a href="https://www.youtube.com/playlist?list=PL8tzorAO7s0hll4B93utRIbXI1b9pRdj-">check out “The opinionated thoughtbotter” series</a>.</p>
<h2 id="marketing-amp-pricing">
  
    Marketing &amp; Pricing
  
</h2>

<p>It can also be challenging to market your company in such a fluid environment where new work is being shipped constantly. How do you keep a consistent message? Well, the best companies are now shipping fast and iteratively, <a href="https://youtu.be/7FuGwn8ec4E?si=AbyPmkbNsJhbU9gt">but the narrative around their brand always stays the same</a>. It’s consistent and is tied to the same company mission.</p>

<p>Your product marketing can be more functional but your brand marketing needs to be emotive; it’s about how you make people feel. The best marketing focuses on the problem, not the solution.</p>

<p>In terms of pricing, consumption based pricing is all the rage currently, while people have been predicting the downfall of SaaS for the last couple of years. But the sentiment I heard is that the pendulum will probably swing back to some form of bundle pricing because consumption based pricing is hard for enterprises to control. The trick here will be creating different consumption buckets that work for your customers, so the two pricing methods are merging to some degree.</p>
<h2 id="future-founders">
  
    Future founders
  
</h2>

<p>Given this was Startup Grind, a lot of the advice was focused on founders. This is an exciting time to be a founder, <a href="https://www.youtube.com/watch?v=mU0mMcnW6cQ">comparable to the opportunities that existed around the iPhone in 2010</a>. As a founder, you have an opportunity to create an entirely new future and to bring customers along for the ride. The next great founders won’t just be bolting AI on something people already use, but they’ll be changing what people do completely. To pull this off, you need to be bold, opinionated and even contrarian.</p>

<p>Entrepreneurial spirit is in high demand in early stage teams too. With the pace of change, <a href="https://www.youtube.com/watch?v=Plstngz-SGM">finding people who are resourceful</a>, hungry and who get things done is more important than specific skills or impressive backgrounds.</p>

<p>Finally, if you are heading down the fundraising route, it is almost impossible to raise money with just a pitch deck (for software products at least). The conventional wisdom seems to be that, with AI coding agents, you need a working prototype and customers to raise capital.</p>
<h2 id="agentic-havoc">
  
    Agentic havoc
  
</h2>

<p>While agents can be helpful, they can also create devastating problems. One example is supply chain attacks, <a href="https://fortune.com/2026/04/02/mercor-ai-startup-security-incident-10-billion/">like the recent one at Mercor</a>. These types of attacks are becoming more prevalent and can be introduced, for example, when someone uses Claude Code to install packages that inadvertently create security issues.</p>

<p>The advice is to <a href="https://www.youtube.com/watch?v=Plstngz-SGM">never connect a coding agent to production data</a> because it can install, run or, worst of all, delete anything. Incident responses, design reviews, and auditing and tracking who made changes <a href="https://youtu.be/v4KX-WfO2YA?si=nTGAF0sKEamKl2kA">are all becoming even more important with agents</a> in the mix. Security, therefore, is a real area of opportunity for companies to exploit.</p>
<h2 id="the-future-of-designers">
  
    The future of designers
  
</h2>

<p>As a Product Designer, I was particularly interested in hearing about the future of design at this conference. In the lead up to it, with the release of Claude Design, there have been a lot of click-bait articles and videos online predicting the demise of the design field.</p>

<p>While the “no UI” concept is a trendy idea, I saw <a href="https://youtu.be/v4KX-WfO2YA?si=nTGAF0sKEamKl2kA">some pushback against it</a>. The feeling seems to be that someone, somewhere during the process, will have to do something, so there’s still going to be a need for a clean, human-centered UI. If we reach a point where an individual is managing a fleet of agents, having a simple, easy and beautiful UI for managing these agents will be the frontier of design.</p>

<p>In terms of UX, in a world where anyone can create anything, the experts actually felt <a href="https://www.youtube.com/watch?v=Plstngz-SGM">UX is going to be more important than ever</a>. So good design isn’t going away.</p>

<p>My favourite talk of the conference was <a href="https://www.youtube.com/watch?v=ju7_5eOiWPI">a fireside chat</a> between Karri Saarinen (CEO and co-founder of Linear) and Stephanie Zhan (a Partner in Sequoia Capital). They discussed design and AI. Karri began his career as a designer so I was particularly interested in what he had to say on this topic. While I recommend watching the talk in full, the key takeaways I pulled from it were:</p>

<ul>
<li>Good design is a way to build trust and could be a competitive advantage. It shows you put lots of thought into your product, which is reassuring for potential customers. You still need to ship fast to test, but there’s a balance to be struck. This point was actually made during the Q&amp;A they did after the original talk, so it’s not in the recording above.</li>
<li>In relation to AI design tools, Karri made the point that even if these tools can generate designs that look good, it doesn’t mean those designs work well. He still uses Figma at the planning stage when he designs because writing something out helps him organise his thoughts. This act gives you some real value that shouldn’t be overlooked in favour of “vibe-designed” applications.</li>
<li>Karri believes that <a href="https://www.linkedin.com/pulse/output-isnt-design-karri-saarinen-ayhnc/">output isn’t design</a>. It’s not the act of producing that is valuable, it’s about understanding the problem well enough to understand what, how and if something should exist. Karri felt there could be a pendulum swing back, moving away from building loads of things quickly and towards being more thoughtful and intentional about what is being built.</li>
<li>Undoubtedly some aspects of design will change. AI is increasing the floor of design in some areas and automating others. The drawing of rectangles will be less important in future. But Karri made the point that if you don’t understand design you’ll use these AI design tools incorrectly. If you don’t trust AI to do your legal work, then why would you trust it to do design?</li>
<li>Finally, the default career direction seems to be that design and designers move closer to code. But Karri felt there is an opportunity for ambitious designers to move upstream into leadership positions where they can answer questions like what we should be building, whether we should build something at all, what’s the product direction and so on.</li>
</ul>
<h2 id="3-cool-companies">
  
    3 cool companies:
  
</h2>

<p>Finally, here are three cool companies that stood out to me from the conference that you may not have heard of. Definitely work checking out!</p>

<ul>
<li>
<a href="https://hydram.is/">Hydram Research</a> - An Icelandic company building novel, large-scale hardware that makes it more energy efficient to produce steam, which is critical in nearly all material manufacturing processes, from plastics to paper.</li>
<li>
<a href="https://samaya.ai/">Samaya AI</a> - As thoughtbot are experts in the regulated industries, including financial services, Samaya caught my eye. Samaya equips financial professionals with secure, market-fluent AI agents to answer questions, deliver insights, and automate workflows.</li>
<li>
<a href="https://condor.pnotp.ai/">Condor</a> - An AI-powered early detection system to prevent the spread of wildfires. They claim to reduce response time from between 30 and 120 minutes to between 1 and 10 minutes.</li>
</ul>

<aside class="related-articles"><h2>If you enjoyed this post, you might also like:</h2>
<ul>
<li><a href="https://thoughtbot.com/blog/how-to-use-chatgpt-to-find-custom-software-consultants">How to Use ChatGPT to Find Custom Software Consultants</a></li>
<li><a href="https://thoughtbot.com/blog/from-idea-to-impact-the-role-of-rapid-prototyping-in-agetech">From idea to impact: The role of rapid prototyping in AgeTech</a></li>
<li><a href="https://thoughtbot.com/blog/using-machine-learning-to-answer-questions-from-internal-documentation">Using Machine Learning to Answer Questions from Internal Documentation</a></li>
</ul></aside>
<img src="https://feed.thoughtbot.com/link/24077/17341576.gif" height="1" width="1"/>]]></content>
    <summary>Here are 6 key insights I took from the Startup Grind Global conference 2026 along with 3 cool companies worth checking out!</summary>
    <thoughtbot:auto_social_share>true</thoughtbot:auto_social_share>
  </entry>
  <entry>
    <title>When to use (and not use) CSS shorthand properties</title>
    <link rel="alternate" href="https://feed.thoughtbot.com/link/24077/17340884/when-to-use-and-not-use-css-shorthand-properties"/>
    <author>
      <name>Elaina Natario</name>
    </author>
    <id>https://thoughtbot.com/blog/when-to-use-and-not-use-css-shorthand-properties</id>
    <published>2026-05-14T00:00:00+00:00</published>
    <updated>2026-05-12T18:35:17Z</updated>
    <content type="html"><![CDATA[<p>Ana Tudor <a href="https://bsky.app/profile/anatudor.bsky.social/post/3mkpbqpkr3k2e">posted about this recently</a> and I agree: CSS shorthand properties are genuinely useful, but they’re not universally applicable. There are no hard and fast rules here. The question to ask yourself isn’t “can I shorthand this?” but “will someone reading this later, including future me, understand what’s happening?” It comes down to readability and intention, and those are going to look different for everyone. Verbosity isn’t always the enemy.</p>
<h2 id="what39s-a-shorthand-property">
  
    What’s a shorthand property?
  
</h2>

<p>CSS shorthand properties let you set a bunch of related values in a single declaration. <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascade/Shorthand_properties">There are quite a few of them</a>, some more widely used than others.</p>

<p>One you may be familiar with is the <code>background</code> property, which can set the image source, position, size, repetition rules, origin, color, clip threshold, and scroll behavior all at once:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="nf">url</span><span class="p">(</span><span class="err">“</span><span class="o">/</span><span class="n">images</span><span class="o">/</span><span class="n">my-image</span><span class="p">.</span><span class="n">jpg</span><span class="err">”</span><span class="p">)</span> <span class="m">1rem</span> <span class="m">1rem</span> <span class="o">/</span> <span class="m">50%</span> <span class="m">75%</span> <span class="nb">no-repeat</span> <span class="nb">fixed</span> <span class="nb">content-box</span> <span class="n">padding-box</span> <span class="nx">orange</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Do you know what each of those values corresponds to? Some are obvious. <code>orange</code> is clearly the background color, and the URL is the image. But the numeric values and the <code>content-box</code>/<code>padding-box</code> pair? I have to look those up every single time.</p>

<p>That’s exactly the kind of situation where I’d rather just write it out.</p>
<h2 id="when-to-use-it-when-to-skip-it">
  
    When to use it, when to skip it
  
</h2>
<h3 id="when-the-ordering-is-intuitive">
  
    When the ordering is intuitive
  
</h3>

<p>Directional properties like <code>padding</code> and <code>margin</code> are generally fine to shorthand. I’ve committed the ordering to memory (clockwise from the top side), which is what makes them feel safe. The number of values determines what gets applied.</p>

<p>One value applies to all four sides:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">1vw</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Two values split into y-axis then x-axis:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">1px</span> <span class="m">10%</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Four values apply clockwise from the top (top, right, bottom, left):</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">10rem</span> <span class="m">3rem</span> <span class="m">2rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>The three-value version, though? I always forget that the second value applies to <em>both</em> right and left. I’d rather write them out individually than trip over that every time I read it back.</p>

<p>So this:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">1px</span> <span class="m">5rem</span> <span class="m">2rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Becomes this:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">padding-bottom</span><span class="p">:</span> <span class="m">2rem</span><span class="p">;</span>
  <span class="nl">padding-left</span><span class="p">:</span> <span class="m">5rem</span><span class="p">;</span>
  <span class="nl">padding-right</span><span class="p">:</span> <span class="m">5rem</span><span class="p">;</span>
  <span class="nl">padding-top</span><span class="p">:</span> <span class="m">1px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>An even more resilient pattern is to use <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Logical_properties_and_values">logical properties</a> rather than strict directional ones, to account for layout changes across different languages and writing modes. In a left-to-right language like English, <code>padding-inline</code> maps to left and right, and <code>padding-block</code> maps to top and bottom. In a right-to-left language like Arabic, the inline axis flips.</p>

<p>You can get more specific with <code>padding-inline-start</code>, <code>padding-inline-end</code>, <code>padding-block-start</code>, and <code>padding-block-end</code> to target individual sides. In this example, a left-to-right reader sees <code>2rem</code> on the left and <code>6rem</code> on the right; a right-to-left reader sees those values swapped, with the same top and bottom padding either way:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="py">padding-block</span><span class="p">:</span> <span class="m">10%</span><span class="p">;</span>
  <span class="py">padding-inline-start</span><span class="p">:</span> <span class="m">2rem</span><span class="p">;</span>
  <span class="py">padding-inline-end</span><span class="p">:</span> <span class="m">6rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>border-radius</code> falls into this category, too. One value applying to all four corners is intuitive enough that shorthand may be fine:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">border-radius</span><span class="p">:</span> <span class="m">8px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>And when we have a variety of values, it’s good to know what we intend with longhand syntax. Sometimes I’ll even write out a zero-ed out property (like border-bottom-right-radius) in this example to communicate exactly what’s needed for this element’s shape:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">border-top-left-radius</span><span class="p">:</span> <span class="m">2rem</span><span class="p">;</span>
  <span class="nl">border-top-right-radius</span><span class="p">:</span> <span class="m">8rem</span><span class="p">;</span>
  <span class="nl">border-bottom-right-radius</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
  <span class="nl">border-bottom-left-radius</span><span class="p">:</span> <span class="m">5px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div><h3 id="when-each-value-is-a-distinct-type">
  
    When each value is a distinct type
  
</h3>

<p><code>transition</code> and <code>animation</code> are both shorthands that pack in a lot: duration, easing, delay, and the property being targeted. For simple cases, the shorthand may hold up when each value is a distinct type: a name, a duration, an easing function.</p>

<p>This example may be easier to parse without ambiguity:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">animation</span><span class="p">:</span> <span class="n">spin</span> <span class="m">1s</span> <span class="nb">ease-in-out</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>But even when the types are distinct, ordering can become its own problem at scale. If one part of a codebase has:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">animation</span><span class="p">:</span> <span class="n">spin</span> <span class="m">1s</span> <span class="nb">ease-in-out</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>And another one has:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">animation</span><span class="p">:</span> <span class="nb">linear</span> <span class="n">fade</span> <span class="m">2s</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Both are valid, but the inconsistency means you’re re-parsing the order every time you encounter the shorthand. Writing them out individually enforces a consistent structure by default. There’s no order to forget or vary.</p>

<p>When things get specific with different delays per property or timing, I’ll pull out the individual properties anyways. Ana’s post has a great example of this: if you have multiple properties transitioning at the same duration, writing the full shorthand for each one is just repeating yourself:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">animation</span><span class="p">:</span> <span class="m">1s</span> <span class="nb">ease-in-out</span><span class="p">;</span>
  <span class="nl">animation-name</span><span class="p">:</span> <span class="n">spin</span><span class="p">,</span> <span class="n">fade</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>animation</code> in particular has enough sub-properties (<code>animation-fill-mode</code>, <code>animation-iteration-count</code>, <code>animation-direction</code>, and more) that the shorthand may get unwieldy fast. In practice, once I’m reaching for any of those, I just write them out all individually.</p>
<h3 id="when-the-syntax-has-its-own-rules">
  
    When the syntax has its own rules
  
</h3>

<p>Some shorthands have parsing rules specific enough that you may need to have the spec loaded to read them. These are the ones I almost always write out.</p>

<p><code>background</code> is my go-to example. Unless you’re setting something dead simple like a solid color or a plain image, the full shorthand becomes a puzzle. This is still readable:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"/images/my-image.jpg"</span><span class="p">)</span> <span class="nb">no-repeat</span> <span class="nb">center</span> <span class="o">/</span> <span class="nb">cover</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>But once you’re reaching for position offsets, size, origin, and clip together, the shorthand stops carrying its weight:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"/images/my-image.jpg"</span><span class="p">)</span> <span class="m">1rem</span> <span class="m">1rem</span> <span class="o">/</span> <span class="m">50%</span> <span class="m">75%</span> <span class="nb">no-repeat</span> <span class="nb">fixed</span> <span class="nb">content-box</span> <span class="n">padding-box</span> <span class="nx">orange</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>It fails here not because there are many values, but because the values are opaque without knowing the specific syntax. The <code>/</code> separates position from size, so <code>1rem 1rem / 50% 75%</code> isn’t four coordinates, it’s two pairs with different meanings. The <code>content-box</code> <code>padding-box</code> pair sets origin and clip in that order, which isn’t something you can always intuit. And that’s a different problem from <code>padding</code> having too many values, because at least those follow a spatial logic.</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background-attachment</span><span class="p">:</span> <span class="nb">fixed</span><span class="p">;</span>
  <span class="nl">background-clip</span><span class="p">:</span> <span class="n">padding-box</span><span class="p">;</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="nx">orange</span><span class="p">;</span>
  <span class="nl">background-image</span><span class="p">:</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"/images/my-image.jpg"</span><span class="p">);</span>
  <span class="nl">background-origin</span><span class="p">:</span> <span class="nb">content-box</span><span class="p">;</span>
  <span class="nl">background-position</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">1rem</span><span class="p">;</span>
  <span class="nl">background-repeat</span><span class="p">:</span> <span class="nb">no-repeat</span><span class="p">;</span>
  <span class="nl">background-size</span><span class="p">:</span> <span class="m">50%</span> <span class="m">75%</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>border</code> is also interesting because it’s a layered shorthand situation: <code>border</code> is a shorthand, and so is <code>border-left</code>. The catch is that <code>border</code> applies to all four sides. You have to go down to the directional properties or the individual sub-properties to set different sides. I usually write <code>border</code> shorthand when I want a consistent border all the way around, but I’ll break it out when I’m doing something more specific with colors or styles on individual sides.</p>

<p>You can also write the sub-properties directionally, which is a nice middle ground:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">border-color</span><span class="p">:</span> <span class="nx">red</span> <span class="nx">blue</span> <span class="nx">green</span> <span class="nx">yellow</span><span class="p">;</span>
  <span class="nl">border-style</span><span class="p">:</span> <span class="nb">solid</span> <span class="nb">dashed</span><span class="p">;</span>
  <span class="nl">border-width</span><span class="p">:</span> <span class="m">10px</span> <span class="m">3px</span> <span class="m">50px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>grid</code> falls into this category too. The shorthand syntax can be genuinely hard to parse at a glance:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="py">grid</span><span class="p">:</span> <span class="n">auto-flow</span> <span class="n">dense</span> <span class="m">40px</span> <span class="o">/</span> <span class="nf">repeat</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="m">1fr</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>This feels easier to read to me:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">grid-auto-flow</span><span class="p">:</span> <span class="n">dense</span><span class="p">;</span>
  <span class="nl">grid-auto-rows</span><span class="p">:</span> <span class="m">40px</span><span class="p">;</span>
  <span class="nl">grid-template-columns</span><span class="p">:</span> <span class="nf">repeat</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="m">1fr</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>I write <code>grid</code> and <code>flex</code> out fully, almost every time.</p>
<h3 id="when-you-can’t-retain-it">
  
    When you can’t retain it
  
</h3>

<p>Some shorthands just don’t stick, and that’s reason enough to write them out. This is also an honest admission that the thresholds I’m describing aren’t necessarily universal; they’re shaped by what I’ve internalized over time. These are conditions as I experience them and not objective rules.</p>

<p>I use the longhand syntax for <code>text-decoration</code> more often than not, even though the individual property names are fairly obvious. I just can’t seem to retain the shorthand structure.</p>

<p>I always have to think about this:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">text-decoration</span><span class="p">:</span> <span class="nb">underline</span> <span class="nb">dotted</span> <span class="nx">red</span> <span class="m">2px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>And to me, this syntax reads like a list of decisions:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">text-decoration-color</span><span class="p">:</span> <span class="nx">red</span><span class="p">;</span>
  <span class="nl">text-decoration-line</span><span class="p">:</span> <span class="nb">underline</span><span class="p">;</span>
  <span class="nl">text-decoration-style</span><span class="p">:</span> <span class="nb">dotted</span><span class="p">;</span>
  <span class="py">text-decoration-thickness</span><span class="p">:</span> <span class="m">2px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>gap</code> is another directional one: it only deals with row gap and column gap in CSS grid. I usually set the same value for both, so shorthand is fine. But when they’re different, I’ll often write <code>row-gap</code> and <code>column-gap</code> separately, mostly because I can never remember which order they go in. I’ve somehow committed <code>padding</code> and <code>margin</code> to memory but not this one.</p>

<p><code>font</code> I have literally never written shorthand in my life. It just doesn’t feel natural, especially with <code>font-family</code>, which often has spaces and fallback stacks and needs its own line anyway.</p>

<p><code>font-variant</code> is a fancy one I reach for when handling special typefaces, usually for turning on ligatures. I can never remember all the individual values, so I write them out. And since I’m typically only tweaking one or two things, it doesn’t add much overhead.</p>
<h2 id="it’s-not-all-or-nothing">
  
    It’s not all or nothing
  
</h2>

<p>You don’t have to choose between going full shorthand or writing out every individual property (spoiler though: <a href="https://thoughtbot.com/blog#writing-only-what-you-mean">I often <em>do</em> make that choice</a>). You can mix them by using the shorthand to set a baseline and then applying a specific longhand when you need precision for one value.</p>

<p><code>border</code> is a solid example of this. Set the baseline with shorthand, then override what changes in a variant:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.button</span> <span class="p">{</span>
  <span class="nl">border</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="nx">navy</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.button--destructive</span> <span class="p">{</span>
  <span class="nl">border-color</span><span class="p">:</span> <span class="nx">red</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>The goal is always clarity. Use the version that makes your intent most obvious.</p>
<h2 id="writing-only-what-you-mean">
  
    Writing only what you mean
  
</h2>

<p>Despite what I’ve just written in the <a href="https://thoughtbot.com/blog#it%E2%80%99s-not-all-or-nothing">previous section</a>, I don’t <em>usually</em> mix short and longhand and am most often choosing the latter.</p>

<p>Longhand can communicate scope, and is a key reason I often err on that side rather than brevity.</p>

<p>Even for something as simple as background color, I’d rather write:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="nx">green</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Instead of:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="nx">green</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>The shorthand works, but leaves the door open. If I only mean to set a color, <code>background-color</code> says that plainly and there’s no slot for anything else other than that to accumulate.</p>

<p>The same logic applies when I want a handful of sub-properties. If I only want a selector to have a background image, color, and repeat value, I write exactly those three properties:</p>
<div class="highlight"><pre class="highlight css"><code><span class="nc">.selector</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="nx">#b4da55</span><span class="p">;</span>
  <span class="nl">background-image</span><span class="p">:</span> <span class="nf">url</span><span class="p">(</span><span class="err">“</span><span class="n">images</span><span class="o">/</span><span class="n">my-image</span><span class="p">.</span><span class="n">jpg</span><span class="err">”</span><span class="p">);</span>
  <span class="nl">background-repeat</span><span class="p">:</span> <span class="nb">no-repeat</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>A <code>background</code> shorthand would create a natural place for other sub-properties to creep in. Someone (including future me) might reasonably add <code>background-size</code> or <code>background-position</code> to that declaration later. And while those are fine additions, it signals intention to me when they’re written out as their sub-properties instead of values within the shorthand.</p>

<p>At the end of the day, shorthand properties are a tool, not a mandate. And if your answer differs from mine: yeah, well you know, that’s just like uh, your opinion, man.</p>

<aside class="related-articles"><h2>If you enjoyed this post, you might also like:</h2>
<ul>
<li><a href="https://thoughtbot.com/blog/rust-doesn-t-have-named-arguments-so-what">Rust Doesn’t Have Named Arguments. So What?</a></li>
<li><a href="https://thoughtbot.com/blog/positioning">Positioning elements on the web with CSS</a></li>
<li><a href="https://thoughtbot.com/blog/taking-the-most-out-of-stimulus">Taking the most out of Stimulus.js</a></li>
</ul></aside>
<img src="https://feed.thoughtbot.com/link/24077/17340884.gif" height="1" width="1"/>]]></content>
    <summary>A case for verbosity in CSS properties.</summary>
    <thoughtbot:auto_social_share>true</thoughtbot:auto_social_share>
  </entry>
  <entry>
    <title>Reflections on my conversation with Lord Chris Holmes MBE</title>
    <link rel="alternate" href="https://feed.thoughtbot.com/link/24077/17339520/reflections-on-my-conversation-with-lord-chris-holmes"/>
    <author>
      <name>Sami Birnbaum</name>
    </author>
    <id>https://thoughtbot.com/blog/reflections-on-my-conversation-with-lord-chris-holmes</id>
    <published>2026-05-13T00:00:00+00:00</published>
    <updated>2026-05-08T10:08:14Z</updated>
    <content type="html"><![CDATA[<p>One of the best things about hosting the <a href="https://podcast.thoughtbot.com/">Giant Robots podcast</a> is that I get to spend time talking to people that might otherwise pass me by. It’s an opportunity to turn casual small talk into meaningful conversation. After meeting Lord Chris Holmes at the DigiGov Expo in 2024, where I was <del>collecting free merch</del> attending on behalf of thoughtbot, I felt I wanted to dig deeper into our brief chat about AI.</p>

<p>It only took a year or two but it was a privilege to sit down with Lord Chris Holmes, a member of the UK House of Lords and a former Paralympic swimmer.</p>

<p>Much has changed across the AI landscape since we first met which made our conversation even more pertinent. Lord Holmes is an active voice in the UK’s conversations around artificial intelligence regulation and digital policy. In Parliament, he has focused heavily on technology and inclusion, including introducing a <a href="https://bills.parliament.uk/bills/3942">Private Member’s Bill</a> on AI regulation.</p>

<p>It’s been nearly two months since <a href="https://podcast.thoughtbot.com/605">our conversation</a> which has given me some time to reflect.</p>

<iframe src="https://player.fireside.fm/v3/DiNRb69N+OV9qNhNE?theme=dark" width="100%" height="200" frameborder="0" scrolling="no"></iframe>
<h2 id="we-can39t-do-nothing">
  
    We can’t do nothing
  
</h2>

<blockquote>
<p>The UK is desperately in need of some AI legislation</p>
</blockquote>

<p>This still rings true for me. I am sometimes surprised at the lack of conversation or guidance on such a society-shifting tool as AI. In my opinion, I feel like this is one of the major roles of government, to have a good overview of the big picture. What does society look like? Where is it heading? And what does it mean?</p>

<blockquote>
<p>There’s been an unfortunate lack of political will when it comes to artificial intelligence in the UK. It’s not a party political point because it was the previous government as much as it was this government. It’s largely been a wait-and-see approach.</p>
</blockquote>

<p>I find this slightly infuriating because I feel like these are the conversations that many of us are having around the country.</p>

<blockquote>
<p>So we’re left suboptimal, confusing, opaque, abandoned…
<br><br></p>

<p>For economic, for social, for psychological reasons, it can’t be allowed to continue. That’s the approach from our UK government.</p>
</blockquote>
<h2 id="pragmatic-approach">
  
    Pragmatic Approach
  
</h2>

<p>I found Lord Holmes approach incredibly pragmatic and reasonable. This is by no means a conversation about anti-AI or heavy regulation.</p>

<blockquote>
<p>Thus, good for investor, for innovator, for consumer, for customer, for creative, good for the country, and really to wrestle to the ground once and for all, that tedious falsehood that recurs time and again, that you can either have regulation or innovation, you can’t have both. You can, and in fact, it’s the role of parliamentarians and regulators to consider all of these factors, so we can bring about pro-innovation, pro-consumer protection, pro-investor, pro-citizen, pro-creative regulation legislation.</p>
</blockquote>

<p>This is not about stifling growth or heavy-handed regulation, and it seems to me that the key to this is a principle based approach that Lord Holmes described, which removes the need for micromanagement.</p>

<blockquote>
<p>Critical to take a principles based rather than a prescriptive approach, I think. It’s tempting always to be prescriptive, to think, if we can write everything down to the last dot and comma and spell it out, that will be the best control we can have.
<br><br></p>

<p>But unfortunately, though beguilingly appealing, it’s an unfortunate trap which traps us at that moment in time, because we don’t live in a static society, technology, economy, polity. None of these things are static. But to have a principles-based approach, which can adapt, develop and be agile through time, through technologies.
<br><br></p>

<p>We know how to do this. We have the great good fortune of common law, which is well constructed and understood in that sort of approach. So we can.</p>
</blockquote>

<p>It’s worth reading the <a href="https://lordchrisholmes.com/ai-regulation-report/">AI Regulation Report</a> to get a better understanding of these principles.</p>
<h2 id="we-have-agency">
  
    We have agency
  
</h2>

<p>I do sometimes find myself feeling a sense of fatalism about where this technology might be taking us. I think it would be unnatural not to be concerned at times, when the narrative indicates abrupt change. However, it was somewhat reassuring to be reminded that we are not just passengers in this societal journey.</p>

<p>We spoke about some of the lack of guidance we felt around social media as a comparison.</p>

<blockquote>
<p>What you set out there about social media is well observed. But here’s the thing. None of that was inevitable.
<br><br></p>

<p>And none of that had anything to do with the technology per se. It was programmed, constructed, operationalized and monetized to do what it now does. Technology didn’t do that.
<br><br></p>

<p>Humans determined to structure it in that way. Horrific, but not inevitable. Not inevitable at all, and the same with AI.</p>
</blockquote>
<h2 id="looking-forward-with-optimism">
  
    Looking forward with optimism
  
</h2>

<p>I still feel a sense of optimism following our conversation. I love the idea that we can be a part of shaping this technology and removing the existential threat perception that it sometimes brings.</p>

<blockquote>
<p>We have a stunning opportunity to make a success of these technologies, but it’s down to all of us playing our part.
<br><br></p>
</blockquote>

<p>So much so that we have to take responsibility as well.</p>

<blockquote>
<p>If it goes wrong, that won’t be a failure of the technology.
<br><br></p>

<p>That will be a failure of us by not human leading, by everyone not playing their part.</p>
</blockquote>

<hr>

<p>I highly recommend taking a listen to the full conversation and if you live in the UK and would like to discuss the regulation of AI with Lord Holmes, you can <a href="https://www.linkedin.com/in/lord-chris-holmes/">connect with him via LinkedIn</a>.</p>

<aside class="related-articles"><h2>If you enjoyed this post, you might also like:</h2>
<ul>
<li><a href="https://thoughtbot.com/blog/we-build-politics">I Work in Politics</a></li>
<li><a href="https://thoughtbot.com/blog/how-to-build-an-ai-startup-and-do-you-really-need-to">How to Build an AI Startup, and Do You Really Need To?</a></li>
<li><a href="https://thoughtbot.com/blog/what-llms-are-in-ai">What is Generative AI and LLMs, really?</a></li>
</ul></aside>
<img src="https://feed.thoughtbot.com/link/24077/17339520.gif" height="1" width="1"/>]]></content>
    <summary>Two months ago I sat down with Lord Chris Holmes MBE to talk about his AI regulation private members bill.</summary>
    <thoughtbot:auto_social_share>true</thoughtbot:auto_social_share>
  </entry>
  <entry>
    <title>Illusions Of Fluency</title>
    <link rel="alternate" href="https://feed.thoughtbot.com/link/24077/17338825/illusion-of-fluency"/>
    <author>
      <name>Richard Newman</name>
    </author>
    <id>https://thoughtbot.com/blog/illusion-of-fluency</id>
    <published>2026-05-12T00:00:00+00:00</published>
    <updated>2026-05-07T15:19:30Z</updated>
    <content type="html"><![CDATA[<p>I didn’t realize it had a name until I looked it up, but a Rubin vase is a famous
optical illusion. It’s the one where you first see two faces looking at one
another, and then realize it can instead be seen as a vase. You might have had
it the other way around.</p>

<p><img src="https://images.thoughtbot.com/jtm3pb38sandiu5shzxu1uthgnv2_Rubin_vase.png" alt="(3D Rubin vase image by Paolo Gonzalex, licensed under Creative Commons)"></p>

<p>That one is well known enough that you probably already know to look for its
“second” image. There are many other examples where another
view isn’t obvious until it’s pointed out. Even then it’s sometimes hard to see
right away.</p>

<p>That is, I’m viewing something, certain I’ve taken it all in, thinking it’s
unremarkable. Nothing suggests I’ve missed anything or should give it a second
look. Once it’s pointed out, I finally see it. How did I miss that? It was
right there the whole time.</p>

<p><a href="https://sites.lafayette.edu/rothm/2015/04/08/the-fluency-illusion-and-a-better-way-to-study/">Fluency</a>
<a href="https://www.mdpi.com/2078-2489/17/3/299">illusion</a>
is like that and far more common than we’d hope.</p>

<p>It happens when you realize a detail you missed. You thought you understood,
but you hadn’t. That confidence, never noticing what you missed, is the illusion
of fluency.</p>
<h2 id="seduction">
  
    Seduction
  
</h2>

<p>This illusion, that we understood what we read when indeed we hadn’t, is
insidious. It draws us in without any sense of risk, without skepticism. For if
we <em>felt</em> we might be misreading something, we’d look for it. But since we don’t,
we move on, accepting our reading as an accurate one.</p>

<p>This isn’t about humility. Not a choice or a failure of attention. The process is
automatic. We’re trying to get something done and nothing triggers us to look
closer.</p>

<p>Our practice, experience, even education, has made us capable of reading quickly.
Of following what may even be complex content and still picking up key elements.
That very capability tricks us into thinking we’ve fully understood.</p>

<p>We’re shown a solution to a math problem on a whiteboard. We find out later we’re
far from being able to solve it on our own.</p>

<p>And so we can’t just read text once and absorb it all. We have to re-read,
study, wrestle with it. It’s why we take a risk when we skim contracts and fine
print.</p>

<p>Or source code.</p>
<h2 id="desirable-difficulties">
  
    Desirable difficulties
  
</h2>

<p>We’re well acquainted with this phenomenon even if we didn’t have a name for it
before. In pedagogical settings, we counter fluency illusions with <a href="https://bjorklab.psych.ucla.edu/research/">desirable
difficulties</a>. The instructor
intentionally forces the student to contend with what they read (discussions,
exercises, exams, etc.). It helps internalize what they’re reading. It better
ensures they’ve discovered what it might yield for them.</p>

<p>As with students, we can’t trust ourselves to capture enough detail merely from
reading it. So we must admit we don’t know what we think we know. We need to find
ways to illuminate details, most especially when we’re the only ones that may be
in a position to do so.</p>

<p>We can create friction to supply that illumination. We want pull requests small
enough to read in pieces. We do this not only to limit the scope of a change but
to make it tractable to review without merely skimming. We write automated tests
not only to verify correctness but to think through what must be considered. We
write them to help us engage with the problem at hand. We deliberately create
desirable difficulties by forcing
<a href="https://thoughtbot.com/blog/a-conversation-with-the-situation">a conversation with the situation</a>.</p>

<p>I can lose the illumination I desire when I inadvertently abdicate my role. When
I let an LLM produce code I haven’t sufficiently participated in. If an AI tool
generates too much code at once, I can be seduced to think it’s doing fine when
it isn’t. The pace at which an LLM can produce code can quickly overwhelm the
<a href="https://thoughtbot.com/blog/the-pace-of-feedback">pace of feedback</a> I can handle.
In trying to read through it I can easily fall victim to fluency illusion. It
may be only later when it becomes plain how much I missed.</p>

<p>We can’t trust ourselves to catch the issues merely by reading the code later.
What the AI comes up with might be opaque to us, even when it works well. Our
illusion of fluency will tempt us to nod along either way.</p>
<h2 id="promises-promises">
  
    Promises, promises
  
</h2>

<p>That sounds dire, but it isn’t really. We’re actually used to this. We start new
fields of research from threads pulled on older questions. We come up with novel
solutions and ways of doing what’s not been seen before. We’ve figured out how
to fly.</p>

<p>Cranberries and nightshade may look alike, but one of those is poison. We figured
it out not by merely looking at them more closely, but empirically. We tested and
watched other animals for clues. We rely on checks and balances and processes,
all to limit the cost of being wrong.</p>

<p>Here too we have an opportunity. An obligation really. To stay engaged, to
understand in the moment what we’re trying to build. To recognize the success, or
failures, of what we write.</p>

<p>Someday we won’t care what the AI explicitly wrote any more than we care about the
ones and zeros in our code most days. We can instead focus on the pace of feedback
so we can correct issues in time. We can find new ways to converse with the
situations at hand. And we’ll want checks and processes to limit the impact of
any mistakes along the way.</p>

<p>Someday AI will be good enough to let it do more on its own in writing code. But
it still needs us heavily engaged and skeptical for it to become what we hope for.</p>

<p>And we still need everyone else to keep us honest about that.</p>

<aside class="related-articles"><h2>If you enjoyed this post, you might also like:</h2>
<ul>
<li><a href="https://thoughtbot.com/blog/how-to-use-chatgpt-to-find-custom-software-consultants">How to Use ChatGPT to Find Custom Software Consultants</a></li>
<li><a href="https://thoughtbot.com/blog/read-between-the-lines">Read between the lines</a></li>
<li><a href="https://thoughtbot.com/blog/lets-not">Let’s Not</a></li>
</ul></aside>
<img src="https://feed.thoughtbot.com/link/24077/17338825.gif" height="1" width="1"/>]]></content>
    <summary>And then I tried to explain it.</summary>
    <thoughtbot:auto_social_share>true</thoughtbot:auto_social_share>
  </entry>
  <entry>
    <title>The Pace Of Feedback</title>
    <link rel="alternate" href="https://feed.thoughtbot.com/link/24077/17338007/the-pace-of-feedback"/>
    <author>
      <name>Richard Newman</name>
    </author>
    <id>https://thoughtbot.com/blog/the-pace-of-feedback</id>
    <published>2026-05-11T00:00:00+00:00</published>
    <updated>2026-05-12T02:10:02Z</updated>
    <content type="html"><![CDATA[<p>If I’m measuring water into a marked cup, I slow down as I’m nearing the mark
because I don’t want to overshoot it. I bet you do that too. I can pour quickly
at first, but as I near the line, I’ll decide I need to be more precise. I slow
the rate so I can control it more. If I poured it all at full speed, I’d almost
certainly stop too early or too late. Even if it’s okay to be a little off, I’d
still have to fix it.</p>

<p>In essence, I’m managing the pace I can handle. The pace at which I can perceive
what is happening, decide what to do about it, and act on that decision. We follow
a relentless perceive-decide-act flow in much of what we do every day. Driving a
car, sewing a hem, painting trim,
<a href="https://thoughtbot.com/blog/a-conversation-with-the-situation">having a conversation</a>.</p>

<p>We need a pace for perceiving that lets us have time to decide and then act. As
we become more familiar and skilled, we can reduce the time it takes, but it
always costs some time. We learn patterns and we learn what to watch for instead
of everything overwhelming us all at once. No matter how practiced we are, we can
only go so fast. I can responsibly drive faster than a new student, but I’m not
ready for the Grand Prix (vroom-vroom noises aside).</p>

<p>In fact, we depend on controlling the pace of feedback so much that we add controls
for it. Not only the brakes on our cars, but foot pedals on sewing machines,
speed controls on mixers, squeeze handles on sprayers. We know we’ll make
mistakes. Without room to react, those mistakes can be damaging.</p>

<p>This isn’t only when working with objects. We know all about rushing an arithmetic
problem or typing out an email too fast. The risk of errors and poorly considered
explanations is far higher. Being deliberate while working under pressure may feel
slower, but it generally meets the need better and faster.</p>
<h2 id="of-power-tools-and-robots">
  
    Of power tools and robots
  
</h2>

<p>The more manual our tools, the easier it is to handle the pace of feedback. If
I’m using a handsaw, it’s unlikely that I’ll injure myself or miss a cut going
crooked. The saw can’t go far before I notice an issue and I can stop immediately.</p>

<p>Compared to a handsaw, a circular saw’s blade rotation and cutting speed are
orders of magnitude faster. The feedback comes too fast for me to perceive every
moment of the cut. I can’t track individual rotations or react to each instant.
To avoid mistakes, wasted material, and injury, I need to do more than just react
in the moment.</p>

<p>A crooked cut isn’t just poor work—it can bind the blade and cause kickback. So I
manage the pace of feedback to preserve room for my perceive-decide-act cycle.
Before I even start, I set up the work to reduce risk. I can’t always see the cut
going crooked in time, so during the cut I feel for binding and listen to the
motor. I compensate for the faster pace by predicting more and preparing more.</p>

<p>Imagine a more complete machine that automates more steps, like those in
mass-market cabinet shops. It might not only trim the wood, but also shape its
edges and corners with dedicated bits. Our machine follows a predetermined
combination of steps already well understood and tested. Now the machine’s pace
far outstrips my perceive-decide-act cycle. By the time I perceive a problem and
decide what to do, the machine has already completed several steps. I can only
tell something went wrong after pieces have gone through or the machine jams or
breaks.</p>

<p>To be fair, the process is well understood and preprogrammed. While the cabinets
might lack artisan craftsmanship, they’re good enough, sometimes excellent. As a
result, we accept less control for more speed and consistency. Our role shifts
from directly shaping the work to monitoring and feeding the machine. But in a
factory, this trade becomes stark. We cut, affix, trim, and package at breakneck
pace. Pieces get ruined, workers even injured, before anyone can perceive, decide,
and act to stop the line. We now program in acceptable error ranges and tolerances
for the machine to follow.</p>

<p>We can separate ourselves even further from the perceive-decide-act cycle. If we
add a robot with artificial intelligence, it will adapt as it works. Based on
what it senses, it adjusts its path and compensates for variations. Because it
adapts continuously, we can’t predict or observe its decisions in real time. Any
one of those could be the start of a bad direction. By the time we realize a
problem, it’s already made choices we never saw. We won’t know what path it took
or why it chose its approach. By then it’s far too late.</p>
<h2 id="running-blindfolded">
  
    Running blindfolded
  
</h2>

<p>Similarly, if an LLM is producing a lot of code for me without pausing, I can
think it’s doing fine when it isn’t. I may not always realize in time the pace was
too fast. Only upon closer examination will I find the code has become a mess.
I wouldn’t easily know what changed or why. It can be like reviewing large,
unfamiliar PRs in unfamiliar codebases.</p>

<p>It’s even worse than that. Because we imagine how good AI could be, we can imagine
not needing to be part of the process. We’ve read where machine learning has found
superior solutions experts can’t explain.</p>

<p>We’re tempted by a theoretical ideal:  we don’t need to understand how something
works as long as it works better than we could. But that would mean I relax my
vigilance and abdicate my perceive-decide-act role. In other words, I not only
am unable to keep up with it, I don’t even try.</p>

<p>AI coding tools aren’t ready yet for us to step that far back. They can outrun
us and generate a tremendous amount of code quickly. That might be tolerable in
an exploratory effort like prototyping.</p>

<p>But in production, especially in regulated industries, security, safety, and
privacy are at stake. There we remain accountable for every line written and
every behavior introduced. LLMs can do a lot, but right now they’re often better
as task tools, like a table saw we can control. They haven’t proven themselves
to be wholly autonomous agents worthy of our trust.</p>

<p>We can’t trust ourselves to catch the issues merely by
<a href="https://thoughtbot.com/blog/illusion-of-fluency">reading the code later</a>.
Even if it does work well, we may find what the AI comes up with to be opaque.
Although it’s tempting to let the tool set the pace, losing control means working
blind and trusting blindly. To be responsible for our work means we
have to be able to engage with it. As with power tools, we need to own the
perceive-decide-act speed we can handle. Losing sight of that risks making mistakes
compound faster than we can recover from.</p>

<p>If you’d like to better manage your pace developing software with LLMs, take a
look at our
<a href="https://github.com/thoughtbot/rails-consultant">rails-consultant open source project</a>
with skills for <code>/slice</code>, <code>/challenge</code>, <code>socratic-review</code>, and more. Or
<a href="https://thoughtbot.com/hire-us">reach out to us</a> to discuss your project and
how we can help.</p>

<aside class="related-articles"><h2>If you enjoyed this post, you might also like:</h2>
<ul>
<li><a href="https://thoughtbot.com/blog/how-to-use-chatgpt-to-find-custom-software-consultants">How to Use ChatGPT to Find Custom Software Consultants</a></li>
<li><a href="https://thoughtbot.com/blog/theme-based-iterations">Theme-Based Iterations</a></li>
<li><a href="https://thoughtbot.com/blog/using-machine-learning-to-answer-questions-from-internal-documentation">Using Machine Learning to Answer Questions from Internal Documentation</a></li>
</ul></aside>
<img src="https://feed.thoughtbot.com/link/24077/17338007.gif" height="1" width="1"/>]]></content>
    <summary>The hurrier I go, the behinder I get.</summary>
    <thoughtbot:auto_social_share>true</thoughtbot:auto_social_share>
  </entry>
</feed>
