<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ktheory]]></title><description><![CDATA[The personal blog of Aaron Suggs]]></description><link>https://ktheory.com</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 23 Mar 2025 23:43:16 GMT</lastBuildDate><item><title><![CDATA[The leveraged leadership of a calm calendar]]></title><description><![CDATA[I once worked closely with two VPs of Engineering with very different calendars. One had a packed calendar, often double- or triple-booked…]]></description><link>https://ktheory.com/the-leveraged-leadership-of-a-calm-calendar/</link><guid isPermaLink="false">https://ktheory.com/the-leveraged-leadership-of-a-calm-calendar/</guid><pubDate>Sun, 23 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I once worked closely with two VPs of Engineering with very different calendars. One had a packed calendar, often double- or triple-booked. In those meetings, he was often rushed and unprepared. He made hasty decisions seemingly to save time that actually created churn and rework.&lt;/p&gt;
&lt;p&gt;Another VP had a mostly-free calendar — just a few meetings each day. He was calm, relaxed, and ready to give high-quality focused attention when an important issue came up. The meetings were generally tight and effective, with time for a few digressions. He still worked hard, and had plenty of ‘slack’ in his day for important-but-not-urgent work. Much of his flexibility came from carefully explaining his thought process and decision-making frameworks so that our team could effectively make similar decisions independently.&lt;/p&gt;
&lt;p&gt;Guess which VP was newly promoted, and which one had been doing the job for 10 years? One was in over his head, struggling to figure out what needed his attention, and what to delegate. The other had figured out the few tasks that were critical for his success, and made systems and trained colleagues to manage the rest.&lt;/p&gt;
&lt;p&gt;Busyness may not be a sign of important work and responsibilities — it may be the sign of poor or outdated management practices.&lt;/p&gt;
&lt;p&gt;Now when I feel too busy to work sustainably, I ask myself, ‘What systems are missing or outdated? What training is needed? What can I delegate?’ It’s a powerful antidote to burnout, a reminder that effective management isn’t about doing it all, but about empowering others to do their best. In that act of trust, everyone can thrive.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Task-relevant maturity: a lens for effective management]]></title><description><![CDATA[Have you ever wished that your manager would give you more autonomy and responsibility in some areas, and more direction and support in…]]></description><link>https://ktheory.com/task-relevant-maturity-a-lens-for-effective-management/</link><guid isPermaLink="false">https://ktheory.com/task-relevant-maturity-a-lens-for-effective-management/</guid><pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever wished that your manager would give you more autonomy and responsibility in some areas, and more direction and support in others? As a manager, have you ever struggled to know when to be hands-on or hands-off with your team’s work?&lt;/p&gt;
&lt;p&gt;If you’re ‘hands on’ — closely involved with the details of your employee’s work — you risk wasting your time micro-managing what they could have done independently. If you’re hands-off, you risk poor execution and missed opportunities for coaching and development.&lt;/p&gt;
&lt;p&gt;One of my favorite tools for navigating this trade-off is ’&lt;strong&gt;Task-relevant maturity&lt;/strong&gt;’ from Andrew Grove’s &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/High_Output_Management&quot;&gt;High Output Management&lt;/a&gt;&lt;/em&gt; book.&lt;/p&gt;
&lt;p&gt;Grove advises that managers vary their approach based on the experience and competence the particular employee with the particular task. If the task a new challenge for your employee, or they’ve struggled with it in the past (low maturity), default to a hands-on approach with frequent, structured support and direction. As they grow (medium maturity), emphasize collaborative problem solving and coaching. And once they gain a lot of experience (high maturity), default to a hands-off, highly delegated approach with initial goal alignment and progress tracking.&lt;/p&gt;
&lt;p&gt;Here’s a helpful table from the book:&lt;/p&gt;
&lt;div class=&quot;responsive&quot;&gt;
  &lt;table class=&quot;table&quot;&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th scope=&quot;col&quot;&gt;Maturity&lt;/th&gt;
        &lt;th scope=&quot;col&quot;&gt;Management approach&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Low&lt;/td&gt;
      &lt;td&gt;Structured; task-oriented: tell &quot;what&quot;, &quot;when&quot;, &quot;how&quot;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Medium&lt;/td&gt;
      &lt;td&gt;Individual-oriented; emphasis on two-way communication, support, mutual reasoning&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;High&lt;/td&gt;
      &lt;td&gt;Minimal involvement from manager: establishing objectives and monitoring&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3&gt;Benefits&lt;/h3&gt;
&lt;p&gt;I’ve found this approach to be valuable in multiple ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Better &lt;em&gt;employee engagement&lt;/em&gt;: team members feel a healthy balance of coaching and close support when they need it, and independence and flexibility when it’s appropriate. They stay in the &lt;a href=&quot;https://www.psychologytoday.com/us/blog/clearer-thinking-today/202411/how-to-achieve-the-flow-state&quot;&gt;flow state&lt;/a&gt; where the challenge matches their skills.&lt;/li&gt;
&lt;li&gt;Improved &lt;em&gt;team effectiveness&lt;/em&gt;: the team’s capabilities grow as members demonstrate maturity in new tasks.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Managerial leverage&lt;/em&gt;: you spend more time on the high-value tasks that actually need your attention and support, and skip the low-value micro-managing.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Examples from my work&lt;/h3&gt;
&lt;p&gt;In software engineering teams, here are some tasks where I’ve applied the lens of ‘Task-oriented maturity’ to attenuate my involvement in their work to improve employee engagement, team efficacy, and managerial leverage.&lt;/p&gt;
&lt;p&gt;For software engineers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creating a tech plan / design / architecture for a new system or component&lt;/li&gt;
&lt;li&gt;cross-functional collaboration (work with new teams or roles)&lt;/li&gt;
&lt;li&gt;interviewing potential hires&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For managers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creating team charters, visions, goals, and roadmaps&lt;/li&gt;
&lt;li&gt;resolving personnel problems and conflicts&lt;/li&gt;
&lt;li&gt;coaching and mentorship&lt;/li&gt;
&lt;li&gt;project execution: identifying and intervening when a project is off-track&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rather than having a one-size-fits-all approach for how I manage these tasks, I’ve varied my approach for low, medium, and high maturity teammates. Grove’s model served me well to effectively support teammates with low task-oriented maturity to grow new competencies, and to stay out of the way of those who already had expertise.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vision before goals]]></title><description><![CDATA[I love this aphorism about visionary leadership paraphrasing Saint-Exupéry: “Building a boat isn’t about weaving canvas, forging nails, or…]]></description><link>https://ktheory.com/vision-before-goals/</link><guid isPermaLink="false">https://ktheory.com/vision-before-goals/</guid><pubDate>Sat, 04 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I love this aphorism about visionary leadership &lt;a href=&quot;https://quoteinvestigator.com/2015/08/25/sea/&quot;&gt;paraphrasing Saint-Exupéry&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Building a boat isn’t about weaving canvas, forging nails, or reading the sky. It’s about giving a shared taste for the sea, by the light of which you will see nothing contradictory but rather a community of love.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a7a93ef247c0a85a8f2b51a4720643de/8ccd0/shipyard.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.9620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAUA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAVmjLCloWqf/xAAZEAADAQEBAAAAAAAAAAAAAAABAhIAAyP/2gAIAQEAAQUCvmVBQN45WI1tNHf/xAAWEQEBAQAAAAAAAAAAAAAAAAAAERL/2gAIAQMBAT8BjL//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFX/8QAHBAAAgAHAAAAAAAAAAAAAAAAAAECEBEhIjEy/9oACAEBAAY/AsWUcR0Wctn/xAAdEAACAQQDAAAAAAAAAAAAAAAAASERMVGRQXGh/9oACAEBAAE/IYxDfRJAqTFircNMdSIyPB5+z//aAAwDAQACAAMAAAAQ6N//xAAWEQEBAQAAAAAAAAAAAAAAAAABEQD/2gAIAQMBAT8QBI6d/8QAFhEBAQEAAAAAAAAAAAAAAAAAAREA/9oACAECAQE/EFbde//EAB4QAQACAgEFAAAAAAAAAAAAAAEAESExQVFhcbHw/9oACAEBAAE/EEIHDNnzx0h8CZKaBnE3hj64ljX7NSptVoyh9ksxf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;a busy shipyard with the ocean in the background&quot;
        title=&quot;a busy shipyard with the ocean in the background&quot;
        src=&quot;/static/a7a93ef247c0a85a8f2b51a4720643de/828fb/shipyard.jpg&quot;
        srcset=&quot;/static/a7a93ef247c0a85a8f2b51a4720643de/ff44c/shipyard.jpg 158w,
/static/a7a93ef247c0a85a8f2b51a4720643de/a6688/shipyard.jpg 315w,
/static/a7a93ef247c0a85a8f2b51a4720643de/828fb/shipyard.jpg 630w,
/static/a7a93ef247c0a85a8f2b51a4720643de/0ede0/shipyard.jpg 945w,
/static/a7a93ef247c0a85a8f2b51a4720643de/3ac88/shipyard.jpg 1260w,
/static/a7a93ef247c0a85a8f2b51a4720643de/8ccd0/shipyard.jpg 1792w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A shared vision obviates many management tasks. People make good decisions with little explicit project management, communication, and coordination. Without a shared vision, management overhead grows exponentially.&lt;/p&gt;
&lt;p&gt;When leaders decide that employees are &lt;em&gt;not&lt;/em&gt; working effectively toward their vision, a particular mistake they can make is to introduce a goal framework (like OKRs) and begin managing to those targets.&lt;/p&gt;
&lt;p&gt;I have not seen this work: managing to targets will not fix a vague vision, lack of focus, or incoherent strategy. In fact, it can lead to disengagement as employees grapple with the dissonance between the official management goals, and what they believe is important. Better to fix the root cause.&lt;/p&gt;
&lt;p&gt;In contrast, if an organization &lt;em&gt;has&lt;/em&gt; a clear shared vision, I’ve seen OKRs and managing to targets accelerate execution and clarify tradeoffs. Goals &lt;em&gt;can be&lt;/em&gt; a useful management tool.&lt;/p&gt;
&lt;p&gt;If you’re tempted to use goals to improve performance, first check if your team has a clear and compelling vision.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Useful models: the barbell strategy]]></title><description><![CDATA[The barball strategy, popularized by Nassim Taleb, is a way to navigate risk/reward tradeoffs when you’re skeptical about the accuracy the…]]></description><link>https://ktheory.com/useful-models-the-barbell-strategy/</link><guid isPermaLink="false">https://ktheory.com/useful-models-the-barbell-strategy/</guid><pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://www.investopedia.com/articles/investing/013114/barbell-investment-strategy.asp#axzz1pbC2xhqE&quot;&gt;barball strategy&lt;/a&gt;, popularized by Nassim Taleb, is a way to navigate risk/reward tradeoffs when you’re skeptical about the accuracy the risk estimates. While it originated in financial investing, it can apply to product and business strategy.&lt;/p&gt;
&lt;p&gt;Imagine a menu of investments ranging from low-risk &amp;#x26; low-reward to high-risk &amp;#x26; high reward. The barbell strategy picks mostly conservative low risk investments to cap losses, and a few high risk bets in the hopes of outsized payoffs. It ignores middle-of-the-road investments.&lt;/p&gt;
&lt;p&gt;The key insight is that risk estimates have systemic bias to understate the risk. For example, projects are far more likely to be late and over-budget than early and under-budget.&lt;/p&gt;
&lt;p&gt;Thus, middle-of-the-road investments are generally riskier than managers think. The barbell strategy is resilient to poor risk estimates.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/66057bf53709f4242e07a14d5c7abe91/75d38/barbell-strategy.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABO0lEQVQoz42QzW7CMBCE8/5vQ+89U6k9gBCIYFBCIDWJjbN20iT4Z10lLlILRe3IB+94Pu2uI/9AUsrzKKXUo0x0UyNiIBljiNh1HQA84qN7yxjDORdCFEWR57nWmjHWdd2/4Lqum1EAIKVsmqbveyHEH3CYmXNurb0xAaBt219g/NJQq1HfTAw5ay3nfPCvTz87I0qpqqq6Hy9EwyIjfu1srd0dz7tDOSPlC6l7bbzTzmq0Gt1wjNGDLto5CwCv62KZMFV/DDBjbJMc97Ta5dXzqk0prDMgR7lMIT7AIgXKQEkAACGqVSbftmqT0MVybY2JCCFbEodhLHrR+lXhZ+9+wzzhw6WsvfMeOq8uvu6HWFmeniaTfZZFcRxPp1NKaVjOOjwpTDhSiekZx/RgGhd+yoWfn8/naZp+Aq2Mex4BBCUDAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;barbell strategy&quot;
        title=&quot;barbell strategy&quot;
        src=&quot;/static/66057bf53709f4242e07a14d5c7abe91/f058b/barbell-strategy.png&quot;
        srcset=&quot;/static/66057bf53709f4242e07a14d5c7abe91/c26ae/barbell-strategy.png 158w,
/static/66057bf53709f4242e07a14d5c7abe91/6bdcf/barbell-strategy.png 315w,
/static/66057bf53709f4242e07a14d5c7abe91/f058b/barbell-strategy.png 630w,
/static/66057bf53709f4242e07a14d5c7abe91/40601/barbell-strategy.png 945w,
/static/66057bf53709f4242e07a14d5c7abe91/78612/barbell-strategy.png 1260w,
/static/66057bf53709f4242e07a14d5c7abe91/75d38/barbell-strategy.png 1851w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’ve found this model implicit in John Doerr’s approach to product strategy when he advocates for a blend of mostly “roofshot” product investments, and a few “moonshot” product investments.&lt;/p&gt;
&lt;p&gt;It can also apply to business strategy of when to defend existing markets versus expand into new markets.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Access-oriented DB design: avoiding the tech debt of normalized schemas]]></title><description><![CDATA[Choosing an appropriate data store and schema design is an important early decision for web development projects. A common convention is to…]]></description><link>https://ktheory.com/access-oriented-db-design-avoiding-the-tech-debt-of-normalized-schemas/</link><guid isPermaLink="false">https://ktheory.com/access-oriented-db-design-avoiding-the-tech-debt-of-normalized-schemas/</guid><pubDate>Tue, 20 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Choosing an appropriate data store and schema design is an important early decision for web development projects. A common convention is to start with a relational database (like PostgreSQL or MySQL) and a &lt;em&gt;normalized schema&lt;/em&gt; that minimizes redundant data (formally called &lt;a href=&quot;https://en.wikipedia.org/wiki/Third_normal_form&quot;&gt;3NF&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I’d like to encourage an alternative &lt;em&gt;access-oriented&lt;/em&gt; approach to designing schemas that prioritizes &lt;em&gt;scalable, extensible data access patterns&lt;/em&gt; over &lt;em&gt;normalization and ad hoc queries&lt;/em&gt;. This approach is heavily influenced by Rick Houlihan’s amazing presentation at re:Invent 2018: &lt;a href=&quot;https://www.youtube.com/watch?v=HaEPXoXVf2k&quot;&gt;Advanced Design Patterns for DynamoDB&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Challenges with normalized SQL schemas&lt;/h3&gt;
&lt;p&gt;In my experience, a major challenge using normalized schemas for web apps is that important DB queries that were initially fast get slower as the data volume grows. Specifically queries that join, sort, and filter unindexed data perform worse in &lt;a href=&quot;https://database.guide/what-is-oltp/&quot;&gt;OLTP databases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It’s certainly &lt;em&gt;possible&lt;/em&gt; to design schemas and write queries that scale gracefully with more data. But when developers start from a mindset of a maximally normalized schema, it’s easy to implement a few gnarly SQL queries for important features.&lt;/p&gt;
&lt;p&gt;This can be particularly challenging for lean startups. Features built with inefficient schemas are often fast with small data sets, such as test environments and early days on production. But as usage grows, performance degrades. This scaling bottleneck causes developers to significantly rework the schema or data architecture just as the product gains popularity. It’s a particularly toxic form of tech debt that’s due just as people are paying attention.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-dnt=&quot;true&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;There&amp;#39;s technical debt, then there&amp;#39;s technical subprime mortgages with exploding balloon payments.&lt;/p&gt;&amp;mdash; Mark Imbriaco (@markimbriaco) &lt;a href=&quot;https://twitter.com/markimbriaco/status/501151363011997696?ref_src=twsrc%5Etfw&quot;&gt;August 17, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;As an example, let’s consider a social network app with a personalized newsfeed of updates from people you follow.&lt;/p&gt;
&lt;p&gt;A normalized (3NF) schema might look like: a &lt;code class=&quot;language-text&quot;&gt;posts&lt;/code&gt; table with and &lt;code class=&quot;language-text&quot;&gt;author_id&lt;/code&gt; that’s a foreign key to a users table, and a &lt;code class=&quot;language-text&quot;&gt;followers&lt;/code&gt; table with &lt;code class=&quot;language-text&quot;&gt;follower_id&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;followed_id&lt;/code&gt; that are also both foreign keys to a users table.&lt;/p&gt;
&lt;p&gt;To get some relevant posts for my homepage newsfeed, I’d generate a query like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;SELECT posts.* FROM posts
INNER JOIN followers ON followers.followed_id = posts.author_id
WHERE followers.follower_id = &apos;my_user_id&apos;
ORDER by posts.relevance_score DESC
LIMIT 50;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s also assume we have the appropriate indexes on &lt;code class=&quot;language-text&quot;&gt;follower_id&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;followed_id&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;relevance_score&lt;/code&gt;, and &lt;code class=&quot;language-text&quot;&gt;author_id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This query still becomes slower the more users follow each other, since the DB must read from a different segment of the posts index for each user you follow. Rather than growing gracefully with your product, the query performance is a tailwind for product growth.&lt;/p&gt;
&lt;p&gt;When faced with slow production queries, many developers quickly implement &lt;em&gt;caching&lt;/em&gt;. Or to put it more generally, they look to &lt;em&gt;denormalize the data to better accommodate important access patterns&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A snappy user experience quickly takes priority over data normalization.&lt;/p&gt;
&lt;p&gt;And because of the urgent need to scale a popular feature, devs often implemented caching hastily, which can incur even more tech debt and system complexity.&lt;/p&gt;
&lt;p&gt;If we’re so quick to give up normalization for scalability, is it truly so valuable to begin with? Can we start with scalability, and reduce the complexity of caching? I think so.&lt;/p&gt;
&lt;h3&gt;Access-oriented schema design&lt;/h3&gt;
&lt;p&gt;Let’s instead design our storage based on how we plan to query the data. In our homepage newsfeed example, we know we want the query to display personalized, relevant news items to remain quick as the number of users and posts grow.&lt;/p&gt;
&lt;p&gt;So we might create a &lt;code class=&quot;language-text&quot;&gt;feed_items&lt;/code&gt; table with &lt;code class=&quot;language-text&quot;&gt;user_id&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;relevance_score&lt;/code&gt;, and &lt;code class=&quot;language-text&quot;&gt;post_id&lt;/code&gt; fields. When a new post is inserted, our application fans out to write the appropriate entries to the &lt;code class=&quot;language-text&quot;&gt;feed_items&lt;/code&gt; table.&lt;/p&gt;
&lt;p&gt;Now the query for the news feed is:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;SELECT posts.*, feed_items.relevance_score FROM posts
INNER JOIN feed_items ON feed_items.post_id = posts.id
WHERE feed_items.user_id = &apos;my_user_id&apos;
ORDER by feed_items.relevance_score DESC
LIMIT 50;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This query more easily scales with a compound index on &lt;code class=&quot;language-text&quot;&gt;feed_items.user_id&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;relevance_score&lt;/code&gt;. It lets us fetch the appropriate posts from a single, contiguous segment of the index. We also defer the need to add a caching tier like Redis or Memcache as well.&lt;/p&gt;
&lt;p&gt;The point is not simply to fanout on write rather than fanout on read—it’s that planning ahead to make your important access patterns fast and scalable can save significant rework later. It’s become one of my favorite topics to dive into during system design reviews: does the engineer have a reasonable understanding of how their data access performance will scale with usage?&lt;/p&gt;
&lt;h3&gt;Developer affordances and NoSQL&lt;/h3&gt;
&lt;p&gt;One advantage of NoSQL wide-column data stores like AWS DynamoDB and Apache Cassandra is to  force developers to implement scalable queries. Scalable queries require a partition key, and don’t support joins.&lt;/p&gt;
&lt;p&gt;DynamoDB drives home this developer affordance with distinct API methods. Use &lt;a href=&quot;https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html&quot;&gt;GetItem&lt;/a&gt; for scalable, performance-sensitive queries. And in the rare cases you need to operate over an arbitrarily large portion of your data set, use &lt;a href=&quot;https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html&quot;&gt;Scan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In contrast, SQL does not have such conspicuous affordances for developers to know if their query is scalable. The massive performance difference between the two queries above is easy to miss. Developers would need to have an intuitive understanding of their data volume, or run &lt;code class=&quot;language-text&quot;&gt;EXPLAIN&lt;/code&gt; commands as an extra step. Arguably, SQL’s big advantage is that it lets authors create complex ad hoc queries. This is fantastic for analytics, reporting, and data exploration where users are less sensitive to latency. But it can confound developers who want their queries to scale gracefully.&lt;/p&gt;
&lt;h3&gt;In summary&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;When designing a new system, consider an &lt;em&gt;access-oriented DB design&lt;/em&gt; that ensures important queries will scale gracefully with data volume and concurrent usage.&lt;/li&gt;
&lt;li&gt;Consider whether a schema change will let you keep using your primary data store without needing the architectural and operational complexity of a secondary cache.&lt;/li&gt;
&lt;li&gt;Consider how you can build affordances in your API to encourage fast, scalable queries, and discourage slow, complex ones.&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[A new model for social energy]]></title><description><![CDATA[I find the traditional introversion / extraversion spectrum used in Myers-Briggs personality test to be inadequate to understand my social…]]></description><link>https://ktheory.com/a-new-model-for-social-energy/</link><guid isPermaLink="false">https://ktheory.com/a-new-model-for-social-energy/</guid><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I find the traditional &lt;a href=&quot;https://en.wikipedia.org/wiki/Myers%E2%80%93Briggs_Type_Indicator#Attitudes:_extraversion/introversion&quot;&gt;introversion / extraversion spectrum&lt;/a&gt; used in Myers-Briggs personality test to be inadequate to understand my social energy. When I took an online assessment years ago, I was smack in the middle: 50% introverted, 50% extroverted. To say that I’m “drained” or “recharged” by either social or alone time is over-simplified to the point of being confusing—I’m all of the above in some way.&lt;/p&gt;
&lt;p&gt;Instead, I’ve found a more useful model for social energy: creating several ‘buckets’ of solitary and social time that I want to fill with time at different rates.&lt;/p&gt;
&lt;p&gt;For alone time, I divide it into &lt;em&gt;structured, task-oriented time&lt;/em&gt;, versus &lt;em&gt;unstructured creative or restorative time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For social time, I consider the size of the group: &lt;em&gt;1:1,  small group (3-5 people), and large group (6+ people)&lt;/em&gt;. I also consider the level of intimacy: &lt;em&gt;intimates (family &amp;#x26; close friends), new acquaintances, or strangers&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For me, the largest bucket is structured alone time, of which I need 1-8 hours per day. I need roughly 1-3 hours per day of unstructured alone time.&lt;/p&gt;
&lt;p&gt;For 1:1 or small groups with intimates, I need about 5-20 hours per week, and say 3-10 hours of large group time per month with new acquaintances and strangers.&lt;/p&gt;
&lt;p&gt;I sometimes enjoy mass events, where a crowd of strangers is feeling the same thing. It could be a concert, sport, or political rally. It’s enjoyable and innervating, as long I as don’t do it more than 2-3 times per year, after which it’s draining. OTOH, I have friends that enjoy that multiple times per week!&lt;/p&gt;
&lt;p&gt;If you ever played The Sims, I picture myself with one of those &lt;a href=&quot;https://sims.fandom.com/wiki/Plumbob&quot;&gt;glowing plumbob mood meters&lt;/a&gt;. If I’m putting time in each bucket at the right frequency, I’m green. But if one of the boxes is neglected, I go yellow or red—my life feels unbalanced and less fulfilling. That’s my cue to schedule the appropriate kind of event to restore my energy.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What I used to believe about happiness]]></title><description><![CDATA[I used to believe that satisfaction could be found. I was a treasure hunter seeking an elusive location, charting waypoints along the…]]></description><link>https://ktheory.com/i-used-to-believe/</link><guid isPermaLink="false">https://ktheory.com/i-used-to-believe/</guid><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I used to believe that satisfaction could be found. I was a treasure hunter seeking an elusive location, charting waypoints along the journey.&lt;/p&gt;
&lt;p&gt;Now I believe that satisfaction, happiness, peace of mind, is constructed. Each moment is an opportunity to create a little more.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Anatomy of a Job Search]]></title><description><![CDATA[Last December, I started a new role at a small, family-owned e-comm company. Two months later, my manager (the founder / CEO) and I realized…]]></description><link>https://ktheory.com/anatomy-of-a-job-search/</link><guid isPermaLink="false">https://ktheory.com/anatomy-of-a-job-search/</guid><pubDate>Sun, 05 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last December, I started a new role at a small, family-owned e-comm company. Two months later, my manager (the founder / CEO) and I realized that the role wasn’t a fit and we parted ways. For the first time since college, 18 years ago, I didn’t know what my job was. This is the story of my search for my new role.&lt;/p&gt;
&lt;h4&gt;Acknowledging privilege&lt;/h4&gt;
&lt;p&gt;Up front, I want to recognize my privilege. I had financial security and insurance throughout the process. I have supportive family and friends. I’m a college-educated white male US citizen with experience in Tech as a software dev and manager.&lt;/p&gt;
&lt;p&gt;At the start of my search in late February, tech hiring going gangbusters.&lt;/p&gt;
&lt;p&gt;It’s valid if readers find my search shockingly easy. I feel blessed. I’m just sharing what I did, why, and how it worked out in the hopes that it helps job seekers set expectations.&lt;/p&gt;
&lt;h4&gt;Search criteria&lt;/h4&gt;
&lt;p&gt;I wrote these criteria early, and it was very helpful for me to focus my efforts and clarify what really mattered to me.
A superficial, ego-stroking part of me certainly wants a prestigious title. But as I go back to my search criteria, it’s really not important. I’d much rather be in an organization where I feel supported and can learn a lot regardless of title.
I’m pleased that the role I accepted nails each of the criteria and preferences below.&lt;/p&gt;
&lt;p&gt;I shared these eagerly with hiring managers if they asked (usually verbally and more concisely).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I view my job search as an &lt;a href=&quot;https://en.wikipedia.org/wiki/Optimization_problem&quot;&gt;optimization problem&lt;/a&gt; to &lt;em&gt;maximize learning&lt;/em&gt; and get exposed to new perspectives and types of expertise. I’m particularly interested in Product/Program management, Strategic Finance, Operations, and non-Ruby tech stacks.&lt;/p&gt;
&lt;p&gt;I set a fairly high bar for:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Products and business opportunity that will have clear positive impact on society.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;self-aware&lt;/em&gt;, supportive org culture. IMHO, every company says they’re &lt;em&gt;supportive&lt;/em&gt;. Self-awareness is correlated and easier to assess as an interviewer. E.g. do interviewers speak frankly to the challenges and trade-offs of the culture and leadership decisions?&lt;/li&gt;
&lt;li&gt;A company that appreciates in-house software engineering as a strategic asset (i.e. most “tech companies”)&lt;/li&gt;
&lt;li&gt;Compensation policies are within ~20% of market rate as determined by Glassdoor, recent offers, and conversations w/ peers. An important aspect of comp is to incentivize working through challenging situations rather than leaving for greener pastures. While comp is far from the most important factor, it establishes a baseline of appreciation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Beyond those requirements, I’m flexible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;individual contributor vs management: open to both&lt;/li&gt;
&lt;li&gt;local vs remote: open to both&lt;/li&gt;
&lt;li&gt;company size: I have a soft preference for larger Eng teams (100+). I’ve spent most of my career on teams of 5-50 engineers. I think a larger team would better serve my #1 goal of being exposed to new perspectives. But I know I enjoy and can thrive on small teams as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;One thing I’m just realizing in writing this post is that I don’t have a specific next-level career achievement I’m shooting for. My goal is basically ‘learn and enjoy the journey’ rather than say, ‘retire early’ or ‘acquire enough experience to start my own company’.&lt;/p&gt;
&lt;h4&gt;Flow chart&lt;/h4&gt;
&lt;p&gt;This Sankey diagram shows the outcomes of the 21 companies I considered. See the &lt;a href=&quot;https://observablehq.com/@ktheory/sankey-diagram&quot;&gt;raw data here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/11875953340a31b8a7f69bb5e03a3bc9/cb93d/job-search-sankey.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.89873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAADNUlEQVQozwEqA9X8AExznqBZeqNxXXiccmB4mmheephfXHuXWlt9l1ZgfJJYZXuOWWt7ilpyeoVceXmAX4B4emSGd3VpjHZxbpF2bXKUdml2l3ZmeJp2ZHeXcl6EAExwmaxoc5h9gW+MgZhqf3SwZHNmyF9oWtJVV2/cVlZh3lhXWdtXVFzXWFNdz11YY8thXWfHZGBrvGZgcbVpYXWta2N3qG9ieqFxX32TbVmPAE5wl61udZNsfG2RYpBmh2upYnp4w19wddNWXKPYXGCQzGptgLd3eImqgX2Lqn1teJ96XXaTdlB1pH5PbKyES3C3h0V5t4dOcKl/VnaUcleMAE51mZ+NhHlvv4pQRdmIODbWdz5D3mc/ddRVRLC9XU2mrH1jmouPc6p0jm+/eopYqGiARbNffTvDioZBm6mHQISvhDmQu4ZGg7uFX4Kse2qEAJRzlJWnenyDvnpSnuKBLq3xfCqd62wxo9dVO7zRWEOrxWFOorNkWqSjaGWdmWxvlYhvdpB3c36OXXB/kFFxmnFCcK1f/6IRAP+4gg3jkI4nAKFwlLG5eoV7yHldlMpuNrzIYUGvzlxPnstYYKTLXWyBw193TL5aejmxX388nWaGQY5qi0WCb5VLbHOSVU1thIRLcJWUZXOJB72ZjADtko4AALF4f5TFf2uGynpNp8d2O7zCbkactmRVXqVyeEild3ldnHV3dIl7g3N3dn9fZ2x5T2dzhlljeJFaYHqbWFp9pVxLc5x0OFiCBQAOowDEh4gBAOeHJaH6kSd8844riuKFMK3biUaQzYxWiMqQXYbHmG2Bwp1+gLKckJyckYxRAAAAAniCqA1heKkMWXinDlN4qA5JbZkKKkdRAC9OYABEZowAANuBK6/siy5y848vUuWKL0XplkND2ZhgUsWWdmC/n4xwwKufe7erpZGimpdE6eDhAP///wBgfLAAWHmrAFR6rABJbZgALEZUADFOYgBDZowAAOOHLaPvkztq5JVLXN6aW1jYnWda1KFzV9Gnf1TKqYtRxKyYS7Won1Oro58km5OOAJeVnAFje6gAW3qmAFZ7qABKcJoAMlBtADdXeABFapEAzY5+nLfbauwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Job search Sankey chart&quot;
        title=&quot;Job search Sankey chart&quot;
        src=&quot;/static/11875953340a31b8a7f69bb5e03a3bc9/f058b/job-search-sankey.png&quot;
        srcset=&quot;/static/11875953340a31b8a7f69bb5e03a3bc9/c26ae/job-search-sankey.png 158w,
