<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Building software on rnewman</title>
    <link>/post/software/</link>
    <description>Recent content in Building software on rnewman</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Richard Newman. All rights reserved.</copyright>
    <lastBuildDate>Sat, 14 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="/post/software/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Removing downloaded macOS text to speech voices</title>
      <link>/post/software/2026/remove-macos-voices/</link>
      <pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2026/remove-macos-voices/</guid>
      <description>&lt;p&gt;I recently played around with using &lt;a href=&#34;https://github.com/dokterbob/macos-speech-server&#34;&gt;&lt;code&gt;macos-speech-server&lt;/code&gt;&lt;/a&gt; for STT/TTS in Home Assistant. When experimenting with &lt;code&gt;avspeech&lt;/code&gt;, the macOS-native speech engine, I discovered that macOS 26 no longer allows you to delete voice packs after installing them — the management UI is gone, and the advice online about swiping in the list doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;At 100–500MB per voice, these add up.&lt;/p&gt;
&lt;p&gt;Unfortunately, deleting the files from &lt;code&gt;/System/Library/AssetsV2/&lt;/code&gt; is blocked by system integrity protection: even &lt;code&gt;sudo&lt;/code&gt; can&amp;rsquo;t do it.&lt;/p&gt;
&lt;p&gt;Fortunately these are &amp;ldquo;mobile assets&amp;rdquo;, so there&amp;rsquo;s a macOS framework to manage them. Claude and I pulled together a Swift script that uses that framework to list the voice assets and let you delete the ones you no longer want. I put it &lt;a href=&#34;https://github.com/rnewman/remove-macos-voices&#34;&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The incident spiral</title>
      <link>/post/software/2026/incident-spiral/</link>
      <pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2026/incident-spiral/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve watched this pattern unfold more than twice, so it&amp;rsquo;s time to write it down.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A team has a quality problem. Reliance on unreliable partners, technical debt after a couple of years of fast growth, accrued complexity — whatever the causes, we&amp;rsquo;ve become aware that things aren&amp;rsquo;t just humming along.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The team starts taking incidents more seriously. A new leader joins, or senior leadership puts the team under a microscope. The intent is good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incident retrospectives become more thorough; these take time. Each retro produces more action items, which take time to address. Some action items improve detection, so on-call engineers get paged more, and we open more incidents to track. The team is now spending 20–40% of its engineering bandwidth on incidents, retros, and action items.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Meanwhile, the team is expected to keep shipping features and absorbing company-wide changes. Those changes themselves increase the surface area for things to go wrong. Running at 60% capacity means corners are cut on feature work and people are tired. More incidents.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a bad situation: the more the team tries to meet expectations, by shipping features and taking incidents seriously, the worse things get.&lt;/p&gt;
