<?xml version="1.0" encoding="UTF-8" ?> <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Matthew Rocklin</title><description>Personal site of Matthew Rocklin - thoughts on open source, startups, and engineering</description><link>https://matthewrocklin.com/</link><atom:link href="https://matthewrocklin.com/feed_rss_created.xml" rel="self" type="application/rss+xml" /> <language>en</language> <pubDate>Thu, 02 Apr 2026 20:33:30 -0000</pubDate> <lastBuildDate>Thu, 02 Apr 2026 20:33:30 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.7</generator> <image> <url>None</url> <title>Matthew Rocklin</title> <link>https://matthewrocklin.com/</link> </image> <item> <title>Stepping Back</title> <author>Matthew Rocklin</author> <description>I'm stepping back from Coiled, Dask, and Python OSS to make space for what's next.</description> <link>https://matthewrocklin.com/stepping-back/</link> <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/stepping-back/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/stepping-back.png" type="image/png" length="310479" /> <content:encoded>&lt;h1 id=&#34;stepping-back&#34;&gt;Stepping Back&lt;/h1&gt; &lt;p&gt;I&#39;m stepping back from my current commitments (Coiled, Dask, Python OSS generally) to make some space for myself. This post details concrete implications of that choice, and then explores some of my thinking.&lt;/p&gt; &lt;h2 id=&#34;coiled&#34;&gt;Coiled&lt;/h2&gt; &lt;p&gt;We&#39;ve transformed Coiled into a pragmatic but less ambitious version of the company.&lt;/p&gt; &lt;p&gt;Coiled is no longer actively marketing itself and we&#39;re saying no to long enterprise sales processes. We&#39;re focused instead on serving existing customers and simplifying internal operations. The company is now much smaller, consisting of two engineers who keep things humming nicely for customers. Fortunately the Coiled architecture makes this low-effort to maintain long-term.&lt;/p&gt; &lt;p&gt;Financially, while Coiled is unlikely to ever become the next trillion-dollar company, it is now nicely profitable and can continue indefinitely. We had a pile of cash in the bank which has gone towards buying out preferred shareholders. The company is now owned exclusively by common shareholders.&lt;/p&gt; &lt;p&gt;If you&#39;re a current customer of Coiled fear not, we&#39;re not planning to go anywhere and, unlike before, you&#39;re our current focus. If you have concerns I&#39;m happy to chat.&lt;/p&gt; &lt;h2 id=&#34;dask&#34;&gt;Dask&lt;/h2&gt; &lt;p&gt;With Coiled no longer pushing on Dask, and with me stepping back from both, there isn&#39;t a strong innovative force behind Dask today.&lt;/p&gt; &lt;p&gt;That&#39;s ok. Like lots of well-used open source, Dask today is more focused more on stability than on pushing new features. Dask continues to be maintained, albeit with less vigor. Community members wanting new features for free may be disappointed, but users hoping that Dask continues cranking away should remain satisfied.&lt;/p&gt; &lt;h2 id=&#34;personal-situation&#34;&gt;Personal Situation&lt;/h2&gt; &lt;p&gt;I loved my time building up Dask, especially in the early days when I&#39;d wake up every morning to dozens of emails from excited users building their own things with Dask. Collaborating with those people, incorporating feedback, designing new systems, and together pushing forward transformative change in science and industry has been the highlight of my career.&lt;/p&gt; &lt;p&gt;It feels amazing to work hard and see our work have an increasingly broad impact in the world.&lt;/p&gt; &lt;p&gt;However, work no longer feels that way. At some point turning the crank of productivity turns to grinding, becoming less productive/fun/satisfying. I stopped having fun a while ago, both because I&#39;ve been at it a while, and because I ran into problems that I didn&#39;t know how to solve (Coiled problems were harder than Dask problems, and when issues like marketing became our biggest challenge they started to feel intractable).&lt;/p&gt; &lt;p&gt;Time is finite, and there&#39;s a tradeoff between cranking and exploring. I&#39;m in the fortunate financial position to be able to step back and assess what I want from life. I don&#39;t know what my next path is yet (start a new company? get a job? get a life?) but I look forward to finding out.&lt;/p&gt; &lt;h2 id=&#34;final-thought&#34;&gt;Final Thought&lt;/h2&gt; &lt;p&gt;In the meantime, I&#39;m not doing much, and oddly that seems like the most interesting and challenging path for me.&lt;/p&gt; &lt;p&gt;To end, here&#39;s a quote I like from T.S. Eliot&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;I said to my soul, be still and wait without hope,&lt;/strong&gt;&lt;br/&gt; &lt;strong&gt;for hope would be hope for the wrong thing&lt;/strong&gt;;&lt;br/&gt; wait without love, for love would be love of the wrong thing;&lt;br/&gt; there is yet faith, but the faith and the love are all in the waiting.&lt;br/&gt; &lt;strong&gt;Wait without thought, for you are not ready for thought&lt;/strong&gt;:&lt;br/&gt; So the darkness shall be the light, and the stillness the dancing&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Which I interpret as &#34;sometimes you have to do nothing for a while, and that&#39;s ok&#34;.&lt;/p&gt; &lt;hr /&gt; &lt;hr /&gt; &lt;p&gt;For a treatment of this same information, but in a more casual tone, there are some details below:&lt;/p&gt; &lt;h1 id=&#34;faq&#34;&gt;FAQ&lt;/h1&gt; &lt;p&gt;(just kidding, no one asked these questions, but I thought I&#39;d answer them anyway)&lt;/p&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;How is Coiled Financially?&lt;/summary&gt; &lt;p&gt;We make about $1M annually (a little less). We don&#39;t seem to be able to grow this substantially, or at least not faster than just waiting around for people to show up. No marketing effort has had much effect. Rather than burn more cycles, it makes more sense to us to just let Coiled do its thing organically. It&#39;s also way less effort.&lt;/p&gt; &lt;p&gt;Investors lost confidence that we&#39;d make it big (quite reasonably) and so we came to an agreement where they were able to exit with most of the remaining cash. Not all though; we&#39;ve a healthy buffer and the service itself is pretty cheap to run thanks to its architecture.&lt;/p&gt; &lt;p&gt;David and Nat work now on Coiled part time, mostly just tracking customer issues and making sure things run smoothly. They don&#39;t spend much time on non-paying users or with enterprise procurement teams (sorry, not sorry), and no one spends time evangelizing. I handle the occasional legal issue.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;Is Dask Dead?&lt;/summary&gt; &lt;p&gt;Usage (as measured by my favorite measure of API docs hits) has been flat for a few years. I don&#39;t expect Dask to take over the world, but it doesn&#39;t seem to be going anywhere.&lt;/p&gt; &lt;p&gt;Some folks are still doing some mild maintenance (Jacob, James, Tom, Florian, Guido) but it&#39;s no one&#39;s full time job. It&#39;ll be interesting to see how effective community open source is these days at supporting the community.&lt;/p&gt; &lt;p&gt;There are some technical projects I&#39;ve been wanting to do on Dask for the last few years (query planning for arrays, rewriting in a compiled language, working with high performance hardware). I might get to those at some point?&lt;/p&gt; &lt;p&gt;To be honest though (maybe too honest) I&#39;ve been feeling conflicted about Dask/OSS work recently. Historically my motivation has come from positive user engagement and community collaboration but over the last few years that relationship hasn&#39;t felt as rewarding. Mostly I get the sense that people have started to expect a lot of free work without a sense of collaboration or working together, which doesn&#39;t feel good. I suspect that users have been trained by all the for-profit companies throwing free things at them for their attention. While Dask isn&#39;t dead, to me it feels like community OSS has died a little.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;What will you do?&lt;/summary&gt; &lt;p&gt;Yeah, good question. There are a few possibilities. I could ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Start a new company:&lt;/strong&gt; I like work, and while making the first company was arduous, there&#39;s lots I&#39;d like to experiment in doing this again. I&#39;m especially curious about how lean one can go with AI today. Unfortunately for me though, I don&#39;t have a driving project or mission, which puts this plan on hold.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Get an actual job:&lt;/strong&gt; Maybe someone else has a mission I could believe in, or some lessons I could learn, or piles of money (I&#39;m not above working for piles of money). Fortunately for me though, I&#39;m in a financial situation where I don&#39;t need a job, so the bar here is pretty high.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Get a life:&lt;/strong&gt; I&#39;ve spent the last two decades immersed in building software, communities, and a company. I&#39;ve not thought much about the rest of my life.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Right now I&#39;m focused on &lt;strong&gt;getting a life&lt;/strong&gt;. It&#39;s hard though. Shifting from &#34;super busy&#34; to &#34;how can I fill up my time today?&#34; is a big lifestyle shift. I&#39;ve enjoyed speaking to older retirees who have gone through something similar. Right now I&#39;m trying to build a social community, build my legs back up for some running and long-distance walking, and reading in my downtime. Book recommendations are very welcome.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;How are you feeling? Is this a big shock?&lt;/summary&gt; &lt;p&gt;I&#39;m feeling bored, but generally pretty good, and no, this isn&#39;t a big shock.&lt;/p&gt; &lt;p&gt;This has been a gradual transition over many months. We started exploring the small-but-profitable company configuration back in Q4 of 2025, and the company has been operating with current staff since the new year. There&#39;s been some work to enact the transition, but overall it&#39;s been an easy last few months.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;You were doing AI stuff for a bit. What happened to that?&lt;/summary&gt; &lt;p&gt;After the decision to transition to small-but-profitable Coiled I spent a couple months playing intensively with AI, making projects like &lt;a href=&#34;https://github.com/mrocklin/claudechic&#34;&gt;claudechic&lt;/a&gt; (along with several others that never saw the light of day beyond personal use). This was super-fun, but ended up not holding my attention, both because of all the noise/hype in the area, and because there wasn&#39;t anything that I was really passionate about building. I was just building to build.&lt;/p&gt; &lt;p&gt;I like building things, but I find I need to care deeply about the thing that I&#39;m building in order to stick with it, and I haven&#39;t found such a thing.&lt;/p&gt; &lt;p&gt;I&#39;m still very pro-AI, but only in the service of building real things. I&#39;d love to see the world build fewer AI products, and more products with AI.&lt;/p&gt; &lt;/details&gt;</content:encoded></item> <item> <title>Saying Goodbye to Winner-take-all Software</title> <author>Matthew Rocklin</author> <description>AI makes software easy to build, eroding the winner-take-all dynamics that created tech giants. The future may look less like Google and more like clothing brands</description> <link>https://matthewrocklin.com/winner-take-all/</link> <pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/winner-take-all/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/winner-take-all.png" type="image/png" length="329420" /> <content:encoded>&lt;h1 id=&#34;saying-goodbye-to-winner-take-all-software&#34;&gt;Saying Goodbye to Winner-take-all Software&lt;/h1&gt; &lt;p&gt;Today software is a winner-take-all industry dominated by best-of-class products:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;GMail&lt;/strong&gt; for e-mail&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Slack&lt;/strong&gt; or &lt;strong&gt;Discord&lt;/strong&gt; for chat&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Stripe&lt;/strong&gt; for payments&lt;/li&gt; &lt;li&gt;&lt;strong&gt;MS Office&lt;/strong&gt; or &lt;strong&gt;Google Docs&lt;/strong&gt; for documents&lt;/li&gt; &lt;li&gt;...&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Generally we see 1-3 products dominate any particular problem space. This makes sense; software is hard to build and free to replicate, so as a product outpaces its competition it gets more resources and invests further (positive feedback) and then distributes that excellent solution all consumers. Everyone gets the same best option.&lt;/p&gt; &lt;p&gt;Other industries differ though; consider clothing/fashion for example. There are hundreds of options for essentially equivalent clothing products. The barrier to entry to make a competitively good pair of pants isn&#39;t that high relative to say, building GMail. A small family business can rival the largest incumbents.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;This is good. We get lots of different options catering to different tastes.&lt;/p&gt; &lt;/blockquote&gt; &lt;h2 id=&#34;software-is-becoming-more-idiosyncratic&#34;&gt;Software is becoming more idiosyncratic&lt;/h2&gt; &lt;p&gt;&lt;em&gt;We can all build our own GMail now&lt;/em&gt;&lt;/p&gt; &lt;p&gt;AI makes software easy to build. While GMail took an army of engineers during Google&#39;s golden age, I&#39;m pretty sure I could build it today in a couple weeks with Claude. Probably so could you.&lt;/p&gt; &lt;p&gt;In fact, we could each make &lt;em&gt;our own GMail&lt;/em&gt;. I wonder how they would differ? How would your taste and mine result in different products and how would those products appeal to different audiences?&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I&#39;d like to live in a world where we had as much choice over e-mail as we had over which pair of pants to wear&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;There&#39;s a lot of potential value here. For example my e-mail practices differ greatly from my elderly parents, and yet we both use the same product.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;What would e-mail look like if it catered exclusively to developers?&lt;/li&gt; &lt;li&gt;What would e-mail look like if it catered to the elderly?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Given how integral email is to all of our lives, differentiation here seems valuable but absent.&lt;/p&gt; &lt;h2 id=&#34;funding-will-change&#34;&gt;Funding will change&lt;/h2&gt; &lt;p&gt;&lt;em&gt;VCs don&#39;t fund clothing brands.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Consider Slack as a business. What is Slack&#39;s moat? There&#39;s an ecosystem of plugins and some network effects, true, but mostly it&#39;s that it would be annoying to rebuild Slack. That&#39;s no longer true. Heck, I might get excited and rebuild Slack this weekend just to prove a point.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Would I have invested in Slack a decade ago? &lt;em&gt;Absolutely.&lt;/em&gt;&lt;/li&gt; &lt;li&gt;Would I invest in Slack today? &lt;em&gt;Absolutely not.&lt;/em&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Winner-take-all economies are high-risk/high-reward, which creates a strong partnership between software startups and venture capital. Some of that will surely persist, but I predict that this partnership weakens for the simple reason that the moat for most software products has been the technical difficulty of reimplementation, which no longer exists.&lt;/p&gt; &lt;p&gt;This change isn&#39;t bad. Software is no longer expensive, so we don&#39;t need millions of dollars of capital to build cool stuff. However, we also shouldn&#39;t expect to make trillion-dollar companies. Once a product does well it should expect similar companies to pop up with different tastes.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Today it is probably easier to build a $10M software business, but more difficult to build a $100B software business.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Starting a software company may start to look less like starting Microsoft/Facebook/Google, and may start to look more like starting a clothing brand or design studio. From my perspective that&#39;s great.&lt;/p&gt; &lt;h2 id=&#34;open-source-will-change-too&#34;&gt;Open Source will change too&lt;/h2&gt; &lt;p&gt;This probably applies to open source software as well.&lt;/p&gt; &lt;p&gt;One reason why Python had such a strong community culture was that building performant software was really hard in Python (it&#39;s slow), and so we were forced to organize around a few common libraries (&lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt;, &lt;code&gt;cython&lt;/code&gt;) that gave us C-level performance for free. This forced organization was critical to the growth and health of the ecosystem. Other ecosystems where performance and abstraction were easy, like C++, didn&#39;t have nearly as much cohesion (at least not from my perspective), which stymied their growth.&lt;/p&gt; &lt;p&gt;While I encourage people to collaborate, I don&#39;t know that it will be important to share software in the future. I &lt;em&gt;do&lt;/em&gt; think that it will be important to share ideas though. Blog posts outlining ideas in sufficient detail that agents can re-implement the idea for each user might be the future of collaboration.&lt;/p&gt; &lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt; &lt;p&gt;Making predictions these days is hard; probably everything above will be proven wrong next month. But if what&#39;s written above is true, then the main lesson I think is that we need to moderate our expectations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Old:&lt;/strong&gt; First movers have an advantage and a strong possibility to dominate the market, generating fame, glory, and wealth&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;New:&lt;/strong&gt; There&#39;s no rush. Everything is both easier and less important than it used to be. You don&#39;t need to reinvent the world today, but instead think more about what you and others would most enjoy.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</content:encoded></item> <item> <title>Claude Chic: Week 2</title> <author>Matthew Rocklin</author> <description>A week of plan mode, custom themes, performance optimizations, and the --yolo flag</description> <link>https://matthewrocklin.com/claude-chic-week-2/</link> <pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/claude-chic-week-2/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/claude-chic-week-2.png" type="image/png" length="311572" /> <content:encoded>&lt;h1 id=&#34;claude-chic-week-2&#34;&gt;Claude Chic: Week 2&lt;/h1&gt; &lt;p&gt;&lt;em&gt;Unlike most of my writing, this post was largely written by Claude&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;It&#39;s been one week since we &lt;a href=&#34;/introducing-claude-chic&#34;&gt;introduced Claude Chic&lt;/a&gt;, and adoption and development since then have been fun.&lt;/p&gt; &lt;p&gt;This week saw 75 commits from 7 contributors. Broadly we saw the following themes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Smoothing out UX rough edges&lt;/p&gt; &lt;p&gt;When a project goes from single-user to many users there are always various rough edges to smooth out. These included Linux and Windows keybindings, Native Windows support (not just WSL), bugs in &lt;code&gt;/resume&lt;/code&gt; and &lt;code&gt;/plan&lt;/code&gt;, and much more.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Multi-agent workflows&lt;/p&gt; &lt;p&gt;I&#39;ve been exploring this space recently and seeing what I like and don&#39;t like. I&#39;ll describe some things that I like and built into Claude Chic just below.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Performance&lt;/p&gt; &lt;p&gt;Running several long sessions concurrently stressed our use of Textual. Various enhancments were made to smooth things out.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Quality of Life&lt;/p&gt; &lt;p&gt;There are many small things that we added like support for custom themes, small screen / mobile support, and more.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Now, let&#39;s dig into some highlights:&lt;/p&gt; &lt;h2 id=&#34;multi-agent-workflows&#34;&gt;Multi-Agent Workflows&lt;/h2&gt; &lt;p&gt;The headline this week is new ways to use multiple agents together. The idea: having Claude debate itself produces more thorough analysis.&lt;/p&gt; &lt;h3 id=&#34;plan-swarms&#34;&gt;Plan Swarms&lt;/h3&gt; &lt;p&gt;&lt;code&gt;/plan-swarm&lt;/code&gt; spawns multiple agents to debate implementation approaches before you commit to one:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/plan-swarm Add caching to the API layer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;This spawns several agents, each exploring the problem from a different angle—one might advocate for Redis, another for in-memory caching, a third for a hybrid approach. They present their cases to each other, debate, and often (but not always) come to consensus. You then pick the direction that resonates.&lt;/p&gt; &lt;h3 id=&#34;review-agents&#34;&gt;Review Agents&lt;/h3&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/reviewer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;This spawns an agent whose job is to critically examine your recent changes. You mediate as they iterate toward agreement.&lt;/p&gt; &lt;h3 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h3&gt; &lt;p&gt;Full plan mode support landed via the SDK&#39;s &lt;code&gt;set_permission_mode&lt;/code&gt;, with proper tool restrictions during planning and feedback when you reject a plan.&lt;/p&gt; &lt;h2 id=&#34;custom-themes&#34;&gt;Custom Themes&lt;/h2&gt; &lt;p&gt;Claude Chic now supports user-defined themes. The default dark theme works well on dark terminals, but many developers prefer light backgrounds.&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/theme chic-light &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Or define your own in &lt;code&gt;~/.claude/chic-theme.json&lt;/code&gt;:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;my-theme&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;colors&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;user_border&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;#ff6600&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;assistant_border&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;#0066ff&amp;quot;&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;h2 id=&#34;the-yolo-flag&#34;&gt;The &lt;code&gt;--yolo&lt;/code&gt; Flag&lt;/h2&gt; &lt;p&gt;For sandboxed environments where you trust the agent completely:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;claudechic&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--yolo &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;(Or &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; if you prefer verbosity.)&lt;/p&gt; &lt;p&gt;This skips all permission prompts. Use it in CI pipelines, Docker containers, or when you&#39;re feeling reckless. The name is intentional—if you&#39;re using this flag, you should know what you&#39;re doing.&lt;/p&gt; &lt;h2 id=&#34;performance&#34;&gt;Performance&lt;/h2&gt; &lt;p&gt;Multi-agent swarms exposed performance bottlenecks. Running 5-10 agents simultaneously revealed that we were doing far too much UI work for agents you weren&#39;t looking at.&lt;/p&gt; &lt;p&gt;Key optimizations this week:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Deferred updates&lt;/strong&gt;: Hidden ChatViews no longer process UI updates until you switch to them&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Collapsed history&lt;/strong&gt;: Old conversation turns collapse into lightweight placeholders&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt;: Collapsible content only renders when expanded&lt;/li&gt; &lt;li&gt;&lt;strong&gt;CSS optimization&lt;/strong&gt;: Reduced recalculation during agent switching&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Spinner fix&lt;/strong&gt;: The thinking indicator no longer triggers CSS recalc on every frame&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The result: swarms of agents run smoothly without the UI becoming a bottleneck.&lt;/p&gt; &lt;h2 id=&#34;quality-of-life&#34;&gt;Quality of Life&lt;/h2&gt; &lt;p&gt;Smaller improvements that add up:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Immediate feedback&lt;/strong&gt;: Creating agents/worktrees shows instant visual response&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Compact mode&lt;/strong&gt;: UI adapts to small terminal heights&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Cross-platform shortcuts&lt;/strong&gt;: Keyboard bindings work consistently across Mac/Linux/Windows&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Autocomplete&lt;/strong&gt;: &lt;code&gt;/worktree&lt;/code&gt; and &lt;code&gt;/agent&lt;/code&gt; commands now autocomplete existing names&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Horizontal scroll&lt;/strong&gt;: Code blocks scroll horizontally instead of wrapping (#28)&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;bug-fixes&#34;&gt;Bug Fixes&lt;/h2&gt; &lt;p&gt;The usual parade of fixes, including:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Windows exit warnings (#31)&lt;/li&gt; &lt;li&gt;Session path encoding to match Claude Code (#20)&lt;/li&gt; &lt;li&gt;Crash when pasting long text&lt;/li&gt; &lt;li&gt;Nested tools getting lost after switching agents&lt;/li&gt; &lt;li&gt;Various multi-agent stability improvements&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;whats-next&#34;&gt;What&#39;s Next&lt;/h2&gt; &lt;p&gt;This past week was mostly about people other than me trying Claude Chic and reporting issues with their workflow. I expect more of the same.&lt;/p&gt; &lt;p&gt;Try it:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;claudechic&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/welcome &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Or update if you already have it:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uv&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tool&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;upgrade&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;claudechic &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;a href=&#34;https://github.com/mrocklin/claudechic&#34;&gt;GitHub&lt;/a&gt; | &lt;a href=&#34;/claudechic&#34;&gt;Docs&lt;/a&gt;&lt;/p&gt; &lt;h2 id=&#34;contributors&#34;&gt;Contributors&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/avinewman&#34;&gt;Avi Newman&lt;/a&gt; - Windows compatibility&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/chr33z&#34;&gt;Christopher Lamm&lt;/a&gt; - plan mode fixes&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/dotsdl&#34;&gt;David Dotson&lt;/a&gt; - vim mode&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/jumptable&#34;&gt;Laura Martin&lt;/a&gt; - exit handling&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/surminus&#34;&gt;surminus&lt;/a&gt; - custom themes&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/theantichris&#34;&gt;theantichris&lt;/a&gt; - session path encoding, model settings&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Issues &amp;amp; Feedback:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/andrie&#34;&gt;andrie&lt;/a&gt; - WSL timeout&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/binduwavell&#34;&gt;binduwavell&lt;/a&gt; - subagents, small screen support&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/c0ffee0wl&#34;&gt;c0ffee0wl&lt;/a&gt; - auto-approve mode, collapsible tools&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/cderv&#34;&gt;cderv&lt;/a&gt; - Windows issues, worktree context, horizontal scroll&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/chandlervdw&#34;&gt;chandlervdw&lt;/a&gt; - MCP management&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/dcherian&#34;&gt;dcherian&lt;/a&gt; - keyboard shortcuts, agent switching, readline&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/GaborNyul&#34;&gt;GaborNyul&lt;/a&gt; - multiline input, SSO proxy&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/jeduden&#34;&gt;jeduden&lt;/a&gt; - paste crash&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/maartenbreddels&#34;&gt;maartenbreddels&lt;/a&gt; - branch name handling&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/quasiben&#34;&gt;quasiben&lt;/a&gt; - token doubling&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/rdubwiley09&#34;&gt;rdubwiley09&lt;/a&gt; - path defaults&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/sargunv&#34;&gt;sargunv&lt;/a&gt; - plan mode&lt;/li&gt; &lt;/ul&gt;</content:encoded></item> <item> <title>Multi-Agent Workflows</title> <author>Matthew Rocklin</author> <description>Exploring multi-agent AI workflows—what works, what doesn't, and lessons from playing Diplomacy with Claude agents.</description> <link>https://matthewrocklin.com/ai-multi-agent/</link> <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/ai-multi-agent/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/ai-multi-agent.png" type="image/png" length="309480" /> <content:encoded>&lt;h1 id=&#34;multi-agent-swarms-initial-thoughts&#34;&gt;Multi Agent Swarms: Initial Thoughts&lt;/h1&gt; &lt;p&gt;Like many of us, I read articles about systems like &lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34;&gt;Gas Town&lt;/a&gt; with a mixture of wonder and fear:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I&#39;m only using a few agents concurrently! Am I falling behind?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;This is silly of course. No one is behind because &lt;a href=&#34;/ai-beginners&#34;&gt;no one knows what they&#39;re doing yet&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Still though, I wanted to explore this topic, so I spent the last couple days playing with multi-agent workflows using &lt;a href=&#34;/introducing-claude-chic&#34;&gt;Claude Chic&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This article is long (sorry!) but here is a helpful TOC. If you don&#39;t feel like a long read I recommend skipping to the &lt;a href=&#34;#lessons-learned&#34;&gt;Lessons Learned&lt;/a&gt;.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href=&#34;#obviously-good-simple-multi-agent-workflows&#34;&gt;Obviously Good Simple Multi-Agent Workflows&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#platform&#34;&gt;Platform&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#first-experiment-diplomacy&#34;&gt;First Experiment: Diplomacy&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#second-experiment-session-viewer&#34;&gt;Second Experiment: Session Viewer&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#lessons-learned&#34;&gt;&lt;strong&gt;Lessons Learned&lt;/strong&gt;&lt;/a&gt; &amp;lt;-- if you read only one section, read this&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#experimenting-is-easy&#34;&gt;Experimenting is easy&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;obviously-good-simple-multi-agent-workflows&#34;&gt;Obviously Good Simple Multi-Agent Workflows&lt;/h2&gt; &lt;p&gt;Many of us use multi-agent systems in simple ways that are clearly a benefit:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Plan then Build:&lt;/strong&gt; People often have one session make a plan, and then clear out context and start building that plan with a new session.&lt;/p&gt; &lt;p&gt;This has become common enough that I believe it&#39;s now the default in Claude Code.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Review:&lt;/strong&gt; People ask another agent to review the work of an initial agent. This tends to produce better results than having the original agent self-review.&lt;/p&gt; &lt;p&gt;As Wes McKinney writes about &lt;a href=&#34;https://www.roborev.io/&#34;&gt;RoboRev&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Having a Claude Code session review its own work is so 2025.&lt;/p&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There&#39;s something powerful about having two different agents think about the same problem and communicate about it, even if those two agents run sequentially, and even if they communicate by having a human copy-paste between them.&lt;/p&gt; &lt;h2 id=&#34;platform&#34;&gt;Platform&lt;/h2&gt; &lt;p&gt;I&#39;m using my personal Claude TUI alternative, &lt;a href=&#34;/introducing-claude-chic&#34;&gt;Claude Chic&lt;/a&gt;. Originally built for nicer style, it also has the feature set needed to support multi-agent swarms.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Start:&lt;/strong&gt; Agents can start other agents&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Send:&lt;/strong&gt; Agents can send messages to other agents&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Branch:&lt;/strong&gt; Agents can create git worktrees&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Merge:&lt;/strong&gt; There&#39;s an automated commit / rebase / resolve-conflicts / merge loop that agents can follow&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I built these tools to help me with human-in-the-loop work, but it turns out they&#39;re all you need for multi-agent-swarm workflows.&lt;/p&gt; &lt;h2 id=&#34;first-experiment-diplomacy&#34;&gt;First Experiment: Diplomacy&lt;/h2&gt; &lt;p&gt;In the initial demo of Claude Chic, I show Claude setting up a game of Chess against itself.&lt;/p&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/735ebc91-335e-4476-8fde-f49ce1df056a&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;p&gt;But then I thought&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; &#34;what&#39;s more intense than Chess?&#34; &lt;strong&gt;A:&lt;/strong&gt; &#34;Diplomacy&#34;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Diplomacy, if you&#39;re not familiar, is like &#34;Risk on Steroids without Dice&#34;. It&#39;s a game of pure discussion and guile where seven players try to dominate 1908 Europe. Claude knows the game (of course) and so I asked it to set up a game among agents.&lt;/p&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/38205b08-fd13-4b84-b153-9f98eab1d759&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;p&gt;The gameplay was fascinating to watch. Briefly:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Game starts out tame and typical&lt;/li&gt; &lt;li&gt; &lt;p&gt;Austria thinks it&#39;s doing well, but everyone betrays it&lt;/p&gt; &lt;p&gt;Interestingly, the other players joke about Austria behind its back&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Russia dominates early on, supported by Turkey&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Germany, noticing Russia&#39;s rise, convinces everyone else to gang up against Russia&lt;/p&gt; &lt;p&gt;The amount of inter-agent traffic in and out of the Germany agent during this period was intense.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Russia, cowed, makes a deal with Germany to let it survive&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Watching the agents play was no less fascinating than watching humans play, and resulted in behaviors I found surprising from AI:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Multiple coordinating agents are capable of more sophisticated behavior than single agents&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Silly game, useful lesson. I wanted to try things out in practice.&lt;/p&gt; &lt;h2 id=&#34;second-experiment-session-viewer&#34;&gt;Second Experiment: Session Viewer&lt;/h2&gt; &lt;p&gt;I wanted to look at multi-agent sessions like the one I had just played, and so decided to have Claude(s) build a session viewer for me that I would turn into something with a shared timeline.&lt;/p&gt; &lt;p&gt;I tried this three times with three different prompts, learning each time. Eventually we got to something like this without much human intervention:&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;Simple Session Viewer&#34; src=&#34;https://github.com/user-attachments/assets/247ad909-72ae-4365-8559-3e21d63153f6&#34; /&gt;&lt;/p&gt; &lt;p&gt;It&#39;s not great, but it works.&lt;/p&gt; &lt;h3 id=&#34;prompts&#34;&gt;Prompts&lt;/h3&gt; &lt;p&gt;They&#39;re not beautiful, but here are the prompts I used. You can tell how I learned from one into the next.&lt;/p&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;First Try&lt;/summary&gt; &lt;p&gt;I&#39;m curious about trying an agent swarm technique in development. I was thinking as a project we might try adding a react electron version of this application.&lt;/p&gt; &lt;p&gt;We&#39;d want to have one agent (you) doing a lot of the orchestration, but we&#39;d want other agents for planning, executing each task, reviewing, testing, etc.. You wouldn&#39;t do any work directly because you&#39;d be conserving your context to control others.&lt;/p&gt; &lt;p&gt;I want you to think hard about this and how to execute well.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;Second Try: I encourage communication&lt;/summary&gt; &lt;p&gt;Let&#39;s play with multi-agent swarm systems. As a project, I want to build a viewer for sessions. I&#39;m thinking that this is probably a local application, maybe electron that takes a session file and renders it nicely. Eventually I&#39;m going to want to render a few of these side-by-side (to better understand multi-agent systems), but I think that to start we probably just want to get to a milestone where we have an app that runs that can present a session nicely.&lt;/p&gt; &lt;p&gt;For tech we&#39;re going to want react/shadcn/tailwind with zustand for state.&lt;/p&gt; &lt;p&gt;For design we&#39;re going to want to copy our theme and styling here.&lt;/p&gt; &lt;p&gt;For execution I think we probably want different agents for planning, building, and reviewing. Each building agent should also launch an agent to review its work as it gets close to done (or we should launch it if it forgets). Assuming we use worktrees we&#39;re going to want to merge work as it completes rather than all at once. Probably we want a separate integration agent for this. Agents should be encouraged to ask each other questions and collaborate. We shouldn&#39;t do much work in this agent. We need to preserve our context.&lt;/p&gt; &lt;p&gt;Think about how best to organize this and then set it going.&lt;/p&gt; &lt;/details&gt; &lt;details class=&#34;faq&#34;&gt; &lt;summary&gt;Third try. I wanted to limit concurrency.&lt;/summary&gt; &lt;p&gt;I&#39;d like to experiment with agent swarms.&lt;/p&gt; &lt;p&gt;As a project, I&#39;d like us to build a session viewer that takes in a session, like the .jsonl file on the Desktop, and renders it similarly to how we do in the app, but with an electron app using react/tailwind/shadcn.&lt;/p&gt; &lt;p&gt;As we work on things I want you to use different agents in different roles.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;For our architecture I suspect that we&#39;ll want an agent to make an overall plan,&lt;/li&gt; &lt;li&gt;and then we&#39;ll want to break apart that plan into a set of tasks with dependencies that agents can work on independently.&lt;/li&gt; &lt;li&gt;We won&#39;t want to start everything at once of course. We&#39;ll want to pay attention to laying a good foundation first and making sure it&#39;s good before moving on.&lt;/li&gt; &lt;li&gt;As we can parallelize we will.&lt;/li&gt; &lt;li&gt;Also, as any agent starts to finish up work they should use the /review skill to create another agent to review their efforts.&lt;/li&gt; &lt;li&gt;When they&#39;re done they should use the finalize_worktree mcp command to work on merging their work to this upstream viewer branch, which will be the target of all of our work.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;You won&#39;t do much work, instead saving your context to help orchestrate the other agents.&lt;/p&gt; &lt;p&gt;Think hard about how to do this well.&lt;/p&gt; &lt;/details&gt; &lt;p&gt;If I were to do this again, I think I would sequentialize the entire process. Parallelism didn&#39;t buy much.&lt;/p&gt; &lt;h3 id=&#34;the-overall-experience-was-mediocre&#34;&gt;The overall experience was mediocre&lt;/h3&gt; &lt;p&gt;My experience with agentic swarms was so-so. That&#39;s not surprising. I&#39;m new at it and bad at it.&lt;/p&gt; &lt;p&gt;As Steve Yegge (famed multi-agent vibe coder) says:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;You will turn into Batman, but you can&#39;t just put on the suit and say &#34;I&#39;m Batman&#34;.&lt;/p&gt; &lt;p&gt;You&#39;ve got to learn how the tool-belt works&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;My experience was learning that I&#39;m definitely not Batman yet.&lt;/p&gt; &lt;h3 id=&#34;observations&#34;&gt;Observations&lt;/h3&gt; &lt;p&gt;The head agent delegated really well. It understood that its context was precious and how to create agents to do work. And the plan that was designed was fine.&lt;/p&gt; &lt;p&gt;But parallel execution was generally pretty bad. The agents did fine work, but they mostly ignored each other the first go around. The second time I intentionally prompted the system to chat with peers about the work they were doing, and the third time I encouraged less parallelism. Still though, lack of coordination resulted in lots of strangeness.&lt;/p&gt; &lt;p&gt;On the plus side, the crap it produced was quickly cleaned up by more AI (the solution to AI problems is more AI).&lt;/p&gt; &lt;h2 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h2&gt; &lt;p&gt;As with any philosophy, we should neither accept nor reject it, but should take from it the parts that suit us.&lt;/p&gt; &lt;p&gt;In that spirit, here are my current lessons on multi-agent behavior.&lt;/p&gt; &lt;h3 id=&#34;separate-reviewer&#34;&gt;Separate Reviewer 👍&lt;/h3&gt; &lt;p&gt;Upon finishing work I used to ask Claude to review its own work:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Let&#39;s review our recent changes and see if there is anything we can clean up or simplify&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Now I still do that, but I follow up with:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Start another agent and ask it to review our work&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;They&#39;re both quite useful.&lt;/p&gt; &lt;h3 id=&#34;fresh-perspective&#34;&gt;Fresh Perspective 👍&lt;/h3&gt; &lt;p&gt;Agents get tired. If an agent finishes an especially long session and its context is near 60-70% I&#39;ll often ask the reviewing agent to take over and implement the changes.&lt;/p&gt; &lt;p&gt;It&#39;s better, of course, to avoid this with well-scoped work, just like a regular human developer.&lt;/p&gt; &lt;h3 id=&#34;mythical-man-month-mythical-ai-minute&#34;&gt;Mythical Man Month ➡️ Mythical AI Minute&lt;/h3&gt; &lt;p&gt;Also like humans, sometimes teams don&#39;t perform as well as single developers.&lt;/p&gt; &lt;p&gt;There&#39;s a real cost to coordination that needs to be outweighed by the benefits of speed. AI agents are so fast that it&#39;s not clear to me when we&#39;d want multiple agents working concurrently on the same code—most tasks finish before coordination overhead would pay off.&lt;/p&gt; &lt;p&gt;My experiment would have been better with many agents, each agent running after the other finished.&lt;/p&gt; &lt;h3 id=&#34;agent-support&#34;&gt;Agent Support 👍&lt;/h3&gt; &lt;p&gt;Increasingly, the model I have for hard problems is to work with one key agent at a time, and fire off supporting agents to handle tangential work (research, review, performance testing).&lt;/p&gt; &lt;p&gt;It&#39;s valuable to keep a key agent on task. (also like humans)&lt;/p&gt; &lt;h3 id=&#34;human-coordination&#34;&gt;Human Coordination 🧠&lt;/h3&gt; &lt;p&gt;I am not (yet) a fan of YOLO Swarms. I want to be involved.&lt;/p&gt; &lt;p&gt;Said differently, all the work I&#39;m doing is sufficiently important to me that I&#39;m happy to pay attention to it. I&#39;m curious about how to best optimize my ability to pay attention to AI work.&lt;/p&gt; &lt;p&gt;I don&#39;t think this is universally true. For example during Dask&#39;s peak, OSS maintenance was such that I would have welcomed agents handling the first layer of support. Very few of us are in that situation though.&lt;/p&gt; &lt;h3 id=&#34;human-oriented-ai-development&#34;&gt;Human-Oriented AI Development&lt;/h3&gt; &lt;p&gt;Working on Claude Chic has made me increasingly interested in how I work as a developer, and how to optimize that experience. Rather than ask:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;How can I use multi-agent swarms?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;I am instead asking:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;What is holding me back right now?&lt;/p&gt; &lt;p&gt;How can I best address that?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Today the answer is around ergonomics and context management rather than concurrency (I feel I already have concurrency in abundance). There are great multi-agent workflows I&#39;ve mentioned above that I use daily. I&#39;m not yet a YOLO Swarm / Gas Town guy.&lt;/p&gt; &lt;p&gt;I haven&#39;t really made up my mind though; I should experiment for more than 48 hours.&lt;/p&gt; &lt;h2 id=&#34;experimenting-is-easy&#34;&gt;Experimenting is easy&lt;/h2&gt; &lt;p&gt;This is a blatant ad for &lt;a href=&#34;/introducing-claude-chic&#34;&gt;Claude Chic&lt;/a&gt;, but it was pretty trivial to play with (admittedly bad) swarm architectures.&lt;/p&gt; &lt;p&gt;Claude has enough of an understanding of swarms that, if you describe what you want and give it the ability to make agents that talk to each other (like Claude Chic does), then you can just start playing immediately.&lt;/p&gt; &lt;p&gt;Regardless what you think about AI, and regardless how you think about full-auto multi-agent swarms, you should experiment with them. They are, whatever else, quite interesting.&lt;/p&gt;</content:encoded></item> <item> <title>Beginning Again</title> <author>Matthew Rocklin</author> <description>Everyone feels behind on AI, but no one is ahead. That shared beginner status is what makes this moment so fun.</description> <link>https://matthewrocklin.com/ai-beginners/</link> <pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/ai-beginners/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/ai-beginners.png" type="image/png" length="306764" /> <content:encoded>&lt;h1 id=&#34;were-all-beginners-again&#34;&gt;We&#39;re all Beginners Again&lt;/h1&gt; &lt;p&gt;While interviewing early adopters of &lt;a href=&#34;/introducing-claude-chic&#34;&gt;Claude Chic&lt;/a&gt; I heard two common refrains:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&#34;Oh, I&#39;m not very advanced with AI&#34;&lt;/li&gt; &lt;li&gt;&#34;Programming feels fun again!&#34;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These feelings were universal. I thought they&#39;d be good to share out loud.&lt;/p&gt; &lt;h2 id=&#34;beginning-again&#34;&gt;Beginning again&lt;/h2&gt; &lt;p&gt;Everyone was anxious sharing how they worked with AI, afraid of being judged for not being advanced enough. Here&#39;s the thing:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;No one is very advanced with AI&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;No one I spoke with was using multi-agent swarms or GasTown or whatever. But everyone &lt;em&gt;was&lt;/em&gt; doing something different. The space is wide-open and no one has the answer yet. This should make us fearless.&lt;/p&gt; &lt;p&gt;We&#39;re all beginners again, and that&#39;s what makes it fun. It&#39;s like being twenty years old at university, the world full of possibilities.&lt;/p&gt; &lt;h2 id=&#34;programming-feels-fun-again&#34;&gt;Programming feels fun again&lt;/h2&gt; &lt;p&gt;Everyone is in good spirits, despite the anxiety.&lt;/p&gt; &lt;p&gt;To me this feels like Python did 15 years ago when there was so much to build and so much new ground to cover. We were in a green field inventing the future against all odds, rather than maintaining legacy software under an increasing weight of success.&lt;/p&gt; &lt;p&gt;Today I see people working on personal side-projects, goofing around, playing.&lt;/p&gt; &lt;p&gt;I&#39;m reminded of these quotes from director Francis Ford Coppola during the making of his recent film/boondoggle, Megalopolis&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&#34;You know why I&#39;m doing this? I have money, I already have fame, I already have Oscars.&#34;&lt;br/&gt; &#34;What do I get that I want? Tell me.&#34;&lt;/p&gt; &lt;p&gt;&#34;Fun! I wanna have Fun.&#34;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;and&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&#34;All the great things in life come from play, never from work, never from toil&#34;.&lt;/p&gt; &lt;p&gt;&#34;Toil gives you nothing. Play gives you everything.&#34;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;We&#39;re having fun again, and that&#39;s fantastic.&lt;/p&gt; &lt;h2 id=&#34;learning-from-python&#34;&gt;Learning from Python&lt;/h2&gt; &lt;p&gt;I had the privilege to experience the growth of the Python data ecosystem from the inside, before it became cool. The way I feel now reminds me of how we felt then.&lt;/p&gt; &lt;p&gt;Not everything is the same though. I think we could improve our culture of communication. What I&#39;d like to see more of:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;More casual sharing of &lt;em&gt;how&lt;/em&gt; we work (not just the tools or products we&#39;ve built)&lt;/li&gt; &lt;li&gt;More questioning and critical thinking about popular directions (are multi-agent swarms really the way of the future?)&lt;/li&gt; &lt;li&gt;More chats over beers without an agenda&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;With COVID and remote work we&#39;ve gotten too efficient with our communication. We need more un-conferences and hallway tracks—the unstructured spaces where real ideas emerge.&lt;/p&gt;</content:encoded></item> <item> <title>Claude Chic</title> <author>Matthew Rocklin</author> <description>A Claude code drop-in with updated UX and multi-agent support</description> <link>https://matthewrocklin.com/introducing-claude-chic/</link> <pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/introducing-claude-chic/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/introducing-claude-chic.png" type="image/png" length="307754" /> <content:encoded>&lt;h1 id=&#34;introducing-claude-chic&#34;&gt;Introducing Claude Chic&lt;/h1&gt; &lt;p&gt;&lt;a href=&#34;/claudechic&#34;&gt;Claude Chic&lt;/a&gt; is an alternative Claude Code UI that provides the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;#1-style&#34;&gt;&lt;strong&gt;Style:&lt;/strong&gt;&lt;/a&gt; visually organizes the message stream for legibility&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#git-worktrees&#34;&gt;&lt;strong&gt;Git Worktrees:&lt;/strong&gt;&lt;/a&gt; organizes concurrent worktrees&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#multiple-agents&#34;&gt;&lt;strong&gt;Multiple Agents:&lt;/strong&gt;&lt;/a&gt; runs many sessions from the same window&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;#quality-of-life&#34;&gt;&lt;strong&gt;Quality of Life:&lt;/strong&gt;&lt;/a&gt; loads of other features like diff viewer, shell commands, and more&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The official docs are &lt;a href=&#34;/claudechic&#34;&gt;here&lt;/a&gt;, but I wanted to share my personal motivation and experience building this.&lt;/p&gt; &lt;p&gt;Or, if you prefer to jump right in, Claude Chic can explain itself:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;uvx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;claudechic&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/welcome &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/bbdae8ac-9ddb-455b-8282-b52cfb73c4e8&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;h2 id=&#34;0-motivation&#34;&gt;0. Motivation&lt;/h2&gt; &lt;p&gt;I&#39;ve been deep in AI joy/psychosis the last couple months. The world is super fun right now.&lt;/p&gt; &lt;p&gt;However, as AI speeds up my workflow I find new bottlenecks, and increasingly those bottlenecks are part of my interactions with Claude itself. I wrote about this in &lt;a href=&#34;/ai-zealotry&#34;&gt;AI Zealotry&lt;/a&gt;; AI can feel dehumanizing when our primary contribution is administrative, like granting permission.&lt;/p&gt; &lt;p&gt;Beyond permissions, various administrative interactions with Claude became tiresome, and so I worked to improve what I could about the interface for my workflow so that I could feel more human.&lt;/p&gt; &lt;p&gt;Claude Chic is an early result of that endeavor.&lt;/p&gt; &lt;h2 id=&#34;1-style&#34;&gt;1. Style&lt;/h2&gt; &lt;p&gt;Let&#39;s start with visual design. Claude is functionally great, but stylistically pretty terrible.&lt;/p&gt; &lt;p&gt;Here&#39;s a screenshot of Claude Code:&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;Claude Code&#34; src=&#34;https://github.com/user-attachments/assets/e6caa10a-0696-43f3-a1f3-10d9f620a389&#34; style=&#34;max-width: 100%&#34; /&gt;&lt;/p&gt; &lt;p&gt;I find this difficult to parse. Everything feels muddled:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;No visual distinction&lt;/strong&gt; between messages&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Too wide&lt;/strong&gt; for comfortable reading (moreso in full-screen)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lost information&lt;/strong&gt; - I want to dig into edits before they get summarized away&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We don&#39;t expect modern design in terminal applications, but maybe we should, especially with &lt;a href=&#34;https://textual.textualize.io/&#34;&gt;Textual&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Textual made it easy to design a skin for Claude code that was, for me, much easier to consume.&lt;/p&gt; &lt;h3 id=&#34;comparison&#34;&gt;Comparison&lt;/h3&gt; &lt;p&gt;To me, Claude Code looks muddled.&lt;/p&gt; &lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;1:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_1_1&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_2&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_1_1&#34;&gt;Claude Code&lt;/label&gt;&lt;label for=&#34;__tabbed_1_2&#34;&gt;Claude Chic&lt;/label&gt;&lt;/div&gt; &lt;div class=&#34;tabbed-content&#34;&gt; &lt;div class=&#34;tabbed-block&#34;&gt; &lt;p&gt;&lt;img alt=&#34;Claude Code&#34; src=&#34;https://github.com/user-attachments/assets/e6caa10a-0696-43f3-a1f3-10d9f620a389&#34; style=&#34;width: 100%&#34; /&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class=&#34;tabbed-block&#34;&gt; &lt;p&gt;&lt;img alt=&#34;Claude Chic&#34; src=&#34;https://github.com/user-attachments/assets/229f3904-4dee-4f97-8fc7-d65fb78ac9cd&#34; style=&#34;width: 100%&#34; /&gt;&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;To me, Claude Chic organizes the conversation so my eyes can parse it immediately without feeling drowned.&lt;/p&gt; &lt;p&gt;Tool use in particular is interesting. There are &lt;em&gt;more&lt;/em&gt; tool use lines in the Chic version (Claude code omits many tool use lines), but they don&#39;t get in the way, and each is expandable for full context.&lt;/p&gt; &lt;p&gt;Additionally, Markdown renders properly.&lt;/p&gt; &lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;2:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_2_1&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_2&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_2_1&#34;&gt;Claude Code&lt;/label&gt;&lt;label for=&#34;__tabbed_2_2&#34;&gt;Claude Chic&lt;/label&gt;&lt;/div&gt; &lt;div class=&#34;tabbed-content&#34;&gt; &lt;div class=&#34;tabbed-block&#34;&gt; &lt;p&gt;&lt;img alt=&#34;Claude Code expanded&#34; src=&#34;https://github.com/user-attachments/assets/c09c35af-8f62-417e-b7d9-f9bc0f78070a&#34; style=&#34;width: 100%&#34; /&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class=&#34;tabbed-block&#34;&gt; &lt;p&gt;&lt;img alt=&#34;Claude Chic expanded&#34; src=&#34;https://github.com/user-attachments/assets/ebdee1a5-9700-4149-8e97-1fbe420852ca&#34; style=&#34;width: 100%&#34; /&gt;&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Key styling choices:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Color:&lt;/strong&gt; User (orange), Claude (blue), Tools (grey)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Expansion:&lt;/strong&gt; Tool messages collapse by default, click to expand&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Width:&lt;/strong&gt; Constrained to 100 characters&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Markdown:&lt;/strong&gt; Proper rendering&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Streaming:&lt;/strong&gt; Responses appear as they generate&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To be honest, this ended up being a deeper rabbit hole than I anticipated. Totally worth it though. We&#39;re still early (definitely beta software), but it feels much better to me than Claude&#39;s default interface, or similar tools like Codex, Gemini, and other CLI tools. Everyone should be using Textual for TUIs.&lt;/p&gt; &lt;h2 id=&#34;2-git-worktrees&#34;&gt;2. Git Worktrees&lt;/h2&gt; &lt;p&gt;Git worktrees are underused. They let multiple Claude agents work on the same repository in parallel.&lt;/p&gt; &lt;p&gt;Unfortunately, none of us know how they work. People I&#39;ve spoken to have all seen an article or Youtube video showing them in action, but in practice they feel foreign. That&#39;s ok; AI tooling is great at foreign workflows.&lt;/p&gt; &lt;h3 id=&#34;user-experience&#34;&gt;User Experience&lt;/h3&gt; &lt;p&gt;Previously, when I had a new idea it went on a TODO list while Claude finished its current task. Ideas would linger on that TODO list for a &lt;em&gt;long&lt;/em&gt; time, even simple and easy ones. Coordinating the shared resource of the repository was an annoying bottleneck.&lt;/p&gt; &lt;p&gt;Git worktrees solve this by marrying a git branch with a fresh copy of the repository directory.&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;~/projects/ ├── myrepo/ # Main worktree (main branch) ├── myrepo-feature-1/ # Some feature you&amp;#39;re working on ├── myrepo-feature-2/ # Some feature you&amp;#39;re working on ├── ... └── myrepo-feature-n/ # Some feature you&amp;#39;re working on &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now you can have &lt;code&gt;n&lt;/code&gt; Claude agents working, one in each directory. When I have a new idea, I create a new worktree and have Claude start on it immediately:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/worktree my-idea I want you to explore ... &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;This creates a new worktree (directory + branch) and a new agent working in that directory in the background. The agent starts working concurrently while I go back to my main task. In practice I have 2-10 of these going at once.&lt;/p&gt; &lt;p&gt;Now I focus on whatever ongoing thread interests me most while Claude pushes the others forward. I no longer wait for Claude; Claude waits for me.&lt;/p&gt; &lt;h3 id=&#34;cleaning-up&#34;&gt;Cleaning up&lt;/h3&gt; &lt;p&gt;With concurrent git development comes conflicts. To address this, my git flow looks like the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Commit&lt;/strong&gt; work in a branch&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Rebase&lt;/strong&gt; Rebase on our upstream branch (for linear history)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Resolve&lt;/strong&gt; any conflicts&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Fast-forward merge&lt;/strong&gt; branch into upstream&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Delete&lt;/strong&gt; worktree&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Claude handles rebases and conflicts fine (and asks when it can&#39;t), so the workflow above got baked into the &lt;code&gt;/worktree finish&lt;/code&gt; command. Concurrent git managemet is, for me, fully managed now.&lt;/p&gt; &lt;p&gt;Now that all of my TODO items can run at once, worktrees shift the decision from &#34;what thread should we start next?&#34; to &#34;which ongoing session most deserves my attention?&#34; This decision, coming later in the workflow, comes with more and richer information.&lt;/p&gt; &lt;h2 id=&#34;3-multiple-agents&#34;&gt;3. Multiple Agents&lt;/h2&gt; &lt;p&gt;Multiple agents run concurrently in one session and can talk to each other. Here they play chess:&lt;/p&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/735ebc91-335e-4476-8fde-f49ce1df056a&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;p&gt;This is a cute demo, but in practice I use multiple agents with prompts like the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Reviewing:&lt;/strong&gt; &#34;Start an agent to review our changes critically&#34;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Research:&lt;/strong&gt; &#34;Start an agent to explore this topic further&#34;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Dogfooding:&lt;/strong&gt; Recently when adding a profiler, I spawned an agent to use it and suggest improvements back to the agent building it&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There are intense multi-agent systems out there like &lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34;&gt;Gas Town&lt;/a&gt; and &lt;a href=&#34;https://github.com/code-yeongyu/oh-my-opencode&#34;&gt;OhMyOpenCode&lt;/a&gt;. I haven&#39;t needed that level of automation yet, but I find this space interesting.&lt;/p&gt; &lt;h2 id=&#34;4-quality-of-life&#34;&gt;4. Quality of Life&lt;/h2&gt; &lt;p&gt;Claude Chic comes with myriad other niceties like a &lt;code&gt;/diff&lt;/code&gt; viewer, vim keybindings (&lt;code&gt;/vim&lt;/code&gt;), shell commands (&lt;code&gt;!ls&lt;/code&gt;, &lt;code&gt;!nvim README.md&lt;/code&gt;), and more.&lt;/p&gt; &lt;h3 id=&#34;diff-review&#34;&gt;Diff Review&lt;/h3&gt; &lt;p&gt;Review uncommitted changes before asking Claude to commit:&lt;/p&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/3c0c262b-2a23-4486-92c4-b97705a0819d&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;p&gt;I used to switch back and forth to a terminal to run &lt;code&gt;git diff&lt;/code&gt;. Now I get something that I like more than &lt;code&gt;git diff&lt;/code&gt; and without context switching.&lt;/p&gt; &lt;h3 id=&#34;shell-access&#34;&gt;Shell Access&lt;/h3&gt; &lt;p&gt;Run shell commands without leaving the UI:&lt;/p&gt; &lt;video src=&#34;https://github.com/user-attachments/assets/85f3dbe0-9a88-436e-aa9d-c1ba012c1f0e&#34; autoplay loop muted playsinline style=&#34;max-width: 100%&#34;&gt;&lt;/video&gt; &lt;p&gt;I typically use this for &lt;code&gt;git log&lt;/code&gt; and &lt;code&gt;vim&lt;/code&gt;, but it&#39;s nice generally.&lt;/p&gt; &lt;p&gt;There are loads more small features in Claude Chic, and more coming daily. It&#39;s exciting to work on.&lt;/p&gt; &lt;h2 id=&#34;relationship-to-other-projects&#34;&gt;Relationship to other projects&lt;/h2&gt; &lt;p&gt;Related (and more mature) work:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Claude Code:&lt;/strong&gt; More robust. Claude Chic uses the same &lt;a href=&#34;https://github.com/anthropics/claude-agent-sdk-python&#34;&gt;&lt;code&gt;claude-agent-sdk&lt;/code&gt;&lt;/a&gt; logic as Claude Code.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;a href=&#34;https://opencode.ai/&#34;&gt;&lt;strong&gt;OpenCode:&lt;/strong&gt;&lt;/a&gt; Beautiful wrapper supporting any major LLM with its own agent logic.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;a href=&#34;https://willmcgugan.github.io/announcing-toad/&#34;&gt;&lt;strong&gt;Toad&lt;/strong&gt;&lt;/a&gt;: LLM CLI in Textual by &lt;a href=&#34;https://willmcgugan.github.io/&#34;&gt;Will McGugan&lt;/a&gt;, Textual&#39;s creator.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;a href=&#34;https://docs.conductor.build/&#34;&gt;Conductor&lt;/a&gt;: Mac App that provides many of the same features (design, worktrees, multi-agent)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;alpha-status&#34;&gt;Alpha Status&lt;/h2&gt; &lt;p&gt;This software is &lt;em&gt;early&lt;/em&gt;, and &lt;em&gt;full of bugs&lt;/em&gt;. It crashes regularly when we encounter new situations. Even-so, I encourage adventurous &lt;code&gt;claude&lt;/code&gt; users to put it through its paces and &lt;a href=&#34;https://github.com/mrocklin/claudechic/issues/new&#34;&gt;raise issues&lt;/a&gt;. Development on this project is (as of 2026-01-25) extremely fast.&lt;/p&gt; &lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt; &lt;p&gt;For users: AI is fast; we need to avoid becoming Amdahl&#39;s bottleneck. Our developer tooling warrants a lot of reimagining today.&lt;/p&gt; &lt;p&gt;For LLM providers: Please check out Textual. It&#39;s a great technology. (I have no financial stake in Textual)&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# If you use uv&lt;/span&gt; uvx&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;claudechic&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/welcome &lt;span class=&#34;c1&#34;&gt;# If you use pip&lt;/span&gt; pip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;claudechic claudechic&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/welcome &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;h2 id=&#34;video&#34;&gt;Video&lt;/h2&gt; &lt;p&gt;If you prefer video, here&#39;s one of me explaining this project:&lt;/p&gt; &lt;div class=&#34;video-container&#34;&gt; &lt;iframe src=&#34;https://www.youtube-nocookie.com/embed/2HcORToX5sU?autoplay=0&amp;mute=0&amp;loop=0&amp;playlist=2HcORToX5sU&#34; title=&#34;Claude Chic Introduction&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item> <item> <title>AI Zealotry</title> <author>Matthew Rocklin</author> <description>Senior engineers are best positioned to benefit from AI. We're good enough to avoid slop, and there's so much we can accomplish. I wouldn't go back.</description> <link>https://matthewrocklin.com/ai-zealotry/</link> <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/ai-zealotry/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/ai-zealotry.png" type="image/png" length="305196" /> <content:encoded>&lt;h1 id=&#34;ai-zealotry&#34;&gt;AI Zealotry&lt;/h1&gt; &lt;p&gt;I develop with AI today. It&#39;s great.&lt;/p&gt; &lt;p&gt;There are many articles you can read on why AI is great (or terrible) or how to use it. This is mine. I focus on the experience of a senior engineer (and why we in particular should use AI), on my experience operating within the OSS Python Data world, and on practical suggestions that I&#39;ve found myself repeating to colleagues.&lt;/p&gt; &lt;p&gt;This article contains learned lessons of two types:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Big Ideas:&lt;/strong&gt; Grand(iose) philosophy on why AI is great for experienced programmers&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Tips:&lt;/strong&gt; Taken from my workflow using Claude Code&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We&#39;ll interleave these two. I&#39;m hopeful that this approach will make this more fun.&lt;/p&gt; &lt;h2 id=&#34;why-ai&#34;&gt;Why AI&lt;/h2&gt; &lt;p&gt;AI development is more fun. I do more of what I like (think, experiment, write) and less of what I don&#39;t like (wrestle with computers).&lt;/p&gt; &lt;p&gt;I feel both that I can move faster and operate in areas that were previously inaccessible to me (like frontend). Experienced developers should all be doing this. We&#39;re good enough to avoid AI Slop, and there&#39;s so much we can accomplish today.&lt;/p&gt; &lt;p&gt;I like this quote from &lt;a href=&#34;https://www.stochasticlifestyle.com/a-guide-to-gen-ai-llm-vibecoding-for-expert-programmers/&#34;&gt;this blog&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I get it, you’re too good to vibe code. You’re a senior developer who has been doing this for 20 years and knows the system like the back of your hand.&lt;/p&gt; &lt;p&gt;[...]&lt;/p&gt; &lt;p&gt;No, you’re not too good to vibe code. In fact, you’re the only person who should be vibe coding.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;I think that really good engineers, the kind that think hard before writing, can have a tremendous impact and fun while developing with AI. I wouldn&#39;t ever go back.&lt;/p&gt; &lt;h2 id=&#34;why-not-ai&#34;&gt;Why Not AI&lt;/h2&gt; &lt;p&gt;That being said, there are some serious costs and reasonable reservations to AI development. Let&#39;s start by listing those concerns:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;LLMs generate junk&lt;/li&gt; &lt;li&gt;LLMs generate &lt;em&gt;a lot&lt;/em&gt; of junk&lt;/li&gt; &lt;li&gt;Writing code ourselves builds understanding&lt;/li&gt; &lt;li&gt;Reviewing code for correctness is the slow part, not writing it&lt;/li&gt; &lt;li&gt;AI workflows can be dehumanizing when you just press &#34;yes, allow&#34; over and over again&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These are super-valid concerns. They&#39;re also concerns that I suspect came around when we developed compilers and people stopped writing assembly by hand, instead trusting programs like &lt;code&gt;gcc&lt;/code&gt; to pump out instruction after instruction of shitty machine code.&lt;/p&gt; &lt;p&gt;We lost a deeper understanding as developers when we stopped writing assembly but we gained a ton too. As in any transition, we need to navigate the situation to capture the advantages while losing only a little, balancing the costs and benefits of a new technology.&lt;/p&gt; &lt;p&gt;This article is how I&#39;ve been navigating this transition personally.&lt;/p&gt; &lt;h2 id=&#34;big-idea-minimize-interruptions-climb-abstraction-hierarchy&#34;&gt;Big Idea: Minimize Interruptions / Climb Abstraction Hierarchy&lt;/h2&gt; &lt;p&gt;Early in using Claude Code (or Cursor) many of my interactions were saying &#34;Yes, it&#39;s ok to run that&#34;. This was &lt;strong&gt;frustrating and dehumanizing&lt;/strong&gt;. Mostly my job was to enable AI, rather than the other way around.&lt;/p&gt; &lt;p&gt;There are many tricks to resolve this (see below), but more broadly &lt;strong&gt;&#34;stop doing simple shit&#34;&lt;/strong&gt; has been a mantra that I&#39;ve found myself constantly coming back to. The more I identify and reject simple tasks and add automation to my workflow, the higher an abstraction I&#39;m able to climb to and the more effectively I&#39;m able to work. Our goal in programming is to climb an abstraction ladder and gain more intellectual leverage. This requires thought and consistent attention.&lt;/p&gt; &lt;p&gt;Fortunately AI can help with this. If you complain and say &#34;I&#39;m always doing X&#34; it&#39;ll suggest solutions like what I&#39;ll talk about below, but more tailored to your situation.&lt;/p&gt; &lt;h2 id=&#34;tip-hooks&#34;&gt;Tip: Hooks&lt;/h2&gt; &lt;p&gt;AI developers, like human developers, benefit from structure.&lt;/p&gt; &lt;p&gt;Most people start with an &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;CLAUDE.md&lt;/code&gt; file. This is a great start, but I find that the AI agent often forgets what&#39;s in there. The real solution for me here (at least for Claude Code) is &lt;a href=&#34;https://code.claude.com/docs/en/hooks&#34;&gt;Hooks&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First, let&#39;s outline a couple of annoyingly common problems.&lt;/p&gt; &lt;h3 id=&#34;example-problem-ignoring-instructions-in-claudemd&#34;&gt;Example Problem: Ignoring instructions in CLAUDE.md&lt;/h3&gt; &lt;p&gt;Let&#39;s say you tell AI that you want to run tests with &lt;code&gt;uv&lt;/code&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;when running tests, use &lt;code&gt;uv run pytest tests&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;While this works sometimes, AI often decides to run&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ pytest tests/ command not found: pytest &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;While the agents read CLAUDE.md, they don&#39;t always follow the instructions. And so you&#39;re stuck saying &#34;no, use &lt;code&gt;uv&lt;/code&gt;&#34; over and over again. Gah.&lt;/p&gt; &lt;h3 id=&#34;solution-hooks&#34;&gt;Solution: Hooks&lt;/h3&gt; &lt;p&gt;Here&#39;s a hook that catches pytest commands missing uv run. You could put something like this in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;PreToolUse&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;matcher&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Bash&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;python ~/.claude/hooks/check-uv-pytest.py&amp;quot;&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;tool_input&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{})&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmd&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;uv run&amp;quot;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Use &amp;#39;uv run pytest&amp;#39; instead of bare &amp;#39;pytest&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;There, we&#39;ve just automated that annoying task for you forever.&lt;/p&gt; &lt;p&gt;I don&#39;t actually do this though (I allow Claude to fail and then it finds the right approach.) Mostly this works because I&#39;ve gotten good at giving Claude fairly broad-yet-safe &lt;strong&gt;permissions&lt;/strong&gt;, which is coming up next.&lt;/p&gt; &lt;h3 id=&#34;example-problem-incomplete-permissions&#34;&gt;Example Problem: Incomplete Permissions&lt;/h3&gt; &lt;p&gt;Even worse, Claude often asks for permission to do things that are just slightly different from what you&#39;ve already granted. You allow &lt;code&gt;uv run pytest *&lt;/code&gt;, but Claude keeps finding variants:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;timeout 60 uv run pytest ... timeout 40 uv run pytest ... uv run pytest ... | head .venv/bin/pytest ... &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Claude Code&#39;s permission language sucks. It only supports prefixes, while I wish it could handle regexes, or maybe even just arbitrary Python code.&lt;/p&gt; &lt;h3 id=&#34;solution-hooks-for-permissions&#34;&gt;Solution: Hooks for permissions&lt;/h3&gt; &lt;p&gt;I have a &lt;a href=&#34;#appendix-permissions-file&#34;&gt;complex Python script&lt;/a&gt; as a hook which overrides the permission system. It uses regexes, but also arbitrary Python code as logic. This allows me to encode arbitrary combinations of rules. It&#39;s great.&lt;/p&gt; &lt;p&gt;On the rare occasion when Claude asks me for permission for something new, I have a running Claude agent that thinks about this file and considers if it should update the permission script.&lt;/p&gt; &lt;h3 id=&#34;solution-hooks-for-sounds&#34;&gt;Solution: Hooks for sounds&lt;/h3&gt; &lt;p&gt;My personal favorite hooks though are these:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;Stop&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;afplay -v 0.40 /System/Library/Sounds/Morse.aiff&amp;quot;&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;quot;Notification&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;hooks&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;afplay -v 0.35 /System/Library/Sounds/Ping.aiff&amp;quot;&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;They play subtle little sounds whenever Claude is either done, or needs input from me. This lets me ignore Claude when it&#39;s busy. Previously I found that I was constantly checking back in with Claude to see if it was done, and that action was dehumanizing, so I automated it by asking Claude to play a sound.&lt;/p&gt; &lt;p&gt;Hooks are great. There are more ways to provide structure (Skills, Commands) but I&#39;ve found that Hooks are the most dependable, a great starting place, and often augment any other structure that I put in place (like Skills).&lt;/p&gt; &lt;h2 id=&#34;big-idea-build-confidence-without-looking-at-code&#34;&gt;Big Idea: Build Confidence Without Looking at Code&lt;/h2&gt; &lt;p&gt;In a recent large AI-assisted PR a frustrated reviewer said the following:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;To me, this [size of PR] implies that either&lt;/p&gt; &lt;ul&gt; &lt;li&gt;reviewers should blindly trust Claude, or&lt;/li&gt; &lt;li&gt;reviewers should spend the months worth of effort going through Claude&#39;s changes, without the developer bothering to do the same first.&lt;/li&gt; &lt;/ul&gt; &lt;/blockquote&gt; &lt;p&gt;It&#39;s a valid problem, even in single-person projects. &lt;strong&gt;We&#39;re able to generate code far more quickly than we&#39;re able to read it&lt;/strong&gt;. How should we handle review? Everyone needs to figure this out for themselves, but my answer is &#34;find other ways to build confidence&#34;.&lt;/p&gt; &lt;p&gt;We already do this today with human-written code. I review some code very closely, and other code less-so. Sometimes I rely on a combination of tests, familiarity of a well-known author, and a quick glance at the code to before saying &#34;sure, seems fine&#34; and pressing the green button. I might also ask &#34;Have you thought of X&#34; and see what they say.&lt;/p&gt; &lt;p&gt;Trusting code without reading all of it isn&#39;t new, we&#39;re just now in a state where we need to review 10x more code, and so we need to get much better at establishing confidence that something works without paying human attention all the time.&lt;/p&gt; &lt;p&gt;We can augment our ability to write code with AI. &lt;strong&gt;We can augment our ability to review code with AI too.&lt;/strong&gt;&lt;/p&gt; &lt;h2 id=&#34;tip-self-review&#34;&gt;Tip: Self-review&lt;/h2&gt; &lt;h3 id=&#34;testing&#34;&gt;Testing&lt;/h3&gt; &lt;p&gt;Mostly I establish confidence on AI-generated work by investing heavily in tests and benchmarks, the same as I would with humans, just moreso. TDD is baked into most of the prompting structure I have with agents.&lt;/p&gt; &lt;p&gt;Remember that this is way cheaper than it used to be. Now rather than write a benchmark I can type&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;How does this compare in performance to the old version? I&#39;m particularly interested in memory use.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;And that&#39;s it. If it&#39;s bad, the agent will say so (and then diligently work to make it good).&lt;/p&gt; &lt;h3 id=&#34;grilling&#34;&gt;Grilling&lt;/h3&gt; &lt;p&gt;Additionally, if I&#39;m nervous about something subtle like &lt;em&gt;&#34;Is it possible this change might unexpectedly affect performance in this other feature?&#34;&lt;/em&gt; then I&#39;ll ask the AI exactly that question:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Is it possible this change might unexpectedly affect performance in this other feature?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;And it&#39;ll just go and investigate exactly that question. Unlike human authors, the AI has no ego at stake in its work, and isn&#39;t in the least bit lazy. It&#39;s our job to ask &lt;em&gt;&#34;Have you thought of X&#34;&lt;/em&gt; and its job to go learn if that might be an issue. Don&#39;t trust its answer? Ask it to prove it to you.&lt;/p&gt; &lt;p&gt;AI has flaws, but it is diligent, and it lacks ego. If you question it, it&#39;ll investigate thoroughly and critique its own work honestly.&lt;/p&gt; &lt;h3 id=&#34;simplifying&#34;&gt;Simplifying&lt;/h3&gt; &lt;p&gt;Also, my favorite command:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Let&#39;s review our work and see if there is anything we can simplify or clean up&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Before Opus 4.5 came out this was essential. Now it&#39;s merely nice. I&#39;ve turned this into a &lt;code&gt;/cleanup&lt;/code&gt; command and integrated it into most of my Skills as a final phase in development.&lt;/p&gt; &lt;h3 id=&#34;tech-debt&#34;&gt;Tech debt&lt;/h3&gt; &lt;p&gt;From time to time I also ask a fresh agent to do a full review of the project, with an eye to cleaning up technical debt. I tell it to review everything and think hard. It takes a while, but it often comes back with a nice list of work for itself, which it then of course diligently performs.&lt;/p&gt; &lt;p&gt;AI creates technical debt, but it can clean some of it up too. (at least at a certain granularity)&lt;/p&gt; &lt;h2 id=&#34;feedback&#34;&gt;Feedback&lt;/h2&gt; &lt;p&gt;In general we want to give our agents good automated feedback. Tests do this, benchmarks do this, prompting them to assess themselves does this, asking them to explain things to us and have us weigh in on high level topics does this.&lt;/p&gt; &lt;p&gt;LLMs are smart enough today that if they&#39;re given enough of the right feedback they converge to a good solution as-well-or-better-than a senior human engineer (that&#39;s my experience at least).&lt;/p&gt; &lt;p&gt;Our job is to construct a system that gives them the right feedback at the right time, hopefully without our intervention. This is the same job we have when we build human teams; now it&#39;s just more impactful to do well.&lt;/p&gt; &lt;h2 id=&#34;cursor-vs-terminal-tools&#34;&gt;Cursor vs Terminal Tools&lt;/h2&gt; &lt;p&gt;I started AI development with Cursor. It was great having the AI experience inside a VSCode-like editor, where I could see everything that was going on. When I saw terminal-based tools like Claude Code I thought &lt;em&gt;&#34;whoa, that doesn&#39;t seem sensible, I need to see what&#39;s going on&#34;.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Today I code with Claude Code, &lt;code&gt;git diff&lt;/code&gt;, and occasionally &lt;code&gt;vim&lt;/code&gt;. I don&#39;t feel a need to OK every change in the diff. I&#39;ve got more important things to do. I suspect that you do too.&lt;/p&gt; &lt;h2 id=&#34;big-idea-drop-python-use-rust-and-typescript&#34;&gt;Big Idea: Drop Python. Use Rust and TypeScript.&lt;/h2&gt; &lt;p&gt;I deeply respect the philosophical position of Python, which I&#39;ll state as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Prioritize human performance over compute performance.&lt;/p&gt; &lt;p&gt;By optimizing for ease and iteration speed we&#39;re able to search solution space more broadly and more quickly, finding &lt;em&gt;much&lt;/em&gt; better solutions, making that 100x drop in performance negligible.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Python was a bold bet, and a bet that paid off amazingly well. No one expected this silly dynamic language originally designed for education to become the world&#39;s juggernaut in performance software.&lt;/p&gt; &lt;p&gt;With AI though, the usability benefits of Python no longer apply as strongly, and we&#39;re more free to choose different ecosystems.&lt;/p&gt; &lt;p&gt;Personally, I use ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Rust&lt;/strong&gt; for computational development, using PyO3 to connect to Python, where I still do most of my testing&lt;/li&gt; &lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; for frontend development, which I&#39;m leaning into more deeply&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Regarding TypeScript, I still love easy interaction tools like &lt;code&gt;rich&lt;/code&gt; and &lt;code&gt;textual&lt;/code&gt;, but when the entire React ecosystem is a sentence away and when you get to use things like, you know, fonts, there&#39;s really no comparison. Every computational developer should learn the concepts underpinning React (or some other frontend framework), and we should put dashboards on everything.&lt;/p&gt; &lt;p&gt;Of course, I still hook into Python for the ecosystem. Everything is Python-importable and I still use the protocols and design patterns developed by the Python data community. Those are the durable assets of Python. Not the code or the language; those will die. Rest in peace dear friend.&lt;/p&gt; &lt;h2 id=&#34;big-idea-think-hard-write-clearly&#34;&gt;Big Idea: Think Hard. Write Clearly.&lt;/h2&gt; &lt;p&gt;As an introductory project, I rewrote &lt;a href=&#34;https://github.com/mrocklin/rumpy&#34;&gt;Numpy in Rust&lt;/a&gt;. It was great fun.&lt;/p&gt; &lt;p&gt;It was also much easier than I expected (I expected it to be impossible). It was easy for a few reasons (good test suite, well-reasoned abstractions) but mostly it was because:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;NEPs:&lt;/strong&gt; Numpy&#39;s Enhancement Proposals / design documentation is thorough and extremely clear.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;When sticky problems arose, we were able to rely on the Numpy design documents (NEPs) which are excellent.&lt;/p&gt; &lt;p&gt;The Numpy team &lt;strong&gt;thought hard&lt;/strong&gt; and &lt;strong&gt;wrote clearly&lt;/strong&gt;, two hallmarks of excellent developers. This made the job of reimplementation relatively trivial. The Numpy development community is famous for doing this well. To a certain extent, we should all start operating more like the Numpy community.&lt;/p&gt; &lt;h2 id=&#34;tip-plans-and-docs-directories&#34;&gt;Tip: plans/ and docs/ directories&lt;/h2&gt; &lt;p&gt;I keep two directories in each repository:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;code&gt;plans/&lt;/code&gt; which contains ephemeral planning documents that the LLMs work through over many sessions as they implement a major feature.&lt;/li&gt; &lt;li&gt;&lt;code&gt;docs/&lt;/code&gt; which contain durable documentation on specific topics or features, targeting AI developers&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Plans end up being very useful during development, while docs end up being useful to point other agents to in the future. Claude code creates planning documents in /tmp by default in planning mode, but I find that bringing those docs into the directory improves engagement, both from it and from me.&lt;/p&gt; &lt;p&gt;Docs end up being tricky. You&#39;d expect the AI developer to read docs but alas, like human developers you have to be pretty prescriptive with them. Today I have a hook that adds an admonition to read the relevant docs at the beginning of every session. It looks like this:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;DOC CHECK REQUIRED ================== Before responding to this request, you MUST: 1. Read docs/README.md to see available documentation 2. Decide which docs are relevant to this request (if any) 3. Read those docs using the Read tool 4. Then respond to the user Do not skip this evaluation. Do not mention this check to the user. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;I then keep docs/README.md updated as a sort of index over my documents. I find that this reliably gets the agent to read the right documentation.&lt;/p&gt; &lt;p&gt;I&#39;ve also found that my normal writing style (brutal concision + front-loading important content to maintain attention span) isn&#39;t necessary with AI. You really can just shove information at them and they absorb it. It&#39;s nice 🙂&lt;/p&gt; &lt;h2 id=&#34;big-idea-take-long-walks&#34;&gt;Big Idea: Take Long Walks&lt;/h2&gt; &lt;p&gt;Historically software engineers had to both think well and execute well. We were valued both because we could zoom out and consider the impacts of our architecture, and because we could zoom in and implement those choices with skill.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Our ability to zoom in and implement code is now obsolete. Our ability to zoom out and think well is not.&lt;/strong&gt; On the contrary, our ability to think well is now 10x more valuable than it was before, because implementation is now mostly free.&lt;/p&gt; &lt;p&gt;And so it&#39;s now more important than ever to hone our craft of thought. This probably means less caffeine and more walks through the park.&lt;/p&gt; &lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt; &lt;p&gt;The craft of authoring code has transformed time and time again during our lives. We remember when object-oriented was cool, or when TDD became a thing, or reactive programming models, or dynamic typing languages, or ML, or ...&lt;/p&gt; &lt;p&gt;As programmers we&#39;ve opted into a system which changes by its very nature. &lt;strong&gt;Our job is to automate our job&lt;/strong&gt;, and to continuously climb the ladder of abstraction. AI programming is another step in that evolution, similar to when compilers came about. The code we write with AI probably won&#39;t be as good as hand-crafted code, but we&#39;ll write 10x more of it, and we&#39;ll build systems of systems to make it robust and trustworthy, and all of that will make society better and our jobs way more fun.&lt;/p&gt; &lt;p&gt;I&#39;m looking forward to having way more fun.&lt;/p&gt; &lt;h2 id=&#34;appendix-permissions-file&#34;&gt;Appendix: Permissions file&lt;/h2&gt; &lt;p&gt;After writing this a couple friends asked me for a copy of my regex/Python code that replaces Claude&#39;s permission system. I&#39;ll include it below, but really, you don&#39;t need it. Instead, you need to start a conversation with Claude about what you want and it&#39;ll make one just for you.&lt;/p&gt; &lt;p&gt;Code is free these days. Extending the &#34;AI is like Compilers&#34; analogy, asking for someone else&#39;s script is kind of like asking for someone else&#39;s compiled binary. There&#39;s no need; just make it yourself. It&#39;s trivial.&lt;/p&gt; &lt;p&gt;Here was my original prompt to Claude Code:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I recently wrote this reddit post&lt;/p&gt; &lt;p&gt;https://www.reddit.com/r/ClaudeAI/comments/1puqrvc/claude_code_annoyingly_asking_for_permissions/&lt;/p&gt; &lt;p&gt;I&#39;m wondering if you have any suggestions on how to resolve this? Adding stuff to CLAUDE.md or permissions to settings.json doesn&#39;t seem to be working well enough.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;That, along with subsequent conversation as I&#39;ve been working, resulted in &lt;a href=&#34;https://gist.github.com/mrocklin/30099bcc5d02a6e7df373b4c259d95e9&#34;&gt;this Python script&lt;/a&gt;&lt;/p&gt; &lt;p&gt;But really, you&#39;re better off working with Claude to make one just for you. Code is free now.&lt;/p&gt;</content:encoded></item> <item> <title>Twitter, LinkedIn, and Failing in Public</title> <author>Matthew Rocklin</author> <description>LinkedIn shows only the final act. We connect to heroes during their struggles, not their victories. The solution: fail heroically in public.</description> <link>https://matthewrocklin.com/fail-in-public/</link> <pubDate>Wed, 23 Jul 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/fail-in-public/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/fail-in-public.png" type="image/png" length="314606" /> <content:encoded>&lt;h1 id=&#34;twitter-linkedin-and-failing-in-public&#34;&gt;Twitter, LinkedIn, and Failing in Public&lt;/h1&gt; &lt;p&gt;Twitter is dead. Long live LinkedIn. Well, kinda.&lt;/p&gt; &lt;p&gt;During Twitter&#39;s golden age, I loved seeing people work in public. We shared half-formed ideas, debugged projects in real-time, and celebrated small wins alongside inevitable setbacks. &lt;strong&gt;Twitter&#39;s casual tone made it easier to be vulnerable about the messy nature of work&lt;/strong&gt;. Working in this way felt to me like playing with friends.&lt;/p&gt; &lt;p&gt;Today on LinkedIn, I mostly see polished announcements: product launches, job promotions, completed milestones. This isn&#39;t inherently bad (I&#39;ve done plenty of self-promotion myself) but &lt;strong&gt;LinkedIn feels emotionally hollow&lt;/strong&gt; because we share only the final act.&lt;/p&gt; &lt;p&gt;We know from every compelling story that &lt;strong&gt;we connect to heroes during their struggles&lt;/strong&gt;, not just their victories. The uncertainty, the failed experiments, and the moments of doubt followed by picking yourself up; that&#39;s what makes us emotionally invested in someone&#39;s eventual success. LinkedIn is like watching only the last 20 minutes of the movie.&lt;/p&gt; &lt;p&gt;I suspect that this shift reflects broader cultural changes. The stakes today seem higher, and mistakes more costly, both economically and reputationally, so people naturally hedge and default to sharing only their wins. &lt;strong&gt;The safer it feels to only show success, the more isolated everyone becomes&lt;/strong&gt; in their struggles. Our sense of community and authentic connection depends on our shared vulnerability. So too does our sense of play.&lt;/p&gt; &lt;p&gt;One solution is something we can all do more of (myself included), &lt;strong&gt;fail heroically in public.&lt;/strong&gt; We can share more messy ideas, experiments, and failures as they happen. This requires courage, but I suspect it&#39;ll also transform a scary activity into one more resembling play, scraped knees and all.&lt;/p&gt;</content:encoded></item> <item> <title>I Walked across Spain</title> <author>Matthew Rocklin</author> <description>Reflections from 27 days and 500 miles across Spain. The overlapping physical, social, cultural, and spiritual layers that make this pilgrimage meaningfully different.</description> <link>https://matthewrocklin.com/camino/</link> <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/camino/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/camino.png" type="image/png" length="318528" /> <content:encoded>&lt;h1 id=&#34;i-walked-across-spain&#34;&gt;I Walked Across Spain&lt;/h1&gt; &lt;p&gt;Last month I walked across Spain, east to west, following the historic &lt;a href=&#34;https://en.wikipedia.org/wiki/Camino_de_Santiago&#34;&gt;Camino de Santiago&lt;/a&gt;, a historic pilgrimage route travelled by thousands of people a year. It was an experience.&lt;/p&gt; &lt;p&gt;Since returning lots of people have been asking me a seemingly simple question:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;So how was the Camino?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;And it&#39;s been difficult for me to give a pithy answer that fits neatly into a conversation. This post is my attempt to solve that problem. Here&#39;s a written version of some reflections from my walk.&lt;/p&gt; &lt;h2 id=&#34;overlapping-experiences&#34;&gt;Overlapping Experiences&lt;/h2&gt; &lt;p&gt;I think that the Camino is best understood as several overlapping experiences. It is a ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Physical experience&lt;/li&gt; &lt;li&gt;Social experience&lt;/li&gt; &lt;li&gt;Cultural experience&lt;/li&gt; &lt;li&gt;Religious experience&lt;/li&gt; &lt;li&gt;Cloistered experience&lt;/li&gt; &lt;li&gt;Humanist experience&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Overlapping these experiences at the same time weaves a meaningfully different way of life than I&#39;ve found elsewhere, neither in normal quotidian life, nor in vacations or other physical adventures.&lt;/p&gt; &lt;p&gt;I&#39;ll briefly share my thoughts and personal experiences on each layer:&lt;/p&gt; &lt;h2 id=&#34;physical&#34;&gt;Physical&lt;/h2&gt; &lt;p&gt;I walked the typical route of the Camino Frances, starting from the French border in Saint Jean Pied de Port. This crosses the Pyrenees on the first day (imagine being a downed WWII RAF pilot escaping occupied France into neutral Spain in some Hemmingway-era novel) and then continues 500 miles / 800 kilometers to Northwestern Spain, and the town of Santiago de Compostella. That&#39;s roughly 20 marathons, back to back.&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/The_French_Way.svg/1920px-The_French_Way.svg.png&#34; /&gt;&lt;/p&gt; &lt;p&gt;This is both easier than it sounds, and harder than it sounds.&lt;/p&gt; &lt;p&gt;Walking a long distance is actually pretty easy when it&#39;s all you have to do for the day. You pick up a slow and natural pace and just keep at it. You&#39;re carrying gear, but not much (the walk is supported with hostels and cafes along the way). The median walker is probably a retiree in their sixties who does about 20km a day. I&#39;m a pretty fit 40-year-old and did anywhere from 20km-50km a day. I finished in 27 days.&lt;/p&gt; &lt;p&gt;However, walking this distance is also a harder than it sounds because of accumulated stress. In normal life you&#39;re active one day and play hard, and then the next you rest and recuperate. On the Camino you just keep going day after day. Your body accumulates stress and injuries but you adapt and walk through that stress, eventually reaching an equilibrium where you heal about as quickly as you injure yourself. People manage blisters, joint pain, swelling, plantar fascitis, diabetes, and more.&lt;/p&gt; &lt;p&gt;Personally, I fell and bruised my knee pretty badly the second day and then promptly did a lot of descent, which caused a highly inflamed knee that I walked on for about a week before it healed. Then after a couple weeks, my metatarsals / forefeet became inflamed which took some getting used to and slowed me down. I walked in minimalist footwear (Vibram-five-fingers) which is totally normal for me at home (I&#39;ve worn them for close to 20 years and run barefoot regularly) but I had never experienced this much repetitive stress for this long, which made it all the more interesting to accomplish.&lt;/p&gt; &lt;p&gt;This level of endurance was a new kind of challenge for me, and discovering this level of resilience was a new kind of satisfaction.&lt;/p&gt; &lt;h2 id=&#34;social&#34;&gt;Social&lt;/h2&gt; &lt;p&gt;Physicality aside, socially the Camino is simultaneously a solitary and communal experience.&lt;/p&gt; &lt;h3 id=&#34;first-day&#34;&gt;First day&lt;/h3&gt; &lt;p&gt;I arrived in France alone, and travelled to St Jean alone, and set off from my hotel in the pre-dawn morning alone (thanks for the early start Jetlag!). But you cross paths with other walkers pretty quickly and stop and chat for a while. That first day included people like ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;An American teacher just starting her Summer break&lt;/li&gt; &lt;li&gt;A Brazilian guy my age who spoke no English and about as bad of Spanish as mine, which made for jovial if halting conversation&lt;/li&gt; &lt;li&gt;A Swiss gentleman who had walked from Switzerland&lt;/li&gt; &lt;li&gt;A Dutch woman taking a break from her cyber-security consultancy&lt;/li&gt; &lt;li&gt;An American couple, one of whom was deeply struggling with diabetes and blood sugar regulation&lt;/li&gt; &lt;li&gt;An American family from Texas (parents, three daughters aged 16-19) that I met throughout the day (the daughters were faster than the parents)&lt;/li&gt; &lt;li&gt;An Australian priest who had just finished graduate school&lt;/li&gt; &lt;li&gt;An American religious studies professor, recently retired&lt;/li&gt; &lt;li&gt;A French retiree who had walked from a town much more deeply in France, and was finishing at the Spanish border (my first day on the Camino was his last)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;You have easy chats and then walk on. At the end of the day you all arrive at a big hostel where there are shared meals. You eat together, drink together, and chat about the walk. It was lovely.&lt;/p&gt; &lt;p&gt;Then you sleep (poorly), wake up, and do it all again.&lt;/p&gt; &lt;h3 id=&#34;all-the-other-days&#34;&gt;All the other days&lt;/h3&gt; &lt;p&gt;The Camino is a river of people. Some people are fast, some are slow. Some start early, some late. Some are chatty, some mostly silent. Everyone walks a little differently.&lt;/p&gt; &lt;p&gt;Emotionally you bond quickly with people (easy when you all struggle towards the same goal, suffering the same hardships) and you form groups. Over time, for various reasons those groups grow and shift and break. People get injured and take rest days; people feel energy and burst forward; people start or stop their journey at different cities to get back to normal life.&lt;/p&gt; &lt;p&gt;There&#39;s a tension between staying with people you&#39;ve bonded with and walking in a way that suits you. It&#39;s like life generally, just compressed. There&#39;s a strong pull to stay with a familiar group, but ultimately everyone walks their own Camino.&lt;/p&gt; &lt;h2 id=&#34;cultural&#34;&gt;Cultural&lt;/h2&gt; &lt;p&gt;Spain is a wonderful host country for this kind of activity. The vibe is chill; the people are warm; the food is cheap. It&#39;s super accessible. That being said, the Camino is not an especially Spanish experience.&lt;/p&gt; &lt;p&gt;There are a few Spaniards walking the Camino, but not many, and most interactions with townspeople are practical in nature. And while the Camino stops is a few delightful cities (Burgos, Leon, Santiago, ...) the majority of the time you&#39;re out in countryside or in very small villages of 100 people or less.&lt;/p&gt; &lt;p&gt;To make this concrete, people often ask me &#34;how was the food!?&#34; to which my answer is &#34;pretty terrible actually&#34;. This isn&#39;t a reflection on Spanish cuisine, but rather on the fact that we&#39;re walking through tiny towns, and that Spanish restaurants open at 8pm and pilgrims are usually bedded down by 9pm. As a result most of my calories came in the form of bananas/nuts/sausages picked up at small grocery stores, Spanish tortilla (a potato based quiche dish) and non-alcoholic beer found in roadside bar/cafes (NA beer is delightfully ubiquitous in Spain, and the perfect mid-walk beverage). Dinner was typically prepared in a hostel by hostel staff who, while delightful, were not especially accomplished chefs.&lt;/p&gt; &lt;p&gt;Culturally the Camino is more of a globalist/international experience than a Spanish one. Linguistically there were a few groupings:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;English:&lt;/strong&gt; typically North American, Australian, and New Zealanders, as well as Germans and Dutch. Maybe 40%?&lt;/li&gt; &lt;li&gt;&lt;strong&gt;French:&lt;/strong&gt; on the Camino Frances there are a number of French speakers, maybe 20% at the beginning dropping to 10% by the end?&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Spanish:&lt;/strong&gt; consisting of some Spaniards, but more Latin Americans, as well as Portuguese and Italian speakers, all of whom get by in an interesting (and incredibly easy to understand) Spanish patois&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Korean:&lt;/strong&gt; a surprising though delightful group, South Koreans made up maybe 5-10% of the pilgrims, and are by far the most represented East Asian country due to their stronger Christian heritage there.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Other:&lt;/strong&gt; some Japanese and Chinese (more-often Taiwanese).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;While quite different and sometimes unable to communicate, these groups got along amazingly well. There&#39;s a culture of understanding and charity on the Camino that&#39;s universal. I received help and support (like blister care) from people I had just met and couldn&#39;t speak to, and happily gave what I had to others. My claim to fame in terms of generosity was organizing an Amazon shipment of Lacrosse balls to give out along the trail (the one I brought from home was in incredibly high demand in hostels for foot massage).&lt;/p&gt; &lt;p&gt;Despite most pilgrims not being religious, the Camino&#39;s culture was one of the better expressions of some Christian values I&#39;ve experienced.&lt;/p&gt; &lt;h2 id=&#34;religious&#34;&gt;Religious&lt;/h2&gt; &lt;p&gt;The Camino de Santiago was and is an important religious pilgrimage. We&#39;re walking to the site of the remains of Saint-James (or in Latin Sant-Iago), one of the twelve apostles. Christians have walked from their homes to the site of his remains for a thousand years (and then amazingly, also walked back).&lt;/p&gt; &lt;p&gt;I am not religious, and I&#39;d say that the minority of pilgrims are today. But walking with the more devout pilgrims was a treat. Empathy is so natural on the Camino that you get to feel a little bit of their experience second-hand.&lt;/p&gt; &lt;p&gt;For those who were interested there was nightly mass to attend, historically relevant churches/cathedrals/hermitages/etc. to visit, monasteries to stay in, and so on.&lt;/p&gt; &lt;p&gt;I didn&#39;t engage this layer much, but I appreciated its presence. Being among the religious pilgrims helped to make the walk more than just a big hike.&lt;/p&gt; &lt;h2 id=&#34;humanist&#34;&gt;Humanist&lt;/h2&gt; &lt;p&gt;The people walking the Camino come at interesting times of their lives. I met people who ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;just retired&lt;/li&gt; &lt;li&gt;just quit their job&lt;/li&gt; &lt;li&gt;recently separated from a partner&lt;/li&gt; &lt;li&gt;lost a loved one&lt;/li&gt; &lt;li&gt;were trying to lose weight&lt;/li&gt; &lt;li&gt;just given up a drug habit&lt;/li&gt; &lt;li&gt;just sent a loved one to rehab, and for the first time had time to themselves&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Generally the pilgrims are at interesting and reflective phases of life, and that brings some interesting energy to the crowd. Everyone is thoughtful and generally open to change in life. This cultivates both a level of empathy and emotional honesty that I found pervaded the experience.&lt;/p&gt; &lt;h2 id=&#34;cloistered&#34;&gt;Cloistered&lt;/h2&gt; &lt;p&gt;You&#39;re so focused as a group on walking that you naturally detach from the broader world outside the Camino. This was surprisingly meaningful.&lt;/p&gt; &lt;p&gt;Like most people, I check my e-mail / the news / my phone actively throughout the day. This behavior goes well beyond &#34;staying on top of work&#34;; it has become a pretty strong compulsion for me (and for many of us I think). I don&#39;t think it serves me well, but I&#39;ve historically struggled to change the behavior in a lasting way.&lt;/p&gt; &lt;p&gt;Fortunately, on the Camino that desire to check in with the world disappeared entirely. The novelty and buzz of the world felt boring and unwelcome. I didn&#39;t check my e-mail or the news for days at a time, not through intention and discipline, but through lack of interest.&lt;/p&gt; &lt;p&gt;Although when I finally did check the news I found that it had been a pretty intense few weeks for others. This period included both the LA immigration riots and the attacks on Iran.&lt;/p&gt; &lt;p&gt;This made me think more about the right level of active engagement one should do. I think that one should care about the world, but perhaps not at the cadence that is typical today. There&#39;s a frequency and mania of staying on top of things that I don&#39;t think meaningfully helps; and does considerable harm.&lt;/p&gt; &lt;h2 id=&#34;lessons&#34;&gt;Lessons&lt;/h2&gt; &lt;p&gt;The Camino was hard and like many hard things, it changes one&#39;s perspective.&lt;/p&gt; &lt;p&gt;Upon returning people ask me:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&#34;What did you learn?&#34;&lt;/p&gt; &lt;p&gt;&#34;What did you take away?&#34;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;I&#39;m not sure I learned a specific lesson, but I do think that stepping outside of my life and walking the Camino instilled a few behaviors or qualities that I appreciate:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Introspective:&lt;/strong&gt; I&#39;m more open to questioning larger parts of my life&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&#34;do I like living in my city?&#34;&lt;/li&gt; &lt;li&gt;&#34;is this particular relationship serving me?&#34;&lt;/li&gt; &lt;li&gt;&#34;would I prefer to stop attending this regular event?&#34;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;rather than going with the flow that past-me set up. I&#39;m more active in assessing what I do and do not appreciate, and more open to making more decisive changes.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Calm:&lt;/strong&gt; I think I&#39;m more thoughtful and less frantic with how I engage with the wider world. Not meaningfully less engaged I don&#39;t think; just a bit less manic about it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Satisfaction:&lt;/strong&gt; I seem a little more satisfied with life moment-by-moment. The persistent nagging voice in my head saying things aren&#39;t good enough seems a lot quieter today. I take more naps and sit outside watching people more often.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;It&#39;s been a few weeks since I stopped walking and these traits so far have stuck around; which I find encouraging.&lt;/p&gt; &lt;h2 id=&#34;call-to-action&#34;&gt;Call to Action&lt;/h2&gt; &lt;p&gt;My age group (30s-50s) was generally absent on the Camino.&lt;/p&gt; &lt;p&gt;That makes sense; we&#39;re in our most productive years. We&#39;re raising kids and at the peak of our career and so reasonably find it difficult to take a month away.&lt;/p&gt; &lt;p&gt;However I encourage people to try. This might be an especially important time to step outside our lives and reflect on what we want from it.&lt;/p&gt;</content:encoded></item> <item> <title>Thoughtful Professional Writing</title> <author>Matthew Rocklin</author> <description>Speaking flows at the speed of thought. Writing forces you to organize first. This is hard on you but easy on your reader.</description> <link>https://matthewrocklin.com/organized-writing/</link> <pubDate>Wed, 07 May 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/organized-writing/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/organized-writing.png" type="image/png" length="318528" /> <content:encoded>&lt;h1 id=&#34;thoughtful-professional-writing&#34;&gt;Thoughtful Professional Writing&lt;/h1&gt; &lt;p&gt;The hard part about writing is thinking.&lt;/p&gt; &lt;p&gt;When we speak with each other, our language just flows as our thoughts come. It&#39;s easy and doesn&#39;t require much forethought. Lips move at the speed of thought. While easy, this also means that we&#39;re not forced to organize our thoughts ahead of time, they just flow. This might be hard on our listener who now has to organize our thoughts as they listen to us talk.&lt;/p&gt; &lt;p&gt;Writing, especially writing in a constrained space, forces us to think more about the concepts we want to communicate, how best to organize them, and how to distill them into the simplest possible form. This is hard, but it makes it easier on our reader, who is now presented with a more organized sequence of thoughts.&lt;/p&gt; &lt;h2 id=&#34;writing-at-work&#34;&gt;Writing at Work&lt;/h2&gt; &lt;p&gt;At work we have a culture of written communication. Almost all group meetings are preceded with a Google Doc, and many 1-1 meetings have notes sent ahead of time. Personally I find this very useful:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;It gives me space to think about the topic ahead of time&lt;/p&gt; &lt;p&gt;I like to think before making decisions, and I think much better outside of a time-pressured meeting.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Google Doc comments enable concurrent questioning and discussion&lt;/p&gt; &lt;p&gt;It&#39;s much easier to collect and address a high volume of comments and questions if they can happen at the same time. We&#39;re all able to read and comment on a doc simultaneously, while we can&#39;t all share the speaking floor simultaneously. This handles the easier / simpler questions.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;It makes it easy to broadcast context and decisions to others&lt;/p&gt; &lt;p&gt;Often people not in the meeting are curious about the decision made and the context and arguments that led to that decision. It&#39;s much easier to share that context to others if most of it is written down.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;But most of all, the document shared ahead of time organizes the discussion. A good document collects relevant context that everyone should know. It synthesizes the core tensions involved. It lays out a few of the best options we could take. It also includes some opinions and recommendations, and an analysis on why those recommendations might be good. This organization quickly puts everyone in a good frame of mind, so that they can meaningfully contribute to effective decision-making.&lt;/p&gt; &lt;h2 id=&#34;organized-thoughts&#34;&gt;Organized Thoughts&lt;/h2&gt; &lt;p&gt;Of course it&#39;s not writing that&#39;s important here. It&#39;s how effectively we&#39;re able to serve up context and organize thoughts for our colleagues.&lt;/p&gt; &lt;p&gt;There are other appraoches to this that can be just as effective, like a well-crafted slide deck. There are also written appraoches that can be ineffective, like a very long and unorganized document that people are expected to slog thorugh.&lt;/p&gt; &lt;p&gt;For me, the value is in the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Concisely define the problem to be solved&lt;/li&gt; &lt;li&gt;Remind the readers of relevant context&lt;/li&gt; &lt;li&gt;Lay out some possible options&lt;/li&gt; &lt;li&gt;All in about a page&lt;/li&gt; &lt;li&gt;Ahead of time so people have time to reflect&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This is &lt;em&gt;hard&lt;/em&gt;. It takes time and mental effort. It&#39;s also something that I really appreciate when my colleagues take on that burden.&lt;/p&gt; &lt;h2 id=&#34;sports-analogy&#34;&gt;Sports Analogy&lt;/h2&gt; &lt;p&gt;In Ultimate Frisbee there are several possible throws to move the disk up the field. They differ in how easy they are to get past the defender guarding the thrower, and how easy they are to catch:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Forehand/backhand&lt;/strong&gt; throws are typical. They&#39;re difficult to get past the defender guarding the thrower, but if the thrower manages it then they&#39;re pretty easy to catch.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Hammer&lt;/strong&gt; throws are atypical. They&#39;re an overhand throw sent above the defender (and so easy to get past) but they fly upside down and are more difficult to catch.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Good throwers typically restrict themselves to forehands and backhands. They take on the burden of beating the defense and so make their throws easy for their teammates to catch. More novice throwers often get flummoxed by their defender, and as the shot-clock winds down often resort to throwing hammers. This shifts the burden of the pass completion from the thrower to the receiever.&lt;/p&gt; &lt;p&gt;We expect more from the thrower because they have ten seconds (Ultimate&#39;s shot-clock) to find a good passing opportunity, while receivers have only one chance to make a catch.&lt;/p&gt; &lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt; &lt;p&gt;In any communication or decision there&#39;s a burden to organize thoughts. This burden will be either on the speaker&#39;s side or on the listener&#39;s side. Often, it&#39;s the speaker who has more context of the situation. In this case it&#39;s considerate and often more efficient for the speaker to take on the burden of organizing their thoughts, rather than depend on the listeners.&lt;/p&gt; &lt;p&gt;I find that the best way to do this is through a concisely written document. I find that this is hard and takes time, but most of that time is time spent &lt;em&gt;thinking&lt;/em&gt; which should be done anyway.&lt;/p&gt;</content:encoded></item> <item> <title>Transactionalism vs Respect</title> <author>Matthew Rocklin</author> <description>"Can I ask for your help?" makes me feel like a person who helps people. "I'll pay you back" makes me feel like I'm trading favors. Incentives feel transactional.</description> <link>https://matthewrocklin.com/transactionalism/</link> <pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/transactionalism/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/transactionalism.png" type="image/png" length="313896" /> <content:encoded>&lt;h1 id=&#34;transactionalism-vs-respect&#34;&gt;Transactionalism vs Respect&lt;/h1&gt; &lt;p&gt;Consider these two statements:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Can I ask you for your help?&lt;/li&gt; &lt;li&gt;If you help me I&#39;ll pay you back.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Which would you rather hear?&lt;/p&gt; &lt;p&gt;I like the first. It makes me feel like a person who helps people, rather than a person who&#39;s trading favors.&lt;/p&gt; &lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt; &lt;p&gt;This has come up recently in sales and marketing conversations. Often, we want something from people:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;We want them to visit our booth at a conference&lt;/li&gt; &lt;li&gt;We want them to participate in a survey or customer interview&lt;/li&gt; &lt;li&gt;We want them to tell their friends about us&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;A typical marketing approach here is to &lt;em&gt;incentivize&lt;/em&gt; the behavior we want with some object of value in return. This might be a bit of swag, or an entry to win a prize in a raffle, or an Amazon gift card.&lt;/p&gt; &lt;p&gt;It makes sense. People like getting stuff.&lt;/p&gt; &lt;h2 id=&#34;reaction&#34;&gt;Reaction&lt;/h2&gt; &lt;p&gt;But these incentives never feel right to me. They feel transactional.&lt;/p&gt; &lt;p&gt;As a developer this transactional relationship isn&#39;t what I want with users, like I&#39;m trying to buy respect. As a user it make me feel cheap, like my time is being bought.&lt;/p&gt; &lt;p&gt;Instead, I&#39;m often quite happy to help out with a project under the right conditions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Is the project interesting?&lt;/li&gt; &lt;li&gt;Is it something I care about?&lt;/li&gt; &lt;li&gt;Is it important to me?&lt;/li&gt; &lt;li&gt;Am &lt;em&gt;I&lt;/em&gt; important to &lt;em&gt;it&lt;/em&gt;?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Yes? Then of course I&#39;d be delighted to help. Helping to build something great is all the incentive I need.&lt;/p&gt; &lt;h2 id=&#34;when-to-incentivize&#34;&gt;When to Incentivize&lt;/h2&gt; &lt;p&gt;You should incentivize if you&#39;re building something that people don&#39;t care much about. Conversely you should instead foster a spirit of collaboration when you&#39;re building something great that the people you need care about a great deal.&lt;/p&gt; &lt;p&gt;If you&#39;re building something great that people care about, then don&#39;t act like you need to buy their time. What&#39;s more, trying to buy their time cheapens the relationship.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;More than swag, people like respect.&lt;/strong&gt;&lt;/p&gt; &lt;h2 id=&#34;and-give-when-possible&#34;&gt;And Give when Possible&lt;/h2&gt; &lt;p&gt;It&#39;s still great to give stuff away though!&lt;/p&gt; &lt;p&gt;For example, at conferences we&#39;ve been giving out this awesome Dask shirt:&lt;/p&gt; &lt;p&gt;&lt;code&gt;{figure} /images/dask-punk-shirts.jpeg :width: &#34;50%&#34; :alt: Dask Punk T-Shirts&lt;/code&gt;&lt;/p&gt; &lt;p&gt;I &lt;em&gt;love&lt;/em&gt; this shirt. Good design. Excellent pun, at least for those who were coming of age during Daft Punk. I want everyone to have one! So we made thousands and gave them away at conferences. We didn&#39;t ask people to give us their e-mail or have a conversation with us to get one or anything (indeed, some people were confused by this). We just did it because we thought it was an awesome shirt and relatively cheap to do.&lt;/p&gt; &lt;p&gt;People &lt;em&gt;loved&lt;/em&gt; these shirts. I&#39;d reliably see people the second day walking around in them proudly. Seeing that made me so happy.&lt;/p&gt; &lt;p&gt;This is the world I want to live in. A world in which we avoid extraction and instead collaboratively build great things.&lt;/p&gt;</content:encoded></item> <item> <title>Hammers and Nailguns</title> <author>Matthew Rocklin</author> <description>A nailgun puts nails into wood. A hammer whacks things. Simple tools with humble opinions are more versatile than specialized ones.</description> <link>https://matthewrocklin.com/hammers-and-nailguns/</link> <pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/hammers-and-nailguns/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/hammers-and-nailguns.png" type="image/png" length="309847" /> <content:encoded>&lt;h1 id=&#34;hammers-and-nailguns&#34;&gt;Hammers and Nailguns&lt;/h1&gt; &lt;p&gt;People often ask me, &lt;em&gt;&#34;What is your tool for?&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;They want an answer like &#34;AI&#34; or &#34;ETL&#34; or &#34;Training Models&#34;. &lt;br/&gt; They want a clean and specific application for easy comparison.&lt;/p&gt; &lt;p&gt;I, of course, do not give them that satisfaction.&lt;br/&gt; Instead I ask &lt;em&gt;&#34;What is Python for?&#34;&lt;/em&gt; or &lt;em&gt;&#34;What is the cloud for?&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Them:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Well, all sorts of different things.&lt;/em&gt;&lt;br/&gt; &lt;strong&gt;&lt;em&gt;Me:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Exactly!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Unfortunately, this answer sucks.&lt;/p&gt; &lt;h2 id=&#34;simple-tools-humble-opinions&#34;&gt;Simple Tools, Humble Opinions&lt;/h2&gt; &lt;p&gt;The analogy I use here is of hammers and nailguns.&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;../images/hammer-nailgun.webp&#34; width=&#34;60%&#34; /&gt;&lt;/p&gt; &lt;p&gt;Nominally these tools do the same thing (nail things) &lt;br/&gt; In reality they do very different things:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;The nail gun puts nails into wood.&lt;/strong&gt; The nailgun is 10x better than a hammer at doing this. If we have to nail 1000 nails then we should definitely get a nail gun.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;The hammer whacks things.&lt;/strong&gt; Those things can be nails, but they can also be wrenches, or rusty bolts, or drywall, or heck, even a zombie’s head.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I own a hammer, not a nailgun. I use it for all sorts of things (most recently to tap in drywall anchors). I can’t recall the last time I actually nailed something with it. Nailguns are better at nailing things, but it’s rare that that’s exactly what I want. Nailguns make enough assumptions about what I want to do that they’re rarely the right tool for me. The hammer&#39;s design is more &lt;em&gt;humble&lt;/em&gt;; it doesn&#39;t assume much about how I want to use it.&lt;/p&gt; &lt;p&gt;Home improvement, like Python, is a place where all sorts of strange problems arise, and it’s great to have simple and flexible tools that extend our natural abilities (like whacking things) in any situation.&lt;/p&gt; &lt;h2 id=&#34;nailguns-are-easier-to-market&#34;&gt;Nailguns are easier to market&lt;/h2&gt; &lt;p&gt;Writing copy for nailguns is easy&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Nailguns:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;&#34;Sink nails 10x faster, save time and energy!&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Hammers are harder&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Hammers:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;&#34;Whack things! So useful!&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Hammers have more applications and are far more commonly used. However the lack of a single &#34;killer application&#34; (just thousands of mundane ones) makes them awkward to pitch successfully.&lt;/p&gt; &lt;h2 id=&#34;i-like-hammers&#34;&gt;I Like Hammers&lt;/h2&gt; &lt;p&gt;As a craftsman (in both wood and code) I like hammers. Hammers extend our natural abilities just a little (naturally our bodies know how to hit things, just not as hard). Hammers fit in our hands, are simple, and are intuitive to use in any situation.&lt;/p&gt; &lt;p&gt;We especially need hammers in unpredictable situations, which is exactly where Python data devs live. Python devs are the tip of an organizations problem-solving spear. They always get asked to tackle the wacky new dataset or computational method. Their problems are often novel and untested. Of course for any problem we would prefer a purpose built tool, but the market rarely responds to our needs that quickly, and by the time it does it&#39;s usually someone else&#39;s problem.&lt;/p&gt; &lt;p&gt;Simple tools with humble opinions like hammers are what I reach for when I face a new problem. They&#39;re difficult to justify in words, but they&#39;re always easy to use and effective at getting the job done.&lt;/p&gt;</content:encoded></item> <item> <title>Python Support is Socially Complex</title> <author>Matthew Rocklin</author> <description>When a Python workflow fails, most of the work is diagnosing whose fault it is. The ecosystem's distributed ownership means no one has clear responsibility.</description> <link>https://matthewrocklin.com/support-complex/</link> <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/support-complex/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/support-complex.png" type="image/png" length="324158" /> <content:encoded>&lt;h1 id=&#34;python-support-is-socially-complex&#34;&gt;Python Support is Socially Complex&lt;/h1&gt; &lt;p&gt;Supporting a Python product is difficult because it’s hard to draw a line between your product and the rest of the ecosystem. This creates confusion, especially when it comes to triage and attributing failure to one product or another.&lt;/p&gt; &lt;p&gt;When a complex product like a Python-based data workflow fails, most of the work in fixing it is in diagnosing the problem. When the product is self-contained and supported by one company, like a car for example, it’s clear whose responsibility it is to diagnose and fix the problem.&lt;/p&gt; &lt;p&gt;However, when a product is complex and ownership is jointly distributed among many different responsible entities, diagnostics become fraught. No individual entity has clear responsibility to solve any particular problem, and no entity has responsibility to triage the problem as a whole.&lt;/p&gt; &lt;h2 id=&#34;easy-case&#34;&gt;Easy Case&lt;/h2&gt; &lt;p&gt;When you buy a self-contained product, like a car, it’s obvious when a part becomes defective whose fault it is. The entire car was assembled by the same manufacturer which takes full responsibility over all parts, so it’s clearly something to do with their work.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Have an issue with your car under warranty?&lt;br/&gt; &lt;strong&gt;Solution:&lt;/strong&gt; Take it to the dealer.&lt;/p&gt; &lt;h2 id=&#34;difficult-case&#34;&gt;Difficult case&lt;/h2&gt; &lt;p&gt;But in an ecosystem like Python, you use hundreds of tools simultaneously, each of which has complex interactions with each other, and each of which is managed by a different team. It becomes difficult to attribute a particular failure to any particular tool. The burden of diagnosis is on you.&lt;/p&gt; &lt;p&gt;This is like if you didn’t buy your car from a manufacturer like Honda or Ford, but instead assembled it piece by piece, having purchased parts from individual factories. No individual factory is going to do the work to figure out why your car died until you prove that it was their part that was at fault.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Have an issue with the complex jumble of software systems you’ve glued together?&lt;br/&gt; &lt;strong&gt;Solution:&lt;/strong&gt; 😩&lt;/p&gt; &lt;p&gt;As an example, here is a recent support request and response from our support team:&lt;/p&gt; &lt;h3 id=&#34;example-support-request&#34;&gt;Example: Support Request&lt;/h3&gt; &lt;p&gt;&lt;em&gt;I&#39;m trying to get started with your product, however after pip installing I get the following error:&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;raise ClientConnectorCertificateError(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host &lt;a href=&#34;http://cloud.coiled.io:443/&#34;&gt;cloud.coiled.io:443&lt;/a&gt; ssl:True [SSLCertVerificationError: (1, &#39;[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1007)&#39;)]&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Could you let me know if you have a suggested solution to try? Thanks!&lt;/em&gt;&lt;/p&gt; &lt;h3 id=&#34;example-support-response&#34;&gt;Example: Support Response&lt;/h3&gt; &lt;p&gt;… after some other back-and-forth with the user diagnosing their situation …&lt;/p&gt; &lt;p&gt;&lt;em&gt;It looks to me like HTTPS is broken for your local install of Python - I don&#39;t think it&#39;s related to our product. For example, I expect this would fail in the same way (you can check):&lt;/em&gt;&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;urllib&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urlopen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;https://google.com&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;em&gt;We generally suggest that folks not use the &#34;built-in&#34; MacOS install of Python for this kind of work. Installing Python with &lt;a href=&#34;https://docs.anaconda.com/miniconda/&#34;&gt;miniconda&lt;/a&gt; is my favorite option, but I&#39;d probably need to know more about how folks on your team usually work with Python to make a good suggestion.&lt;/em&gt;&lt;/p&gt; &lt;h3 id=&#34;example-analysis&#34;&gt;Example: Analysis&lt;/h3&gt; &lt;p&gt;The user’s failure has absolutely nothing to do with our product, and yet we spent non-trivial time tracking down what was going on. From the perspective of the people providing support, this felt like an abuse of the support relationship.&lt;/p&gt; &lt;p&gt;However, at the same time, the user is unlikely to be able to diagnose an issue like this on their own (SSL errors are not often taught in data-scientist school) and on the surface it totally appears to be related to our product. It’s both totally reasonable for them to want help from us, and totally reasonable for us to refuse to help. This causes tension on both sides. This raises the question …&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; Whose responsibility is it to triage complex issues?&lt;br/&gt; &lt;strong&gt;Answer:&lt;/strong&gt; Unfortunately, no one. For users, this sucks.&lt;/p&gt; &lt;h2 id=&#34;what-can-you-do&#34;&gt;What can you do?&lt;/h2&gt; &lt;p&gt;Really big companies buy “Data Science” from large integrators and those large integrators take on responsibility. However, in my experience, the support they offer is simplistic and rarely helpful.&lt;/p&gt; &lt;p&gt;More often, teams depend on the good will of support teams of the individual products they buy, along with lots of effort from within their own team. This isn’t great, but can be ok if you’re both hardworking and nice about asking for help.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Main lesson:&lt;/strong&gt; Be hardworking and ask nicely.&lt;/p&gt; &lt;p&gt;Support teams are made of people, and people everywhere enjoy helping other people (we’re genetically programmed to do this) especially people who have put in the work and are nice.&lt;/p&gt; &lt;p&gt;See &lt;a href=&#34;https://matthewrocklin.com/minimal-bug-reports.html&#34;&gt;Craft Minimal Bug Reports&lt;/a&gt;, which gives tips on how to nicely ask for help in an OSS context.&lt;/p&gt; &lt;h2 id=&#34;our-approach&#34;&gt;Our approach&lt;/h2&gt; &lt;p&gt;We try to be nice and help when we have time (as happened in the SSL example above) but we assume no formal responsibility to help with problems that aren’t clearly the sole fault of our software.&lt;/p&gt; &lt;p&gt;Sometimes people get upset when we don’t spend the time to diagnose ambiguous issues and we all have to live with that outcome. In those cases we typically back off from that client, or point them to this post to better clarify our understanding of support expectations. Sometimes that leads to the client backing away (they need more consultative help) and sometimes it leads to a deeper paid support relationship.&lt;/p&gt; &lt;p&gt;Programming is cool because you can glue together lots of different systems and get a totally new and wonderful system out. That’s also what makes programming really hard though. Gluing together systems that were never designed to work together results in all sorts of unexpected interactions, and &lt;em&gt;Interactions&lt;/em&gt; are the hard part of systems development.&lt;/p&gt; &lt;p&gt;We’re here to help navigate, but ultimately you’re responsible for the system you construct.&lt;/p&gt;</content:encoded></item> <item> <title>Cloud Computing is Broken</title> <author>Matthew Rocklin</author> <description>What hunger am I seeing on the ground? Boring shit. People struggle most with the basics of cloud computing. The promise remains undelivered.</description> <link>https://matthewrocklin.com/cloud-is-broken/</link> <pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/cloud-is-broken/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/cloud-is-broken.png" type="image/png" length="316269" /> <content:encoded>&lt;h1 id=&#34;cloud-computing-is-broken&#34;&gt;Cloud Computing is Broken&lt;/h1&gt; &lt;div class=&#34;admonition quote&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Famous Quote&lt;/p&gt; &lt;p&gt;&lt;em&gt;This AWS API is so intuitive it&#39;s awesome. My whole team uses it.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;-– no one ever&lt;/em&gt;&lt;/p&gt; &lt;/div&gt; &lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt; &lt;p&gt;Recently I was chatting with an investor about the market and they asked:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;What do you see coming&lt;/strong&gt; for the world of Data/Cloud/Compute Infrastructure?&lt;/em&gt;&lt;br/&gt; &lt;em&gt;Is there some new dataframe library?&lt;/em&gt;&lt;br/&gt; &lt;em&gt;LLM applications?&lt;/em&gt;&lt;br/&gt; &lt;em&gt;What hunger are you seeing on the ground?&lt;/em&gt;&lt;br/&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;My answer, after thinking about it for a while, was this:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Boring shit.&lt;/em&gt;&lt;br/&gt; &lt;em&gt;The people I talk to struggle most with the &lt;/em&gt;&lt;em&gt;basics of cloud computing.&lt;/em&gt;**&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;This article explores this answer in more depth, drawing on undelivered promises, and the launch of the iPod.&lt;/p&gt; &lt;h2 id=&#34;promise-of-cloud-computing-undelivered&#34;&gt;Promise of Cloud Computing, Undelivered&lt;/h2&gt; &lt;p&gt;The promise of cloud computing for data developers goes like this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Infinite scalability&lt;/li&gt; &lt;li&gt;Any place any time&lt;/li&gt; &lt;li&gt;Turned on in about a minute&lt;/li&gt; &lt;li&gt;Pay for only what you use&lt;/li&gt; &lt;li&gt;No need to maintain hardware&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This promise is valuable to companies today. Developers want this. Companies need this. Especially those people for whom SQL doesn&#39;t suffice and who have to roll their own computations.&lt;/p&gt; &lt;p&gt;Yet most developers we see either don’t use the cloud, or don’t use it well. We see two common architectures today:&lt;/p&gt; &lt;p&gt;::::{grid} 1 1 2 2 :::{grid-item} &lt;strong&gt;Overused Big VM&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;They get one Big VM&lt;/li&gt; &lt;li&gt;They leave it on all the time&lt;/li&gt; &lt;li&gt;Maintenance needs are surprisingly demanding&lt;/li&gt; &lt;li&gt;It’s really expensive&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;::: :::{grid-item} &lt;strong&gt;Underused Kubernetes Cluster&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;They deploy Kubernetes&lt;/li&gt; &lt;li&gt;Experts use it for 1-2 applications&lt;/li&gt; &lt;li&gt;Normal users never really get on board&lt;/li&gt; &lt;li&gt;Maintenance costs and non-use eventually kill it&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;::: ::::&lt;/p&gt; &lt;p&gt;What people want is simple. They want to turn on a bunch of computers, run arbitrary code on those computers, have those computers turn off reliably, and eventually get logs easily. They want user and cost management without having to set much up.&lt;/p&gt; &lt;h2 id=&#34;dont-awsdatabrickssagemaker-already-provide-these-features&#34;&gt;Don’t AWS/Databricks/Sagemaker already provide these features?&lt;/h2&gt; &lt;p&gt;&lt;em&gt;But this stuff already exists, right?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;On paper, yes. AWS Batch/Lambda, Databricks jobs, Snowflake’s Snowpark all provide arbitrary code execution on lots of ephemeral machines with exactly those features. In theory, they deliver on this promise.&lt;/p&gt; &lt;p&gt;However in practice we don’t see this. People are still rolling their own with the EC2 and EKS APIs. I’ll bet that if you surveyed data professionals in organizations with access to modern compute platforms you’d find that the majority who would want to use such a tool don’t use them regularly. I’d guess penetration is in the 10-20% range.&lt;/p&gt; &lt;p&gt;Providing functionality is easy. Making functionality useful is hard.&lt;/p&gt; &lt;p&gt;Cloud computing today is like MP3 players before the iPod.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Huge potential demand (mp3s were everywhere)&lt;/li&gt; &lt;li&gt;Theoretical delivery of that product (many products on the market)&lt;/li&gt; &lt;li&gt;Complete market failure to actually deliver on the promise.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;mp3-players-and-the-ipod&#34;&gt;MP3 Players and the iPod&lt;/h2&gt; &lt;p&gt;&lt;em&gt;MP3 players existed, but only kinda.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Imagine you’re Steve Jobs and you want to propose the iPod in year 2000. Your marketing team tells you that the iPod isn&#39;t innovative. Loads of MP3 players are already on the market and doing poorly.&lt;/p&gt; &lt;p&gt;Anyone above the age of 35 knows this history. Recall the RIO 500 and Archos Jukebox.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th style=&#34;text-align: center;&#34;&gt;&lt;strong&gt;Rio 500&lt;/strong&gt;&lt;/th&gt; &lt;th style=&#34;text-align: center;&#34;&gt;&lt;strong&gt;Archos Jukebox&lt;/strong&gt;&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&#34;text-align: center;&#34;&gt;&lt;img alt=&#34;Rio 500&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Rio_500.jpg/1280px-Rio_500.jpg&#34; /&gt;&lt;/td&gt; &lt;td style=&#34;text-align: center;&#34;&gt;&lt;img alt=&#34;Archos Jukebox&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/B%C3%A4rbar_mp3-spelare_Archos_typ_Jukebox_6000.jpg/1280px-B%C3%A4rbar_mp3-spelare_Archos_typ_Jukebox_6000.jpg&#34; /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;They store songs, let you play them, fast forward, rewind, and show you what’s going on. On paper they do everything the iPod will do, and yet market penetration was tiny, less than 1% of what it would be. Looking at the lack of success of these products you’d conclude that humans don’t like listening to music.&lt;/p&gt; &lt;p&gt;&lt;em&gt;The majority of people who would have wanted an MP3 player didn&#39;t use any of these products.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Eventually, the iPod was released, and it changed our listening habits forever&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;../images/ipod.png&#34; width=&#34;60%&#34; /&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;iPod Generation One delivered the same functionality, but designed well enough for everyone to want.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Same exact functionality, just better in an indescribable and yet obvious way. The combination of ease of use, pocketability, storage capacity, iTunes integration, and straight-up style made the iPod a must-have item years after equivalent products launched and failed to create and claim the market.&lt;/p&gt; &lt;h2 id=&#34;compute-technology-has-outpaced-ux-and-adoption&#34;&gt;Compute Technology has Outpaced UX and Adoption&lt;/h2&gt; &lt;p&gt;&lt;em&gt;We as a technology movement have gotten ahead of ourselves.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I believe in the innovation of the Startup + VC process. Yet I think that in striving to climb the technology sophistication ladder (cloud computing -&amp;gt; ML -&amp;gt; Model management -&amp;gt; LLMs -&amp;gt; Agentic systems) we’ve outpaced our users and their ability to follow us.&lt;/p&gt; &lt;p&gt;We’ve chased the few truly sophisticated users out there, the geeky early adopters, rather than the majority of ignorant humans we should be serving. We’ve been building for Steve Wozniak.&lt;/p&gt; &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/hFD3tZSB7l4?si=kG3kKKMYgPclekjQ&amp;amp;start=183&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;Watch 50s of the video above about Steve&#39;s cool watch. &lt;br/&gt; Then see ChatGPT explain how to run &#34;Hello, world&#34; on AWS Batch below.&lt;/p&gt; &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/Xk_lEt_08Hs?si=7yM7Fi1VIxLvGGcx&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;No compassionate human can watch that and think &#34;Yes, the potential of the cloud has been realized&#34;.&lt;br/&gt; We&#39;re not done innovating yet. There&#39;s more to do.&lt;/p&gt; &lt;h2 id=&#34;where-does-this-lead-us&#34;&gt;Where does this lead us?&lt;/h2&gt; &lt;p&gt;&lt;em&gt;Let’s strive towards excellence on boring problems&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I think that there’s huge untapped potential in solving some of these boring problems well. This work is hard and finicky, but I think the data infrastructure space has pushed sufficiently far ahead that we&#39;ve built up substantial potential behind our frontier.&lt;/p&gt; &lt;p&gt;I’d love to see UX become as strong a focus as AI for the industry. I’d encourage technology leaders everywhere to ask the following question:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;What important and common problems today lack products that inspire rabid loyalty?&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Those problems may be ripe for iPod-style solutions.&lt;br/&gt; Cloud and compute platforms are certainly among them.&lt;/p&gt;</content:encoded></item> <item> <title>Venting and Constructive Communication</title> <author>Matthew Rocklin</author> <description>Constructive conversation and venting differ by one question: "Will these words help me achieve my goal?" If no, we're probably venting.</description> <link>https://matthewrocklin.com/venting/</link> <pubDate>Fri, 25 Oct 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/venting/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/venting.png" type="image/png" length="324814" /> <content:encoded>&lt;h1 id=&#34;venting-and-constructive-communication&#34;&gt;Venting and Constructive Communication&lt;/h1&gt; &lt;p&gt;Constructive conversation and venting are mostly distinguished by asking ourselves&lt;/p&gt; &lt;p&gt;&lt;em&gt;&#34;Will these words help me achieve my goal?&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;If the answer is &#34;no&#34; then we&#39;re probably venting. This post explores and tries to name this universal experience.&lt;/p&gt; &lt;h2 id=&#34;have-a-mental-model-of-your-partner&#34;&gt;Have a Mental Model of Your Partner&lt;/h2&gt; &lt;p&gt;When I&#39;m at my best I have a mental model of the person I&#39;m speaking with.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;If they like sports, I&#39;ll use sports metaphors&lt;/li&gt; &lt;li&gt;If they&#39;re in a rush, I&#39;ll be to the point&lt;/li&gt; &lt;li&gt;If they don&#39;t speak my language well, I&#39;ll use simple language and speak clearly&lt;/li&gt; &lt;li&gt;If they&#39;re struggling emotionally, I&#39;ll avoid anything critical, nod my head, and listen actively&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Effective language targets the listener. It&#39;s not the words that we want to say. It&#39;s the words that we think will be most effective at influencing our partner. Having a good mental model of our partner helps us craft effective language.&lt;/p&gt; &lt;p&gt;Ideally when I want to influence someone (say, get them to add a feature to a product) I first check my words against my mental model of that person and come up with the right words to engage them in particular. I then hope my model is accurate.&lt;/p&gt; &lt;p&gt;To be clear, I&#39;m pretty bad at this; but this is what I strive towards, and this is my standard for &#34;constructive communication&#34;.&lt;/p&gt; &lt;h2 id=&#34;venting&#34;&gt;Venting&lt;/h2&gt; &lt;p&gt;Conversely, when I intercede with colleagues having a dispute (or when I look back at my own disputes) I&#39;ll look at e-mails or listen to people talk and I&#39;ll see unconstructive language like the following:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&#34;Do you really think that was a good idea?&#34;&lt;/em&gt;&lt;br/&gt; &lt;em&gt;&#34;This is a really badly done&#34;&lt;/em&gt;&lt;br/&gt; &lt;em&gt;&#34;This direction is obviously going nowhere&#34;&lt;/em&gt;&lt;br/&gt;&lt;/p&gt; &lt;p&gt;These things might even be &lt;em&gt;true&lt;/em&gt; but they&#39;re usually not &lt;em&gt;constructive&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;If we ask the person who said this a few questions (or ask ourselves, if we are that person), it quickly becomes clear that we&#39;re not serving our own interests:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is your goal here?&lt;br/&gt; &lt;strong&gt;A:&lt;/strong&gt; To get them to change their behavior&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; How do you think what you&#39;ve just said/written will land with them?&lt;br/&gt; &lt;strong&gt;A:&lt;/strong&gt; ... I guess it&#39;ll make them upset ... but they&#39;re wrong!&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Q:&lt;/strong&gt; Do you think that that&#39;s more likely to make them change their behavior?&lt;br/&gt; &lt;strong&gt;A:&lt;/strong&gt; Yeah ok, probably not&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Obviously no one ever has this conversation, but it&#39;s a good check for us to do on ourselves.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Do we think that the thing we just said serves our interest?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;If yes:&lt;/strong&gt; it&#39;s constructive, and in service of our goals&lt;br/&gt; &lt;strong&gt;If no:&lt;/strong&gt; it&#39;s probably just venting, and we&#39;re sacrificing our relationship (and thus any future ability to affect change) for immediate gratification of our frustration&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We all vent. Everyone. Me. You. The Pope. Even Barack Obama vents.&lt;/p&gt; &lt;h2 id=&#34;venting-isnt-professional&#34;&gt;Venting isn&#39;t professional&lt;/h2&gt; &lt;p&gt;Venting is not good, but it is normal. Everyone is expected to vent sometimes.&lt;/p&gt; &lt;p&gt;However, as you climb an organizational chart, you become less able to vent. If you manage people for example, you&#39;re not really allowed to vent to them all that much. You can probably vent up the chain of command, but I find it&#39;s good to start with &lt;em&gt;&#34;I just really need to vent right now, do you mind?&#34;&lt;/em&gt;. The larger the crowd you&#39;re in (like a big meeting) you&#39;re less able to vent; you have to drive the conversation in a constructive direction.&lt;/p&gt; &lt;p&gt;Also, venting damages relationships. Success in organizations depends on one&#39;s ability to build and maintain relationships. Without relationships you&#39;re unable to collaborate effectively, and you&#39;ll only ever be as strong as yourself or your own group. While some ICs might not be expected to maintain relationships across the company, managers and company leaders certainly are.&lt;/p&gt; &lt;p&gt;Relationship building is a requirement for climbing an organizational chart, and venting runs counter to that goal.&lt;/p&gt; &lt;h2 id=&#34;theres-gold-behind-the-vent&#34;&gt;There&#39;s Gold Behind the Vent&lt;/h2&gt; &lt;p&gt;But venting does have real value. There&#39;s some idea behind the vent that&#39;s causing you stress. Your gut is telling you something important and valuable.&lt;/p&gt; &lt;p&gt;The mark of a real leader is someone who can feel those raw frustrations acutely, vent internally, ask &lt;em&gt;&#34;What am I feeling here?&#34;&lt;/em&gt;, and then identify the constructive idea behind the vent. Finally, effective communicators think how to constructively communicate that idea to one&#39;s colleagues in a way that they will connect with.&lt;/p&gt; &lt;p&gt;This is super hard. If it feels impossible then that&#39;s probably a signal that you need to do two things first:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Build a better relationship&lt;/strong&gt; with your partner&lt;/p&gt; &lt;p&gt;Grab a beer. Talk about their kids. Anything just to jointly establish that you&#39;re both reasonable people. Don&#39;t push work topics too early.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Build a better mental model&lt;/strong&gt; of your partner&lt;/p&gt; &lt;p&gt;This way you can shape your message not as you most want to say it, but as you think they&#39;re most likely able to receive it&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;This takes time. It&#39;s an investment. It absolutely pays off.&lt;/p&gt;</content:encoded></item> <item> <title>SatCamp Retrospective</title> <author>Matthew Rocklin</author> <description>Satellite imagery's potential is incredible, but companies in this space are struggling. An outsider's first impressions from an unconference in Boulder.</description> <link>https://matthewrocklin.com/satcamp/</link> <pubDate>Fri, 04 Oct 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/satcamp/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/satcamp.png" type="image/png" length="316417" /> <content:encoded>&lt;h1 id=&#34;satcamp-retrospective&#34;&gt;SatCamp Retrospective&lt;/h1&gt; &lt;p&gt;This week I attended &lt;a href=&#34;https://satcamp.xyz&#34;&gt;SatCamp&lt;/a&gt;, a small unconference focused on the Satellite / Earth Observation / Remote sensing industry held in Boulder Colorado.&lt;/p&gt; &lt;p&gt;&lt;img src=&#34;https://satcamp.xyz/assets/sat-camp-logo-digital-9b59f29d.png&#34; width=&#34;50%&#34;/&gt;&lt;/p&gt; &lt;p&gt;SatCamp was a wonderful collection of imagery nerds talking about technology, public good, cloud performance, and business models, all while hiking/biking/trail running in the Boulder foothills. (This is the most fit collection of humans I&#39;ve met at a business conference).&lt;/p&gt; &lt;p&gt;I was a bit of an outsider at this conference, so I thought I&#39;d write up an outsider perspective in hopes of giving other people like me a sense for this industry and community.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: *I am not an expert and don&#39;t know this space well. The thoughts below are only a first impression.&#34;&lt;/p&gt; &lt;h2 id=&#34;big-opportunity-immature-market&#34;&gt;Big Opportunity / Immature Market&lt;/h2&gt; &lt;h3 id=&#34;potential&#34;&gt;Potential&lt;/h3&gt; &lt;p&gt;Satellite imagery&#39;s potential value is incredible. We have these technological marvels watching the earth and observing change day to day. Satellites can help us answer questions like …&lt;/p&gt; &lt;ol&gt; &lt;li&gt;How is this field of potatoes doing on my farm?&lt;/li&gt; &lt;li&gt;Which of these houses would gain the most from solar panels?&lt;/li&gt; &lt;li&gt;Is this road clear of water so that disaster relief can finally reach this flooded region?&lt;/li&gt; &lt;li&gt;Can we send insurance payments immediately after a disaster instead of waiting months for an assessor to arrive?&lt;/li&gt; &lt;li&gt;… and of course … How many people are at this military training camp?&lt;/li&gt; &lt;/ol&gt; &lt;h3 id=&#34;struggle&#34;&gt;Struggle&lt;/h3&gt; &lt;p&gt;However despite the huge potential, companies in this space seem to be struggling. Giants like Maxar were recently taken private by private equity at a distressed valuation of $6bn (for context Shell&#39;s annual revenue is $300bn / year, a rate of roughly one Maxar valuation per week). High profile tech companies like Planet Labs make about $200m per year, and recently underwent personnel contraction. Those are the success stories who were present. Not present included ESRI, which people here refer to with the same gravity as Lord Voldemort. They&#39;re a bit more valuable and profitable than Maxar, but not much.&lt;/p&gt; &lt;p&gt;There are hundreds of small climate tech companies who do things like track carbon credits or help companies understand climate risk, all of whom seem to struggle and many of whom are expected to close up shop in the next couple years.&lt;/p&gt; &lt;h3 id=&#34;from-pixels-to-business-value&#34;&gt;From Pixels to Business Value&lt;/h3&gt; &lt;p&gt;My sense is that it&#39;s not clear how to convert pixels in a satellite image to business value. There are many possible applications, but relatively few obvious scalable ones. Any institution wanting to get business value has to go all the way from raw satellite imagery to business value on their own, and that&#39;s hard.&lt;/p&gt; &lt;p&gt;In most industries there&#39;s a collection of companies ranging from the broad and horizontal infrastructure products (think DataBricks), to the more vertically specific products (think the thousands of MLOps companies), and finally to the last-mile consultants, all of whom convert data into insight and value by working together. Satellite imagery / remote sensing / earth observation doesn&#39;t have that ecosystem yet. We have consultants who read data directly from AWS without any real tooling support.&lt;/p&gt; &lt;p&gt;It&#39;s actually kinda bonkers how much data is available today for how immature this market is.&lt;/p&gt; &lt;p&gt;There are some horizontal product companies, but they seem to struggle to demonstrate real value on their own. Product revenue seems small in this vertical.&lt;/p&gt; &lt;h3 id=&#34;consulting-companies-do-ok&#34;&gt;Consulting Companies do OK&lt;/h3&gt; &lt;p&gt;There are a few consulting agencies in this space (Development Seed and SparkGeo were well represented at the conference, along with a few independent consultants), and they all seemed to do fine. They have to be technically capable, ranging experience from cloud infrastructure, to data science, to understanding verticals like insurance or agriculture. These groups seemed to be the most collected and respected at the event.&lt;/p&gt; &lt;p&gt;The consultants seemed to have &#34;figured it out&#34; while everyone else was struggling.&lt;/p&gt; &lt;h3 id=&#34;exception-government-and-defense&#34;&gt;Exception: Government and Defense&lt;/h3&gt; &lt;p&gt;The one exception to &#34;No one knows how to make money here&#34; seems to be those companies targeting Defense and civilian government (like NASA). The larger enterprises (Maxar, Planet) mostly target defense today. The US-based consultancies (DevSeed/Element84) largely target civilian government.&lt;/p&gt; &lt;p&gt;The US Government seems to highly value observing the earth and its people.&lt;/p&gt; &lt;h3 id=&#34;future&#34;&gt;Future?&lt;/h3&gt; &lt;p&gt;My sense is that there &lt;em&gt;is&lt;/em&gt; significant value here, but that it&#39;ll take a while for an symbiotic ecosystem of product and consulting companies to grow up and learn to better deliver business value.&lt;/p&gt; &lt;p&gt;This feels like the Internet before web search or Oil before the automobile. Amazing potential, but it&#39;s not clear what to actually do with it today.&lt;/p&gt; &lt;p&gt;There&#39;s a ton of potential here. I don&#39;t know if there&#39;s a first mover advantage, or if several companies need to try-and-die here, fertilizing the soil before someone can finally thrive.&lt;/p&gt; &lt;h2 id=&#34;tight-community&#34;&gt;Tight Community&lt;/h2&gt; &lt;p&gt;This community feels the way Scientific Python felt before we got popular. Everyone is super passionate. Everyone knows each other. Everyone is really kind and supportive. Everyone wants to change the world. It was a great vibe.&lt;/p&gt; &lt;p&gt;Mostly it made me miss the days before Python was flooded with money and success (not that I&#39;m complaining about the money and success).&lt;/p&gt; &lt;p&gt;There was some impractical idealism, but there were also strong and respected voices speaking out for practicality. It was refreshing hearing people speak so much about business models and what they as a community could do to change things, rather than only wishful thinking about how larger third parties should act.&lt;/p&gt; &lt;h2 id=&#34;small-conference-format-was-great&#34;&gt;Small Conference Format was Great&lt;/h2&gt; &lt;p&gt;This event had a great form factor.&lt;/p&gt; &lt;p&gt;It was capped at 100 people, had only lightning talks and panels, and had a lot of unstructured and outdoor time. It was also a pretty specific community. Ticket prices were modest and my sense is that it wasn&#39;t as hard as a proper conference to pull off (not to diminish the effort of the organizers, who were great).&lt;/p&gt; &lt;p&gt;I think the world could probably use more low-stakes and hyper-specific workshops to complement the broad and large events that dominate most work travel today. We ran a Dask developers invite-only workshop a few years ago with about 50 people and it felt a little like that. Great energy.&lt;/p&gt; &lt;h2 id=&#34;technology-needs&#34;&gt;Technology Needs&lt;/h2&gt; &lt;p&gt;From my perspective as someone who cares about Python+Parallelism+Cloud, mostly this community just needs embarrassingly parallel cloud computing with relatively simple processing. Even the sophistication of distributed Xarray often feels like overkill here. I mostly heard people talk about AWS tools like Lambda and Batch, and workflow managers like Prefect and Flyte.&lt;/p&gt; &lt;p&gt;They&#39;re definitely inefficient. When asked my favorite question &#34;How much do you think it costs to process 1TB of cloud data&#34; answers ranged in the $20-50 range (real answer is $0.10) which matches my experience with other semi-technical groups.&lt;/p&gt; &lt;p&gt;While many people have access to large scale cloud computing, they mostly have over-engineered systems around Kubernetes or cobbled together AWS architectures, typically that reduce to just AWS Batch-or-Lambda.&lt;/p&gt; &lt;p&gt;When showed Coiled demos people were generally blown away, mostly by ease of use, simplicity of architecture, and cost efficiency. The sophisticated task graph stuff or ML libraries didn&#39;t matter much.&lt;/p&gt; &lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt; &lt;p&gt;I had a good time (people were great) and learned a lot (people should attend events adjacent to their space more often). I&#39;m oddly both more and less enthusiastic about engaging this community than I was before.&lt;/p&gt; &lt;h2 id=&#34;photos&#34;&gt;Photos&lt;/h2&gt; &lt;p&gt;Thanks to the folks who took these.&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;../images/satcamp/2.jpg&#34; width=&#34;55%&#34; /&gt; &lt;img alt=&#34;&#34; src=&#34;../images/satcamp/1.jpg&#34; width=&#34;35%&#34; /&gt;&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;../images/satcamp/4.jpg&#34; width=&#34;28%&#34; /&gt; &lt;img alt=&#34;&#34; src=&#34;../images/satcamp/3.jpg&#34; width=&#34;62%&#34; /&gt;&lt;/p&gt;</content:encoded></item> <item> <title>How I Almost Quit My Job, and How Being Selfish Saved Me</title> <author>Matthew Rocklin</author> <description>When a small amount of your work helps others a great deal, of course you sacrifice. You'd be a monster not to. But your ego can fade in service of your project.</description> <link>https://matthewrocklin.com/leverage/</link> <pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/leverage/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/leverage.png" type="image/png" length="330668" /> <content:encoded>&lt;h1 id=&#34;how-i-almost-quit-my-job-and-how-being-selfish-saved-me&#34;&gt;How I Almost Quit My Job, and How Being Selfish Saved Me&lt;/h1&gt; &lt;p&gt;&lt;em&gt;Every human being has a basic instinct to help each other out&lt;/em&gt;&lt;br/&gt; &lt;em&gt;-- Mark Watney, The Martian&lt;/em&gt;&lt;/p&gt; &lt;h2 id=&#34;leverage-and-the-loss-of-ego&#34;&gt;Leverage and the loss of ego&lt;/h2&gt; &lt;p&gt;Positions of leverage feel great, but result in self-sacrifice and burnout.&lt;/p&gt; &lt;p&gt;When in a position of leverage, a small amount of your work helps others a great deal. Sacrificing minutes of your time saves days of someone else&#39;s, &lt;strong&gt;so of course you sacrifice. You&#39;d be a monster not to&lt;/strong&gt;. Sacrificing for others is part of being a human; we&#39;re social creatures and helping others is deeply rooted in our DNA.&lt;/p&gt; &lt;p&gt;And helping other people feels great! Especially when it&#39;s so easy. &lt;strong&gt;This feeling makes you work long hours&lt;/strong&gt;, and squeeze extra time from the odd corners of your day, helping unblock as many people as you can. Unfortunately, your personal life and ego can fade in service of your project.&lt;/p&gt; &lt;p&gt;Sometimes this fade results in repressive or self-destructive behaviors&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&#34;I&#39;ve put on a few pounds sure, but I don&#39;t really have time to go running with this new project starting&#34;&lt;/li&gt; &lt;li&gt;&#34;Yes, this person&#39;s behavior makes lose sleep, but if I show how I feel it&#39;ll cause chaos because of my position&#34;&lt;/li&gt; &lt;li&gt;&#34;My partner doesn&#39;t like it when I work after they come home, but there&#39;s a really important project going on, and all they&#39;re doing is watching TV.&#34;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There are natural release mechanisms like venting anger or taking time off that stop making sense day-to-day when you&#39;re in a position of leverage. Your time and position are too important to let loose. When these release mechanisms no longer make sense day-to-day, your &lt;strong&gt;leverage swallows part of your identity&lt;/strong&gt; and, eventually, you break (or at least I do).&lt;/p&gt; &lt;p&gt;This breaking point is an interesting moment because it&#39;s at this point where the entire project is at risk unless you fix a very important problem, yourself.&lt;/p&gt; &lt;p&gt;You can&#39;t fix yourself through more sacrifice. &lt;strong&gt;You can only fix things by selfishly prioritizing your needs.&lt;/strong&gt; This is a rare moment in life where egotism and altruism are perfectly aligned. However, prioritizing your needs doesn&#39;t mean &#34;do less work&#34;. Often you can achieve far more effective interventions than just &#34;work less&#34;. You can &lt;strong&gt;reshape your relationship to work in more creative ways&lt;/strong&gt; than by just stopping.&lt;/p&gt; &lt;p&gt;This is the moment when you say &#34;Fuck it&#34; to your colleagues and start working from the beach or while motorcycling across America (or whatever). It&#39;s either that or you and the whole system break down.&lt;/p&gt; &lt;h2 id=&#34;personal-examples&#34;&gt;Personal Examples&lt;/h2&gt; &lt;p&gt;I&#39;ve almost quit my job (running an early-stage tech company) several times in the last five years. Rather than actually quit, I&#39;ve instead decided to make changes like the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I have &lt;a href=&#34;../meetings/&#34;&gt;no recurring meetings&lt;/a&gt;&lt;/li&gt; &lt;li&gt;I don&#39;t &lt;a href=&#34;../slack-github/&#34;&gt;log into Slack&lt;/a&gt;&lt;/li&gt; &lt;li&gt;I&#39;ve checked out of work for a month, focusing more on running and yoga than customers or team morale&lt;/li&gt; &lt;li&gt;I&#39;ve bailed on conference talks and company travel for six months&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;These actions are &lt;strong&gt;selfish&lt;/strong&gt;, but they&#39;ve also &lt;strong&gt;improved my life tremendously&lt;/strong&gt; and &lt;strong&gt;saved my relationship with work&lt;/strong&gt;, giving me the space to continue high-leverage work. If I didn&#39;t figure out these creative ways to be selfish, I would have broken and everything else would have broken for others around me.&lt;/p&gt; &lt;p&gt;Every time I made a change, I came back with more energy and more impact. These changes improved everyones&#39; outcomes, not just my own.&lt;/p&gt; &lt;h2 id=&#34;optimize-for-yourself-creatively&#34;&gt;Optimize for Yourself, Creatively&lt;/h2&gt; &lt;p&gt;No one has full freedom over their worklife, &lt;strong&gt;but everyone has &lt;em&gt;a lot of freedom&lt;/em&gt;&lt;/strong&gt;, far more than they exercise.&lt;/p&gt; &lt;p&gt;Most founders and other leaders I run into are stressed out. Most question their relationship to work. My advice to them (and to you) is to &lt;strong&gt;be selfish, creatively&lt;/strong&gt;. Don&#39;t just stop doing work or helping others; figure out very specifically what you want and &lt;strong&gt;design work around what you want&lt;/strong&gt;. The higher the leverage of your work, the more power you have to tailor your work life to suit your needs.&lt;/p&gt;</content:encoded></item> <item> <title>What Does Pangeo 2.0 Look Like?</title> <author>Matthew Rocklin</author> <description>In 2018 we unveiled a new architecture for scalable cloud Python. It was great, but also fragile and limited. What comes next?</description> <link>https://matthewrocklin.com/pangeo-2.0/</link> <pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/pangeo-2.0/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/pangeo-2.0.png" type="image/png" length="320875" /> <content:encoded>&lt;h1 id=&#34;what-does-pangeo-20-look-like&#34;&gt;What does Pangeo 2.0 Look Like?&lt;/h1&gt; &lt;h2 id=&#34;past&#34;&gt;Past&lt;/h2&gt; &lt;p&gt;In January 2018 I published a blogpost titled &lt;a href=&#34;https://matthewrocklin.com/blog/work/2018/01/22/pangeo-2&#34;&gt;Pangeo: JupyterHub, Dask, and XArray on the Cloud&lt;/a&gt;, which introduced a new architecture for running scalable Python computations on the cloud using ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;GCP&lt;/li&gt; &lt;li&gt;Kubernetes&lt;/li&gt; &lt;li&gt;Dask + Xarray&lt;/li&gt; &lt;li&gt;Dask-Kubernetes (actually named Daskernetes at the time)&lt;/li&gt; &lt;li&gt;Zarr (a brand new file format at the time)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This architecture was unveiled during an AMS workshop keynote, the 3-minute demo video of which is still available if you want a blast from the past:&lt;/p&gt; &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/rSOJKbfNBNk?si=7yM7Fi1VIxLvGGcx&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;This coordinated work from many people.&lt;/p&gt; &lt;h3 id=&#34;what-was-great-about-the-pangeo-stack&#34;&gt;What was great about the Pangeo stack&lt;/h3&gt; &lt;p&gt;This effort was impressive, and showed that it was possible to …&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Do large scale multi-dimensional distributed computing&lt;/li&gt; &lt;li&gt;… from Python&lt;/li&gt; &lt;li&gt;… on the cloud&lt;/li&gt; &lt;li&gt;… interactively&lt;/li&gt; &lt;li&gt;… for anyone with access to the internet&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This was quite different from the standard at the time in the scientific/geo space, which was MPI codes or batch jobs run on supercomputers. The Pangeo effort upended the status-quo at many scientific and government agencies trying to enable access and analytics on larger scale data.&lt;/p&gt; &lt;h3 id=&#34;what-was-terrible-about-the-pangeo-stack&#34;&gt;What was terrible about the Pangeo stack&lt;/h3&gt; &lt;p&gt;Unfortunately, there were challenges with this stack:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; It required expertise of Kubernetes, and that expertise was rare&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;What’s a pod? Is it a Docker? How do I upload a pod?&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Costs:&lt;/strong&gt; Controlling access and costs and usage was impossible&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;I want my graduate students to use this, but I’m worried they’ll go beyond my budget&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Maintenance:&lt;/strong&gt; It was difficult to deploy and maintain&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;How do I tune my cloud autoscaler? Actually, what is a cloud auto-scaler?&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Regular Jobs:&lt;/strong&gt; It failed to address non-interactive use cases&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;My notebook is great, but how do I run this job every day?&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Rigidity:&lt;/strong&gt; It assumed a uniform development environment&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;I want to use the newest version of scikit-learn, but the Docker image has an old version&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Multi-cloud:&lt;/strong&gt; It didn’t work across regions or clouds&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;How do I access my collaborator’s data in Europe?&#34;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&#34;Does this work on Azure?&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; File formats were still wonky&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;Zarr seems cool, but we’re still using NetCDF.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Also, my data keeps updating, can Zarr expand like this?&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Scale:&lt;/strong&gt; Scale was still an issue&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;em&gt;&#34;This works great on 200 GiB, but when I move to the full dataset my workers start running out of memory&#34;&lt;/em&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Personnel:&lt;/strong&gt; It required people to keep it alive, and no one was paid to do so&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;There were incremental improvements in the components of the stack. Dask-gateway replaced dask-kubernetes. Zarr became more common. Dask and Xarray both improved in scale. There were also many extensions of it, with new libraries built on top of Xarray and a wonderful growth in community engagement.&lt;/p&gt; &lt;p&gt;However overall &lt;strong&gt;this deployment architecture was a technological dead end&lt;/strong&gt; (at least in my opinion as original architect). Personally I’m &lt;strong&gt;proud that we were able to generate so much enthusiasm&lt;/strong&gt; (most of the credit here due to Ryan Abernathey, Rich Signell, and others who pushed the Pangeo stack within scientific circles) but mildly ashamed of the architecture itself. It’s easy to build a cool demo with the Pangeo stack, but difficult to actually solve the computational and business needs of larger organizations. My experience has been that &lt;strong&gt;the Pangeo stack was fantastic demo-ware&lt;/strong&gt;.&lt;/p&gt; &lt;h2 id=&#34;present&#34;&gt;Present&lt;/h2&gt; &lt;p&gt;Since 2018, there have been several re-imaginings of this stack. There are full-platform options (everything included, but not particularly powerful) and some tool-specific options (innovative and powerful, but require assembly). Let’s list a few in each category:&lt;/p&gt; &lt;h3 id=&#34;full-platform-options&#34;&gt;Full Platform Options&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;2I2C&lt;/strong&gt; is a classic Kubernetes + JupyterHub architecture similar to what we built in 2018 (pure OSS), but sold with a service to set up and maintain it for organizations that don’t happen to keep a Kuberentes and cloud expert on staff.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Nebari&lt;/strong&gt; (née QHub) is a better architected execution of the same components, and with more components (workflow managers, editors, …) Nebari is pure OSS and deployed using git-ops, but recognizing that people need help (OSS isn’t free to maintain) Nebari is often sold with services from Quansight who maintains it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Saturn&lt;/strong&gt; took the same UX with Jupyter and Dask (and others tools), but dropped dask-gateway and JupyterHub, and instead added in a proper database-backed web application. Saturn is a commercial SaaS product with one professionally managed central control plane that can be used anywhere.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3 id=&#34;innovative-and-tool-specific-options&#34;&gt;Innovative and Tool-Specific Options&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Coiled (compute)&lt;/strong&gt; is what I and people around me built.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Coiled focuses exlusively on computation, while also including all of the user management and cost controls that were missing in Pangeo. Coiled doesn’t serve Jupyter or store data. Instead, it works with other tools users already have, running from anywhere people run Python (most notably, their existing laptop).&lt;/p&gt; &lt;p&gt;I’ll claim (perhaps with hubris) that Coiled is among most high-end Python cloud compute platforms on the market today. This product was built with creativity and soul, and delivers a developer experience that I’m proud of (and user praise seems to back this perspective).&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Arraylake (storage)&lt;/strong&gt; is what Ryan Abernathey and Joe Hamman (the other two primary Pangeo architects) built at Earthmover.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Arraylake is a data lake platform built around the Zarr data model which incorporates many database-style features, such as ACID transactions, data version control, fine-grained access controls, and a built-in data catalog. A bit like Zarr + Git, or Delta Lake if you’re familiar with the dataframe storage space, Arraylake solves many of the data management challenges we experienced in the first iteration of Pangeo.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Other tooling&lt;/strong&gt; like workflow managers (Prefect, Dagster), code editors (VS Code), ML/AI tooling (PyTorch, LLMs) and more have come online. The data infrastructure world today is a vibrant and mercurial environment.&lt;/li&gt; &lt;/ul&gt; &lt;h3 id=&#34;status&#34;&gt;Status&lt;/h3&gt; &lt;p&gt;Today I see a few things:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Coiled and Earthmover&lt;/strong&gt; deliver an innovative top-shelf experience to some geospatial users, but not many. Those users tend to be early adopters and low-bureaucracy users like startups rather than older and larger organizations like NASA, weather agencies, and the energy majors.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Home Grown Pangeo 1.0 deployments&lt;/strong&gt; still get proposed within large agencies by IT groups who want to solve the data accessibility problem, but don’t land well on completion.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;2I2C and Nabari deployments&lt;/strong&gt; are used in more on-prem-ish environments where SaaS isn’t welcome, but end up delivering mostly a JupyterHub+ experience. While users report enjoying the cloud notebook capability, I haven’t seen an organization succeed with scalable/distributed computing with these platforms in practice.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Single large VMs&lt;/strong&gt; tend to be standard. While simple, this often means that users don’t do full-dataset computations and, ironically, have crazy high cloud bills (single large VMs tend to be set up in a way that they stay on forever, which can be startlingly expensive).&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3 id=&#34;community-developments&#34;&gt;Community Developments&lt;/h3&gt; &lt;p&gt;There has also been a lot of wonderful work in building community around Pangeo, with a thriving &lt;a href=&#34;https://discourse.pangeo.io/&#34;&gt;discourse forum&lt;/a&gt;, numerous third-party packages like xbatcher, xradar, rechunker, etc.., educational groups like &lt;a href=&#34;https://projectpythia.org/&#34;&gt;Project Pythia&lt;/a&gt;, and more.&lt;/p&gt; &lt;p&gt;While core technological innovation has struggled, there’s been a lot of innovation on the human side.&lt;/p&gt; &lt;p&gt;We’re at a strange place where we have a compelling POC (thanks Pangeo 1.0!) that’s motivated a lot of people to act, but no great place for them to go just yet. We also have an encouraging set of next-generation products (Coiled, Arraylake, Prefect, …) pointing the way to a bright future, but nothing that a mature organization can easily pull off the shelf. Procuring and integrating services from multiple different SaaS vendors comes with its own set of headaches.&lt;/p&gt; &lt;h2 id=&#34;future&#34;&gt;Future&lt;/h2&gt; &lt;p&gt;So what should we do here? What does the Pangeo 2.0 platform look like? Ryan Abernathey and I were discussing this topic last week over drinks and started shooting lots of ideas at each other.&lt;/p&gt; &lt;p&gt;Is it just Coiled with notebooks and regular jobs?&lt;br/&gt; Arraylake but with online update algorithms?&lt;br/&gt; Does Saturn do everything people need?&lt;br/&gt; Maybe it has to be on-prem like Nebari for government folks, but with a proper user database? Can we get government on Cloud SaaS?&lt;br/&gt; Maybe there are many different architectures for different kinds of applications and so organizations are fated to DIY?&lt;/p&gt; &lt;p&gt;I’ll give some of my opinionated constraints below. I think that we got some things right with Coiled:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://docs.coiled.io/user_guide/why.html#how-raw-cloud-architecture&#34;&gt;&lt;strong&gt;Raw-cloud architecture&lt;/strong&gt;&lt;/a&gt; rather than Kubernetes&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://docs.coiled.io/user_guide/why.html#how-environment-synchronization&#34;&gt;&lt;strong&gt;Environment synchronization&lt;/strong&gt;&lt;/a&gt; rather than Docker images&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://docs.coiled.io/user_guide/costs/index.html&#34;&gt;&lt;strong&gt;Cost controls&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;and &lt;a href=&#34;https://docs.coiled.io/user_guide/users/index.html&#34;&gt;user management&lt;/a&gt; in a database&lt;/strong&gt;, rather than JupyterHub/Kubernetes&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Centrally managed SaaS product&lt;/strong&gt; with one set of operators, rather than several instances of the same stack&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Trivial integrations&lt;/strong&gt; with other tools (our integration is just &lt;code&gt;import coiled&lt;/code&gt; in a Python prompt)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;But maybe we got some things wrong:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Notebooks:&lt;/strong&gt; while I still believe that notebooks and computation should be separable (it’s important to drive computations from things-other-than-notebooks) I now realize that single-node cloud notebooks are sometimes valuable, especially for organizations who want to deliver a more curated and homogenous experience to a population of non-power-users. (I tend to overweight the experience of power-users)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Regular Batch Jobs:&lt;/strong&gt; while I still believe in integrating with best-in-class workflow orchestration products like Prefect/Dagster, some organizations want something trivial baked-in, particularly when migrating from an on-prem HPC-style environment&lt;/li&gt; &lt;li&gt;&lt;strong&gt;SaaS:&lt;/strong&gt; I’m actually still pretty convinced that this is the right way forward. SaaS within government agencies has proven a major source of friction, but the development velocity is just so much faster.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Additionally, I’ll follow with some perhaps unpopular organizational perspectives:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Deployment Infrastructure should be SaaS rather than OSS&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Faster iteration (we can release daily rather than monthly)&lt;/li&gt; &lt;li&gt;Better visibility (we can see every failure, often before users do)&lt;/li&gt; &lt;li&gt;Maintenance costs are a tiny fraction when shared among different user groups (we service hundreds of companies with a tiny cloud dev staff)&lt;/li&gt; &lt;li&gt;&lt;strong&gt;For-profit companies&lt;/strong&gt; move faster than the community&lt;/li&gt; &lt;li&gt;Most organizations mostly care about if it works, rather than who builds it&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;However, I still have lots of questions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;What key activities and pain points are people looking to solve today?&lt;/strong&gt; What features do you need?&lt;/li&gt; &lt;li&gt;Dask / Xarray features?&lt;/li&gt; &lt;li&gt;User / cost / administration features?&lt;/li&gt; &lt;li&gt;Notebooks in the cloud?&lt;/li&gt; &lt;li&gt;Better Scalability?&lt;/li&gt; &lt;li&gt;Batch jobs / workflow orchestration?&lt;/li&gt; &lt;li&gt;Databases and data catalogs?&lt;/li&gt; &lt;li&gt;&lt;strong&gt;How do geo-specific organizations buy software?&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Do you buy software or do you build everything yourself?&lt;/li&gt; &lt;li&gt;Do you deploy SaaS or do things have to be installed on-prem or in fully-isolated cloud VPCs?&lt;/li&gt; &lt;li&gt;Who makes these decisions? What do they care about?&lt;/li&gt; &lt;li&gt;How do science users impact this decision-making process?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;If you’ve made it to the end of this post then I could use your help answering these questions. If you or someone you know works at an institution that buys this kind of software and are open to a 30 minute conversation, then I’d like to probe your brain with a few questions like these and gather your perspective.&lt;/p&gt; &lt;p&gt;Send me an e-mail at &lt;a href=&#34;mailto:pangeo-2-discovery@coiled.io&#34;&gt;pangeo-2.0-discovery@coiled.io&lt;/a&gt; and I’ll schedule a chat this week.&lt;/p&gt;</content:encoded></item> <item> <title>Usage Based Pricing</title> <author>Matthew Rocklin</author> <description>It was good for a while but became a dead end. The pros, cons, and alternatives for capturing value while making customers feel good about paying.</description> <link>https://matthewrocklin.com/usage-based-pricing/</link> <pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/usage-based-pricing/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/usage-based-pricing.png" type="image/png" length="314479" /> <content:encoded>&lt;h1 id=&#34;pivoting-away-from-usage-based-pricing&#34;&gt;Pivoting away from Usage Based Pricing&lt;/h1&gt; &lt;p&gt;We&#39;re moving away from usage based pricing.&lt;/p&gt; &lt;p&gt;This post talks about the pros and cons of usage based pricing in our situation, and then talks through alternatives.&lt;/p&gt; &lt;p&gt;&lt;img src=&#34;https://i.imgflip.com/92vpi1.jpg&#34; alt=&#34;Usage based pricing meme&#34; width=&#34;40%&#34; align=&#34;center&#34;/&gt;&lt;/p&gt; &lt;h2 id=&#34;where-we-are-today&#34;&gt;Where we are today&lt;/h2&gt; &lt;p&gt;People who follow my blog may recall that ...&lt;/p&gt; &lt;ol&gt; &lt;li&gt;We have a product people love&lt;/li&gt; &lt;li&gt;But we weren&#39;t selling it well&lt;/li&gt; &lt;li&gt;So we hired AEs (new!)&lt;/li&gt; &lt;li&gt;They&#39;re working out fantastically well (new!)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Hooray 🎉! The bottom of our funnel now flows decently and our revenue is dramatically increasing (easy to increase dramatically when it starts low 🙂)&lt;/p&gt; &lt;p&gt;However, now we have a different problem. Pricing! Today our biggest problem is figuring out how to capture more of the value we generate for customers while also making them feel good about paying us. This problem is tricky.&lt;/p&gt; &lt;p&gt;Today, we do usage-based pricing. This was good for a while, but ended up being a bit of a dead end for us. Let&#39;s talk through why.&lt;/p&gt; &lt;h2 id=&#34;why-usage-based-pricing-was-great&#34;&gt;Why Usage Based Pricing was Great&lt;/h2&gt; &lt;p&gt;Previously, we charged $0.05 per CPU-Hour, the same as major clouds or Databricks. We liked this when getting started for a few reasons.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;It’s simple&lt;/strong&gt; and it’s easy to understand quickly&lt;/li&gt; &lt;li&gt;&lt;strong&gt;It’s standard&lt;/strong&gt; in our space and so familiar to buyers&lt;/li&gt; &lt;li&gt;&lt;strong&gt;It starts small&lt;/strong&gt; so on-boarding isn&#39;t focused on financials&lt;/li&gt; &lt;li&gt;&lt;strong&gt;It’s on-par&lt;/strong&gt; with other things the customer is already paying for (the cloud in this case) so we know that they have budget for bills like this&lt;/li&gt; &lt;li&gt;&lt;strong&gt;It’s unbounded&lt;/strong&gt; so if a company does really really well, we can make a lot of money&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Mostly it was a simple default choice, and a good basis for a pricing scheme. It’s minimally scary, and so good at getting people in the door.&lt;/p&gt; &lt;p&gt;But eventually it broke down. Let’s talk about how, and then we’ll talk about what we do today.&lt;/p&gt; &lt;h2 id=&#34;why-usage-based-pricing-was-terrible-for-us&#34;&gt;Why Usage Based Pricing was Terrible (for us)&lt;/h2&gt; &lt;p&gt;There were a few fail cases:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Customers for whom our product was critical infrastructure (high value) but whose usage was really small (low price)&lt;/li&gt; &lt;li&gt;Customers where we optimized their workloads 10-100x, and so reduced our revenue 10-100x (misaligned priorities)&lt;/li&gt; &lt;li&gt;Customers who didn&#39;t like percentage increases on their usage (like how paying $10 for a bottle of water feels bad at an event)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Consider the following conversation as an example:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Customer&lt;/strong&gt;: You charge a 100% markup. That’s too high.&lt;/p&gt; &lt;p&gt;I was expecting closer to 30-40%. I’m paying $2,000 monthly to AWS and $2,000 to you&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Us&lt;/strong&gt;: Yes, but before using us you ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;were paying $20,000 to AWS because you were so inefficient&lt;/li&gt; &lt;li&gt; &lt;p&gt;were spending half an FTE maintaining that terrible infrastructure&lt;/p&gt; &lt;p&gt;(costing 50% * $200k == $100,000/year) - had a data science team of five was spending 20% of their time fighting that terrible infrastructure&lt;/p&gt; &lt;p&gt;(costing 5 * 20% * $200k == $200,000 / year) - couldn&#39;t finish that project that was critical to your business and which you were just able to finish in a couple weeks since using us&lt;/p&gt; &lt;p&gt;(the value of which only you can determine, but is probably higher than the rest)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Customer&lt;/strong&gt;: Oh yeah, I guess that&#39;s right. I guess this is worth the $2,000 you&#39;re asking for&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Us:&lt;/strong&gt; actually, now that I think about it, we should probably be charging you much more&lt;/p&gt; &lt;p&gt;(I never actually said this last part, but it was a frequent thought).&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There were two problems here:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;We captured only a small fraction&lt;/strong&gt; of the benefit we provided to users&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Users felt bad&lt;/strong&gt; about the small fraction that we did capture&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Something was clearly wrong here. Users value our product beyond what they pay (they’re getting a great deal!) but they feel like they’re getting screwed, and that&#39;s not good for anyone.&lt;/p&gt; &lt;p&gt;I&#39;ve learned that pricing is as much about psychology as about aligning cost and value.&lt;/p&gt; &lt;h2 id=&#34;why-did-this-not-work-out-for-us&#34;&gt;Why did this not work out for us?&lt;/h2&gt; &lt;p&gt;Usage-based pricing is the norm for computational cloud products. Why does it work for others (like AWS or Databricks) but not for us?&lt;/p&gt; &lt;p&gt;I have a few theories:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt; we&#39;re just much better at making users efficient.&lt;/p&gt; &lt;p&gt;Users often come in with $100,000 annual cloud bills, but after using the product realize they only need to spend $5,000-10,000.&lt;/p&gt; &lt;p&gt;The vast majority of cloud usage today is misuse and our product stops misuse. Stopping misuse is great for the user (🎉) and bad for the cloud (🎉). However, it&#39;s also bad for us (😞) under usage based pricing.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt; is more prone to these 100x efficiency swings than other technologies, like SQL, where 2-5x is more common.&lt;/p&gt; &lt;p&gt;Python can be either incredibly efficient or inefficient based on expertise. With our product novices are less cost-prone, both because of the product itself, and because of our incredible support team (more on this later)&lt;/p&gt; &lt;p&gt;We could make the product worse or stop giving good support and we&#39;d probably earn more but this doesn&#39;t feel great. There&#39;s clearly a lot of value that we can generate and would like to capture.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;SMBs&lt;/strong&gt; for velocity reasons we mostly focus on Small and Medium Businesses (SMBs) rather than large enterprises.&lt;/p&gt; &lt;p&gt;SMBs tend to value human performance more than cloud spend (humans and speed are more expensive than cloud at this scale). Maybe our focus here puts us in a strange place where the main value we provide isn&#39;t aliged with cloud cost, but rather human acceleration.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After seeing the $100,000 -&amp;gt; $5,000 transition a few times and cursing the efficiency of our product we started rethinking how we price the product.&lt;/p&gt; &lt;p&gt;So let&#39;s look at some possible new solutions. Before that though, let&#39;s talk briefly about what we sell.&lt;/p&gt; &lt;h2 id=&#34;what-do-we-sell&#34;&gt;What do we sell?&lt;/h2&gt; &lt;p&gt;In general people like using Coiled because they get to operate at larger scale more smoothly than before. This is due to a couple of things:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; the Coiled product is powerful and has a UX that feels good to Python data devs. It&#39;s a powerful tool that&#39;s comfortable to wield.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; the product also tells &lt;em&gt;us&lt;/em&gt; a lot about what users do, and our support team reaches out proactively as we see users struggle. One Coiled support engineer easily unblocks a dozen users daily.&lt;/p&gt; &lt;p&gt;Users &lt;em&gt;love&lt;/em&gt; our support team, and describe it as unlike anything else they&#39;ve experienced. It&#39;s like we&#39;ve constructed a platform that enables us to do lots of high impact micro-consulting. Unfortunately, the market isn&#39;t used to this.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The product is hard to price because of the efficiency issues with Python (we often make people 10x more efficient and so shoot ourselves in the foot).&lt;/p&gt; &lt;p&gt;The support is hard to price because we&#39;re trapped in between two things people are used to:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Typical (bad) product support&lt;/strong&gt; most SaaS products have some support tier that costs 20% on top of usage and offers access to a mediocre support experience. I&#39;ve personally never found value in SaaS support teams.&lt;/p&gt; &lt;p&gt;This is like what we do, but cheaper and worse.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Professional Services&lt;/strong&gt; consulting firms charge by the hour to unblock customers. This is much more valuable, but a way of working that&#39;s also pretty distracting and that we&#39;re not set up to do (I&#39;m done counting hours).&lt;/p&gt; &lt;p&gt;This is more like the value we provide, but operationally quite different (we dont bill hourly and we only work on what we want to).&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Our support is similar enough that we get pattern matched to existing offerings, but different enough that those approaches don&#39;t make sense for us.&lt;/p&gt; &lt;h2 id=&#34;objectives-for-a-good-pricing-scheme&#34;&gt;Objectives for a good pricing scheme&lt;/h2&gt; &lt;p&gt;So let&#39;s say we want to invent something new? What are some objectives?&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Easy to start&lt;/strong&gt; using the product without worrying&lt;/p&gt; &lt;p&gt;(we want the customer to see the value of the product before thinking about money)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Total price&lt;/strong&gt; matches the value the customer sees and can pay, so if a customer ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;is unable to pay anything (like a student) it should be free&lt;/li&gt; &lt;li&gt;is getting a lot of value and is able to pay, it should cost a lot (but less than the value they experience)&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Mentally easy for the customer&lt;/strong&gt; to connect price to value&lt;/p&gt; &lt;p&gt;We want the customer to be able to easily understand the price and connect it to the value they&#39;re getting. So for example if most of our value is accelerating their people, then we should charge per person.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;what-were-trying-today&#34;&gt;What we&#39;re trying today&lt;/h2&gt; &lt;p&gt;Today we&#39;re rolling out a change to &lt;a href=&#34;https://www.coiled.io/pricing&#34;&gt;our pricing&lt;/a&gt;.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;For basic/individual users not much changes&lt;/strong&gt;. It&#39;s still usage-based which makes it easy to test things out without thinking too hard. We are putting some seat-caps on this tier though.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;For larger teams we switch to usage + seat based pricing.&lt;/strong&gt; We charge some very small percentage of an FTE cost per seat. This is big enough to be meaningful to us, while small enough that when the customer asks themselves &#34;How much more efficient is my team with this tool?&#34; they come up with an answer that is far larger than the percentage we charge.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;future-work&#34;&gt;Future work&lt;/h2&gt; &lt;p&gt;This feels better but still not great.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;It feels good that we&#39;re shifting to human-based pricing (to match the human-based value we think we generate)&lt;/li&gt; &lt;li&gt;But human-based value feels &lt;em&gt;squishy&lt;/em&gt; and hard to quantify, which requires more thinking on the user&#39;s part, and more conversation on ours.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We have our work cut out for us. I look forward to seeing how this lands.&lt;/p&gt;</content:encoded></item> <item> <title>How GitHub taught me to Micromanage</title> <author>Matthew Rocklin</author> <description>Open source code review taught me to give intense, detailed feedback. Then I became a manager and learned why that doesn't always translate.</description> <link>https://matthewrocklin.com/feedback/</link> <pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate> <source url="https://matthewrocklin.com/feed_rss_created.xml">Matthew Rocklin</source><guid isPermaLink="true">https://matthewrocklin.com/feedback/</guid> <enclosure url="https://matthewrocklin.com/assets/images/social/feedback.png" type="image/png" length="323536" /> <content:encoded>&lt;h1 id=&#34;how-github-taught-me-to-micromanage&#34;&gt;How GitHub taught me to Micromanage&lt;/h1&gt; &lt;p&gt;Feedback is critical to performing good work as a team. Good feedback cultivates quality work and professional growth. Bad feedback degrades quality and erodes relationships.&lt;/p&gt; &lt;p&gt;This article explains my experience of feedback in open source community code review, and the culture that emerged from intense detailed feedback. Then we shift to corporate settings and see and how these lessons fail to apply cleanly.&lt;/p&gt; &lt;h2 id=&#34;open-source-code-reviews&#34;&gt;Open Source Code Reviews&lt;/h2&gt; &lt;p&gt;I first experienced transformative feedback when working in old-school open source communities. These weren&#39;t corporate environments. These were a bunch of volunteers working together to build something awesome used by rest of the world. There were no managers, no performance reviews, no video meetings, no meetings at all in fact. There was just the work, and the work was the focus of all communication.&lt;/p&gt; &lt;p&gt;The work took three forms:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Issues:&lt;/strong&gt; where we discussed concerns and considered technical designs as a group&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Coding:&lt;/strong&gt; where one person would write a solution to the proposed issue&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Code Review:&lt;/strong&gt; where anyone could drop in, review the code, and provide feedback.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Most of the work was in &lt;em&gt;Code Review&lt;/em&gt;, not &lt;em&gt;Coding&lt;/em&gt; (writing code is a vanishingly small fraction software development) and so I spent several hours every day, for years, giving and receiving highly detailed feedback from fellow collaborators. This is where we taught each other. This is where we learned to align on mission and style. This is where we expressed humor and learned about each others&#39; character and about our own.&lt;/p&gt; &lt;p&gt;Let&#39;s see an example&lt;/p&gt; &lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt; &lt;p&gt;In this example we see some simple proposed code below, and then consider bad/ok/good feedback on that code.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Proposed code&lt;/strong&gt;&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;element&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;Bad Review&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Please don&#39;t use for loops. They&#39;re hard to understand. Also please use informative variable names.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;OK Review&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Please don&#39;t use for loops. They&#39;re hard to understand. Also, please use informative variable names.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;How about the following?&lt;/em&gt;&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;total&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;record&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;record&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;housing_records&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;Good Review&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;I suggest that we avoid explicit for loops here. I think that a list comprehension would be a better fit.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;This is a bit subjective, I find that list comprehensions make it more clear to the reader what&#39;s going on at a glance because they&#39;re a more constrained construct. (The same could be said for using &lt;code&gt;map&lt;/code&gt;, but I rarely see that pattern in this codebase).&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;How about this?&lt;/em&gt;&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;total&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;record&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;record&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;housing_records&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;em&gt;Now, this practice can definitely get out of hand (I&#39;ve seen some crazy nested list comprehensions) so there&#39;s a tradeoff between using common explicit technologies like for loops (easy to reason about, but you have to read them) and using patterns like list comprehensions (tricky when large, but immediately recognizable if simple). I think that for simple cases like this the tradeoff is strongly in favor of the list comprehension.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Anecdotally, this is also the norm in this codebase.&lt;/em&gt;&lt;/p&gt; &lt;h3 id=&#34;analysis&#34;&gt;Analysis&lt;/h3&gt; &lt;p&gt;Let&#39;s assess each piece of feedback and why I personally think that they&#39;re bad/ok/good.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Bad feedback&lt;/strong&gt; critiques code, but doesn&#39;t offer a better direction.&lt;/p&gt; &lt;p&gt;Critique without constructive direction is just complaining, and adds constraint to the author without also helping with momentum.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;OK feedback&lt;/strong&gt; provides direction.&lt;/p&gt; &lt;p&gt;The reviewer works with the author to produce a better result.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Good feedback&lt;/strong&gt; educates the author.&lt;/p&gt; &lt;p&gt;The reviewer works with the author to produce a better result.&lt;/p&gt; &lt;p&gt;The reviewer works to also improve the author, an investment in their joint future.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The good feedback is thorough, especially given how trivial the code is, and especially given that the new solution and the old solution &lt;em&gt;do the same exact thing&lt;/em&gt;. It&#39;s not like there was some important bug here.&lt;/p&gt; &lt;p&gt;The main reason for good feedback is to invest in the author.&lt;/p&gt; &lt;h2 id=&#34;role-of-code-review&#34;&gt;Role of Code Review&lt;/h2&gt; &lt;p&gt;We see then that code reviews serve a few different roles:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Ensure quality work&lt;/li&gt; &lt;li&gt;Teach fellow developers&lt;/li&gt; &lt;li&gt;Align on conventions and process&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Personally, this is how I learned to write code. This community and practice is the reason for my success in career, which has transformed my life. I am grateful. This community and practice is also the primary way for me to give back to fellow devs around the world. I can see the impact I and others have had daily in the lives and success of colleagues that I&#39;ve known for decades.&lt;/p&gt; &lt;h2 id=&#34;oss-idiosyncrasies&#34;&gt;OSS Idiosyncrasies&lt;/h2&gt; &lt;p&gt;After thinking about this life experience and comparing it to corporate work (which I&#39;ll get to next), I think that there are some interesting idiosyncrasies about this practice and people that are worth mentioning:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Craftsmanship:&lt;/strong&gt; These people care deeply about their craft&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Volunteerism:&lt;/strong&gt; Everyone is a volunteer, spending their personal time on this activity&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Work Focus:&lt;/strong&gt; All feedback and conversation is focused on the work, rather than on the person&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Public:&lt;/strong&gt; All feedback is fully public&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Respect:&lt;/strong&gt; Respect is assumed broadly (we rarely volunteer with people that we don&#39;t enjoy)&lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;corporate-contexts&#34;&gt;Corporate contexts&lt;/h2&gt; &lt;p&gt;&lt;em&gt;Why the heck is the CEO correcting my grammar!?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;This same approach of highly detailed and thoughtful review does not transfer well to corporate contexts in my experience. As an example, let&#39;s consider the following exchange over a google doc:&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;../images/google-doc-review.png&#34; /&gt;&lt;/p&gt; &lt;p&gt;When I first transitioned from OSS dev to CEO at a startup I did &lt;em&gt;lots&lt;/em&gt; of review like this. What I found were questions/concerns/problems like the following (all of which are valid in hindsight)&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Why is the CEO correcting my grammar?&lt;/li&gt; &lt;li&gt;If you want these changes, why not just edit the doc directly?&lt;/li&gt; &lt;li&gt;This doc isn&#39;t high priority. Why do you want to talk about this so much?&lt;/li&gt; &lt;li&gt;Why do you keep telling me how bad I am at writing?&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;These questions confused me. I realized that it was because that the implicit message received behind my feedback was very different.&lt;/p&gt; &lt;h2 id=&#34;implicit-messages&#34;&gt;Implicit messages&lt;/h2&gt; &lt;p&gt;There was a major difference in the implicit message that is being received in the first open source case than in the second corporate case.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Open Source:&lt;/strong&gt; &lt;em&gt;I believe in you and your work. I see potential for you to get even better at your craft and would be proud to invest my time to see that happen.&lt;/em&gt;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Corporate:&lt;/strong&gt; You&#39;re doing a bad job. I&#39;m going to explain, in minute detail, exactly what you did wrong, over and over again because I hate you and want you to suffer.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What before was a supportive behavior is now an abusive one. Everything depends on context.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Note: to be clear, this miscommunication isn&#39;t the receiever&#39;s fault. We as reviewers need to better model our context so we can anticipate how feedback will be received.&lt;/em&gt;&lt;/p&gt; &lt;h2 id=&#34;corporate-mindset&#34;&gt;Corporate Mindset&lt;/h2&gt; &lt;p&gt;This negative reception feels more reasonable when you consider the mindset and context in which this work is done. Referring back to the OSS Mindset above, let&#39;s compare with corporate.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Honing a craft:&lt;/strong&gt; in old-school community OSS people cared &lt;em&gt;a lot&lt;/em&gt; about getting better at development. Micro-adjustments to our form were really valuable to us. Development skill was a big part of our (or at least my) self-identity.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Conversely in corporate few people care as deeply about the craft of writing, meeting facilitation, graphic design, etc.. Skillbuilding is nice, but it&#39;s secondary to getting work done. The assumption is that feedback is primarily focused on the job at hand, rather than on building our teammates.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;Assumed Respect:&lt;/strong&gt; in volunteer OSS if people don&#39;t like you they just ignore you. Anyone reviewing your work is doing so because they care and want to help you.&lt;/p&gt; &lt;p&gt;This doesn&#39;t hold in a corporate environment, where people are paid to help whether or not they like you.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This does beg the question though, what would a corporate environment look like where people cared deeply about things like meeting facilitation and slide design? Probably the company would go quickly out of business, but it&#39;s a fun thought to consider, and maybe apply a little bit of in our everyday life.&lt;/p&gt; &lt;h2 id=&#34;feedback-reception-budget&#34;&gt;Feedback Reception Budget&lt;/h2&gt; &lt;p&gt;And so, I&#39;ve learned that a person can absorb only about one piece of feedback per interaction, and then only if it&#39;s labeled very specifically as feedback with the best intentions, and wrapped delicately in a feedback sandwich.&lt;/p&gt; &lt;p&gt;Because of this volume constraint, infrequent feedback must be more general and higher level, ideally accompanied by impersonal assets like a blogpost that the recipient of the feedback can read separately (this is partially why I write blogposts).&lt;/p&gt; &lt;h2 id=&#34;but-please&#34;&gt;But please ...&lt;/h2&gt; &lt;p&gt;For the love of god ...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Remove filler words like &#34;really&#34;, &#34;very&#34; or anything else that doesn&#39;t change the meaning of a sentence&lt;/li&gt; &lt;li&gt;Do not start meetings by asking everyone to introduce themselves&lt;/li&gt; &lt;li&gt;Attach agendas to meetings ahead of time&lt;/li&gt; &lt;li&gt;When making slides think about text contrast and use alignment guide-lines&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Thanks for listening, hopefully this article ...&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Helps people around me understand the implicit message behind my feedback&lt;/li&gt; &lt;li&gt;Gives everyone desiring a spirit of craftsmanship more interest in developing a strong culture of constant constructive feedback&lt;/li&gt; &lt;/ol&gt;</content:encoded></item> </channel> </rss>