/static/11875953340a31b8a7f69bb5e03a3bc9/6bdcf/job-search-sankey.png 315w,
/static/11875953340a31b8a7f69bb5e03a3bc9/f058b/job-search-sankey.png 630w,
/static/11875953340a31b8a7f69bb5e03a3bc9/40601/job-search-sankey.png 945w,
/static/11875953340a31b8a7f69bb5e03a3bc9/78612/job-search-sankey.png 1260w,
/static/11875953340a31b8a7f69bb5e03a3bc9/cb93d/job-search-sankey.png 2304w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here’s how to interpret the chart. Starting on the left, there were three sources of companies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Referral&lt;/strong&gt; (9 companies) - I had a personal connection to someone at the company. These ranged from casual acquaintances to close former colleagues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organic&lt;/strong&gt; (5 companies) - I applied via the company job board.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recruiter&lt;/strong&gt; (7 companies) - An in-house recruiter contacted me, and I responded with interest.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I’m not counting recruiters that I ignored. I chose not to work with external recruiting agencies b/c I think our incentives would be misaligned.&lt;/p&gt;
&lt;p&gt;And on the right, there are four outcomes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No response&lt;/strong&gt; (6): After some interaction, I didn’t hear back from the company (aka ghosted).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rejected&lt;/strong&gt; (6) : the company decided to not move forward with me for any current roles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declined&lt;/strong&gt; (8): I decided to not move forward with the company for any current roles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accepted&lt;/strong&gt; (1): my new job!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the middle was a mostly conventional hiring funnel.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Recruiter screen&lt;/strong&gt; (5/10 pass rate): brief conversation w/ an in-house recruiter about the role(s), my experience, and what I’m looking for. In 5 cases, we skipped this and went straight to…&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiring Manager screen&lt;/strong&gt; (3/10 pass rate): usually a general discussion about our approaches with a handful of specific anecdotes. This is key to build rapport w/ my potential manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main panel&lt;/strong&gt; (3/3 pass rate): a slate of 3-4 deep-dive interviews.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extra panel&lt;/strong&gt; (2/3 pass rate): in one case, the extra panel was an anticipated chat with the CEO and virtual lunch with several team members I’d manage. In the other 2 cases, it was unconventional! I’d done well in the main panel, that the team wanted to consider me for different, more senior roles.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The extra panels were quite valuable because 1️⃣ it’s a strong positive signal that the company likes you if they’re willing to have cross-functional discussions about whether you’re a fit for an unconventional role, and 2️⃣ it gave me more opportunities to meet the team and see how they make decisions. Of the 3 companies where I’d done extra panels, I had video chats with 10-13 employees per company.&lt;/p&gt;
&lt;h4&gt;Timelines&lt;/h4&gt;
&lt;p&gt;I didn’t have a good intuition for how long I could reasonably wait to hear back about a role I applied for.&lt;/p&gt;
&lt;p&gt;In my case, the median time from when I replied to a recruiter or applied to a job to having my first screening was &lt;strong&gt;3 days&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Only 2 screenings took more than 6 days, and those were special cases with active email threads coordinating around travel and PTO.&lt;/p&gt;
&lt;p&gt;My conclusion is that if you haven’t heard back within &lt;strong&gt;6 days&lt;/strong&gt;, you probably won’t.&lt;/p&gt;
&lt;p&gt;The later stages were similar: within a week, usually less, modulo any scheduling accommodations.&lt;/p&gt;
&lt;h4&gt;Learnings and surprises&lt;/h4&gt;
&lt;p&gt;The extra panels showed me that as roles get more senior, adapting the interview process is key. The &lt;em&gt;interview loops evolve from cookie-cutters to snowflakes&lt;/em&gt;. On the hiring side, I’ve put in a lot of effort to make predictable, standardized interview loops for early career through middle-management roles. I expect most SVP or C-level roles would have uniquely personalized interview loops. Currently, I’m somewhere in the middle.&lt;/p&gt;
&lt;p&gt;I accepted a role to which I applied organically rather than via a referral. That was surprising b/c referrals are usually easier to navigate since the referrer can advocate for me and/or share helpful context about the company’s needs and quirks. Most of my recent jobs have come via my personal network.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The in-house recruiters play a critical role in broadcasting company culture&lt;/em&gt;. Are they organized? Engaging? Well-informed? If not, it’s a 🚩 red flag — one unfortunate recruiter couldn’t speak to the interview process past the HM screen, and later sent me the wrong on-site panel, apparently confusing me with another candidate. Was the whole company like that disorganized? OTOH, great recruiters would share thorough interview guides, and have detailed explanations for why they were hiring particular roles, skills, and traits. I come away from this process with a deeper appreciation for the strategic value of recruiting teams to keep strong candidates in the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Shadow interviewers are a good sign&lt;/em&gt;. Shadowers are employees in training for how to conduct interviews. They mostly observe and answer candidate questions at the end. I liked seeing shadowers because 1️⃣ it’s evidence that the company values rigorous hiring practices and employee development, and 2️⃣ I got an additional perspective to my questions about the team/company/role.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So that was my job search! I hope that this helps clarify and set expectations for what can be a confusing, time consuming, and emotional process.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Leading for proficiency versus creativity]]></title><description><![CDATA[I recently finished The Culture Code by Daniel Coyle, and one of the final points was a flash of clarity for me. Coyle contrasts leading for…]]></description><link>https://ktheory.com/leading-for-proficiency-versus-creativity/</link><guid isPermaLink="false">https://ktheory.com/leading-for-proficiency-versus-creativity/</guid><pubDate>Mon, 30 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently finished &lt;a href=&quot;https://danielcoyle.com/the-culture-code/&quot;&gt;&lt;em&gt;The Culture Code&lt;/em&gt;&lt;/a&gt; by Daniel Coyle, and one of the final points was a flash of clarity for me. Coyle contrasts &lt;em&gt;leading for proficiency&lt;/em&gt; where consistent task-based execution is key, and &lt;em&gt;leading for creativity&lt;/em&gt; where a team discovers and builds original ideas.&lt;/p&gt;
&lt;h4&gt;Leading for proficiency&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Best for repetitive task-based execution.&lt;/li&gt;
&lt;li&gt;Examples: restaurants, flight crews, sports teams.&lt;/li&gt;
&lt;li&gt;Leaders should reiterate vivid examples of good behaviors and fundamental skills, “if X then Y” mantras. Celebrate when the team does the fundamentals well.&lt;/li&gt;
&lt;li&gt;Feedback is frequent and direct: “find ways to delight the customer”, “always hustle back for defense”.&lt;/li&gt;
&lt;li&gt;Since the feedback cycle is quick (minutes or hours), team members can immediately apply feedback and practice.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Leading for creativity&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Best for discovering and building original projects.&lt;/li&gt;
&lt;li&gt;Example: Ed Catmull’s teams at Pixar and Disney.&lt;/li&gt;
&lt;li&gt;Leaders should focus on team composition, interactions. Ensure it’s safe to fail and protect the team’s autonomy. Feedback is a gentle nudge or suggestion rather than an explicit command.&lt;/li&gt;
&lt;li&gt;Celebrate when the team tries something novel.&lt;/li&gt;
&lt;li&gt;The feedback cycle is slower, possibly weeks or months. This implies that some ideas will inevitably prove unviable after investing significant resources. Don’t seek to eliminate that waste, instead ensure the team will continue to take risks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In software development, there is the need for &lt;em&gt;both proficiency&lt;/em&gt; when scaling, securing, and debugging systems, and &lt;em&gt;creativity&lt;/em&gt; in discovering effective products.&lt;/p&gt;
&lt;p&gt;I’ve subconsciously gravitated towards a “proficiency” style of leadership, perhaps due to my sysadmin / operations background, or because I like the reinforcement of a fast feedback loop.&lt;/p&gt;
&lt;p&gt;This distinction hit home for me because some of my most confusing discussions with coworkers can be characterized as the misalignment of these leadership styles. When a system was crashing a lot, a colleague advocated “we should give this team air cover while they discover a solution themselves”, and I’d say, “We already have a process for solving bugs like this. Can they please follow the checklist?” It was a recipe for talking past each other, and in retrospect, we should have first aligned on whether this was about teaching proficiency, or supporting creativity.&lt;/p&gt;
&lt;p&gt;The difference in feedback speed jumps out as the most significant structural detail, and reminds me of Donella Meadow’s insight about systems:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“A delay in a balancing feedback loop makes the system likely to oscillate.” - Thinking in Systems, page 54 (&lt;a href=&quot;http://www.gc.soton.ac.uk/files/2015/01/Thinking-in-Systems35-72.pdf&quot;&gt;pdf&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The delayed feedback of the creative projects makes feast-or-famine oscillations likely, especially paired with the direct “do this, don’t do that” feedback that works well in proficiency domains. In creative projects, knowing which conventions to bend and break is where the magic happens (and value’s created). Air cover and gentle nudges from leaders prevent overcorrection (and dampen oscillations) and support self-aware risks.&lt;/p&gt;
&lt;p&gt;I appreciate that &lt;em&gt;The Culture Code&lt;/em&gt; helped me understand the difference so I can blend and apply both styles in the future.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A paradigm for developer productivity]]></title><description><![CDATA[In Thomas Kuhn’s Structure of Scientific Revolutions, he observed that fields of study grows more complex until a key insight radically…]]></description><link>https://ktheory.com/paradigm-for-developer-productivity/</link><guid isPermaLink="false">https://ktheory.com/paradigm-for-developer-productivity/</guid><pubDate>Wed, 25 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Thomas Kuhn’s &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions&quot;&gt;&lt;em&gt;Structure of Scientific Revolutions&lt;/em&gt;&lt;/a&gt;, he observed that fields of study grows more complex until a key insight radically shifts the paradigm practitioners use, which creates new applications and research areas.&lt;/p&gt;
&lt;p&gt;I believe that developer productivity (or DX for dev experience) is near a ‘peak complexity’ moment, and is poised for a key insight that radically simplifies our understanding. A sign that we’ve cracked the nut for a useful DX paradigm is when measuring and interpreting DX metrics is  something that novice engineers can do, and leaders outside of engineering seek out those metrics because they easily connect to business goals (product quality, revenue growth, etc).&lt;/p&gt;
&lt;p&gt;Currently, the DX metrics that are easy to measure (like ticket lead time and deploys per day) are bemoaned as “vanity metrics,” while what truly matters is complicated, nuanced, and hard to quantify.&lt;/p&gt;
&lt;p&gt;To be sure, I think research like the &lt;a href=&quot;https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance&quot;&gt;DORA Report&lt;/a&gt; (with it’s 4 key metrics: Deploy frequency, Lead time for changes, Change fail rate, Time to recovery), &lt;a href=&quot;https://queue.acm.org/detail.cfm?id=3454124&quot;&gt;SPACE framework&lt;/a&gt; (Satisfaction and well-being, Performance, Activity, Communication and collaboration, Efficiency and flow), and services like &lt;a href=&quot;https://getdx.com&quot;&gt;DX&lt;/a&gt; and &lt;a href=&quot;https://codeclimate.com&quot;&gt;CodeClimate&lt;/a&gt; are incredibly helpful and move the industry forward. I’m bullish on the future of dev tooling and full disclosure: I have a financial interest in DX the company. Despite their work, this tweet captures the status quo:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-dnt=&quot;true&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;At GitHub we tried building a GitHub metrics product... it failed to gain adoption even amongst our internal teams because the metrics weren&amp;#39;t actually useful.&lt;br&gt;&lt;br&gt;Crazy how much $$$ is being spent on these types of tools just because leaders are desperate to measure *something*.&lt;/p&gt;&amp;mdash; Abi Noda (@abinoda) &lt;a href=&quot;https://twitter.com/abinoda/status/1518965443075067904?ref_src=twsrc%5Etfw&quot;&gt;April 26, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;This tweet is so damning for the current state of dev productivity. A premier company that makes beloved products for developers, with smart and enthusiastic employees eager to improve DX, and whose platform contains a wealth of relevant data, couldn’t figure out how to make DX metrics useful for their own dev teams.&lt;/p&gt;
&lt;p&gt;Is it simply impossible? Maybe. But I’m not ready to throw in the towel. To be sure, &lt;em&gt;I don’t know&lt;/em&gt; what the new paradigm for DX will be — no silver bullets here — but I think I can describe a vision of what a useful paradigm would look like, and some strategies to work towards it.&lt;/p&gt;
&lt;h2&gt;Analogy: Core Web Vitals&lt;/h2&gt;
&lt;p&gt;Let’s examine an analogous domain: &lt;strong&gt;front-end browser performance&lt;/strong&gt; recently went though just such a simplifying paradigm shift with &lt;a href=&quot;https://web.dev/vitals/&quot;&gt;Core Web Vitals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before Core Web Vitals, teams working on browser performance had a dizzying number of metrics to drive, some of which could be considered “vanity metrics” like payload size or number of backend requests. (I wrote about &lt;a href=&quot;https://medium.com/glossier/measuring-frontend-latency-our-strategy-to-simplify-the-complex-7e0ae0fe3c6e&quot;&gt;Glossier’s journey here&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;I see a few key features that enabled Core Web Vitals to revolutionize browser performance:&lt;/p&gt;
&lt;h4&gt;1. Metrics are easy to measure and comparable across organizations&lt;/h4&gt;
&lt;p&gt;Web Vitals focuses on 3 (admittedly complicated) metrics: Largest Contentful Paint, First Input Delay or Total Blocking Time, and Cumulative Layout Shift.&lt;/p&gt;
&lt;p&gt;The first question a developer may wonder is “how does my site perform in these metrics?”&lt;/p&gt;
&lt;p&gt;It’s so easy to find out! Use Chrome Dev Tools and Lighthouse to analyze any page, or use &lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;this Pagespeed widget&lt;/a&gt;. Because there are consistent APIs to gather these performance metrics, analytics products like &lt;a href=&quot;https://docs.datadoghq.com/real_user_monitoring/&quot;&gt;Datadog&lt;/a&gt; and &lt;a href=&quot;https://calibreapp.com/features/performance-budgets&quot;&gt;Calibre&lt;/a&gt; can incorporate these metrics into reports and dashboards.&lt;/p&gt;
&lt;p&gt;Compare this to say, the DORA metrics and SPACE. Figuring out how to gather the data is an immediate obstacle. How do I design a survey and write good questions? Some metrics are difficult and nuanced to define, like what constitutes a ‘failure’ for a change failure rate. There’s little consistent tooling for how to measure these and make comparisons across organizations.&lt;/p&gt;
&lt;h4&gt;2. Metrics are highly correlated with successful outcomes&lt;/h4&gt;
&lt;p&gt;Imagine yourself in an adversarial mindset and try to improve a metric without improving the product. If it’s easy to do so, you’ve got a vanity metric that clever folks will inevitably game to their narrow advantage. Good metrics like Web Vitals are generally hard to trick, avoiding the moral hazard of vanity metrics.&lt;/p&gt;
&lt;p&gt;But some DX activity metrics, like deploys per day or tickets closed, are fairly easy to game. Focusing on them can incentivize busywork over quality product improvements.&lt;/p&gt;
&lt;h4&gt;3. Compel organizations to report their data&lt;/h4&gt;
&lt;p&gt;In 2018, Google compelled web sites to invest in browser performance when they &lt;a href=&quot;https://developer.chrome.com/blog/search-ads-speed/&quot;&gt;made it a factor in search and ad rankings&lt;/a&gt;. Marketing departments were suddenly more supportive of projects to improve page speed as it directly connected to the performance of an important channel.&lt;/p&gt;
&lt;p&gt;Switching to the finance world, VC-backed and public companies are required to produce audited statements about their income, cash flow, and balance sheet. Investors and the SEC compel company managers to produce these documents because they’re so valuable to analyze a company’s performance.&lt;/p&gt;
&lt;p&gt;Currently, developer productivity does not have such compelling pressure — it’s feels like a mostly insular discussion of software leaders and researchers discussing which aspects of the developer experience are integral or incidental, how to measure the experience, and how to improve it. We usually find ourselves trying to persuade others to invest in DX with the goal of accelerating product delivery, improving quality, and saving money.&lt;/p&gt;
&lt;p&gt;Imagine how rapidly our DX research and practices could improve if there were such external pressure.&lt;/p&gt;
&lt;p&gt;For example, corporate boards and investors could ask for employee survey data to show that the company’s workforce is well-supported and engaged. Engineers could self-report productivity data to aggregation services like &lt;a href=&quot;https://www.glassdoor.com/&quot;&gt;Glassdoor&lt;/a&gt; and &lt;a href=&quot;https://www.levels.fyi&quot;&gt;Levels.fyi&lt;/a&gt;, and high-functioning teams would be rewarded with more and better applicants. At first, only high-functioning teams would report. But soon, &lt;em&gt;not reporting&lt;/em&gt; would be seen as a negative signal for potential hires, creating a virtuous cycle for companies to both share and improve their DX.&lt;/p&gt;
&lt;p&gt;Prospective employees could better make apples-to-apples comparisons across teams with public quantitative data rather than semi-public qualitative reviews and backchannel advice.&lt;/p&gt;
&lt;p&gt;In the language of &lt;a href=&quot;https://donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/&quot;&gt;Meadow’s Leverage Points&lt;/a&gt;, this would be changing “the goals of the system”. DX improvements aren’t just to improve and accelerated product development, but to prove to investors and future team members that the team is managed effectively.&lt;/p&gt;
&lt;p&gt;To be sure, I don’t know what data to report. My hunch is that publicly reporting &lt;em&gt;any&lt;/em&gt; data, even if they’re initially vanity metrics, will better incentivize and accelerate the discovery of more effective metrics and survey questions. Examples of analogous evolving standards are &lt;a href=&quot;https://fasb.org/page/PageContent?pageId=/standards/accounting-standards-updates-issued.html&quot;&gt;GAAP for financial statements&lt;/a&gt;, and &lt;a href=&quot;https://www.cisecurity.org/controls&quot;&gt;CIS Controls&lt;/a&gt; in the security community.&lt;/p&gt;
&lt;p&gt;In summary, I think we’ll be dramatically better at understanding developer productivity when:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We have productivity metrics that are easy to measure consistently across orgs and tech stacks.&lt;/li&gt;
&lt;li&gt;We have a simple way to connect those metrics to positive business outcomes.&lt;/li&gt;
&lt;li&gt;We leverage external stakeholders to compel our organization to report on developer productivity (like hiring / review sites and investors).&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[How to invest in documentation]]></title><description><![CDATA[I have a new interview on the DX Fieldnotes blog: How to Champion Investments to Improve Documentation. Brook Perry at DX did a great job…]]></description><link>https://ktheory.com/how-to-invest-in-documentation/</link><guid isPermaLink="false">https://ktheory.com/how-to-invest-in-documentation/</guid><pubDate>Tue, 26 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a new interview on the &lt;a href=&quot;https://getdx.com&quot;&gt;DX&lt;/a&gt; Fieldnotes blog: &lt;a href=&quot;https://getdx.com/best-practices/investments-to-improve-developer-documentation&quot;&gt;How to Champion Investments to Improve Documentation&lt;/a&gt;. Brook Perry at DX did a great job structuring the interview around practical advice.&lt;/p&gt;
&lt;p&gt;Some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation is a means to an end. Be clear about the goals (or ‘job to be done’) that you want from your docs. E.g., onboard team members faster, reduce downtime, have more consistent practices, crossfunctional awareness + alignment.&lt;/li&gt;
&lt;li&gt;make the authoring+maintaining experience incredibly easy.&lt;/li&gt;
&lt;li&gt;have a ‘one-stop-shop’ for the discovery experience.&lt;/li&gt;
&lt;li&gt;when choosing what to document first, use two techniques: ‘follow the pain’ (write the most-sought missing docs), and ‘stop the bleeding’ (ensure new projects don’t further exacerbate knowledge silos).&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[3 ways to construct a narrative]]></title><description><![CDATA[Humans constantly construct narratives to make sense of a messy reality. If a new product launch went well,  we could say it was because of…]]></description><link>https://ktheory.com/3-ways-to-construct-a-narrative/</link><guid isPermaLink="false">https://ktheory.com/3-ways-to-construct-a-narrative/</guid><pubDate>Mon, 18 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Humans constantly construct narratives to make sense of a messy reality. If a new product launch went well,  we could say it was because of the team’s good planning and coordinated execution, or one person’s heroic last-minute effort. Did another team miss their targets? We could say that’s because the higher-ups keep changing their minds, or the team lacked the necessary skills. We can construct wildly different stories to understand the same situation.&lt;/p&gt;
&lt;p&gt;Effective leaders construct compelling narratives for their team to understand the present reality, and inspire them to achieve a shared vision. It’s hard to say any particular narrative is &lt;em&gt;right&lt;/em&gt; or &lt;em&gt;wrong&lt;/em&gt;. Rather, let’s ask which narrative is useful and evocative? Let’s break it down.&lt;/p&gt;
&lt;p&gt;In this post, I’ll describe 3 distinct perspectives or “lenses” to use when building a narrative and vision: 1️⃣ &lt;strong&gt;rational decisions, 2️⃣ organizational process, and 3️⃣ people and politics&lt;/strong&gt;. Many leaders tend to lean heavily on one particular perspective. I’ve found myself becoming a more resilient leader by being mindful of all 3 perspectives, and incorporating them into the narratives I use to lead.&lt;/p&gt;
&lt;p&gt;This post draws from &lt;a href=&quot;https://en.wikipedia.org/wiki/Essence_of_Decision&quot;&gt;Graham Allison’s &lt;em&gt;Essence of Decision&lt;/em&gt;&lt;/a&gt;, and &lt;a href=&quot;https://www.corestrengths.com/relationship-intelligence/the-power-of-the-sdi-2-0/&quot;&gt;Core Strengths SDI leadership assessment&lt;/a&gt;, and &lt;a href=&quot;https://cloud.google.com/architecture/devops/devops-culture-westrum-organizational-culture&quot;&gt;Ron Westrum’s 3 types of organizational culture&lt;/a&gt; (&lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1765804/&quot;&gt;original research paper&lt;/a&gt;). See the appendix for more details.&lt;/p&gt;
&lt;h3&gt;Perspective 1: Rational decisions&lt;/h3&gt;
&lt;p&gt;The rational decisions lens assumes that all the appropriate information was gathered and evaluated. It uses a dispassionate, objective analysis focused on unambiguous, quantified results and expected outcomes. We presume people behave like &lt;a href=&quot;https://en.wikipedia.org/wiki/Homo_economicus&quot;&gt;Homo economicus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The advantage of this perspective is that its conclusions seem logically justified—the optimal action may be deduced from the present facts. The disadvantage is that it’s woefully incomplete way of understanding how humans actually behave.&lt;/p&gt;
&lt;h3&gt;Perspective 2: Organizational process&lt;/h3&gt;
&lt;p&gt;This perspective focuses on the small set of things that a particular team, organization, or institution is capable of doing well.&lt;/p&gt;
&lt;p&gt;Unlike the open-ended possibilities of the ‘Rational decisions’ perspective, the organizational process strongly prefers the well-known options.&lt;/p&gt;
&lt;p&gt;Any initiative that fits into an organization’s established processes and leverages existing competencies has a greater chance of success than one that requires novel processes and decisions.&lt;/p&gt;
&lt;p&gt;For example, a manager may have an easy time promoting an employee during their organizations’ semiannual performance review period, but have difficulty doing an off-cycle ad hoc promotion. When the employee gets a promotion may have more to do with the quirks of a bureaucratic process than the particular moment they merit it.&lt;/p&gt;
&lt;p&gt;An engineering team composed of, say,  Frontend and Backend engineers may struggle to hire and onboard a new specialty, like a Site Reliability or Security Engineer. The novelty of the role increases the risks and the amount of effort required.&lt;/p&gt;
&lt;p&gt;The advantage of this perspective is that it focuses on leveraging familiar solutions. The disadvantage is that those familiar solutions may become increasingly outdated and insufficient to new challenges. There’s a thin line between “strategic laziness” and “narrow mindedness”.&lt;/p&gt;
&lt;h3&gt;Perspective 3: People and politics&lt;/h3&gt;
&lt;p&gt;This perspective focuses on the zero-sum game of political power and influence. The only way to gain power or influence is to take it from someone else. If you don’t please the people who are the source of your influence (your employees, peers, manager, customers, shareholders, etc), you’ll quickly loose it.&lt;/p&gt;
&lt;p&gt;A ‘people and politics’ narrative focuses on individuals or groups with rising or waning influence or recognition. Who gets their way, and who doesn’t? Who’s life gets easier, and who’s life gets harder?&lt;/p&gt;
&lt;p&gt;Many people, including myself, are uncomfortable dwelling in this lens. The zero-sum logic can breed unhealthy competition, even combativeness and &lt;a href=&quot;https://en.wikipedia.org/wiki/Machiavellianism_in_the_workplace&quot;&gt;Machiavellian manipulation&lt;/a&gt; rather than collaborative, constructive dialogue.&lt;/p&gt;
&lt;p&gt;But humans are social, competitive creatures. Our brains inevitably focus on whether the people we like are rewarded, and the people we don’t like get what they deserve. People around you are constantly evaluating your reputation, and weighing whether they should hitch their fate to yours. Leaders neglect this perspective at their peril.&lt;/p&gt;
&lt;p&gt;An advantage of this perspective over Rational decisions is that it better captures how people actually behave. But the disadvantage is that it does not, by itself, reveal effective strategies. A leader who baldly declares, “Our strategy is do whatever most improves my reputation” would often be abandoned as a sociopath. Leaders must incorporate other perspectives.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Okay, let’s see how these 3 perspectives can apply to the same hypothetical story.&lt;/p&gt;
&lt;p&gt;Say your software team is building a new service, and an early decision is what programming language to use for the project. After some discussion, Typescript emerges of the language of choice. Why?&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;rational decisions&lt;/strong&gt; narrative could be that the leaders of the team carefully considered the suitability of various programming language attributes for the project, e.g. typed vs dynamic languages, security and operability concerns, the ecosystem of tooling and shared libraries, the current expertise of the team, the learning curve to train new developers, and the size of the community. The leaders wrote up a decision doc weighing all these factors and ultimately choosing Typescript because, e.g.,  type safety would benefit the project and ease maintenance, the language had a large and growing community, and a rich ecosystem of developer tooling.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;organizational process&lt;/strong&gt; narrative says that the tech team only had the infrastructure tooling and expertise to support, say, Ruby and Typescript. Choosing anything besides Ruby or Typescript would have required a lot of persuading and training that the project leaders didn’t think was worthwhile. The platform/infra team recently announced a lot of new tooling to support Typescript services. The team chose Typescript because they perceived organizational momentum towards it.&lt;/p&gt;
&lt;p&gt;And finally the &lt;strong&gt;people and politics&lt;/strong&gt; narrative is that tech lead of the project had spent years maintaining a poorly architected Ruby service. They were eager to try a something different, and had recently cajoled the platform/infra team to better support their new favorite language: Typescript. When their manager asked them to lead the new project, they accepted on the condition that the manager would support their choice of language. The manager agreed since they did not have a good alternative to be tech lead.&lt;/p&gt;
&lt;p&gt;Personally, the rational decision narrative is what &lt;em&gt;I want to believe&lt;/em&gt;, but the last 2 feel more realistic.&lt;/p&gt;
&lt;p&gt;One final point: I think Camille Fournier really nailed these perspectives in her post about &lt;a href=&quot;https://skamille.medium.com/why-is-it-so-hard-to-decide-to-buy-d86fee98e88e&quot;&gt;build vs buy decisions&lt;/a&gt;. The ‘rational decisions’ lens says teams should ‘buy’ more often than they actually do. To understand the discrepancy between theory and practice, she highlights some institutional and political factors that encourage building:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;our whole style of teaching computer science is first-principles based, which encourages the default to build ourselves.
…
Companies reward people who create new things … which creates a pressure to build in order to grow your career.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The lesson for me is that none of these perspectives are right or wrong—they’re all incomplete. And that I’m well-served by bearing in mind all 3 when understanding or explaining decisions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Appendix&lt;/h3&gt;
&lt;p&gt;In my recent research about organizational effectiveness, I was struck by the congruence of 3 models for understanding how leaders make decisions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/architecture/devops/devops-culture-westrum-organizational-culture&quot;&gt;Ron Westrum’s 3 types of organizational culture&lt;/a&gt;: Pathological, Bureaucratic, and Generative&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Essence_of_Decision&quot;&gt;Graham Allison’s &lt;em&gt;Essence of Decision&lt;/em&gt;&lt;/a&gt; examines the Cuban Missile Crisis through the lens of a Government Politics, Organizational Behavior, and Rational Actor.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://www.corestrengths.com/relationship-intelligence/the-power-of-the-sdi-2-0/&quot;&gt;Core Strengths leadership assessment&lt;/a&gt; charts personal styles on 3 axis: People, Process, and Performance&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s how I organized them into analogous lenses:&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;col&quot;&gt;Model&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Lens 1: Rational decisions&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Lens 2: Organizational process&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Lens 3: People and politics&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;Graham Allison&apos;s model&lt;/th&gt;
      &lt;td&gt;Rational Actor&lt;/td&gt;
      &lt;td&gt;Organizational Process&lt;/td&gt;
      &lt;td&gt;Bureaucratic Politics&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;Ron Westrum&apos;s model&lt;/th&gt;
      &lt;td&gt;Generative culture&lt;/td&gt;
      &lt;td&gt;Bureaucratic culture&lt;/td&gt;
      &lt;td&gt;Pathological culture&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;Core Strengths SDI model&lt;/th&gt;
      &lt;td&gt;Performance&lt;/td&gt;
      &lt;td&gt;Process&lt;/td&gt;
      &lt;td&gt;People&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Handy iOS Shortcuts]]></title><description><![CDATA[I love a good low-code productivity hack. Here are some of my favorite iOS shortcuts that make my life slightly easier. Easy after-school…]]></description><link>https://ktheory.com/handy-ios-shortcuts/</link><guid isPermaLink="false">https://ktheory.com/handy-ios-shortcuts/</guid><pubDate>Mon, 07 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I love a good low-code productivity hack. Here are some of my favorite &lt;a href=&quot;https://support.apple.com/guide/shortcuts/welcome/ios&quot;&gt;iOS shortcuts&lt;/a&gt; that make my life slightly easier.&lt;/p&gt;