&lt;h2 id=&#34;action-items-are-a-trap&#34;&gt;Action items are a trap&lt;/h2&gt;
&lt;p&gt;In most companies, incident action items bypass normal prioritization. A P1 comes with a one-week deadline and supersedes other work for whichever engineer is assigned the ticket. This is &lt;strong&gt;by design&lt;/strong&gt;, because, without that deadline and that accountability, the backlog of action items will keep getting punted until after the next sprint, when the cold light of day shines on the list of things you told your product manager you&amp;rsquo;d get done. You sat in a meeting and said these things were &lt;em&gt;necessary&lt;/em&gt; to prevent recurrence, accelerate detection, help with mitigation, or reduce blast radius, right?&lt;/p&gt;
&lt;p&gt;But consider the tradeoff that occurs in practice. Teams are always balancing feature and reliability work, and some of that planned reliability work might matter more than any incident action item.&lt;/p&gt;
&lt;p&gt;A P1 action item for a minor incident might preempt a &lt;em&gt;planned&lt;/em&gt; project to deprecate a problematic system or remove a single point of failure.&lt;/p&gt;
&lt;p&gt;The incident action item addresses a failure mode we&amp;rsquo;ve just seen. The planned work might avoid a catastrophic failure that we haven&amp;rsquo;t yet seen. We prioritize the former because it&amp;rsquo;s vivid. We&amp;rsquo;ve been lucky on the latter — so far.&lt;/p&gt;
&lt;p&gt;Lorin Hochstein captures this with a thought experiment he calls the &lt;a href=&#34;https://surfingcomplexity.blog/2023/12/22/the-courage-to-imagine-other-failures/&#34;&gt;Oracle of Delphi&lt;/a&gt;. Imagine an oracle tells you that if you do an incident&amp;rsquo;s follow-up work, you&amp;rsquo;ll avoid a recurrence… but you&amp;rsquo;ll suffer a novel eight-hour outage next month. If you do the reliability work that was already on your backlog, you&amp;rsquo;ll have another minor incident like the one you just had, but avoid the big one. Which do you choose?&lt;/p&gt;
&lt;p&gt;Creating a P1 or P2 incident action item is a statement that this is the most important thing you can work on this week, based on an implicit assumption that the &lt;strong&gt;last&lt;/strong&gt; incident is a strong predictor of future reliability issues. That assumption is often wrong. You were surprised before. You&amp;rsquo;ll be surprised again.&lt;/p&gt;
&lt;h2 id=&#34;the-complexity-that-was-supposed-to-help&#34;&gt;The complexity that was supposed to help&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a related problem with the &lt;em&gt;kind&lt;/em&gt; of action items that retros produce. The natural response to an incident is to add something: a check, a cache, a retry, a fallback, a circuit breaker. Each is reasonable in isolation, and they&amp;rsquo;re easy for folks on the periphery of a system to imagine and propose as action items. Over time, they accumulate.&lt;/p&gt;
&lt;p&gt;Hochstein has a &lt;a href=&#34;https://surfingcomplexity.blog/2017/06/24/a-conjecture-on-why-reliable-systems-fail/&#34;&gt;conjecture&lt;/a&gt; about this: once a system reaches a certain level of reliability, most major incidents will involve either a manual intervention intended to mitigate a minor incident, or unexpected behavior of a subsystem whose primary purpose was to improve reliability.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t theoretical. The &lt;a href=&#34;https://surfingcomplexity.blog/2025/12/14/aws-reinvent-talk-on-their-oct-25-incident/&#34;&gt;October 2025 AWS outage&lt;/a&gt; involved an unanticipated interaction between multiple reliability mechanisms: redundant enactor instances, a locking mechanism, a cleanup mechanism, a transactional mechanism, and a rollback mechanism. All sensible design decisions, but the incident emerged from their interaction. The &lt;a href=&#34;https://surfingcomplexity.blog/2025/12/06/quick-takes-on-the-dec-5-cloudflare-outage/&#34;&gt;December 2025 Cloudflare outage&lt;/a&gt; was triggered by a killswitch — a mechanism specifically designed to quickly disable misbehaving rules — that had worked well in the past but failed in a corner case.&lt;/p&gt;
&lt;p&gt;Caches, retries, and bimodal fallback paths are all common contributors to incidents. I see them proposed as action items every week.&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t mean reliability mechanisms are bad. We need retries, timeouts, bulkheading, failovers, rate limiting, caches, circuit breakers, and all the rest. Complexity is inevitable, and indeed we must learn to ‘surf’ it, as Hochstein puts it. However, we must also continually work to &lt;strong&gt;simplify&lt;/strong&gt; to make room for the new complexity we&amp;rsquo;re adding.&lt;/p&gt;
&lt;h2 id=&#34;breaking-out&#34;&gt;Breaking out&lt;/h2&gt;
&lt;p&gt;The urge to take incidents seriously is correct. The problem is that when every incident generates two weeks of follow-up work, the team can&amp;rsquo;t keep up. Prevention competes with response, and both compete with the roadmap.&lt;/p&gt;
&lt;p&gt;Here are some approaches I&amp;rsquo;ve found helpful to reduce the burden and increase agency, starting with the two I think matter most.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Predictable external failures shouldn&amp;rsquo;t be incidents.&lt;/strong&gt; One airline being unreachable isn&amp;rsquo;t an incident for a travel booking site. One restaurant being unexpectedly closed isn&amp;rsquo;t an incident for Uber Eats. Some failure modes exist by design — they will happen, and the system should handle them gracefully, informing the user as appropriate. (To do this right you might need to monitor external dependencies with synthetics, rather than just watching error rates.)&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t mean ignoring these failures. Track them. Build dashboards. Set up weekly reviews to spot trends. If a partner&amp;rsquo;s error rate doubles, that&amp;rsquo;s a conversation to have with the partner, or a reason to reconsider the integration. But don&amp;rsquo;t page someone at 2am.&lt;/p&gt;
&lt;p&gt;You can achieve similar benefits by weakening guarantees: for example, retries, job queues, dead-letter queues, and so on are all mechanisms to turn failures into latency. If your users are OK with latency, you can use those mechanisms to make your system more resilient.&lt;/p&gt;
&lt;p&gt;You might make a different decision here if you have a lot of influence or control over the partner or destination, if the partner is fungible, if there&amp;rsquo;s something you can do to unblock your own customer &lt;em&gt;in extremis&lt;/em&gt;, or if you want to actively track these failures. However, I think this point will be immediately recognizable to teams trapped in a particular bad state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be more discriminating about action items.&lt;/strong&gt; Action items should fill urgent gaps in detection or ability to mitigate, fix obvious bugs, and prevent cascading failures. Not every incident needs a code change. Good action items should address a &lt;em&gt;class&lt;/em&gt; of incidents, not just the specific failure you observed.&lt;/p&gt;
&lt;p&gt;Almost everything else you can think of, particularly migrations and rewrites, should be added to the backlog to be weighed against the other reliability work you were already planning.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m fond of asking in retros &lt;a href=&#34;../../post/software/2024/an-incident-lens&#34;&gt;the questions I learned at Amazon&lt;/a&gt;. They&amp;rsquo;re simple, but they nudge you into taking different perspectives and generalizing to a class of failures: what would have halved your time to detection? What would have halved your time to recover? What would have halved the blast radius?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also useful to ask what would halve the &lt;strong&gt;cost&lt;/strong&gt; of this class of incident, because achieving that can help us break out of the spiral. Sometimes the answer is “nothing practical, and we accept this will happen occasionally” — that might be better than doing a bunch of work just to feel like you&amp;rsquo;re responding to the incident. If you&amp;rsquo;re never declining action items, you&amp;rsquo;re not being selective enough.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After an incident, look for complexity to remove, not just safeguards to add.&lt;/strong&gt; We should be skeptical of action items that add new things that can interact and fail. After an incident, ask: what could we &lt;em&gt;remove&lt;/em&gt; to make this simpler? Could we eliminate the dependency that failed, rather than wrap it in more error handling? Can we make two things &lt;a href=&#34;https://en.wikipedia.org/wiki/Fate-sharing&#34;&gt;share fate&lt;/a&gt;? Could we drop a feature that isn&amp;rsquo;t worth its operational cost?&lt;/p&gt;
&lt;p&gt;Asking simplifying questions &lt;em&gt;all the time&lt;/em&gt; is something I expect of staff engineers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be honest about staffing.&lt;/strong&gt; A team spending 30% of its time on incidents might be understaffed for its scope. Sometimes the answer is “we can&amp;rsquo;t operate this much surface area with this many people.” That&amp;rsquo;s uncomfortable to say, but the alternative — denial, leading to degraded quality, burnout, and attrition — is worse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make the cost visible with an incident budget.&lt;/strong&gt; Allocate a fixed percentage of engineering time — say, 15% — to incident work. When that&amp;rsquo;s exhausted, remaining action items compete with features through normal prioritization. This makes the cost visible, forces explicit tradeoffs, and creates pressure to make incidents cheaper.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;None of these changes will fix everything overnight, but they might break the feedback loop.&lt;/p&gt;
&lt;p&gt;Engineering needs to be sustainable. A team drowning in incidents can&amp;rsquo;t think strategically or make deliberate choices. The first step is to reclaim the ability to plan, then use that ability to chart a course towards holistic reliability.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An incident lens</title>
      <link>/post/software/2024/an-incident-lens/</link>
      <pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2024/an-incident-lens/</guid>
      <description>&lt;p&gt;I first started owning the operational posture of modern (SaaS, microservices, cloud, &lt;em&gt;etc&lt;/em&gt;.) services in 2018, when I joined AWS.&lt;/p&gt;