&lt;h3&gt;Easy after-school pickups&lt;/h3&gt;
&lt;p&gt;At my daughter’s elementary after-school program, the pickup protocol is for the parent to send a text message to the program director, who then brings the kid to the front door.&lt;/p&gt;
&lt;p&gt;I noticed a regular routine: I arrive in the school parking lot, take out my phone, find the program director in the Messages app, and copy+paste my previous message along the lines “Hello, I’m here to pick up [my child’s name].”&lt;/p&gt;
&lt;p&gt;Let’s automate that!&lt;/p&gt;
&lt;p&gt;I created a location-based iOS Shortcut: &lt;code class=&quot;language-text&quot;&gt;when I arrive at the school between 3-6pm on weekdays, send that text message to the program director&lt;/code&gt;. Now when I park at the school, I pull out my phone, and tap a shortcut notification on the lock screen, and the text is on it’s way!&lt;/p&gt;
&lt;p&gt;This is inspired by &lt;a href=&quot;https://twitter.com/shawnblanc/status/1182099320427954177&quot;&gt;Shawn Blanc’s gym pass&lt;/a&gt; shortcut.&lt;/p&gt;
&lt;h3&gt;Office music&lt;/h3&gt;
&lt;p&gt;I frequently listen to music on AirPlay speakers in my home office. But I don’t like the temptation of unlocking my phone and tapping around to find my playlist. It’s too tempting to start checking notifications and social media.&lt;/p&gt;
&lt;p&gt;So to avoid unlocking my phone, I got &lt;a href=&quot;https://www.amazon.com/gp/product/B075CFXY8V/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;#x26;th=1&quot;&gt;these NFC stickers&lt;/a&gt; and stuck one on my desk.&lt;/p&gt;
&lt;p&gt;Then I made an iOS shortcut: &lt;code class=&quot;language-text&quot;&gt;when I tap my phone to the NFC tag, set the playback destination to my office speakers, and play my favorite playlist or app&lt;/code&gt;. I change the playlist or app in the shortcut when the mood strikes. Recently &lt;a href=&quot;https://music.apple.com/us/curator/lofi-girl/1568752863&quot;&gt;Lofi Girl&lt;/a&gt; and &lt;a href=&quot;https://endel.io&quot;&gt;Endel soundscapes&lt;/a&gt; are in heavy rotation.&lt;/p&gt;
&lt;h3&gt;Set Slack status messages the hard way&lt;/h3&gt;
&lt;p&gt;I have several shortcuts that change my slack status. When I start a walking workout, a shortcut automatically updates my slack status to “AFK for a walk”.&lt;/p&gt;
&lt;p&gt;When I enable “Do Not Disturb” focus mode in iOS/macOS, another shortcut automatically sets my Slack status to “DND - writing”.&lt;/p&gt;
&lt;p&gt;It took a lot of trial and error (and some yak shaving) to get the Slack API permissions configured correctly, so I’ll put the steps here.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create &lt;a href=&quot;https://api.slack.com/apps/&quot;&gt;a new Slack app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In your app, set a required redirect URL. Note you can use any URL, say google.com. You’re the only one who will use it, and it doesn’t affect the functionality.&lt;/li&gt;
&lt;li&gt;In the “User Token Scopes” section, add the &lt;code class=&quot;language-text&quot;&gt;users.profile:write&lt;/code&gt; scope so the app can update your profile.&lt;/li&gt;
&lt;li&gt;Install the app to your workspace (or ask your workspace admin to do it for you).&lt;/li&gt;
&lt;li&gt;Now you should see a section in your app called “OAuth Tokens for Your Workspace”. Copy the User OAuth token that starts &lt;code class=&quot;language-text&quot;&gt;xoxp-&lt;/code&gt; for use in the shortcut.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the token in hand, you can now use the &lt;code class=&quot;language-text&quot;&gt;Get contents of URL&lt;/code&gt; shortcut action to make the &lt;a href=&quot;https://api.slack.com/methods/users.profile.set&quot;&gt;Slack API request to &lt;code class=&quot;language-text&quot;&gt;users.profile.set&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here’s a screenshot of what a successful shortcut looks like. Note that the first 3 steps are to compute the expiration time as a unix timestamp (seconds since 1970)—i.e. ‘30 minutes from now’. And the Authorization header is &lt;code class=&quot;language-text&quot;&gt;Bearer xoxp-XXXX&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c36d93519e2a38c71cc4856d8325fe27/061c7/slack-status-shortcut.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 101.8987341772152%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAADAklEQVQ4y42Uy27jRhBF9f+/kA9IVlnNIrusg1nNAGPD8kOyJIukyCabr36xyRNUS5zEhhdTwEU1i+CtqlvF3sx/faF4znhtIWsmHvKZfeXps5zda8ePfOGpiExTZI6RGMXPN399jlNkWRbGfmQzfP3KkBWMxjP2hraztN3I0PYoNVDWhqoe6buRvjeY0TC0A+NgGHqTvBmuca00G778SfHjnrtDycv+SJ6deGsmHks4Ngs7tfBULbwoOKhAU14oD4rvZ7jL4bUKBG8RE9KNczOqizycPaX2TM7gnceGSAiBGDzBuyskbizOOoz12ASXnoMPdLpj4//5Db3/TlFcyM9nXquJt9rSPz5yOrU8FpFd4XnKPXUXmELA+5AIVkgBU5jo256N3v6NLg5USqMqRaUdlR4Z8xxVdmS1I1eGrLrq661NVX6EVNnWLZvf8z/4ln2jOBUcjwdK1fBUwX1J0m1bzNxnkecycnfzYfpv2sMw0DQN3vvrlJUtCLNnNWMsdaMZR0OjW6zzxHlhikvyAlmRFfM8J4jZ0bJhgWVe0FqnbM45tG6Sb9sW7xxw/ZgVH2y5xdKU4yxLO1EURSJcTWJr5s8IPuJnhaKDBLquS4RD36eXfd+nJHoY6ARdl7oYx/FT0neEUsnheORhu2W33yeBhezx+Zlye486HqiqisvlkgYgcliZtrPJuyTLSjjPaYGNMfSiob8OSGI+BOhbaBsWraAuWXRNVCWxzInqQryciVUBc8QadyUUvcSkJaVUGoZkrusaGyZ+1awMZdVwLX3VUioW8vl2q4imkjxpJv5/eLc2q4afTVliUqWQi3aSdN27j3hPuMzkRcFut0s+bb0xHE+nRKjblre3N87nM+cswzqXtJaO3O38k1B+ITGp4GW3Y7/fp4nKR0Ki2w4z9ujqgvHXnfW3ga2QAb6bslQo2hWXC2VZJkh7QlypGmd6mupCPUyE4FMHPtyQzjdCY9nI1SPLKl5+HbmG5FeUaz0lk+s+nRfmOKXzR0jV0unQDfwLfIsJdCNm5ckAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Slack status shortcut&quot;
        title=&quot;Slack status shortcut&quot;
        src=&quot;/static/c36d93519e2a38c71cc4856d8325fe27/f058b/slack-status-shortcut.png&quot;
        srcset=&quot;/static/c36d93519e2a38c71cc4856d8325fe27/c26ae/slack-status-shortcut.png 158w,
/static/c36d93519e2a38c71cc4856d8325fe27/6bdcf/slack-status-shortcut.png 315w,
/static/c36d93519e2a38c71cc4856d8325fe27/f058b/slack-status-shortcut.png 630w,
/static/c36d93519e2a38c71cc4856d8325fe27/40601/slack-status-shortcut.png 945w,
/static/c36d93519e2a38c71cc4856d8325fe27/061c7/slack-status-shortcut.png 1216w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Happy hacking! And please &lt;a href=&quot;https://twitter.com/ktheory&quot;&gt;let me know on Twitter&lt;/a&gt; if you enjoy these shortcuts.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Left ditch, right ditch]]></title><description><![CDATA[A useful mental model I recently learned is enumerating the ‘left ditch’ and ‘right ditch’ solutions. Imagine we’re steering a vehicle along…]]></description><link>https://ktheory.com/left-ditch-right-ditch/</link><guid isPermaLink="false">https://ktheory.com/left-ditch-right-ditch/</guid><pubDate>Sat, 19 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A useful mental model I recently learned is enumerating the ‘left ditch’ and ‘right ditch’ solutions.&lt;/p&gt;
&lt;p&gt;Imagine we’re steering a vehicle along a winding road and each turn is a new challenge. We want to avoid under-correcting to end up in the left ditch, and over-correcting to end up in the right ditch.&lt;/p&gt;
&lt;p&gt;For example, say a software component has recently become unreliable, with frequent bugs and performance issues. A ‘left ditch’ under-correction may be to repeatedly add one-off “band-aid” bug fixes to each issue. A ‘right ditch’ over-correction may be a complete rewrite the component. A ‘just right’ solution may be introducing a new design pattern to the component that improves correctness, scalability, maintainability, etc, and gradually migrate the entire component to that new pattern.&lt;/p&gt;
&lt;p&gt;At Glossier, we called this finding the ‘stage appropriate’ solution, and it’s a generalization of the &lt;a href=&quot;https://medium.com/@ktheory/the-spectrum-of-involvement-49564fad7709&quot;&gt;spectrum of involvement&lt;/a&gt;. I’ve found it helpful to explicitly discuss what a ‘left ditch’ and ‘right ditch’ solutions would be, to open up the middle path for a ‘just right’ solution.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[6 metrics for system observability]]></title><description><![CDATA[A recent theme of my work has been elevating metrics that focus and align small teams towards healthy business outcomes. I view this through…]]></description><link>https://ktheory.com/6-metrics-for-system-observability/</link><guid isPermaLink="false">https://ktheory.com/6-metrics-for-system-observability/</guid><pubDate>Mon, 14 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A recent theme of my work has been elevating metrics that focus and align small teams towards healthy business outcomes.&lt;/p&gt;
&lt;p&gt;I view this through the lens of &lt;a href=&quot;https://en.wikipedia.org/wiki/Systems_theory&quot;&gt;systems thinking&lt;/a&gt;, with stocks, flows, and feedback loops as the primary mental model (see &lt;a href=&quot;https://www.chelseagreen.com/product/thinking-in-systems/&quot;&gt;Thinking In Systems&lt;/a&gt; by Donella Meadows and &lt;a href=&quot;https://lethain.com/systems-thinking/&quot;&gt;Will Larson’s intro&lt;/a&gt;). Examples of such systems abound in organizations. How you hire and onboard employees, develop new products and features, do financial planning and accounting, and interact with customers can all be modeled as systems. In software engineering, our products comprise distributed systems of services and components.&lt;/p&gt;
&lt;p&gt;This post is aimed at software engineers, managers, and adjacent teams like marketing and finance who seek to rigorously &lt;em&gt;understand, optimize, and scale&lt;/em&gt; the systems they work in. The teams I’ve worked in sometimes struggle to orient themselves in a dizzying volume of system data. I’ve found &lt;em&gt;6 distinct metrics&lt;/em&gt; that give a thorough understanding of the state of a system (observability), and illuminate effective paths towards operational excellence.&lt;/p&gt;
&lt;p&gt;The six metrics are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Throughput&lt;/li&gt;
&lt;li&gt;Waste&lt;/li&gt;
&lt;li&gt;Lead time (aka latency)&lt;/li&gt;
&lt;li&gt;Utilization&lt;/li&gt;
&lt;li&gt;Quality&lt;/li&gt;
&lt;li&gt;Queue depth&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that the first four metrics correspond to Google’s &lt;a href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/#xref_monitoring_golden-signals&quot;&gt;Four Golden Signals&lt;/a&gt; for monitoring distributed systems. While those are a good start, adding &lt;em&gt;quality&lt;/em&gt; and &lt;em&gt;queue depth&lt;/em&gt; make the list more robust. And to show how each metric is broadly useful, I’ll apply it to 3 example systems: a hiring funnel, an e-commerce site, and a hospital.&lt;/p&gt;
&lt;p&gt;Let’s dive in.&lt;/p&gt;
&lt;h3&gt;1. Throughput&lt;/h3&gt;
&lt;p&gt;Throughput is the rate of completed units coming out the end of the flow in a particular time window, such as e-comm orders per day or new hires per month.&lt;/p&gt;
&lt;p&gt;When managing systems as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Constraint_satisfaction_problem&quot;&gt;constraint satisfaction problem&lt;/a&gt;, you’ll generally seek to &lt;em&gt;maximize&lt;/em&gt; throughput while keeping others system metrics within tolerable limits.&lt;/p&gt;
&lt;h4&gt;Final versus proximate throughput&lt;/h4&gt;
&lt;p&gt;It’s useful to distinguish the final output of a system versus the intermediate or proximate outputs each step along the way.&lt;/p&gt;
&lt;p&gt;For example, if you’re just starting to build a hiring process, it’s difficult to know how many new hires you can expect the existing team to make—hires are a lagging indicator, and you don’t have good priors. You have more control over the early steps in a hiring process, like how many candidates you source, how many pitches you try, or channels you use to find candidates.&lt;/p&gt;
&lt;p&gt;After you source candidates, you may find that throughout is slow at another point in your hiring funnel, like passing an on-site interview.&lt;/p&gt;
&lt;p&gt;Improving the final throughput of a system is result of effective changes to proximate throughput at each step in your system.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: &lt;em&gt;Final output&lt;/em&gt; is the count of new hires making productive contributions. &lt;em&gt;Proximate  outputs&lt;/em&gt; may be the rate at which you source candidates for review, or how many hiring manager screens you completed, how many candidates passed an on-site round, or how many offers you’ve extended.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;: &lt;em&gt;Final output&lt;/em&gt; is the count of orders successfully delivered to customers.  &lt;em&gt;Proximate  outputs&lt;/em&gt; are the number of visitors viewing your products, visitors making a purchase, and the number of order payments successfully charged and ready to ship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: &lt;em&gt;Final output&lt;/em&gt; is the count of treated patients discharged from the hospital.  &lt;em&gt;Proximate  outputs&lt;/em&gt; are the count of patients seen by medical staff, the count of diagnostic tests performed, and the count of treatments administered.&lt;/p&gt;
&lt;p&gt;If improving the proximate throughput does not improve the final throughput, you’ve actually created…&lt;/p&gt;
&lt;h3&gt;2. Waste&lt;/h3&gt;
&lt;p&gt;Every system has waste. This is a measure of the undesirable byproducts created by the system.&lt;/p&gt;
&lt;p&gt;It’s impossible to completely eliminate all waste. Rather, it’s practical to keep it below a tolerable threshold. Reducing a particular source of waste often becomes exponentially more difficult. If a web app has a lot of bugs, eliminating the first 80% of bugs likely takes a similar level of effort as eliminating the next 15%, and then the next 3%.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.gatesnotes.com/Health/An-update-from-the-fight-to-eradicate-polio&quot;&gt;Bill Gates said of eradicating polio&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fighting polio today is much harder – and different – than fighting it [in] the 80’s and 90’s. The last 40 cases are far more difficult than the first 400,000.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Catastrophic waste&lt;/h4&gt;
&lt;p&gt;Some waste is generated in a steady, predictable way, like CO2 emissions from a car or household trash. And sometimes it comes as a large, sudden shock that’s hard to predict, like a nuclear meltdown, class action lawsuit, a site outage (like &lt;a href=&quot;https://engineering.fb.com/2021/10/05/networking-traffic/outage-details/&quot;&gt;Facebook’s multi-hour outage&lt;/a&gt;), or security breach.&lt;/p&gt;
&lt;p&gt;When quantifying the wasteful byproducts of your system, consider both the familiar, frequent waste, and the rare potential catastrophes.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: &lt;em&gt;Predictable&lt;/em&gt;: Rejected candidates and declined offers. &lt;em&gt;Catastrophic&lt;/em&gt;: a hiring discrimination lawsuit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;: &lt;em&gt;Predictable&lt;/em&gt;: Occasional HTTP errors, oversold inventory, returned orders, dissatisfied customers. &lt;em&gt;Catastrophic&lt;/em&gt;: complete site outage, security breach, product recalls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: &lt;em&gt;Predictable&lt;/em&gt;: Ineffective treatments, inconclusive tests. &lt;em&gt;Catastrophic&lt;/em&gt;: Larry Nassar’s malfeasance, Thalidomide birth defects scandal.&lt;/p&gt;
&lt;h3&gt;3. Lead time (or latency)&lt;/h3&gt;
&lt;p&gt;Lead time is how long it takes for work to go through your system. For a particular unit of work, subtract the time it entered your system from the time it left your system to get the lead time.&lt;/p&gt;
&lt;p&gt;For example, if I sign a contract to buy a new car today, and it takes 3 months for the car to be manufactured and delivered, the lead time is 3 months.&lt;/p&gt;
&lt;p&gt;Lead time is longer than the &lt;em&gt;cycle time&lt;/em&gt;, which is how long a resource in your system is actively working on the unit. The car manufacturer may only spend a few hours assembling any particular car, but the 3 month lead time includes getting each component to the plant and ready for assembly, transit time, quality inspections, etc.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Lead time = cycle time + wait time&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Another example: say our system is modeling how a team of developers perform code reviews. If a developer submits new code for review at 9am, then at 11am a teammate spends 15 minutes reviewing the code and approves it, the wait time is 2 hours, the cycle time is 15 minutes, and the lead time is 2h15m.&lt;/p&gt;
&lt;p&gt;The lead time is measured at the very edges of the system.&lt;/p&gt;
&lt;p&gt;Lead time is often called &lt;em&gt;latency&lt;/em&gt; in systems where the consumer’s attention is engaged the whole time; such as when users wait for a UI to respond to input (e.g. in Dan Luu’s &lt;a href=&quot;https://danluu.com/keyboard-latency/&quot;&gt;post about keyboard latency&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Lead time has a statistical distribution, you’ll probably want to graph a histogram of your lead time distribution to best understand your system. And when setting lead time targets, you’ll focus on particular statistics like median, top 90th percentile, mean, etc. In network systems, &lt;a href=&quot;https://en.wikipedia.org/wiki/Power_law&quot;&gt;power law distributions&lt;/a&gt; are common. That is, the majority of requests are fast, and there’s a long tail of a few very slow requests. Or you may have a bimodal distribution, such as a read-through cache system where warm-cache requests are fast, but cache-miss requests are slow.&lt;/p&gt;
&lt;p&gt;Reducing the &lt;em&gt;variance&lt;/em&gt; of lead time is helpful to more easily understand how your system will behave under increasing throughput. &lt;em&gt;Timeouts&lt;/em&gt; are a common technique for reducing lead time variance by adding a strict upper limit.&lt;/p&gt;
&lt;p&gt;Reducing cycle times specifically means your system operates more efficiently. It means you’ve eliminated waste, and can therefore increase throughput, reduce utilization, or reduce capacity.&lt;/p&gt;
&lt;p&gt;Like waste, reducing cycle times becomes exponentially more difficult.&lt;/p&gt;
&lt;p&gt;From a customer’s perspective, latency is a quality measure: customers are more satisfied the faster the web site loads, and the quicker the package arrives.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: Time from opening a job requisition to having the new hire start. You can also track the lead time of each step through the hiring funnel: time from a candidate submitting a job application to getting a response from the company; time from a candidate completing all the interviews to getting an offer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;:  page load time, time it takes from placing and order until it’s confirmed, time from placing an order to having the order delivered&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: Time from a patient seeking treatment to being discharged.&lt;/p&gt;
&lt;h3&gt;4. Utilization&lt;/h3&gt;
&lt;p&gt;Utilization is the percentage of time that a particular component in your system is busy. For example, if a cashier in a grocery store takes 2 minutes to checkout out a customer, and 15 customers check out in an hour, the cashier is 50% utilized during that hour. Or if a computer’s CPU has 4 seconds worth of computations to perform in a 10 second period, we’d say the CPU is 40% utilized, and 60% idle.&lt;/p&gt;
&lt;p&gt;Utilization has subtle and counterintuitive implications for your system. I used to think that 100% utilization represents a perfectly optimized and efficient system, and that less than 100% utilization implies idle waste.&lt;/p&gt;
&lt;p&gt;But no! Any component that’s 100% utilized is the bottleneck that constrains the throughput of your system. Work becomes backlogged behind the constrained resource. A bit of algebra shows some harmful implications of an over-utilized system.&lt;/p&gt;
&lt;p&gt;Let’s reconsider the example of a grocery store where the sole cashier takes 2 minutes (120 seconds) to check out each customer. Suppose new customers arrive faster than the cashier can check them out, say every 90 seconds. The line behind the register grows longer (that’s &lt;em&gt;queue depth&lt;/em&gt;). The &lt;em&gt;wait time&lt;/em&gt; for each customer to check out grows longer and longer.&lt;/p&gt;
&lt;p&gt;You’ll eventually run out of space in the store with shoppers waiting to check out, assuming your frustrated customers don’t leave on their own. You’ll have to either &lt;em&gt;increase capacity&lt;/em&gt; by adding another cashier, or &lt;em&gt;throttle arrivals&lt;/em&gt; by turning away customers until the store is less crowded.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Increasing capacity&lt;/em&gt; and &lt;em&gt;throttling the arrival rate&lt;/em&gt; are the only ways to decrease utilization without re-engineering your system.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Kingman%27s_formula&quot;&gt;Kingsman’s formula&lt;/a&gt; (specifically the &lt;code class=&quot;language-text&quot;&gt;ρ / 1 - ρ&lt;/code&gt; term) from queuing theory shows that as utilization approaches 100%, wait time approaches infinity!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://itrevolution.com/book/the-phoenix-project/&quot;&gt;The Phoenix Project&lt;/a&gt; explains it well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The wait time for a given resource is the percentage that resource is busy, divided by the percentage that resource is idle. So, if a resource is fifty percent utilized, the wait time is 50/50, or 1 unit. If the resource is ninety percent utilized, the wait time is 90/10, or nine times longer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This explains why some &lt;a href=&quot;https://devrant.com/rants/4270351/put-it-in-the-backlog&quot;&gt;product dev backlogs are depressingly long&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This lens for understanding utilization also explains why a few slow database queries can crash a web app. If the DB CPU is 100% utilized, new queries queue up as they wait for CPU, causing each response to take ever longer to generate. Eventually, clients time out (like our grocery shoppers leaving in frustration), and visitors get an error page.&lt;/p&gt;
&lt;p&gt;So if 100% utilization is bad, what’s good? My general rule is to aim for 80% utilization for most critical resources (see this post about &lt;a href=&quot;https://ktheory.com/flex-time-and-the-80-rule/&quot;&gt;the 80% rule&lt;/a&gt;). This doesn’t necessarily mean that the resource is &lt;em&gt;idle&lt;/em&gt; the rest of the time—rather it’s doing work that can easily be preempted and temporarily delayed, like a chef wiping down their workspace or a development team working on code cleanup tasks. This flex time ensures your system can gracefully adapt to disruptions. You can increase or decrease the target utilization based on how steady or variable the inputs are.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.tocinstitute.org/five-focusing-steps.html&quot;&gt;Goldblatt’s Five Focusing Steps&lt;/a&gt; from his Theory of Constraints to make the best use of your system’s bottlenecks.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: % of employee time in interviews, or number of interviews per week per interviewer. % of time your conference rooms are occupied&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;: Compute: % of CPU, network IO, disk IO, and memory that each app tier uses. Fulfillment: % of inventory space currently occupied, % of time that pickers and packing stations are in use&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: % of hours per week an operating room is in use, % of beds that are in use, % of medical devices in uses, # hours per week that doctors are with patients.&lt;/p&gt;
&lt;h3&gt;5. Quality&lt;/h3&gt;
&lt;p&gt;Quality is the measure of desirable and undesirable traits in the output of your system.&lt;/p&gt;
&lt;p&gt;For example, a high quality car may have great fuel efficiency, high resale value, and run for many miles with routine maintenance. Or it may have luxury features that signal the owner’s status, and fast acceleration and handling that are enjoyable to drive. It may have brand associations that resonate with the owner’s identity.&lt;/p&gt;
&lt;p&gt;From a manufacturer’s perspective, a high quality car uses parts that are reliably sourced, is easy to assemble, and has a large and predictable market demand.&lt;/p&gt;
&lt;p&gt;Some quality metrics are easily quantified, like fuel efficiency and resale value, or they may be fuzzy and qualitative, like brand associations and status signaling.&lt;/p&gt;
&lt;p&gt;Another example: a high-quality e-commerce homepage has a low bounce rate, and increases visitors’ interest in buying your products. It makes cold leads warmer, and converts warm leads. It’s fast and reliable.&lt;/p&gt;
&lt;p&gt;Note that latency is a quality measure.  Consumers would prefer getting things sooner rather than later. But latency has important implications for the rest of your system around capacity and throughput, so it’s worth observing separately.&lt;/p&gt;
&lt;p&gt;So how should you measure quality? If you’re generally satisfied with the quality of your system’s outputs, I recommend monitoring a handful of quality metrics to ensure you maintain your expected level of quality. And occasionally ratchet up your quality bar, and intervene quickly when quality slips.&lt;/p&gt;
&lt;p&gt;For systems producing low-quality outputs, I recommend picking a single quantitative quality metric you expect to unlock the most throughput, improve it, and then iterate to focus on another quality metric until you reach a healthy level of quality.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: The degree to which the new hire increases the team’s output, morale, and adaptive capacity&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;: Degree to which the customer is satisfied by the purchase. CSAT and NPS are popular measures. You can also consider customer lifetime value (LTV), and the conversion rate of each step in the customer acquisition funnel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: The degree to which the treatment mitigates symptoms, adds life-years, and does not cause harmful side effects.&lt;/p&gt;
&lt;h3&gt;6. Queue depth&lt;/h3&gt;
&lt;p&gt;Queue depth (also called stock level) is a count of how many units are in a particular state of your system.&lt;/p&gt;
&lt;p&gt;Queues form behind the bottleneck in your system, so observing queues is an easy way to pinpoint utilization issues. In the grocery store analogy, the queue of customers with full shopping carts waiting to check out is an early and obvious sign that the cashiers are the bottleneck.&lt;/p&gt;
&lt;p&gt;Sudden shocks to a system also manifest as rapid changes in queue depth, such as unassembled parts queuing up behind a broken component in an assembly line, or a long line of customers at a bakery when a busload of tourists arrives.&lt;/p&gt;
&lt;p&gt;Just as a queue that’s too large indicates over-utilization, a queue that’s too small indicates under-utilization and risk of supply shocks.&lt;/p&gt;
&lt;p&gt;And a software development team with &lt;em&gt;nothing&lt;/em&gt; in their backlog is likely under-utilized. And keeping a strategic stockpile of resources makes your system more resilient to unreliable supply.&lt;/p&gt;
&lt;p&gt;Therefore, aim to keep queue depths within a healthy range that prevents under-utilization and fragility to supply shocks, while also avoiding the high carrying costs and long wait times of excessive queue depth.&lt;/p&gt;
&lt;h4&gt;Example metrics&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hiring team&lt;/strong&gt;: The number of candidates between each step in the hiring funnel. E.g. applied but not screened, screened but waiting for an on-site interview, interviewed on-site but awaiting an offer, offer extended but not yet accepted&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E-comm site&lt;/strong&gt;: Inventory on ready to be sold in the warehouse, inventory in transit from suppliers, number of orders in each step of your fulfillment process: waiting for payment, waiting to be picked, waiting to be shipped&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hospital&lt;/strong&gt;: number of patients in the waiting room, waiting for test results, or waiting for an operation.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;With those six metrics, you have a robust toolkit to &lt;em&gt;understand, optimize, and scale&lt;/em&gt; the systems you work with.&lt;/p&gt;
&lt;p&gt;These metrics encourage practitioners to keep their system models simple. You may argue that it’s an &lt;em&gt;oversimplification&lt;/em&gt;. That’s certainly true for some systems—these metrics are not sufficient for understanding &lt;a href=&quot;https://en.wikipedia.org/wiki/Complex_adaptive_system&quot;&gt;complex adaptive systems&lt;/a&gt; with emergent behaviors and nonlinear dynamics, like markets and ecosystems.&lt;/p&gt;
&lt;p&gt;Donella Meadows neatly highlights the limits of my approach in her article &lt;a href=&quot;https://donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/&quot;&gt;about leverage points to intervene in a system&lt;/a&gt;. This post focuses on the simple steps: changing parameters and feedback loops. The higher steps involve changing the rules, power structures, and paradigms around a system—a much larger task!&lt;/p&gt;
&lt;p&gt;But all models are incomplete, and I find this one is useful. Progress towards observability comes from reframing big hairy challenges as a sequence of simple steps.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gratitude — 2021]]></title><description><![CDATA[This is the eve of Thanksgiving in the US, an occasion to reflect on what we’re grateful for. This year, I’d like to share my gratitude…]]></description><link>https://ktheory.com/2021-gratitude/</link><guid isPermaLink="false">https://ktheory.com/2021-gratitude/</guid><pubDate>Wed, 24 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is the eve of Thanksgiving in the US, an occasion to reflect on what we’re grateful for. This year, I’d like to share my gratitude publicly.&lt;/p&gt;
&lt;p&gt;First and foremost, I’m thankful that my close family and loved ones are healthy, and we generally feel safe and secure. This has been the case virtually all my life. But it wasn’t the case last year, so I appreciate all the more this year.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’m thankful for good advice to view life’s challenges though a useful lens. Early in the year, I shared with an older friend that I felt disoriented about where my career and personal relationships were going. “Of course, you’re at the age to feel that way,” said my friend.&lt;/p&gt;
&lt;p&gt;They went on to explain that I’d established a career, and I’d gotten through the early years of parenting. Now my spouse and I were finding ourselves with more time and energy than we knew what to do with. They said, “Now is the time to rewire your relationships for the next few decades.”&lt;/p&gt;
&lt;p&gt;I love that metaphor: rewire relationships for the next decades. It unlocked fantastic questions. How do I want to treat my spouse, and how do I want to be treated, from now into retirement? What’s the relationship I want with our kids? How do I want to interact with my community? What’s my professional identity and relationship to work?&lt;/p&gt;
&lt;p&gt;This year, I’m grateful for those focusing questions, and the effort I’ve put towards answering them.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’m thankful for learning, both about myself and others. My personal therapy has revealed that I’m often unable to acknowledge my own negative emotions. My beginning to do so feels revelatory. It feels like uncovering a straight path through what seemed like a labyrinth.&lt;/p&gt;
&lt;p&gt;I began reading a book each week (and &lt;a href=&quot;https://app.thestorygraph.com/books-read/aaronsuggs&quot;&gt;updating my StoryGraph profile&lt;/a&gt;). It feels like compound interest for developing interesting ideas.&lt;/p&gt;
&lt;p&gt;I’m thankful to my colleagues at Glossier from whom I’ve learned so much, from hiring and interviewing, how to plan and coordinate large initiatives, to building trust and alignment, and when to be scrappy and pragmatic. Today is the first Black Friday weekend in four years that I’m not primary on-call. It’s a great team, and I’m humbled to be part of it.&lt;/p&gt;
&lt;p&gt;I’m grateful for new opportunities. In December, I’m starting a new job that feels like a profound blessing. I think it’s the flow state I’ve been craving, challenging me to the brink of my abilities. But that’s a story for another day.&lt;/p&gt;
&lt;p&gt;Happy Thanksgiving.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Types of Analysis]]></title><description><![CDATA[One of the more powerful concepts I’ve found is considering which type of analysis to apply to the challenge at hand. It’s been especially…]]></description><link>https://ktheory.com/types-of-analysis/</link><guid isPermaLink="false">https://ktheory.com/types-of-analysis/</guid><pubDate>Sun, 07 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the more powerful concepts I’ve found is considering which type of analysis to apply to the challenge at hand. It’s been especially useful when coaching a software team to put in more and different effort to find the root cause of a failure, or occasionally to save effort when over-analyzing a situation.&lt;/p&gt;
&lt;p&gt;So here’s my survey of ‘types of analysis’, inspired by (and expanding on) a section of &lt;a href=&quot;https://itrevolution.com/book/accelerate/&quot;&gt;&lt;em&gt;Accelerate&lt;/em&gt;&lt;/a&gt;, chapter 12.&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;col&quot;&gt;&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Forensic&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Predictive&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Causal&lt;/th&gt;
      &lt;th scope=&quot;col&quot;&gt;Mechanistic&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;Confidence of claims&lt;/th&gt;
      &lt;td&gt;Low, new evidence could drastically change conclusions&lt;/td&gt;
      &lt;td&gt;Modest, based on suppositions about the past and present contexts&lt;/td&gt;
      &lt;td&gt;High, this was definitely true in the past&lt;/td&gt;
      &lt;td&gt;Very high, claims will be true forever&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;General uses&lt;/th&gt;
      &lt;td&gt;Paleontology, criminal investigations&lt;/td&gt;
      &lt;td&gt;Meteorology, government policies&lt;/td&gt;
      &lt;td&gt;Clinical trials&lt;/td&gt;
      &lt;td&gt;Rocket science, material science&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th scope=&quot;row&quot;&gt;Software development uses&lt;/th&gt;
      &lt;td&gt;Security incident investigations&lt;/td&gt;
      &lt;td&gt;Roadmap planning, project selection, scoping, and sequencing&lt;/td&gt;
      &lt;td&gt;A/B tests of user behavior&lt;/td&gt;
      &lt;td&gt;Unit testing, debugging&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2&gt;Forensic analysis&lt;/h2&gt;