&lt;p&gt;With service ownership came incidents (and &lt;a href=&#34;https://wa.aws.amazon.com/wat.concept.coe.en.html&#34;&gt;CoEs&lt;/a&gt;!), and the ensuing six years built my awareness of availability and formed the lenses I use in incident retrospectives. Those lenses now shape the advice I give.&lt;/p&gt;
&lt;p&gt;Last week&amp;rsquo;s example: a senior engineer wanted to improve the deployment processes used by a nascent service. It is today manually deployed to a shared testing environment and a production environment, usually in order, once per week.&lt;/p&gt;
&lt;p&gt;The first thought of the engineer and his manager was that we should build a &amp;lsquo;stable&amp;rsquo; pre-production environment — let&amp;rsquo;s call it &lt;em&gt;pilot&lt;/em&gt; for the sake of discussion — avoiding contention in the testing environment. Changes would bake there for a while before flowing to prod. Various additional suggestions, most of them good, built on that: make deployments include only a single change, so we know what broke; build a pipeline that a person would promote instead of running Terraform, and so on.&lt;/p&gt;
&lt;p&gt;These are all worth doing! But from an incident perspective, we tend to ask some very simple questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How did you know something went wrong?&lt;/li&gt;
&lt;li&gt;How long did it take you to find out?&lt;/li&gt;
&lt;li&gt;How big was the impact?&lt;/li&gt;
&lt;li&gt;How long did it take you to recover?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a retrospective, we&amp;rsquo;ll rotate these questions a bit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How would you have halved the time to detection?&lt;/li&gt;
&lt;li&gt;How would you have halved the time to recovery?&lt;/li&gt;
&lt;li&gt;How would you have halved the blast radius?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thinking in this mindset led to my advice: there is little point in building a pilot environment or a release pipeline unless you can (a) reliably roll back deployments, (b) detect bustage in prod quickly enough to automatically decide to roll back, and (c) roll back quickly enough, and/or deploy to small enough populations, to minimize how many users are affected, depending on the maturity level and SLA of your service.&lt;/p&gt;
&lt;p&gt;We have no automatic rollback other than ECS blue-green deploys, and while we have alarms on service metrics, many endpoints take little to no traffic. (I&amp;rsquo;ve seen this situation in a few places: uncommon endpoints take no traffic, so they can easily regress without being detected in any reasonable rollback window.)&lt;/p&gt;
&lt;p&gt;Introducing a pilot environment would only give us a false sense of security, or even make things worse by improving developer productivity: we&amp;rsquo;d deploy broken changes, bake them without detecting any problems, then roll out the broken change to 100% of users in prod. Maybe we&amp;rsquo;d even watch the dashboards, and not see any problem for a week or two!&lt;/p&gt;
&lt;p&gt;The need to detect bustage before it affects lots of users, and roll back quickly, dictates the roadmap I suggested:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Build synthetic tests (&amp;ldquo;canaries&amp;rdquo;) to ensure a volume of traffic that mimics real usage on every API (&amp;ldquo;which API endpoints are you willing to break without noticing?&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Build detectors on those canaries and service metrics to fire alarms. Any bustage should be detectable. Now your time-to-detection is low.&lt;/li&gt;
&lt;li&gt;Build a pipeline that rolls back if those alarms fire. Now your time-to-recovery for simple bugs is low.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Then&lt;/em&gt; build a pilot stage to serve as a smaller &amp;lsquo;canary&amp;rsquo; population. This stage bakes a release before it goes out. Now you have reduced the blast radius of a bad change, introducing a place to run canaries and real internal users to generate novel traffic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Other concerns, like smaller rapid deployments, are secondary to these. They might be important — perhaps developer velocity is hampered by the shared testing environment — but I&amp;rsquo;ve found that bad deployments are themselves a large source of friction, as well as being bad for the customer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tenets</title>
      <link>/post/software/2022/tenets/</link>
      <pubDate>Fri, 21 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2022/tenets/</guid>
      <description>&lt;p&gt;I learned a lot during my time at AWS. One thing that I haven’t seen discussed much is how documented tenets can be used to structure a team’s path.&lt;/p&gt;
&lt;p&gt;Tenets in this context are documented principles and beliefs that a team holds about itself, its users, and its products. They can be a useful guide for decision-making, and even the process of defining and phrasing the team’s tenets — and the ruthless prioritization needed to hit the expected limit of 5–7 — brings tremendous clarity. As with planning, the value is largely in the process, not the outcome!&lt;/p&gt;
&lt;p&gt;Tenets can be set at the team level, the service level, or for smaller efforts and scopes that would benefit from directional clarity.&lt;/p&gt;
&lt;p&gt;Writing good tenets is hard, and even tenured leaders often misunderstand the concept, losing some of the benefits.&lt;/p&gt;
&lt;p&gt;A bad tenets list reads like a statement of values, a wishlist, simple priorities, or untethered aspirations. Our product will be fast, cheap, and available everywhere.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.factoftheday1.com/p/tenets-at-amazon-a2bb8a56ae94&#34;&gt;This blog post&lt;/a&gt; publishes some internal Amazon tenets (see the w.amazon.com links!).&lt;/p&gt;
&lt;p&gt;A good example is from IoT:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Necessary offline operations: We help customers build systems in the cloud that work in predictable ways when connectivity is limited.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The point of writing up tenets is not to capture something that&amp;rsquo;s unambiguous or uncontested (&lt;em&gt;products should be fast&lt;/em&gt;, &lt;em&gt;the team should have a high bar for quality&lt;/em&gt;), nor to capture something that&amp;rsquo;s easily defined in some process doc or as a metric and thus does not require much human judgment. It&amp;rsquo;s to define a mental model for coping with conflicting priorities, to define a position in an exclusive value space, or to provide a mast to which a team under fire can tie themselves.&lt;/p&gt;
&lt;p&gt;I’m sure it would be very convenient to tie some IoT capabilities to a network connection. Making a system work reliably with limited connectivity is hard and must be designed in from the start; it’s something that customers need help with; and it’s a requirement that engineering teams would love to drop! This tenet encodes an &lt;em&gt;intention&lt;/em&gt; that steers decisions towards the inconvenient choice that’s right for customers.&lt;/p&gt;
&lt;p&gt;Tenets like this are a statement in advance, while we still have the space and presence of mind to use good judgment, that we won’t do the expedient thing. It is a form of &lt;a href=&#34;https://effectiviology.com/precommitment/&#34;&gt;precommitment&lt;/a&gt; — the corporate equivalent of setting out your workout clothes the night before, because you know you won’t feel like exercising in the morning.&lt;/p&gt;
&lt;p&gt;Accessibility is another good example. It&amp;rsquo;s important, it has top-down guidance in many product orgs, and yet teams will routinely sacrifice accessibility (and localization!) in order to hit a deadline, saying &amp;ldquo;yeah, well, accessibility is important, but of course we have to weigh it against shipping features…&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;A weak tenet like &lt;em&gt;accessibility is important&lt;/em&gt; is strengthened by making it definite — &lt;em&gt;our releases are always accessible to users of assistive technologies&lt;/em&gt; — or make the tradeoffs explicit: &lt;em&gt;we prioritize accessibility over time to market, and will delay a release that doesn’t serve all of our customers&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A good tenet can capture discomfort and interaction patterns, too: &lt;em&gt;we avoid excluding our remote teammates by making decisions asynchronously and with time for thoughtful comments, rather than in synchronous meetings&lt;/em&gt;. Again, there’s a tradeoff captured: that the team will go slower in order to be inclusive and make more measured decisions.&lt;/p&gt;
&lt;p&gt;Other tenets can express an opinionated stance about product-market fit: &lt;em&gt;our users are sophisticated and prefer detailed, accurate docs rather than vague marketing materials&lt;/em&gt;, or &lt;em&gt;we accommodate our industry&amp;rsquo;s long sales cycles by treating trial users with the same priority as sold users&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;At a leadership offsite my team tried an exercise: gather in small groups and write what you think the whole org’s tenets should be, then come together and discuss. The outcome was educational, if not surprising: many newer leaders wrote bad tenets; many wrote tenets that focused on the importance of their teams’ efforts, rather than the breadth of the business and our coordinated long-term success; and few wrote tenets that surfaced the essential tensions between their own priorities and those of other managers. This exercise is time well spent if you can spare an hour, but be prepared to work through the disagreements about what really matters for your teams!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing for an audience</title>
      <link>/post/software/2022/writing-for-an-audience/</link>
      <pubDate>Fri, 21 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2022/writing-for-an-audience/</guid>
      <description>&lt;p&gt;Many Stripes are in the habit of writing &amp;ldquo;5:15s&amp;rdquo;: short updates that take fifteen minutes to write and five to read. My own staff notes are infrequent, on the order of every month or two.&lt;/p&gt;
&lt;p&gt;In part that is because I find it hard to find the time to digest my week into a useful narrative. If you told 25-year-old me how many hours of meetings I would have each week, and how much time I spend on Slack, he wouldn’t have believed you, and would have gone back to writing code. (First he would have asked you what Slack was!) The raw dump would be overwhelming and unnavigable.&lt;/p&gt;
&lt;p&gt;In part it’s because I spend a lot of time constructing custom-fit narratives for individuals or small groups, trying to serve their needs by shaping my experiences and perspectives into a parable and an account that succinctly gives them what they need for the situation in which they find themselves. A mentee recently apologized for presenting so many questions and problems for me to respond to, and I laughed — this is the most fun part of my job!&lt;/p&gt;
&lt;p&gt;Mostly, though, it’s because I am acutely aware that a broadcast narrative — whether that’s an email, a project review update, a 5:15, or a conference talk — is a tool for changing an audience’s perspective, and getting that right requires both understanding the audience and providing (or assuming) enough context that the message can be practically brief. Often the context cannot feasibly be communicated, either because it is too early and unstable, or because it is so impractically large that the audience will extract no net value from what I have to say.&lt;/p&gt;
&lt;p&gt;That leaves me where I am today: with occasional abstract updates.&lt;/p&gt;
&lt;p&gt;Those of you who succeed at broader notes: I would love to hear your perspectives and ideas. Those who read these abstract notes: I am curious whether you find them valuable, or would prefer something more concrete (or different entirely).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First month at Stripe</title>
      <link>/post/software/2022/first-month-at-stripe/</link>
      <pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2022/first-month-at-stripe/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m approaching the end of my first month at Stripe. I didn&amp;rsquo;t announce where I was landing &lt;a href=&#34;../../post/software/2022/back/&#34;&gt;in my earlier post&lt;/a&gt; out of a sense of counting my chickens, so I&amp;rsquo;m glad to change that!&lt;/p&gt;
&lt;p&gt;It is a strange and amusing shift to go from working at a bookshop with a climate pledge to working at a &lt;a href=&#34;https://press.stripe.com/&#34;&gt;publisher&lt;/a&gt; with a &lt;a href=&#34;https://stripe.com/climate&#34;&gt;carbon sequestration arm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After more than three years at AWS I was quite settled on my team, surrounded by people I knew well, and aware of the patterns swirling at various levels. I was also aware of my pace of learning having slowed, and I was tired of managing my cognitive dissonance. While I miss the people, the Principal Engineering community, and some unique aspects of my role, and I&amp;rsquo;m grateful for how much I had the opportunity to learn, I feel good about my decision to leave.&lt;/p&gt;
&lt;p&gt;I also feel good so far about my decision to join Stripe: even as a relatively large startup, there is still a coherence of vision and some agility, and it really feels like we are all pulling in roughly the same direction. The people are kind, and that&amp;rsquo;s even expressed in the benefits decisions that management makes, like explicitly giving emergency medical and caring leave this year — too many of my friends at Amazon burned through PTO due to surprise COVID or caring responsibilities. No place is perfect, but so far I can live with the imperfections.&lt;/p&gt;
&lt;p&gt;My first weeks at Stripe have been a firehose, as one might imagine: simultaneously learning a new domain (finance and payments), how Stripe&amp;rsquo;s businesses fit in to that, the technologies we use, the work that&amp;rsquo;s beginning, and the people. Stripe has a very thorough &amp;ldquo;101&amp;rdquo; onboarding program, but I quite quickly (too quickly?) ramped up on some real work, and I feel like I accidentally struck a good balance: after 19 working days I already have a web of relationships with my onboarding cohort, my new teams, and other staff engineers in my area, and I&amp;rsquo;m starting to develop the intuitions and questioning/routing behaviors that staff engineers use to do our jobs.&lt;/p&gt;
&lt;p&gt;More importantly, I have managed to strike a good balance of time. Meetings happen 9–3 Pacific to avoid impacting east coasters, and Wednesdays are meeting-free for makers. I stop at 4 or 5, depending on when I started my day. Working at Amazon was always described to me as &amp;ldquo;intense&amp;rdquo;. So far Stripe is also intense, but bounded and mindfully so: everyone has given me advice to make sure that I don&amp;rsquo;t take on too much.&lt;/p&gt;
&lt;p&gt;We have ambitious goals for the next twelve months, so it&amp;rsquo;s a relief to find that people view that as a long hike, not as a deathmarch. Onwards!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I&#39;m back; things changed</title>
      <link>/post/software/2022/back/</link>
      <pubDate>Thu, 06 Jan 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2022/back/</guid>
      <description>&lt;p&gt;As &lt;a href=&#34;../../post/software/2021/a-long-pause/&#34;&gt;I wrote&lt;/a&gt; last year, I didn&amp;rsquo;t feel like I had the space to write for public consumption while performing my role at AWS, and I would be back when things changed.&lt;/p&gt;
&lt;p&gt;They have: I decided to leave AWS at the start of 2022.&lt;/p&gt;
&lt;p&gt;As is tradition I then spent a couple of days fiddling with blogging systems, migrating my posts out of Medium and recovering a couple of posts from an even older blog. This is the result.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t expect a particular cadence of writing, and I&amp;rsquo;m trying to not let the perfect be the enemy of good, but I&amp;rsquo;m optimistic that I will publish things now that I have an easy place to do so.&lt;/p&gt;
&lt;p&gt;More next week.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A long pause</title>
      <link>/post/software/2021/a-long-pause/</link>
      <pubDate>Sat, 25 Sep 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/software/2021/a-long-pause/</guid>
      <description>&lt;p&gt;Working at AWS is very different to working at smaller mission-driven companies like Mozilla.&lt;/p&gt;
&lt;p&gt;Even in projects where &lt;a href=&#34;https://github.com/aws/amazon-chime-sdk-js/issues?q=richnew10&#34;&gt;I get to think or work in the open&lt;/a&gt;, there is policy around communication that has a chilling effect on writing, as well as cultural pressure to use my time to write more leveraged &lt;a href=&#34;https://aws.amazon.com/blogs/business-productivity/transforming-audio-and-shared-content-in-the-amazon-chime-sdk-for-javascript/&#34;&gt;blog posts to serve the interests of the team&lt;/a&gt;. That means I don’t write here.&lt;/p&gt;
&lt;p&gt;This culture is in stark contrast to &lt;a href=&#34;../../tags/medium/&#34;&gt;my pieces on Medium&lt;/a&gt; from 2018, my last year at &lt;a href=&#34;../../tags/mozilla/&#34;&gt;Mozilla&lt;/a&gt;, in which I wrote to explain — and wrote &lt;em&gt;to think through&lt;/em&gt;! — two problems with which I have grappled for long stretches of my career: how different groups of people (individuals, teams, or even communities) can &lt;em&gt;reuse&lt;/em&gt; information that overlaps in space and vocabulary; and how different devices can &lt;em&gt;change&lt;/em&gt; shared data over time and space without the need for heavyweight central coordination.&lt;/p&gt;
&lt;p&gt;The AWS blog certainly attracts more readers than this little Medium, but it doesn’t serve those purposes of explaining and thinking through problems.&lt;/p&gt;
&lt;p&gt;In occasional bursts of free time I return to the topic of structured storage, whether by writing index chunk join code to understand an &lt;a href=&#34;https://arxiv.org/abs/1210.0481&#34;&gt;algorithm&lt;/a&gt;, or more recently by digging into &lt;a href=&#34;https://blueskyweb.org/satellite&#34;&gt;an identity challenge that is intrinsically decentralized&lt;/a&gt;, only to find &lt;a href=&#34;https://json-ld.org/spec/latest/json-ld/&#34;&gt;JSON-LD&lt;/a&gt; (&lt;a href=&#34;https://www.w3.org/2001/sw/wiki/RDF&#34;&gt;RDF&lt;/a&gt; in disguise!) hiding under the covers. Writing prose for public consumption, however, has fallen by the wayside.&lt;/p&gt;
&lt;p&gt;I’ll be back when things change.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