&lt;p&gt;Forensic analysis seeks to understand an incident when it’s impossible to fully recreate the incident.&lt;/p&gt;
&lt;p&gt;Forensic analysis gathers evidence, then uses abductive reasoning to find the most reasonable explanation that fits evidence. When criminal detectives and attorneys argue a theory of a crime, or paleontologists describe how dinosaurs behaved based on fossil records, they’re using abductive reasoning. Any claims based on forensic analysis and abductive reasoning are contingent on the available evidence. It’s always possible that new evidence comes to light that dramatically changes our understanding of an incident.&lt;/p&gt;
&lt;p&gt;In software development, we use forensic analysis to investigate security incidents, or when we search through logs to figure out when or how something occurred.&lt;/p&gt;
&lt;p&gt;Forensic analysis is often the least effort to perform, and the least certain or generalizable in its conclusions.&lt;/p&gt;
&lt;h2&gt;Predictive analysis&lt;/h2&gt;
&lt;p&gt;Predictive analysis uses historical data and inductive reasoning to make claims about the future in an uncontrolled environment.&lt;/p&gt;
&lt;p&gt;When a meteorologist makes a weather forecast, or when the &lt;a href=&quot;https://www.cbo.gov&quot;&gt;CBO&lt;/a&gt; forecasts what a new tax policy will cost over the next decade, they’re using predictive analysis. When lawmakers consider the pros and cons of passing a law, they (ideally) use predictive analysis.&lt;/p&gt;
&lt;p&gt;Because these analyses are uncontrolled, it’s impossible to repeat an experiment. That is, if you make a decision based on forecasts, you can’t know precisely what would have happened if you’d made a different decision. Like, what would society be like if the government had passed a different law years ago? It’s a counterfactual. The best we can do is speculate.&lt;/p&gt;
&lt;p&gt;In software development, we use predictive analysis when creating roadmaps, scoping, and sequencing our projects. We can only speculate about how things would turn out if we chose different projects.&lt;/p&gt;
&lt;h2&gt;Causal analysis&lt;/h2&gt;
&lt;p&gt;Causal analysis uses controlled experiments to see both sides of a decision (i.e., a treatment and control group). This lets us make much stronger claims about the efficacy of a treatment than just predictive analysis.&lt;/p&gt;
&lt;p&gt;Causal analysis is most well known in medicine for clinical drug trials. By comparing the outcomes of subjects in the control and treatment groups, we can be fairly certain that differences in outcomes were &lt;em&gt;caused&lt;/em&gt; by the treatment.&lt;/p&gt;
&lt;p&gt;In software development, we use causal analysis when we do A/B tests. Is the user more likely to click the button if we present information &lt;em&gt;this&lt;/em&gt; way, or &lt;em&gt;that&lt;/em&gt; way?&lt;/p&gt;
&lt;p&gt;Causal analysis is not generalizable. Are the subjects in an experiment representative of the broader population? You need to re-do the experiment to find out. Say an e-commerce company finds that adding a big flashing “NEW” icon next to products increases sales. How long does that effect last? You’d have to do another A/B test to find out. Would it work as well for a different brand? Gotta do another A/B test.&lt;/p&gt;
&lt;p&gt;Causal analysis is clever in that the &lt;em&gt;mechanism&lt;/em&gt; by which the treatment works is irrelevant to the experiment. It doesn’t let us say &lt;em&gt;why&lt;/em&gt; a new drug works, or why users click the button more; just that we have some degree of confidence that the treatment causes some desirable outcome.&lt;/p&gt;
&lt;h2&gt;Mechanistic analysis&lt;/h2&gt;
&lt;p&gt;Mechanistic analysis supports the strongest claims about &lt;em&gt;why&lt;/em&gt; and &lt;em&gt;how&lt;/em&gt; a system works.&lt;/p&gt;
&lt;p&gt;It requires a thorough understanding of the mechanisms that make the system work. You can repeatedly apply the well-modeled system to new situations. It relies well-known scientific theories that are taken as axioms, and uses deductive reasoning to derive useful applications.&lt;/p&gt;
&lt;p&gt;Some examples: When 19th century inventors sent &lt;a href=&quot;https://en.wikipedia.org/wiki/Incandescent_light_bulb#Early_pre-commercial_research&quot;&gt;electrical current through carbon filaments&lt;/a&gt; and discovered that the filaments glowed, they discovered a physical properties that we can use to produce artificial light. Such a system is enduring: every carbon filament glows in predictable ways when you run electricity through it.&lt;/p&gt;
&lt;p&gt;When rocket scientists calculate how much fuel they’ll need to launch a payload into orbit, or when civil engineers analyze whether a bridge design will support a given load, they use mechanistic analysis. Then answer is the solution to a mathematical equation.&lt;/p&gt;
&lt;p&gt;They don’t build many bridges, then drive cars over them to see if they stay up. That kind of predictive analysis is insufficient for the challenge.&lt;/p&gt;
&lt;p&gt;In software engineering, mechanistic analysis is best used when testing and debugging. If we can reliably reproduce a bug, or reliably verify the correctness of a system, it’s strong evidence that we’ve isolated a property of our system, and we’re well on our way to knowing how to modify the system to fix the bug.&lt;/p&gt;
&lt;p&gt;Mechanistic analysis requires the most effort, but yields the highest confidence in our understanding of a system.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Enumerating these 4 types of analysis from low effort / weak claims to high effort / strong claims has helped me coach teams on a pragmatic depth of understanding. To decide if we should invest effort in a product change, we’ll use predictive analysis. To learn exactly how much the product change improved the user experience, we’ll use causal analysis. And to ensure we thoroughly fix any bugs along the way, we’ll use mechanistic analysis.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Completed staff work and Commander’s intent]]></title><description><![CDATA[Recently, I’ve found 2 leadership techniques particularly helpful. They’re both highly leveraged: they empower those around me to work…]]></description><link>https://ktheory.com/completed-staff-work-and-commanders-intent/</link><guid isPermaLink="false">https://ktheory.com/completed-staff-work-and-commanders-intent/</guid><pubDate>Sun, 31 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I’ve found 2 leadership techniques particularly helpful. They’re both &lt;em&gt;highly leveraged&lt;/em&gt;: they empower those around me to work effectively with less direct input and coordination from myself.&lt;/p&gt;
&lt;h2&gt;Completed Staff Work&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://newrelic.com/blog/nerd-life/engineering-management-completed-staff-work&quot;&gt;Jade Rubick has an excellent intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Completed_staff_work&quot;&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Completed staff work is a rigorous “definition of done” when one needs to clarify and recommend a decision to someone else.&lt;/p&gt;
&lt;p&gt;It’s useful when for the &lt;em&gt;responsible&lt;/em&gt; person is different from the &lt;em&gt;accountable&lt;/em&gt; person in a &lt;a href=&quot;https://project-management.com/understanding-responsibility-assignment-matrix-raci-matrix/&quot;&gt;RACI matrix&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;How I’ve applied it&lt;/h4&gt;
&lt;p&gt;When my colleagues present a decision that’s incomplete, my instinct is to do the additional work myself and model what I think is missing. Completed Staff Work helped me recognize that I overplay that Do-It-Myself technique (often at the expense of other priorities), and can instead give clear feedback about what’s missing&lt;/p&gt;
&lt;h2&gt;Commander’s Intent&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hbr.org/2010/11/dont-play-golf-in-a-football-g&quot;&gt;HBR article&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Commander’s intent is about explaining “why” a particular task or instruction is important. Then If the particular task becomes unrealistic, knowing the intent allows others to creatively and independently solve the problem with less input from the “commander.” I think of it as the “spirit of the law” rather than the ”&lt;a href=&quot;https://en.wikipedia.org/wiki/Letter_and_spirit_of_the_law&quot;&gt;letter of the law&lt;/a&gt;“.&lt;/p&gt;
&lt;p&gt;Knowing the intent empowers operators to better improvise and improve on rote instructions.&lt;/p&gt;
&lt;h4&gt;How I’ve applied it&lt;/h4&gt;
&lt;p&gt;I didn’t realize it at the time, but I used commander’s intent to evolve Glossier’s incident response process. We wanted to better detected and mitigate incidents. And we wanted to prioritize remediation work that would eliminate several types of failures. When this work inevitably ran up against product feature tradeoffs, the team was able to navigate those tradeoffs well referring back to the explicit intent of our incident response process, namely to continuously improve product quality and team productivity.&lt;/p&gt;
&lt;p&gt;I encourage other leaders to use ‘completed staff work’ to teach their team to make clear decisions, and use commander’s intent to allow individual autonomy while staying aligned with the group.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Incident anecdote: The one with the weird A/B test]]></title><description><![CDATA[I appreciate reading stories of how complex software systems fail and the hard-earned lessons to make them more resilient. Here is  another…]]></description><link>https://ktheory.com/incident-anecdote-the-one-where-an-ab-test-revealed-a-major-bug/</link><guid isPermaLink="false">https://ktheory.com/incident-anecdote-the-one-where-an-ab-test-revealed-a-major-bug/</guid><pubDate>Wed, 20 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I appreciate reading stories of how complex software systems fail and the hard-earned lessons to make them more resilient.&lt;/p&gt;
&lt;p&gt;Here is  another of my personal favorite incident anecdotes. It sticks out because it helped broaden my thinking about appropriate uses for A/B tests.&lt;/p&gt;
&lt;h2&gt;Key lesson&lt;/h2&gt;
&lt;p&gt;A/B tests can be useful to verify that a software system works correctly—they’re not just for testing the user experience.&lt;/p&gt;
&lt;h2&gt;Setting the scene&lt;/h2&gt;
&lt;p&gt;My team had spent about 8 months rewriting our e-comm frontend from dynamic, backend-rendered HTML to a statically rendered frontend (called SSG for static site generation). The main goal of the project was to make our site more scalable (by reducing the need for backend rendering and DB queries), and reduce latency.&lt;/p&gt;
&lt;p&gt;We began QA’ing the new SSG version of Glossier behind a feature flag with fancy Cloudflare routing config.&lt;/p&gt;
&lt;p&gt;In order to quantify the revenue impact of the project, leadership requested we do an A/B test on the conversion rate.&lt;/p&gt;
&lt;p&gt;The team and I were initially reluctant, since an A/B test for this particular infra migration required one-off support in our Cloudflare Workers. We hadn’t planned to A/B test SSG because it wasn’t an optional feature — we needed SSG for our Black Friday traffic.&lt;/p&gt;
&lt;p&gt;But it’s fair to ask us to back up our aspirational claims with data. And boy were we surprised when the early A/B results showed SSG had a worse conversion rate than our slow, dynamically-generated control.&lt;/p&gt;
&lt;p&gt;We dug in, and realized that almost no customers from the UK converted in our SSG treatment. That helped us pinpoint a typo in our localization code (&lt;code class=&quot;language-text&quot;&gt;en-UK&lt;/code&gt; instead of &lt;code class=&quot;language-text&quot;&gt;en-GB&lt;/code&gt;). This caused customers with a UK IP address to default to the US store. Confused, they’d bounce rather than change their locale in a footer widget.&lt;/p&gt;
&lt;p&gt;Note that we’d certainly tested many international locales; but we’d tested it by manually changing our locale (which worked) rather than the geo-IP lookup that’s the default for most users.&lt;/p&gt;
&lt;p&gt;We fixed the typo, re-ran the A/B test, and sighed with relief at a modest lift in the conversion rate.&lt;/p&gt;
&lt;p&gt;The A/B test was useful for QA! It would have been more difficult and costly to find that typo had we launched without an A/B test.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Personal productivity advice]]></title><description><![CDATA[Two colleagues recently asked me for personal productivity advice. I suspect one of them even gave me the Disco compliment: Aaron Suggs…]]></description><link>https://ktheory.com/personal-productivity-advice/</link><guid isPermaLink="false">https://ktheory.com/personal-productivity-advice/</guid><pubDate>Sun, 26 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two colleagues recently asked me for personal productivity advice. I suspect one of them even gave me the &lt;a href=&quot;https://values.justdisco.com&quot;&gt;Disco compliment&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aaron Suggs always gets projects over the finish line.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, there must be some misunderstanding because &lt;em&gt;I&lt;/em&gt; don’t feel like I get an unusual amount done, nor am I particularly strategic about it. My motivating principle is to avoid constant anxiety.&lt;/p&gt;
&lt;p&gt;So here’s some free advice from an unqualified amateur.&lt;/p&gt;
&lt;p&gt;First, I’ll point to better resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gettingthingsdone.com/what-is-gtd/&quot;&gt;Getting Things Done (GTD)&lt;/a&gt; — I first read David Allen’s GTD book in 2005. It has a lot of durable, influential ideas. Though the implementation of notepads can be updated for a smartphone era.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jamesclear.com/atomic-habits&quot;&gt;Atomic Habits&lt;/a&gt; by James Clear. I really liked the emphasis on &lt;em&gt;mindset&lt;/em&gt; and &lt;em&gt;environment&lt;/em&gt; in changing habits.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.newyorker.com/tech/annals-of-technology/the-rise-and-fall-of-getting-things-done&quot;&gt;The Rise and Fall of Getting Things Done&lt;/a&gt; by Cal Newport. This is a modern, wide-lens perspective on GTD and the personal productivity domain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some productivity techniques that I’ve found useful:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Touch-it-once&lt;/strong&gt;: Once a task has your attention, try to see it through to completion so you don’t need to ‘touch’ it or think about it again. For example, when I check my mail, if there’s a bill, I open and pay it right away (or better yet set up auto-pay). Then I can recycle the bill. I never set it down nor remember to pay it later. It means checking the mail sometimes takes a few minutes, but it doesn’t generate future work or accumulate in piles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ubiquitous capture&lt;/strong&gt;: Make it easy to leave notes to your future self, whether by your bedside table late at night or first thing in the morning, at your computer, in the car, or anywhere. I use the Reminders app on Apple Watch (usually via Siri), iOS, and macOS. And I use &lt;a href=&quot;https://culturedcode.com/things/&quot;&gt;Things app&lt;/a&gt; to organize complicated projects. I organize my reminders to notify me when and where I can act on them. E.g. say in an 11am meeting we make a decision I need to communicate to my team. And say I’m busy until 3pm. I’ll make a reminder to share the decision with the team at 3pm. I can relax knowing that my system will notify me when I’m able to act on it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write down the next action&lt;/strong&gt;. If you need to interrupt a task (see #1 for why this should be rare), leave notes to your future self to make it easy to pick up where you left off. What were your about to do? On a project, you’re usually doing one of 4 things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Researching - understanding the problem&lt;/li&gt;
&lt;li&gt;Brainstorming - generating ways to solve the problem&lt;/li&gt;
&lt;li&gt;Communicating - getting approval/alignment, informing or training stakeholders about how it affects them&lt;/li&gt;
&lt;li&gt;Implementing - executing the work you brainstormed + said you’d do.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you’re stuck, ask yourself which one of those 4 things you should do to make progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be easy to follow&lt;/strong&gt;: Write down your work process so others can imitate it. Put it in the first place you’d look for it in the future (code review comments, Jira ticket, wiki, etc). Share the checklist, notes, thought process that you went through. This feels like extra work in the moment, but pays off in the long-run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Know yourself&lt;/strong&gt;. When do you focus best? What type of work is a chore that saps energy? Get the chores out of the way, and then treat yourself to the more enjoyable tasks. And don’t force yourself to be productive if you’re really not in the headspace for it. Focus on the work you’re able to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consider &lt;a href=&quot;https://www.psychologistworld.com/cognitive/maximizers-satisficers-decision-making&quot;&gt;Satisficing vs maximizing&lt;/a&gt;&lt;/strong&gt;: Ask yourself if this project benefits from a quick, low-effort satisfying and sufficient solution (i.e. satisficing), or a high-effort maximizing solution. Most of the time, the answer is satisficing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Those are six strategies that help me remember details and stay focused. Please &lt;a href=&quot;https://twitter.com/ktheory&quot;&gt;let me know on twitter&lt;/a&gt; if you have any to share.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Resiliency generator]]></title><description><![CDATA[Below is the mental model I use when designing or reviewing web services to fail gracefully. It’s useful to enumerate common failure types…]]></description><link>https://ktheory.com/resiliency-generator/</link><guid isPermaLink="false">https://ktheory.com/resiliency-generator/</guid><pubDate>Tue, 07 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Below is the mental model I use when designing or reviewing web services to fail gracefully. It’s useful to enumerate common failure types, and ensure engineers intentionally plan for them.&lt;/p&gt;
&lt;p&gt;For each network call the service makes (to a data store or API), consider how it would would behave if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the call immediately &lt;strong&gt;returns an error&lt;/strong&gt;. Do you have appropriate &lt;em&gt;error handling, instrumentation, and &lt;a href=&quot;https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/&quot;&gt;retry logic&lt;/a&gt;&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;the call &lt;strong&gt;never returns&lt;/strong&gt;. Do you have an &lt;em&gt;appropriate timeout&lt;/em&gt;? Can you determine if the network call should be retried? Ruby’s Unicorn web server has a &lt;a href=&quot;https://yhbt.net/unicorn/Application_Timeouts.html&quot;&gt;concise introduction of application timeout considerations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;the responses are &lt;strong&gt;temporarily incorrect&lt;/strong&gt;. Do you have &lt;em&gt;logging and instrumentation&lt;/em&gt; to figure out which data are affected?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By addressing these 3 questions, you’ve built a solid foundation for a reliable, maintainable web service.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Team values]]></title><description><![CDATA[Every team has values that guide their work. Of course, I like to write down some aspirational values, preferably in a charter. Here are…]]></description><link>https://ktheory.com/team-values/</link><guid isPermaLink="false">https://ktheory.com/team-values/</guid><pubDate>Thu, 05 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every team has values that guide their work. Of course, I like to write down some aspirational values, preferably in a charter.&lt;/p&gt;
&lt;p&gt;Here are some of my favorites over the years:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be exemplary&lt;/strong&gt;:
Our work, process, and demeanor should serve as an example to our coworkers, and to the industry in general. We aim to move the organization forward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blameless self-reflection&lt;/strong&gt;:
No one naturally likes talking about their failures, delays, or lack of understanding. Yet doing so is safe, healthy, and necessary to do better tomorrow. Strive to only make new mistakes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be approachable&lt;/strong&gt;:
Work collaboratively with other teams. Share responsibility and model a &lt;a href=&quot;https://cloud.google.com/architecture/devops/devops-culture-westrum-organizational-culture&quot;&gt;generative culture&lt;/a&gt;. Embrace and guide others scratching their own itch to do so in a way that benefits the whole team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explain why, and ensure it’s safe to ask why&lt;/strong&gt;:
Be transparent and explicit about how we prioritize, scope, and implement projects. Documenting the reasons and context for these decisions lets us easily adapt when we encounter new circumstances, and quickly onboard new team members.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Embrace experimentation with limits to avoid tech debt&lt;/strong&gt;:
Balance the virtues of consistent, familiar tools with innovative experiments. Experiments are the engine of innovation and continuous improvement.&lt;/p&gt;
&lt;p&gt;And especially for platform/SRE teams serving internal customers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pave the common path&lt;/strong&gt;:
Common tasks should be easy (or automated!) and well-supported.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Empower our colleagues&lt;/strong&gt;:
Build simple, reliable processes and tools. Avoid being a bottleneck with self-service tools so others may help themselves.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Incident anecdote: the one where memcached crashed]]></title><description><![CDATA[I appreciate reading stories of how complex software systems fail and the hard-earned lessons to make them more resilient. In fact, one of…]]></description><link>https://ktheory.com/incident-anecdote-the-one-where-memcached-crashed/</link><guid isPermaLink="false">https://ktheory.com/incident-anecdote-the-one-where-memcached-crashed/</guid><pubDate>Wed, 28 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I appreciate reading stories of how complex software systems fail and the hard-earned lessons to make them more resilient. In fact, one of my favorite software interview questions is “tell me about a time you were involved in a production incident.”&lt;/p&gt;
&lt;p&gt;Here is one of my personal favorite incident anecdotes. It sticks out because of the cognitive bias that slowed our diagnosis, and how thoroughly we were able to prevent similar incidents in the future.&lt;/p&gt;
&lt;h2&gt;Key lessons&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;It’s useful to reconfirm basic assumptions if &lt;a href=&quot;https://response.pagerduty.com/before/different_roles/#subject-matter-expert&quot;&gt;Subject Matter Experts&lt;/a&gt; are stumped.&lt;/li&gt;
&lt;li&gt;Listen to all the voices in the room.&lt;/li&gt;
&lt;li&gt;Thorough remediation means mitigating future failures in multiple independent ways.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Setting the scene&lt;/h2&gt;
&lt;p&gt;It was early 2015 at Kickstarter. Our Rails app used 3 &lt;a href=&quot;https://www.memcached.org&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt;&lt;/a&gt; servers running on EC2 as a read-through cache. We were expecting a high-visibility project to launch in the coming days, so per our standard practice, we scaled up our &lt;a href=&quot;https://yhbt.net/unicorn/unicorn_1.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;unicorn&lt;/code&gt;&lt;/a&gt; app processes by 50%. In this case, that meant going from 800 to 1200 unicorn workers.&lt;/p&gt;
&lt;p&gt;In prior months, we’d been battling DDOS attacks, so I was primed to expect unusual app behavior to be a new type of abusive traffic.&lt;/p&gt;
&lt;h2&gt;The incident&lt;/h2&gt;
&lt;p&gt;Out of the blue, our team was paged that the site was mostly unresponsive. A few clients could get a page to load within our ~60 second timeout, but more often clients got a 504 gateway timeout error. Several engineers, including myself, joined our incident slack channel to triage.&lt;/p&gt;
&lt;p&gt;Digging into our APM dashboards, we saw that the &lt;a href=&quot;https://www.kickstarter.com/help/stats&quot;&gt;public stats page&lt;/a&gt; saturating our database CPU with slow queries, which meant our unicorn web workers hung while waiting on DB queries to render pages.&lt;/p&gt;
&lt;p&gt;That was strange because while the stats queries are slow, we kept the cache warm with a read-through and periodic write-through strategy. If the results fell out of cache, the page should hang for just a few seconds; not cause site-wide impact for several minutes.&lt;/p&gt;
&lt;p&gt;“It’s as if &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; isn’t running,” said one prescient engineer. I ignored the comment, too deep in my own investigation. Memcached doesn’t crash, I thought. It must be our app bug, or some clever new denial-of-service vector to generate DB load.&lt;/p&gt;
&lt;p&gt;After roughly 40 minutes of fruitless head scratching, the prescient engineer piped in, “I ssh’ed into one of the cache servers, and &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; isn’t running.”&lt;/p&gt;
&lt;p&gt;If we’d had an Incident Manager role, we’d likely have checked memcached sooner.&lt;/p&gt;
&lt;p&gt;Biggest. Facepalm. Ever.&lt;/p&gt;
&lt;h2&gt;The fix&lt;/h2&gt;
&lt;p&gt;Moments after we confirmed &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; wasn’t running, we restarted it with &lt;code class=&quot;language-text&quot;&gt;/etc/init.d/memcached restart&lt;/code&gt;, and the site recovered within a few seconds.&lt;/p&gt;
&lt;p&gt;With the incident mitigated, our investigation continued. Why wasn’t memcached running? Our cache cluster had been healthy for years. The EC2 hosts were healthy. Yet each &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; process had crashed in the past few hours. Only in retrospect did we observe that the site was slightly slower as the first 2 crashed. We certainly noticed the near-complete outage when the final process crashed.&lt;/p&gt;
&lt;p&gt;Digging through our app logs, I noticed sporadic connection errors to memcached. Apparently, we still had the default ulimit of 1024. So when we scaled to 1200 app workers, only 1024 could connect, and the remaining 176 would get errors. The Ruby memcached client would automatically attempt to reconnect every few seconds.&lt;/p&gt;
&lt;p&gt;I was still puzzled why memcached had crashed, so I searched through the code commits for anything mentioning “crash.” And eureka! &lt;a href=&quot;https://github.com/memcached/memcached/commit/ac939723874f1ebe1f0738af3855e81c026e9bc4&quot;&gt;This commit mentions exactly our issue&lt;/a&gt;: as clients connect and disconnect when memcached is at the ulimit’s max connections, a race condition can crash the server. The default version of memcached that came with our Ubuntu version happened to predate the fix. I was able to reliably recreate the crash in a test env.&lt;/p&gt;
&lt;p&gt;With all this in hand, the team implemented several fixes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I ported the default &lt;code class=&quot;language-text&quot;&gt;init.d&lt;/code&gt; script to &lt;a href=&quot;http://smarden.org/runit/&quot;&gt;runit&lt;/a&gt;, our preferred tool at the time, to automatically start processes if they crash. This would make the impact of the crash negligible.&lt;/li&gt;
&lt;li&gt;We increased the &lt;code class=&quot;language-text&quot;&gt;ulimit&lt;/code&gt; to accommodate more workers. This improved latency because ~15% of our workers were effectively without cache.&lt;/li&gt;
&lt;li&gt;We upgraded &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; to patch the &lt;code class=&quot;language-text&quot;&gt;ulimit&lt;/code&gt; issue.&lt;/li&gt;
&lt;li&gt;Send an alert if &lt;code class=&quot;language-text&quot;&gt;memcached&lt;/code&gt; isn’t running on a cache server to reduce our time-to-detect.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Items 1-3 are &lt;em&gt;each&lt;/em&gt; sufficient to prevent this particular memcached crash from having a significant impact on our customers.&lt;/p&gt;
&lt;p&gt;This was the first and only incident with memcached crashing in my 7 years at Kickstarter.&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;This incident taught me to be a better listener to all the voices in the room, even if it means questioning assumptions that have served me well before.&lt;/p&gt;
&lt;p&gt;And it taught me to be tenacious in tracking down causes for failures, rather than stopping at the first sufficient mitigation. Reading the source code can be fun and rewarding!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Build vs. Buy wisdom from Apple and Amazon]]></title><description><![CDATA[I published Guiding principles for build vs. buy decisions on LeadDev as part of their Technical Decision Making series. Here’s the…]]></description><link>https://ktheory.com/build-vs-buy-on-leaddev/</link><guid isPermaLink="false">https://ktheory.com/build-vs-buy-on-leaddev/</guid><pubDate>Fri, 18 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I published &lt;a href=&quot;https://leaddev.com/technical-decision-making/guiding-principles-build-vs-buy-decisions&quot;&gt;Guiding principles for build vs. buy decisions&lt;/a&gt; on LeadDev as part of their &lt;a href=&quot;https://leaddev.com/category/technical-decision-making&quot;&gt;Technical Decision Making&lt;/a&gt; series.&lt;/p&gt;
&lt;p&gt;Here’s the conclusion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I encourage you to consider ‘build vs. buy’ primarily from the lens of whether the opportunity merits a long-term strategic investment of your team’s attention, and less from the lens of short-term financial cost. Build if there’s an opportunity to make a significant improvement on the state of the art and create a competitive advantage for your organization. Buy it otherwise. And be ready to discard your competitive advantages of yesteryear as better alternatives emerge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Together with &lt;a href=&quot;https://ktheory.com/choosing-software-vendors/&quot;&gt;Choosing software vendors well&lt;/a&gt;, it feels like a coherent a strategy.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Culture of Code podcast]]></title><description><![CDATA[Felix Thea interviewed me recently for his new Culture of Code podcast. It begins with a bit of biography about my early sysadmin and…]]></description><link>https://ktheory.com/culture-of-code-podcast/</link><guid isPermaLink="false">https://ktheory.com/culture-of-code-podcast/</guid><pubDate>Sun, 06 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Felix Thea interviewed me recently for his new &lt;a href=&quot;https://www.cultureofcode.co&quot;&gt;Culture of Code&lt;/a&gt; podcast.&lt;/p&gt;
&lt;p&gt;It begins with a bit of biography about my early sysadmin and developer career, then gets into advice about how to do &lt;a href=&quot;https://noidea.dog/glue&quot;&gt;“glue” work&lt;/a&gt; across teams.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/31950affe9f0628e6daae5bec38f3892/COC-EP01-AARON-SUGGS-FULL-EPISODE.mp3&quot;&gt;Download&lt;/a&gt; or play below:&lt;/p&gt;
&lt;p&gt;
		&lt;audio
			src=/31950affe9f0628e6daae5bec38f3892/COC-EP01-AARON-SUGGS-FULL-EPISODE.mp3
			preload=&quot;auto&quot;
			
			
			
			controls
      width=&quot;undefined&quot;
		&gt;&lt;/audio&gt;
	&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Reading List (Feb-May 2021)]]></title><description><![CDATA[Here’s a log of audiobooks I’ve listened to recently, with some notes. Nonfiction Sapiens: A Brief History of Human Kind by Yuval Noah…]]></description><link>https://ktheory.com/reading-list-feb-may-2021/</link><guid isPermaLink="false">https://ktheory.com/reading-list-feb-may-2021/</guid><pubDate>Wed, 02 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s a log of audiobooks I’ve listened to recently, with some notes.&lt;/p&gt;
&lt;h3&gt;Nonfiction&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Sapiens: A Brief History of Human Kind&lt;/em&gt; by Yuval Noah Harari&lt;/p&gt;
&lt;p&gt;This was a wonderful book. Some of my favorite points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Corporations and nations are a collective fiction like religions.&lt;/li&gt;
&lt;li&gt;Money is an uniquely valuable technology because it transcends culture.&lt;/li&gt;
&lt;li&gt;Agriculture and the Neolithic revolution changed humanity in harmful ways, increasing the likelihood of violent conflict and poverty (reminiscent of &lt;em&gt;Ishmael&lt;/em&gt; by Daniel Quinn).&lt;/li&gt;
&lt;li&gt;The chapter on happiness and Zen Buddhism gave me galaxy brain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;The Essential Drucker&lt;/em&gt; by Peter F Drucker&lt;/p&gt;
&lt;p&gt;A wide-ranging collection of insights on business management, many from the early-mid 1900s.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Good to Great&lt;/em&gt; by Jim Collins&lt;/p&gt;
&lt;p&gt;I read this because it’s popular among Glossier leaders, with frequent references to a ‘flywheel’ and ‘getting the right people on the bus’. I found it quite valuable.&lt;/p&gt;
&lt;p&gt;Some notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Humility and egolessness are critical leadership skills.&lt;/li&gt;
&lt;li&gt;You are more likely to get revolutionary results from an evolutionary process than a revolutionary process. I.e. evolving a process is like compound interest.&lt;/li&gt;
&lt;li&gt;Opportunity selection is more critical than opportunity creation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Inspired&lt;/em&gt; by Marty Cagan&lt;/p&gt;
&lt;p&gt;I read this b/c an Eng/PM friend recommended it when I confessed a lot of role confusion amongst PMs, Eng Managers, and tech leads. It’s a good primer on what Product Management should be. I particularly appreciated the emphasis on finding reference customers as a symbiotic partnership.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Doughnut Economics&lt;/em&gt; by Kate Raworth&lt;/p&gt;
&lt;p&gt;A thought-provoking exploration of an economics that doesn’t assume indefinite growth. She argues that systems thinking (stocks and flows) are much more helpful to economics than trying to discover physics-like natural laws and constants.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Algorithms to Live By&lt;/em&gt; by Brian Christian and Tom Griffiths&lt;/p&gt;
&lt;p&gt;I especially liked applying the multi-armed bandit approach to explore/exploit trade offs in everyday life (like whether to try a new restaurant).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Structure of Scientific Revolutions&lt;/em&gt; by Thomas S Kuhn&lt;/p&gt;
&lt;p&gt;I re-read this for the first time since college. One point that really stuck out what that work on novel paradigms is often accessible to a non-academic audience. Examples were Newton’s &lt;em&gt;Principia&lt;/em&gt; and Darwin’s &lt;em&gt;Origin of Species&lt;/em&gt;. In contrast, as a paradigm is well-established, academic work becomes deeply niche and inscrutable without decades of training.&lt;/p&gt;
&lt;p&gt;Turns out, the hard sciences are more subjective than we realize.&lt;/p&gt;
&lt;h3&gt;Fiction&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;His Dark Materials&lt;/em&gt; trilogy by Philip Pullman&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Broken Earth&lt;/em&gt; trilogy by N. K. Jemisin&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Yiddish Policemen’s Union&lt;/em&gt; by Michael Chabon&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Project Hail Mary&lt;/em&gt; by Andy Weir. Rocky! I liked The Martian and Artemis. This is my favorite of the three. Weir has really found his groove.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Death’s End&lt;/em&gt; (Remembrance of Earth’s Past trilogy) by Cixin Lui&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[When to ship]]></title><description><![CDATA[There’s a crucial moment in platform engineering projects when you decide it’s ready to ship. For large projects (say, more than 1 year of…]]></description><link>https://ktheory.com/when-to-ship/</link><guid isPermaLink="false">https://ktheory.com/when-to-ship/</guid><pubDate>Sun, 23 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There’s a crucial moment in platform engineering projects when you decide it’s ready to ship. For large projects (say, more than 1 year of engineering effort), it can be a difficult decision for the team. More cautious contributors want to delay for further testing and polishing. Other teammates inevitably begin to shift their attention to their next project, and are eager to move on.&lt;/p&gt;
&lt;p&gt;I’ve found a simple criteria for navigating the risk/reward trade-off for launching a complex project:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ship when the project is an improvement on the status quo.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If current engineering risks make it uncertain that it’s an improvement, continue testing and fixing defects until it’s clearly an improvement.&lt;/p&gt;
&lt;p&gt;And all those extra features on the backlog: you can still build them, but it’s not worth withholding the value you’ve already created while you do so.&lt;/p&gt;
&lt;p&gt;I’ve found this to be particularly useful for architecture migrations or component rewrites where achieving ‘feature parity’ with a deprecated implementation or ‘feature completeness’ of our ideal product is difficult or not worth the opportunity cost. Agreeing to ship a feature when it’s a net improvement over the existing solution ensures our team delivers value as quickly as possible, and helps us focus our effort on the most impactful work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Development environment trade-offs]]></title><description><![CDATA[My team has been discussing the role of various test and development environments. We’d like to provide guidance for what developers should…]]></description><link>https://ktheory.com/development-environment-optimizations-and-trade-offs/</link><guid isPermaLink="false">https://ktheory.com/development-environment-optimizations-and-trade-offs/</guid><pubDate>Sun, 16 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My team has been discussing the role of various test and development environments. We’d like to provide guidance for what developers should test locally on their laptop, on an ad hoc deployed environment, on a pre-prod environment, and on production.&lt;/p&gt;
&lt;p&gt;I’d like to share some criteria that help me organize the value and purpose of various environments.&lt;/p&gt;
&lt;p&gt;Let’s start with 3 key features of an ideal dev env:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt; feedback. It should be as quick as possible to change some code in your editor and see the effect in your dev environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Similar&lt;/strong&gt; to production. The environment should be maximally similar to the full production system. There are several aspects in which it may be similar or different, such as the infrastructure it runs on, configuration, data, and traffic load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolated&lt;/strong&gt;. Any side effects and failures should be isolated from impacting actual users, or even your colleagues (e.g. minimize the time that one person breaking the build blocks teammates).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, fast, similar, and isolated aren’t so much features, but continuous dimensions that we try to maximize. We can carve out roles for various dev envs by considering the relative importance of each dimension.&lt;/p&gt;
&lt;h3&gt;Local development&lt;/h3&gt;
&lt;p&gt;For local development environments (i.e. code running on your laptop), I’d rank the importance as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Isolated&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Similar&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In other words, it’s most important that local envs are isolated from breaking anything on production or anyone else’s environments. The 2nd priority is fast developer feedback as long as it doesn’t compromise isolation. And the 3rd priority is being production-like, as long as it doesn’t compromise isolation or fast feedback.&lt;/p&gt;
&lt;p&gt;A feature like Webpack’s &lt;a href=&quot;https://webpack.js.org/guides/hot-module-replacement/&quot;&gt;Hot Module Replacement&lt;/a&gt; and React Hot Reloading improves feedback time, but detracts from being production-like. So that’s a win for local development since ‘Fast’ is more important the ‘Similar’.&lt;/p&gt;
&lt;p&gt;By similar reasoning, local development is a good place to run uncommitted code, or dynamically generating assets that would be immutable deploy artifacts on production.&lt;/p&gt;
&lt;h3&gt;Testing on production&lt;/h3&gt;
&lt;p&gt;What about practices that let you more safely test on production, like feature flags and blue-green deployments? I see the ranking as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Similar&lt;/li&gt;
&lt;li&gt;Isolated&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;‘Similar’ is de facto top priority since it &lt;em&gt;is&lt;/em&gt; production. Next up, our goal is to isolate failures and unintended side effects as much as possible. And finally, we want fast feedback as long as it doesn’t compromise isolation.&lt;/p&gt;
&lt;h3&gt;Other deployed environments&lt;/h3&gt;
&lt;p&gt;Where does that leave environments like staging, QA, or other quasi-production like environment? For decades, they’ve been a middle-ground between local development and production.&lt;/p&gt;
&lt;p&gt;As release engineering and local development tooling improves, I’m finding fewer reasons to maintain them. More likely, I’m going to invest in ways to gain confidence in my code locally, or build ways to safely test it on production.&lt;/p&gt;
&lt;p&gt;Let’s recall the aspects in which an environment can be production-like: infrastructure (as in the CPU and memory resources, operating system, and system libraries), configuration, data, and traffic.&lt;/p&gt;
&lt;p&gt;Years ago infrastructure and configuration were a frequent sources of bugs. Code might work on a developer’s macOS laptop, but not on Linux server. Or we forgot to set all the environment variables we expected. Staging environments were a critical place to suss out those bugs. Lately, Infra-as-code tooling and better configuration patterns like Terraform, CloudFormation, and Docker have made these rare issues.&lt;/p&gt;
&lt;p&gt;Most bugs I see on production today are related to data (i.e. unexpected states) or traffic (unexpected resource contention or race conditions). Those are particularly difficult to suss out in non-production environments.&lt;/p&gt;
&lt;p&gt;Sometimes creating these non-production integration environments means adding and maintaining new code paths. For example, for &lt;a href=&quot;https://stripe.com/docs/testing&quot;&gt;Stripe’s sandbox environment&lt;/a&gt;, Stripe maintains different payment cards that always succeed or return predictable errors. That’s unique behavior to the sandbox environment not found on production. In order to be useful for isolated testing, they had to compromise on being similar to production. As I think about a constellation of microservices that could make up a complete test environment, the support cost of these alternate code paths can add up quickly.&lt;/p&gt;
&lt;p&gt;For SRE / Platform / Release Engineering teams tasked with supporting developers on the entire delivery lifecycle, we must choose where our attention can have the most impact for the organization. I’m finding that ever more often the focus in on fast local development and safe production releases, and there are fewer reason for maintaining non-production deployed environments.&lt;/p&gt;
&lt;p&gt;Check out ”&lt;a href=&quot;https://kickstarter.engineering/the-value-of-reliable-developer-tooling-e94791d1482e&quot;&gt;The value of reliable developer tooling&lt;/a&gt;” for some of my prior work on dev envs.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Capacity testing: key metrics for success]]></title><description><![CDATA[A friend recently asked how to set better capacity testing goals for their tech team. We agreed we needed to get more specific about what…]]></description><link>https://ktheory.com/capacity-testing-three-key-numbers-for-success/</link><guid isPermaLink="false">https://ktheory.com/capacity-testing-three-key-numbers-for-success/</guid><pubDate>Sat, 27 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A friend recently asked how to set better capacity testing goals for their tech team. We agreed we needed to get more specific about what “capacity testing” means.&lt;/p&gt;
&lt;p&gt;Below are the key terms I’ve found helpful. I go into more detail about these in my talk &lt;a href=&quot;https://www.youtube.com/watch?v=Jy_-l3v9zsY&quot;&gt;Surviving Black Friday&lt;/a&gt; (particularly at the &lt;a href=&quot;https://youtu.be/Jy_-l3v9zsY?t=492&quot;&gt;8:00 mark&lt;/a&gt;).&lt;/p&gt;
&lt;h4&gt;Expected traffic&lt;/h4&gt;
&lt;p&gt;This is a plausible traffic volume based on prior data and forecasts. I encourage this number to come from cross-functional consensus from Eng, Data, Marketing, Product, Sales, etc. Express it as a rate like reqs/sec or orders/min.&lt;/p&gt;
&lt;p&gt;If the expected traffic is too low, the service could crash from insufficient capacity. But if it’s too high, you’ve wasted scarce engineering effort building capacity you don’t need (analogous to excess inventory in a supply chain). Site downtime is usually more costly than wasted engineering effort. The virtue of highlighting wasted engineering effort is to recognize the marginal effort and opportunity cost for engineers to support greater capacity.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Factor_of_safety&quot;&gt;Safety factor&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This is the multiplier or fudge factor to give yourself breathing room. I’d suggest 20-50x for early-stage startups that don’t know when they’ll go viral, 5-20x for growth stage businesses, and &amp;#x3C;5x for mature businesses with robust prior data and tightly-managed sales/marketing plans. At Glossier, we currently use a 10x safety factor. We were bitten in 2018 with a 5x safety factor and insufficiently detailed traffic forecast.&lt;/p&gt;
&lt;h4&gt;Capacity target&lt;/h4&gt;
&lt;p&gt;This is what you’re aiming for. &lt;code class=&quot;language-text&quot;&gt;capacity target = expected traffic * safety factor&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So assuming &lt;em&gt;expected traffic&lt;/em&gt; of 500 req/sec, and a &lt;em&gt;safety factor&lt;/em&gt; of 10x, your &lt;em&gt;capacity target&lt;/em&gt; is 5,000 req/sec.&lt;/p&gt;
&lt;h4&gt;Demonstrated capacity&lt;/h4&gt;
&lt;p&gt;This is the load that your engineers have proven your system can handle during their load tests. Keep scaling and removing bottlenecks until your demonstrated capacity exceeds the capacity target.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;: run your load tests for several minutes (we do an hour) to “soak” your infrastructure (kudos to Rajas Patil for introducing this idea). This can reveal bottlenecks that don’t show up in quick tests. For example, at Glossier, the data replication from our customer-facing DB to our BI data warehouse was significantly delayed during a 60-minute soak tests, but we wouldn’t have noticed during a quick 5-minute test. By detecting the replication delay early, we had time to mitigate it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Less painful roadmap reviews]]></title><description><![CDATA[The Glossier Tech team wrapped up our annual roadmap exercise earlier this year. It takes a lot of time and attention from the team…]]></description><link>https://ktheory.com/less-painful-roadmap-reviews/</link><guid isPermaLink="false">https://ktheory.com/less-painful-roadmap-reviews/</guid><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Glossier Tech team wrapped up our annual roadmap exercise earlier this year. It takes a lot of time and attention from the team, especially managers.&lt;/p&gt;
&lt;p&gt;I wanted to share some tips I’ve gleaned to make reviews easy and productive. They’re organized into ‘filters’, or questions to ask about each project in a roadmap.&lt;/p&gt;
&lt;p&gt;If product and engineering managers can speak to each of these filters, they’ll likely have a smooth review with no surprises.&lt;/p&gt;
&lt;p&gt;Virtually all the questions and feedback that came up in our roadmap reviews fall into one of the filters below; and each one is a hard-learned lesson from watching my projects or teams stumble.&lt;/p&gt;
&lt;h5&gt;1. &lt;em&gt;Sufficiently detailed&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;The appropriate level of detail increases during the roadmap process. In general, sufficient detail means that project outcomes and requirements are defined, and that key decisions and risks are highlighted and investigated. A 6-month project may not have a clear approach at the beginning of the road mapping process, but by the end it would likely have specific, realistic outcomes for each 2-week sprint.&lt;/p&gt;
&lt;p&gt;Having documented examples of projects plans with the appropriate detail is helpful here (see &lt;a href=&quot;https://lethain.com/discouraging-perfection/&quot;&gt;Will Larson’s Discouraging Perfection&lt;/a&gt;). Some people take roadmapping too seriously, going into so much detail that the precision of their plan exceeds it’s accuracy. They get frustrated when they need to adapt to the unexpected. Others can be too casual or hedge so much that it’s difficult for others to depend on them. The key is the psychological safety to acknowledge that plans are imperfect and will inevitably change. The point is &lt;em&gt;sufficient&lt;/em&gt; detail to reduce risks, not complete and rigid precision.&lt;/p&gt;
&lt;h5&gt;2. &lt;em&gt;Aligned&lt;/em&gt; with business goals&lt;/h5&gt;
&lt;p&gt;Are these projects sufficient to meet the team’s mission and biz goals? If not, change up the projects, or set more realistic goals. For example, if a goal is to increase a conversion rate by X% this year, but the projects to improve conversion ship at the end of the year, they likely won’t have a significant impact on the conversion rate and there’s little time to respond.&lt;/p&gt;
&lt;h5&gt;3. &lt;em&gt;Comprehensive&lt;/em&gt; of all work&lt;/h5&gt;
&lt;p&gt;Does this roadmap account for all the work the team will have to do? If a team spends 20% of their time responding to bugs filed by the customer support team, that should be accounted for in the resource planning. We call this Keep The Lights On (KTLO) work.&lt;/p&gt;
&lt;h5&gt;4. &lt;em&gt;Sequenced&lt;/em&gt; effectively&lt;/h5&gt;
&lt;p&gt;Which projects have strict deadlines? Do Team A’s projects depend on one of Team B’s projects? Does Project X become easier or more valuable if we do Project Y first? A group roadmap review is one of the more obvious places to suss this out.&lt;/p&gt;
&lt;h5&gt;5. &lt;em&gt;Resourced&lt;/em&gt; for success&lt;/h5&gt;
&lt;p&gt;Does the team have appropriate people and skills to deliver each project? What skill gaps or “bus factors” are there? What’s the plan to get those skills (hire, train, or borrow)?&lt;/p&gt;
&lt;h5&gt;6. &lt;em&gt;Iterative&lt;/em&gt; milestones&lt;/h5&gt;
&lt;p&gt;Can you frontload more business value? I.e. be more agile and less waterfall. Are there narrow customer segments or journeys that you could support early on while you develop the rest of the project? Are there milestones that de-risk the project and enable real feedback as soon as possible?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Having presented and reviewed several roadmaps, I’ve found these filters to be a helpful &lt;a href=&quot;https://en.wikipedia.org/wiki/Lint_(software)&quot;&gt;linting tools&lt;/a&gt; to make more useful roadmaps. Or at least they allow me to learn &lt;em&gt;new ways to fail&lt;/em&gt; rather than repeat my previous mistakes.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Flex time and the 80% rule]]></title><description><![CDATA[While reviewing how I’ve spent my time recently, I stumbled into a practice to better ensure I have sufficient flexible time for…]]></description><link>https://ktheory.com/flex-time-and-the-80-rule/</link><guid isPermaLink="false">https://ktheory.com/flex-time-and-the-80-rule/</guid><pubDate>Wed, 10 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;While reviewing how I’ve spent my time recently, I stumbled into a practice to better ensure I have sufficient flexible time for serendipitous projects. I’ll aim to schedule a max of ~80% of my time for inflexible work like group meetings.&lt;/p&gt;
&lt;p&gt;The practice was inspired by ”&lt;a href=&quot;https://en.wikipedia.org/wiki/Hara_hachi_bun_me&quot;&gt;hara hachi bun me&lt;/a&gt;”, the Confucian practice of eating until you’re 80% full.&lt;/p&gt;
&lt;h5&gt;Dysfunction of the over-booked calendar&lt;/h5&gt;
&lt;p&gt;What’s the harm in scheduling every minute of your day? If appointments are hard to move, it adds friction to say ‘yes’ to unexpected opportunities. I found myself disinclined make time if it had administrative overhead like rescheduling meetings and delaying project timelines.&lt;/p&gt;
&lt;p&gt;Applying &lt;a href=&quot;https://medium.com/@christlc/slacking-off-at-work-is-a-demonstration-of-your-time-management-skill-proven-by-maths-f6529711cc70&quot;&gt;some lean production theory&lt;/a&gt;, as your schedule becomes 100% utilized, the wait-time for any new task approaches infinity.&lt;/p&gt;
&lt;h5&gt;Remove friction to optimize your schedule&lt;/h5&gt;
&lt;p&gt;The solution is me noticing as my schedule fills up, I’ll more aggressively block off flex time on my calendar. To be sure, I find it very useful to be &lt;em&gt;intentional&lt;/em&gt; with every minute of my schedule. Adrian Cruz describes this well in &lt;a href=&quot;https://medium.com/glossier/the-power-of-quiet-time-d21f4ef1d091&quot;&gt;The Power of Quiet Time&lt;/a&gt;. So while I may have an hour or two blocked off for writing docs or making a prototype; I consider that flex time becaue there’s low friction to reschedule that time to help debug a complex issue, or have impromptu discussions.&lt;/p&gt;
&lt;p&gt;Some flex time in your calendar makes it easy to say ‘yes’ when opportunity knocks.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Reading list]]></title><description><![CDATA[In mid-2020, I got an Audible subscription as a substitute for doomscrolling through social media. It turns out I enjoy listening to books…]]></description><link>https://ktheory.com/2020-reading-list/</link><guid isPermaLink="false">https://ktheory.com/2020-reading-list/</guid><pubDate>Thu, 18 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In mid-2020, I got an &lt;a href=&quot;https://www.audible.com&quot;&gt;Audible&lt;/a&gt; subscription as a substitute for doomscrolling through social media.&lt;/p&gt;
&lt;p&gt;It turns out I enjoy listening to books far more than reading them. Here are some books I enjoyed in the last 6 months (follow my &lt;a href=&quot;https://goodreads.com/ktheory&quot;&gt;my Goodreads profile&lt;/a&gt; for more):&lt;/p&gt;
&lt;h3&gt;Nonfiction&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/93904.The_Machine_That_Changed_the_World?ac=1&amp;#x26;from_search=true&amp;#x26;qid=x0TABXfYyG&amp;#x26;rank=1&quot;&gt;The Machine That Changed the World&lt;/a&gt; by James P Womack. One sentence book review: Rigorous insights into Japanese lean manufacturing and keiretsu; emphasizing the success is not due to a national or cultural identity, but a set of practices thoughtfully applied.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nicolefv.com/book&quot;&gt;Accelerate: The Science of DevOps and Lean Software&lt;/a&gt; by Nicole Forsgren: software teams should focus on deploy frequency, lead time, TTR, and change fail rate.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/45303387-an-elegant-puzzle&quot;&gt;An Elegant Puzzle&lt;/a&gt; by Will Larson: bring expansive and systematizing mindset to every technical and management challenge; then work the process (not the exceptions).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/113934.The_Goal&quot;&gt;The Goal: A Process of Ongoing Improvement&lt;/a&gt; by Eliyahu M. Goldratt: identify and eliminate bottlenecks to improve throughput. Bottlenecks can be subtle or unintuitive.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/55587198-the-all-new-don-t-think-of-an-elephant?ac=1&amp;#x26;from_search=true&amp;#x26;qid=R8O7eujaBR&amp;#x26;rank=1&quot;&gt;Don’t Think of an Elephant&lt;/a&gt; by George Lakoff: Controlling subtle and implicit metaphors has huge leverage to frame political debates. Personal values can often be grouped into a “dominant father” or “nuturant mother” mindset. (With &lt;em&gt;Sapiens&lt;/em&gt;, I’m realizing this parallels chimpanzee and bonobo social heirarchies as well.)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/44064568-reimagining-capitalism-in-a-world-on-fire&quot;&gt;Reimagining Capitalism in a World on Fire&lt;/a&gt; by Rebecca Henderson: the current corporate rules and norms undermined the long-term health of society, so leaders should advocate to change the rules for healthier incentives.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/44525559-this-could-be-our-future&quot;&gt;This Could Be our Future&lt;/a&gt; by Yancey Strickler: having an expansive and long-term notion of value (beyond, say, money) clarifies purpose.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/50484473-lives-of-the-stoics?from_search=true&amp;#x26;from_srp=true&amp;#x26;qid=lAY6Hp6JoD&amp;#x26;rank=4&quot;&gt;Lives of the Stoics: The Art of Living from Zeno to Marcus Aurelius&lt;/a&gt; by Ryan Holiday. Stoics are surprisingly varied and relatable. I particularly appreciated the portayal of Seneca as a flawed moderating influence on a corrupt leader.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fiction&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Foundation Trilogy: &lt;a href=&quot;https://www.goodreads.com/book/show/29579.Foundation&quot;&gt;Foundation&lt;/a&gt;, &lt;a href=&quot;https://www.goodreads.com/book/show/29581.Foundation_and_Empire&quot;&gt;Foundation and Empire&lt;/a&gt;, &lt;a href=&quot;https://www.goodreads.com/book/show/29580.Second_Foundation&quot;&gt;The Second Foundation&lt;/a&gt; by Isaac Asimov&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/50548197-a-deadly-education&quot;&gt;A Deadly Education&lt;/a&gt; by Naomi Novik&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/6101718-the-magicians?ac=1&amp;#x26;from_search=true&amp;#x26;qid=LprVCJVBVO&amp;#x26;rank=2&quot;&gt;The Magicians&lt;/a&gt; by Lev Grossman&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/186074.The_Name_of_the_Wind?from_search=true&amp;#x26;from_srp=true&amp;#x26;qid=WrOhIWypPA&amp;#x26;rank=1&quot;&gt;Name of the Wind&lt;/a&gt; (The Kingkiller Chronicle #1) by Patrick Rothfuss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/23168817-the-dark-forest?from_search=true&amp;#x26;from_srp=true&amp;#x26;qid=7UXBkERHRb&amp;#x26;rank=1&quot;&gt;The Dark Forest&lt;/a&gt; (Remembrance of Earth’s Past #2) by Liu Cixin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/62022.The_Queen_s_Gambit?ac=1&amp;#x26;from_search=true&amp;#x26;qid=SSzvxNpP23&amp;#x26;rank=1&quot;&gt;The Queen’s Gambit&lt;/a&gt; by Walter Tevis&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/49661162-randomize&quot;&gt;Randomize&lt;/a&gt; by Andy Weir&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/15808621-the-wise-man-s-fear&quot;&gt;The Wise Man’s Fear&lt;/a&gt; (The Kingkiller Chronicle #2) by Patrick Rothfuss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/49669410-emergency-skin?from_search=true&amp;#x26;from_srp=true&amp;#x26;qid=ecTylKtGI8&amp;#x26;rank=1&quot;&gt;Emergency Skin&lt;/a&gt; by N. K. Jemisin&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Bento: Beyond Near Term Orientation]]></title><description><![CDATA[In January, I joined the Bento Society as a weekly practice in long-term thinking. The society is born of Yancey Strickler’s book This Could…]]></description><link>https://ktheory.com/bento/</link><guid isPermaLink="false">https://ktheory.com/bento/</guid><pubDate>Sun, 14 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In January, I joined the &lt;a href=&quot;https://bentoism.org&quot;&gt;Bento Society&lt;/a&gt; as a weekly practice in long-term thinking.&lt;/p&gt;
&lt;p&gt;The society is born of Yancey Strickler’s book &lt;a href=&quot;https://www.amazon.com/This-Could-Our-Future-Manifesto/dp/0525560823&quot;&gt;&lt;em&gt;This Could Be Our Future&lt;/em&gt;&lt;/a&gt;. Bento stands for &lt;em&gt;Beyond Near Term Orientation&lt;/em&gt;, and a play on the neatly separated Japanese lunch tray.&lt;/p&gt;
&lt;p&gt;In it’s simplest form, the Bento is a square divided into quadrants; with the x-axis being time (now and the future) and the y-axis our self-interest (me and us).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/aca03670675ebf8014d90bbc849e2b90/a878e/blank-bento.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZElEQVQoz4WTi4rCMBBF/f8/FEShplnrNq+ZPEgmj8VGa9dd9BJoO+Rk7tzQXVtERDlnANBa55yJKKXknaOU7u/ehxBoUQihU7v+YIwNw3A6Hk+nk9FaKSmFGIZBa22M0Vqfz+f9fn84HC6Xr3Fkd7jW2loDAO9dKaVthIhrpS6KMSJi/3zCiEhErbXyUGvNGNOLq4joHVwf6nbW4grbN/BWK7yVtc9Z7oEppUIIOd+CTSnFGK21jDEpJQAYY5y1y4YspYwxPuFaK+dcCAFwC1ZrBXCbVmvtnMs5p5RCCIgIAIyxPvYH20QEAC9FRMw5/7IdQvDeLy7Ksm4npkTGmL9BvMJE932ldLJuix8654fD9VZebNdae8jW2n86CyFKKekhIvLeCyF6YO86p5TGcZymiXM+zzMAIKIQgjHmnDPGTJcL53yapuv1+vwxuk/nnFLKObeNvRvpnhHxe56FlPM8r/APNMxrQ8dGYLMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;blank bento&quot;
        title=&quot;blank bento&quot;
        src=&quot;/static/aca03670675ebf8014d90bbc849e2b90/f058b/blank-bento.png&quot;
        srcset=&quot;/static/aca03670675ebf8014d90bbc849e2b90/c26ae/blank-bento.png 158w,
/static/aca03670675ebf8014d90bbc849e2b90/6bdcf/blank-bento.png 315w,
/static/aca03670675ebf8014d90bbc849e2b90/f058b/blank-bento.png 630w,
/static/aca03670675ebf8014d90bbc849e2b90/40601/blank-bento.png 945w,
/static/aca03670675ebf8014d90bbc849e2b90/78612/blank-bento.png 1260w,
/static/aca03670675ebf8014d90bbc849e2b90/a878e/blank-bento.png 2048w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One powerful application is to use the quadrants to tap into important parts of your identity. Write a question like “what should I do today?”, and envision how each quadrant would answer.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6243b72e101ffac716bc0a3071cd087b/4f2ef/completed-bento.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 90.50632911392405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAACb0lEQVQ4y32Ui27bMAxF8/9fNwwd0DRJm6xJnTi25Yds2XqdgbKbpt06AoSViLq6FC+54qt50D/BrMHsoP8F4xbMBsYX6H7AsOVbW4UQqOuaYRjI85zT6YSzDt1qet2j255rnqe1uBs9ph8pyyLFd13HOI4UxRVrLasYI+v1Iy8vL+x2O9brNVVVoZS4QtUq7TVNnbxuFOdzxna75eHhgc3TE+fzOcUI8EpoCsMQ/B3x+CkN2efbXdLFt5TnPyom66k6hzaebnC0vaPWjn70FGVJMFPyaD1xWYdhwuuBqizni2KcAZtaoY3j8Tjyep04XCf2+cTj0XAqLZVShKrDZ9X8zRtC3RPaAVdrVFV9BhSGw+jIlCWrLJfaclaWt2ri2jgqVRI6Q9AmgfhaEyabQAJxTjnGO4ZNw/9M9p1z3+73fX/bX0mpj8cjbdsmCcj33rXWZFmWYqQ4wuY+VsCkyuXyjgvg6xfAZvndYoxJMhKWIUbMOM5xS6z+CviekuT/v5SE6Xc2DD3TNH0AyoGmrVF9Tt1fKdo3fHCL5iLee4qq4mJBuUhhI5cpUtrAm4Wy6RiN+QAUhZfqyqX9TdFm5M0rdZ/TGXVjfikKXsfIaYpsh8h6iBxMJHPQdTph3ADlnaStBtsyTDq5gGlTixoSqIhb+0jnI7WbXdhKf/VaY8wdoAwGeeB/9tVi793wqQEX9sLQfE35Q4sx9bUU4b3KorGiKJDJ5H1I1b6/u227z0URds/POw6HQ5o4+/3+pkH5imw2m02ShqzTdNnv04QRfcrIk1i5OAFKkIh2fssmVf0vaSwpicnB+SKV4t/PC+AfsIFyi1TfHDwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;&amp;#39;what should I do today?&amp;#39; Bento&quot;
        title=&quot;&amp;#39;what should I do today?&amp;#39; Bento&quot;
        src=&quot;/static/6243b72e101ffac716bc0a3071cd087b/f058b/completed-bento.png&quot;
        srcset=&quot;/static/6243b72e101ffac716bc0a3071cd087b/c26ae/completed-bento.png 158w,
/static/6243b72e101ffac716bc0a3071cd087b/6bdcf/completed-bento.png 315w,
/static/6243b72e101ffac716bc0a3071cd087b/f058b/completed-bento.png 630w,
/static/6243b72e101ffac716bc0a3071cd087b/40601/completed-bento.png 945w,
/static/6243b72e101ffac716bc0a3071cd087b/78612/completed-bento.png 1260w,
/static/6243b72e101ffac716bc0a3071cd087b/4f2ef/completed-bento.png 2714w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Now me”&lt;/em&gt; (your short-term self-interest) might want to binge watch Netflix, or knock out a work project that’s been on your mind.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Now us”&lt;/em&gt; (your short-term group-minded self) might want to talk with a family member going through a hard time, or reconnect with an old friend.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Future me”&lt;/em&gt; (your long-term self interest) might want to work on a passion project, or practice a new skill.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Future us”&lt;/em&gt; (your long-term group-minded self) might want to apply a new skill in a way that benefits your community.&lt;/p&gt;
&lt;p&gt;All too often, I find that the &lt;em&gt;“now me”&lt;/em&gt; gets to drive my life. Thinking through the Bento quadrants helps me balance near- and long-term interests; and balance self-care and service to others. It’s not about judging certain quadrants as good/bad or right/wrong; simply that no one quadrant is the complete picture of what matters.&lt;/p&gt;
&lt;p&gt;After doing several Bentos, the exercise highlights the values and guiding principles that I want to more thoroughly practice, like curiosity and compassion.&lt;/p&gt;
&lt;p&gt;Participating in the &lt;a href=&quot;https://bentoism.org&quot;&gt;Bento Society&lt;/a&gt; has been helpful way to ground and orient my values and daily habits.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Choosing software vendors well]]></title><description><![CDATA[If you follow the strategy of avoiding undifferentiated heavy lifting, you’ll inevitably integrate with many software vendors. For example…]]></description><link>https://ktheory.com/choosing-software-vendors/</link><guid isPermaLink="false">https://ktheory.com/choosing-software-vendors/</guid><pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you follow the strategy of avoiding &lt;a href=&quot;https://aws.amazon.com/blogs/aws/we_build_muck_s/&quot;&gt;undifferentiated heavy lifting&lt;/a&gt;, you’ll inevitably integrate with many software vendors. For example, my e-commerce software team at &lt;a href=&quot;https://www.glossier.com&quot;&gt;Glossier&lt;/a&gt; has vendors for our cloud hosting, CDN, CMS, payment processing, CI/CD pipelines, code hosting, internal docs, observability, and alerting to name a few.&lt;/p&gt;
&lt;p&gt;Here are a few criteria I’ve found particularly valuable when choosing vendors.&lt;/p&gt;
&lt;h3&gt;1. Emphasize rate of improvement over current feature set&lt;/h3&gt;
&lt;p&gt;Prefer a vendor that’s sufficient today and improving quickly over a dominant-yet-stagnant vendor. I judge vendors’ rate of improvement by their recent feature announcements and possibly a roadmap presented by an account rep. In other words, consider which vendor will likely have the best product ~2 years from now; not just the product as it exists today. Skate to where the puck is going.&lt;/p&gt;
&lt;p&gt;This criteria is particularly helpful to compare small, disruptive innovators with current market leaders.&lt;/p&gt;
&lt;p&gt;Of course, if the current market leader is also innovating quickly, you’re lucky to have an easy decision.&lt;/p&gt;
&lt;h3&gt;2. Backchannel referrals / Ask an expert&lt;/h3&gt;
&lt;p&gt;In my &lt;a href=&quot;https://staffeng.com/stories/aaron-suggs&quot;&gt;StaffEng interview&lt;/a&gt;, I shared this anecdote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our team was recently choosing a new vendor and the team was split between two mediocre choices. I asked an acquaintance with expertise about the vendors how he would choose; and he recommended a lesser-known new vendor that quickly became a universal team favorite.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To expand on this example, it was an an area that our team had little expertise. It was difficult for us to determine what features really matter; and set realistic expectations. Asking experts in your professional network can bring clarity and confidence.&lt;/p&gt;
&lt;h3&gt;3. Emphasize net value over cost&lt;/h3&gt;
&lt;p&gt;From the &lt;a href=&quot;https://ktheory.com/vendor-relationship-howto/&quot;&gt;Vendor relationship HOWTO&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The goal is to &lt;em&gt;maximize our organization’s long-term value&lt;/em&gt; from the vendor’s service.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In contrast, I’ve sometimes seen teams try to minimize cost, ignoring gross value. This is short-sighted.&lt;/p&gt;
&lt;p&gt;Suppose Vendor A costs $25k/yr and adds $200k of gross value to the org ($175k net value); while Vendor B costs $100k and adds $500k of gross value ($400k net value).&lt;/p&gt;
&lt;p&gt;Choose Vendor B because of the higher net value, even though it’s more expensive than Vendor A.&lt;/p&gt;
&lt;p&gt;To be sure, I don’t know how to assess the gross value derived from any vendor beyond a hand-wavy estimate. Here are some techniques I use; though I’d certainly like to learn more.&lt;/p&gt;
&lt;p&gt;One technique is to look at productivity improvements. If a tool saves each engineer 1 hour per week, it’s a 2.5% productivity improvement; so it’s gross value is roughly 2.5% of your total Engineering payroll.&lt;/p&gt;
&lt;p&gt;Other times vendors add capabilities or controls that change how the team works, so you can’t easily assess productivity. In this case, speculate about how much value your org gets from that capability or control. E.g. an A/B testing tool adds the capability to rigorously measure the impact of product changes. The gross value is the difference between the product features you ship using A/B test feedback versus product features you would have shipped without A/B test feedback. Security tools add controls that constrain types of risk. The gross value is difference from the liability of the unknown/unconstrained risk versus the better-known/constrained risk.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vendor Relationship HOWTO]]></title><description><![CDATA[Creating and sustaining vendor relationships can be a highly leveraged skill for software engineering teams. But there’s little guidance or…]]></description><link>https://ktheory.com/vendor-relationship-howto/</link><guid isPermaLink="false">https://ktheory.com/vendor-relationship-howto/</guid><pubDate>Mon, 25 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Creating and sustaining vendor relationships can be a highly leveraged skill for software engineering teams. But there’s little guidance or structure at small companies for folks learning to build vendor relationships.&lt;/p&gt;
&lt;p&gt;So here’s the template of bare essentials and some nice-to-have responsibilities to steer emerging engineering leaders in vendor management. This is born from experience at tiny startups to growth-stage companies with hundreds of employees. Larger companies have more formal processes for choosing and managing vendors.&lt;/p&gt;
&lt;p&gt;This post won’t go cover how to choose a vendor and the famous “build versus buy” calculus; instead focusing on what to do after you’ve chosen a vendor.&lt;/p&gt;
&lt;p&gt;Without further ado, the template:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The goal is to &lt;em&gt;maximize our organization’s long-term value&lt;/em&gt; from the vendor’s service. That means we use their service appropriately, and spend money efficiently.&lt;/p&gt;
&lt;h3&gt;Minimum essentials&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Each vendor should have a &lt;a href=&quot;https://about.gitlab.com/handbook/people-group/directly-responsible-individuals/&quot;&gt;Directly Responsible Individual&lt;/a&gt; within the org. The DRI is responsible for the items below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Follow our org’s legal review process. Before you accept terms of service or sign anything, familiarize yourself with your company’s signing authority and approval process. In short, give our legal team a heads up; and they can help navigate contract discussions, particularly around liability and data privacy issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Follow our org’s billing process. Give our accounting team a heads up to coordinate who keeps track of invoicing and receipts. Very small companies tend to use corporate charge cards. As they grow, it tends towards invoices and purchase orders with formal approval processes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Know how to contact the account rep, escalate tech support tickets, or otherwise get high-quality, timely technical assistance. Preferably, this contact info is stored in a well-known, discoverable place for all vendors. (We use &lt;a href=&quot;https://www.blissfully.com&quot;&gt;Blissfully&lt;/a&gt;.) This is particulary important for business-critical vendors like payment providers and CDNs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep payment information up-to-date to avoid service disruptions; and make sure invoices are approved/paid on time. Check your emails!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use a vendor-specific email list like &lt;code class=&quot;language-text&quot;&gt;vendor-name@mycompany.com&lt;/code&gt; for all communication with the vendor. As our team grows and we onboard new member, they can easily review and join discussions. As the DRI, you’re responsible for staying on top of this email list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure money is spent effectively. Should we change our terms to reduce our bill (like commit to a larger quota to reduce overage charges)? For large contracts (&gt;$15k/yr), &lt;a href=&quot;https://lethain.com/renegotiate-first-vendor-contract/&quot;&gt;negotiate with the vendor&lt;/a&gt; (the finance team can help with this).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When contracts are expected to change or expire without renewal, inform stakeholders with ample time to implement alternatives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure the process for onboarding and offboarding employees with the vendor is documented clearly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintain a list of the PII and sensitive information that’s shared with the vendor. Your legal team can help ask the right questions here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Nice-to-have strategic considerations&lt;/h3&gt;
&lt;p&gt;Here are some next-level ways to derive significantly more value from your vendor relationship:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintain a clear sense of the value this vendor provides the organization. Tech vendors typically use &lt;a href=&quot;https://hbr.org/2016/08/a-quick-guide-to-value-based-pricing&quot;&gt;value-based pricing&lt;/a&gt; (as opposed to cost-based pricing), so being able to describe the value of various features ensures you and the account rep speak the same language.&lt;/li&gt;
&lt;li&gt;Track how closely our usage aligns the vendor’s typical customer usage. Do we use their service in a common, expected way; or in a custom, unusual way that could be a strategic risk as the vendor evolves? Are we one of their biggest/smallest customers (another strategic risk), or middle-of-the-pack?&lt;/li&gt;
&lt;li&gt;Maintain a general sense of the competitive landscape and alternatives for the vendor. What’s our next best alternative if we had to move off this vendor? Are there competitors who have a superior service or are gaining quickly? When would it be worth the opportunity cost to build it ourselves?&lt;/li&gt;
&lt;li&gt;Track and contribute to the vendor’s private roadmap (beta features). Usually the account rep will offer to discuss this once or twice per year.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Congrats, you’re well on your way to a productive, valuable vendor relationship!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Interview at StaffEng]]></title><description><![CDATA[This interview originally appeared on StaffEng. I wanted to share it here as well. Tell us a little about your current role: where do you…]]></description><link>https://ktheory.com/staff-engineer-interview/</link><guid isPermaLink="false">https://ktheory.com/staff-engineer-interview/</guid><pubDate>Thu, 21 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This interview originally appeared on &lt;a href=&quot;https://staffeng.com/stories/aaron-suggs&quot;&gt;StaffEng&lt;/a&gt;. I wanted to share it here as well.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Tell us a little about your current role: where do you work, your title and generally the sort of work that you and your team do.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I work at &lt;a href=&quot;https://www.glossier.com&quot;&gt;Glossier&lt;/a&gt;, a direct-to-consumer growth-stage skincare and beauty company with incredibly passionate customers. Our engineering team is ~35 people. I’m a Principal Engineer, mostly focusing on our Site Reliability and Tools team. My recent focus has been leading Glossier’s Operational Excellence initiative (nicknamed ✨GLOE✨) and ensuring we’re building scalable services and team practices. I define operational excellence as our ability to deliver low defect rates, high availability, and low latency for product features. In practice for the SRE/Tools team, that means improving observability, increasing our infra-as-code adoption, and shepherding our migration from a monolith to microservices.&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;https://staffeng.com/guides/staff-archetypes&quot;&gt;Staff Eng Archetypes&lt;/a&gt;, I gravitate most towards being a right-hand, and secondly a solver.&lt;/p&gt;
&lt;p&gt;Prior to Glossier, I was a Director of Engineering at Kickstarter. In 2018, I joined Glossier as a Senior Staff Engineer (an IC role), and as the first engineer to focus primarily on internal tools and engineering practices. My first projects were building a feature flag system so we could safely and easily test features with real data; then implementing continuous deployments to accelerate delivery.&lt;/p&gt;
&lt;p&gt;After a few months, I switched back to management to lead a new Platform team and prepare for Black Friday. Glossier has an annual Black Friday sale that generates a huge spike in traffic and revenue, and our ambitious growth targets showed we need to rigorously prepare with capacity testing, system hardening, and cross-functional collaboration (See &lt;a href=&quot;https://www.youtube.com/watch?v=Jy_-l3v9zsY&quot;&gt;Surviving Black Friday: Tales from an e-commerce engineer&lt;/a&gt; for details on Glossier’s Black Friday prep). After some re-orgs, the Platform team wound down, but the current SRE/Tools team does similar work. A year ago I gave up my management responsibilities to more deeply focus on operational excellence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Did you ever consider engineering management, and if so how did you decide to pursue the staff engineer path?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Absolutely! I’ve switched from manager to IC twice in my career; and I’ll likely do so again.&lt;/p&gt;
&lt;p&gt;When I first became a manager in 2015, it was the only career path for a senior engineer at my company. Fortunately, ever-smaller engineering teams soon created and shared career ladders with parallel IC and management tracks. When I helped create Kickstarter’s engineering ladder, I emphasized IC growth paths that didn’t require people management.&lt;/p&gt;
&lt;p&gt;I was deeply influenced by a section of Camille Fournier’s &lt;em&gt;Manager’s Path&lt;/em&gt; that called out “empire building” as a toxic management practice. It reminded me of the argument in Plato’s &lt;em&gt;Republic&lt;/em&gt; that the political leaders shouldn’t be those that selfishly seek power, rather those whose wisdom makes them duty-bound to lead.&lt;/p&gt;
&lt;p&gt;So I don’t orient my career around ever-greater management responsibilities: it’s one tool in the toolbox. I appreciate management as a rich discipline that I’ll spend my career honing; alongside programming and systems engineering.&lt;/p&gt;
&lt;p&gt;Here are some important factors for me when switching between manager and IC roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What skills does the team need most acutely: management to coordinate the actions of a group; or an IC to accelerate the execution?&lt;/li&gt;
&lt;li&gt;Will I have sufficient support and feedback to learn and succeed?&lt;/li&gt;
&lt;li&gt;Am I the only one on the team who could do this; or could others do it well?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Can you remember any piece of advice on reaching Staff that was particularly helpful for you?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“Replace indignation with curiosity.”&lt;/p&gt;
&lt;p&gt;Several years ago, I told my manager about another team behaving in a way that caused problems for my team. When I finished, he gave me that advice. I hadn’t been curious about why the other team was acting that way. It turned out they had constraints that made their behavior quite reasonable. By approaching them with curiosity and a helpful mindset (instead of frustration), we quickly found a process that improved both our workflows.&lt;/p&gt;
&lt;p&gt;More recently, while struggling with burnout, a career coach asked me, “What would let you approach each day with energy and optimism?”&lt;/p&gt;
&lt;p&gt;It’s become my morning mantra, ensuring that I make time for operational excellence and mentorship and bring genuine enthusiasm to my work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;How do you spend your time day-to-day?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My days are roughly 50% scheduled meetings, 35% deep-focus blocks, and 15% unplanned work.&lt;/p&gt;
&lt;p&gt;I work hard to make sure the meetings are effective. That usually means at least having an agenda. The meeting should have a clear purpose known to attendees beforehand, such making a decision, generating ideas, or reviewing information. Meetings often have a negative connotation because they’re facilitated poorly; but they can be incredibly productive. I try to get better at facilitating productive meetings and using synchronous attention well. &lt;em&gt;High Output Management&lt;/em&gt; by Andrew Grove is a great resource to learn about effective meetings.&lt;/p&gt;
&lt;p&gt;A technique I recently learned from my CTO is to schedule reading time at the start of a group meeting. Say you’re in a hiring debrief: everyone spends the first 5 minutes reading each other’s feedback about the candidate. It’s a great way to ensure attendees truly read the document and have it top-of-mind. It ultimately saves time and elevates the subsequent discussion.&lt;/p&gt;
&lt;p&gt;I also interview quite a bit. In 2020, I did (&lt;em&gt;checks calendar&lt;/em&gt;) 126 interviews. Improving the long-term health of the team is a key Staff+ responsibility; and helping us hire great people is part of that.&lt;/p&gt;
&lt;p&gt;The deep-focus blocks are marked off on my calendar. My company observes “No Meeting Thursday” which helps a lot. I use these blocks for work that’s ‘important but not urgent’ from &lt;a href=&quot;https://www.eisenhower.me/eisenhower-matrix/&quot;&gt;Eisenhower’s productivity matrix&lt;/a&gt;. That’s usually writing specs and documentation, or researching and prototyping new tools and patterns.&lt;/p&gt;
&lt;p&gt;My schedule is unusual in that I stop work around 4pm most days, then work later in the evenings, ~8-10pm. This gives me several high-quality hours with my family each day. I have difficulty concentrating in the afternoon, and can more easily concentrate at night. And I enjoy getting something done right before bedtime. So this schedule has improved both my work/life balance and productivity. I changed my schedule because of childcare needs during the coronavirus pandemic; but I think I’ll keep it long-term. I encourage everyone to reflect on what habits and schedules are helpful for their work. An open discussion with your manager and some flexibility can go a long way.&lt;/p&gt;
&lt;p&gt;The unplanned work is mostly answering Slack messages, advising on urgent issues, or sometimes responding to a production incident. I try to approach this work with a helpful attitude, and also with an eye towards cross-training and writing discoverable documentation to minimize future unplanned work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Where do you feel most impactful as a Staff-plus Engineer? A specific story would be grand.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think of my impact in two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Working the plan&lt;/li&gt;
&lt;li&gt;Serendipity&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;‘Working the plan’ is about making daily, incremental progress on a big project with a team. Some examples have been improving our site availability from under 99% to over 99.95%. It took a lot of Learning Reviews (blameless postmortems), training, testing, and refactoring. Another was a 9-month migration from dynamically-generated Rails-based HTML pages to statically-generated React-based ones to improved time-to-first-byte and availability. It took a lot of coaching, buy-in, and coordination. To successfully work the plan, you need clear goals and incremental milestones to keep the team motivated, and continuous alignment with leadership on the desired outcomes and timeline.&lt;/p&gt;
&lt;p&gt;‘Serendipity’ in my work is about sharing an insight with the right people at the right time to make a positive impact. For example, our team was recently choosing a new vendor and the team was split between two mediocre choices. I asked an acquaintance with expertise about the vendors how he would choose; and he recommended a lesser-known new vendor that quickly became a universal team favorite.&lt;/p&gt;
&lt;p&gt;Another serendipitous example was an engineer mentioning during standup that a caching optimization wasn’t having impact they expected. I happened to be familiar with the config options of the particular Ruby web server; and was able to interpret some complicated metrics on a dashboard they showed to determine we had misconfigured a memory threshold. Later that day, we made a one-line config change to optimize our memory usage that reduced latency by 30%.&lt;/p&gt;
&lt;p&gt;Serendipitous impact isn’t planned; and isn’t necessarily hard work. It’s about paying attention (being present), keeping a curious mindset, and sharing the insight in a way that colleagues are open to receiving.&lt;/p&gt;
&lt;div class=&quot;pull&quot;&gt;
&lt;p&gt;&lt;strong&gt;Some of Aaron&amp;#39;s work&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kickstarter.engineering/the-value-of-reliable-developer-tooling-e94791d1482e&quot;&gt;The Value of Reliable Developer Tooling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://increment.com/documentation/what-a-deploy-bot-taught-glossier-about-documentation/&quot;&gt;What a deploy bot taught us about documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Jy_-l3v9zsY&quot;&gt;Surviving Black Friday: Tales from an e-Commerce Engineer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/glossier/the-engineering-manager-workshop-82383f810549&quot;&gt;The Engineering Manager Workshop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;How have you sponsored other engineers? Is sponsoring other engineers an important aspect of your role?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Certainly! As a Principal Engineer, I try to be an enthusiastic and conspicuous &lt;a href=&quot;https://sive.rs/ff&quot;&gt;first follower&lt;/a&gt; when other engineers are doing important new practices. Some examples are when colleagues demoed React snapshot testing and local development with Docker. After each demo, I’d ask how I can try it out and see the benefits for myself. Then I’d look for other teams and in-flight projects where we can apply these practices to get wider adoption.&lt;/p&gt;
&lt;p&gt;I also ‘cheerlead’: recognizing a colleague’s valuable effort in public or a small group, even if the outcomes aren’t tangible yet. It could be complimenting a team that’s was thorough and reflective during a difficult Learning Review; praising an engineer who reproduced a tricky race condition; or thanking someone who documented a poorly understood process.&lt;/p&gt;
&lt;p&gt;I aim to serve two purposes with cheerleading: recognize those doing the valuable behavior, and give positive reinforcement in the hopes that the team does more of that behavior. It’s really &lt;a href=&quot;https://en.wikipedia.org/wiki/Operant_conditioning&quot;&gt;operant conditioning&lt;/a&gt;, but cheerleading sounds much nicer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;What about a piece of advice for someone who has just started as a Staff Engineer?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Other engineers look up to you as a role model, some in ways you may not expect. They’ll emulate your coding style, your tone in code reviews, your behavior in meetings, your rationale for making decisions, and the way you treat colleagues.&lt;/p&gt;
&lt;p&gt;It can feel like a lot of responsibility to be perfect all the time. But it can also bring clarity to your work: do your best, acknowledge shortcomings, be generous and curious.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Exemplary Pull Requests]]></title><description><![CDATA[A well-crafted GitHub pull request can be a powerful way to show others how to extend and maintain a component. These ‘Exemplary’ PRs…]]></description><link>https://ktheory.com/exemplary-pull-request/</link><guid isPermaLink="false">https://ktheory.com/exemplary-pull-request/</guid><pubDate>Mon, 18 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A well-crafted GitHub pull request can be a powerful way to show others how to extend and maintain a component. These ‘Exemplary’ PRs highlight the code and practices you want others to emulate.&lt;/p&gt;
&lt;p&gt;A few years ago, my Platform team was implementing a new GraphQL API. We found engineers needed a lot of support and code reviews to add new mutations in our app. One of our lead engineers used a new mutation as an opportunity to create an exemplary PR.&lt;/p&gt;
&lt;p&gt;The exemplary PR for a GraphQL mutation showed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The new class to create and interface to implement&lt;/li&gt;
&lt;li&gt;How to register the new mutation with the server&lt;/li&gt;
&lt;li&gt;How to handle authentication/authorization&lt;/li&gt;
&lt;li&gt;How to validate the object and handle validation errors&lt;/li&gt;
&lt;li&gt;Instructions for how to test the mutation locally, what automated tests to create, and how to manage test state&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It turned out to be highly leveraged effort! As we pointed engineers to the exemplary PR, they were able to easily create high-quality mutations while also needing less support from the Platform team.&lt;/p&gt;
&lt;p&gt;Recently, I had the opportunity to help create another exemplary PR. Our SRE team wanted to make an easy process for Eng Managers to maintain their team’s PagerDuty on-call schedules using Terraform. We created a simple &lt;code class=&quot;language-text&quot;&gt;pagerduty_team&lt;/code&gt; module that only required a few parameters, like the name of the team and a list of emails of the on-call members. That way managers didn’t need to learn a bunch of Terraform provider details just to maintain their on-call rotations.&lt;/p&gt;
&lt;p&gt;I worked with an EM to craft an exemplary PR, adding her team’s rotation, and being sure to add explanatory comments about how our CI/CD pipeline applies the changes. As other EMs asked how to set up their on-call schedule, we’d just send a link to that PR. It was obvious what values to substitute.&lt;/p&gt;
&lt;p&gt;To be sure, we had more documentation about our Terraform setup; but making the PR the one-stop-shop ensured EMs could get their rotations set up in minutes without much reading or back-and-forth.&lt;/p&gt;
&lt;p&gt;Engineers naturally look for similar code in a repository they can use as a starting point for new features. Creating and labeling exemplary PRs is a helpful way to highlight the code you want them to emulate.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Energy and Optimism]]></title><description><![CDATA[In late 2019, I was burnt out in my Director of Engineering role. I spent several sessions with a career coach outlining my professional…]]></description><link>https://ktheory.com/energy-and-optimism/</link><guid isPermaLink="false">https://ktheory.com/energy-and-optimism/</guid><pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In late 2019, I was burnt out in my Director of Engineering role. I spent several sessions with a career coach outlining my professional challenges. Teams lurched from crisis to crisis. Various teams either lacked a coherent strategy, or lacked the alignment or resources to execute it effectively. Frequent confusion about roles and responsibilities caused tension. I didn’t have the resources to fix it all.&lt;/p&gt;
&lt;p&gt;My coach finally asked:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“What would let you approach each day with energy and optimism?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The question felt like reaching a vista after a long hike. My mood lifted as answers leapt to mind. I love being a small part of a big success. I love coaching and cheerleading colleagues working on something difficult and important. I love pairing—learning and teaching simultaneously—and fist pumping when we track down a bug. I’d be interested and excited to tackle each of my company’s particular socio-technical challenges in a focused, disciplined way. But to make time for that, I needed to significantly change my role.&lt;/p&gt;
&lt;p&gt;I shared the revelation with my manager; and a few short weeks later, I handed off management responsibilities to a colleague. I became a Principal Engineer rather than Director. I’ve spent the past year mostly as an individual contributor, and mostly loving my work.&lt;/p&gt;
&lt;p&gt;My coach’s question has become my mantra as I set my daily intentions. It’s honed my ability to focus on where I can make meaningful progress, and let go of the rest. It helps me orient my schedule around what’s important rather than what’s urgent.&lt;/p&gt;
&lt;p&gt;In 2020, COVID and an immunocompromised family member upheaved my daily routines. My household navigated remote schooling and daycare with two working-from-home parents. Throughout these changes, I’m thankful for many blessings. In particular, I’m thankful for this mantra, which helped me adapt to new roles at work and at home. It’s improved my satisfaction both at work, and with my family.&lt;/p&gt;
&lt;p&gt;As I think of goals and intentions for the new year, I’m asking myself, “what could I work on with genuine energy and optimism”?&lt;/p&gt;</content:encoded></item></channel></rss>