<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Cody Django Redmond]]></title><description><![CDATA[Public expressions from an software engineering manager, sci-fi enthusiast and synth noodler.]]></description><link>https://codydjango.com/</link><image><url>https://codydjango.com/favicon.png</url><title>Cody Django Redmond</title><link>https://codydjango.com/</link></image><generator>Ghost 5.53</generator><lastBuildDate>Tue, 07 Jul 2026 14:16:12 GMT</lastBuildDate><atom:link href="https://codydjango.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[New job, new dog]]></title><description><![CDATA[<p>Happy to announce I&apos;m joining the leadership team at getjobber.com, where I&apos;ll be managing a couple of teams in the fintech area. I&apos;m excited about this opportunity, as it&apos;s a great match to my skills and experience, with a growing and</p>]]></description><link>https://codydjango.com/new-dog-new-job/</link><guid isPermaLink="false">6a4acdf727058428dbad12fb</guid><category><![CDATA[life]]></category><category><![CDATA[family]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Sun, 05 Jul 2026 21:45:07 GMT</pubDate><content:encoded><![CDATA[<p>Happy to announce I&apos;m joining the leadership team at getjobber.com, where I&apos;ll be managing a couple of teams in the fintech area. I&apos;m excited about this opportunity, as it&apos;s a great match to my skills and experience, with a growing and maturing organization. </p><p>We also got a new pup! Shep, a Silken Windhound. I&apos;ve had the last two months off to spend time with him as he settles into his new life with our family. He&apos;s great. Very much a growing puppy, exploring and learning. His baby teeth are so sharp!</p><p>Joni already loves him, but it&apos;s difficult for her to understand when he&apos;s over-tired and bitey, and trying to steal her toys. I found a great dog trainer, and I&apos;m going to a class every satuday morning, learning how to be the best puppy-coach I can be. </p>]]></content:encoded></item><item><title><![CDATA[Shipping a voice-native Brand Discovery product]]></title><description><![CDATA[<p>I&apos;m an engineering leader, but I&apos;m also a builder. This is a short report on a product I&apos;m taking from hypothesis to beta: <strong>BrandSoup.ai</strong>, a voice agent that interviews a founder about their brand and produces a strategist-grade report. I&apos;m sharing</p>]]></description><link>https://codydjango.com/shipping-a-voice-native-brand-discovery-agent-bets-tradeoffs-and-speed/</link><guid isPermaLink="false">6a34719a27058428dbad101a</guid><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Thu, 18 Jun 2026 22:54:59 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;m an engineering leader, but I&apos;m also a builder. This is a short report on a product I&apos;m taking from hypothesis to beta: <strong>BrandSoup.ai</strong>, a voice agent that interviews a founder about their brand and produces a strategist-grade report. I&apos;m sharing it to show how good judgment enables development velocity, even with a tiny team.</p><h2 id="situation">Situation</h2><p>My brother-in-law is a brand strategist in Australia. We were talking about how brand strategy is locked inside expensive consultants and intimidating, lengthy questionnaires. Most founders never do the work. We want to deliver a <em>conversation</em> &#x2014; natural, spoken, adaptive &#x2014; that extracts the same signal a strategist would, and turns it into a usable framework and PDF that can work as an direct input into Go-To-Market motions. &#xA0;</p><h2 id="hypothesis-and-assumptions">Hypothesis and assumptions</h2><ul><li><strong>Hypothesis:</strong> founders will go deeper, faster in a spoken conversation than in a form, and an LLM can reliably infer structured answers from that messy dialogue.</li><li><strong>Assumptions:</strong> beta users are primarily on mobile, on speaker, with no headphones; latency and barge-in matter more than polish; and the underlying brand framework will change frequently as we dial in our target users and better understand their requirements &#x2014; so nothing should be hardcoded.</li></ul><h2 id="goals">Goals</h2><ol><li><strong>Validate the hypothesis quickly:</strong> get real founders talking to it.</li><li><strong>Techical feasibility: </strong>voice and multi-agent coordination are durable capabilities &#x2013; this isn&apos;t a one-off, so do it right.</li><li><strong>Find product-market fit:</strong> instrument enough to learn what converts and what doesn&apos;t.</li></ol><h2 id="initial-user-stories">Initial user stories</h2><ul><li>As a <strong>founder</strong>, I speak with an agent that asks one good question at a time and adapts to what I&apos;ve already said, working through a set of framework criteria.</li><li>As a <strong>founder</strong>, I get a polished brand report by email within 20 minutes of starting the conversation.</li><li>As our <strong>brand expert</strong>, I edit the criteria framework (pillars, aspects, queries) in a spreadsheet &#x2014; with no deploy required.</li><li>As our <strong>PM</strong>, I see per-call cost and coverage so we can tune for unit economics.</li><li>As a <strong>beta partner</strong>, I get something that <em>just works</em> on my Android phone.</li></ul><p> Stakeholders today are deliberately tight: the brand-manager expert, the PM, and a small set of beta partners. I kept the circle small on purpose, because a loud feedback loop with the wrong people would pull us toward scale before we&apos;ve earned the right to it. I also sequenced the bets: prove the conversation works on the cheapest, hardest device first (Android, on speaker); make the framework editable by a non-engineer before tuning the model; and defer payments until there&apos;s something worth paying for. Each decision protects the team&apos;s attention for the one question that matters this quarter &#x2014; does the hypothesis hold?</p><h2 id="technical-challenges">Technical challenges</h2><p>I&apos;ll pick three.</p><h3 id="1-two-agents-one-conversation">1. Two agents, one conversation</h3><p>The hard part of a voice agent is that <em>thinking</em> and <em>talking</em> compete for the same critical path. My answer is a <strong>dual-process blackboard</strong>. A <strong>Conversational Agent (CA)</strong> drives the dialogue. An <strong>Analytical Agent (AA)</strong> runs in the background after each turn &#x2014; inferring answers, updating coverage, and writing a fresh <em>StrategicBrief</em> to a shared blackboard. The CA never waits on the AA; it just reads the latest brief at the top of its next turn.</p><p>The tradeoff I accepted: the AA is intentionally <strong>one turn behind</strong>. That&apos;s a small loss of immediacy for a large win in responsiveness, and it keeps each process independently testable.</p><!--kg-card-begin: html--><pre class="mermaid">
sequenceDiagram
%%{init: {&apos;theme&apos;:&apos;base&apos;, &apos;themeVariables&apos;: {&apos;background&apos;:&apos;transparent&apos;,&apos;primaryColor&apos;:&apos;#ffffff&apos;,&apos;primaryTextColor&apos;:&apos;#1a1a1a&apos;,&apos;primaryBorderColor&apos;:&apos;#333333&apos;,&apos;lineColor&apos;:&apos;#333333&apos;,&apos;fontSize&apos;:&apos;14px&apos;,&apos;edgeLabelBackground&apos;:&apos;#ffffff&apos;}}}%%
    participant U as User (voice)
    participant CA as Conversational Agent
    participant BB as Blackboard
    participant AA as Analytical Agent
    U-&gt;&gt;CA: speaks (turn N)
    CA-&gt;&gt;BB: read StrategicBrief
    CA-&gt;&gt;U: reply (turn N)
    CA--&gt;&gt;AA: fire-and-forget evaluate(turn N)
    AA-&gt;&gt;AA: infer answers + coverage
    AA-&gt;&gt;BB: write coverage + new StrategicBrief
    Note over CA,AA: AA stays one turn behind,<br>off the critical path
</pre><!--kg-card-end: html--><h3 id="2-real-time-audio">2. Real-time audio</h3><p>Full-duplex voice on a phone speaker is a feedback nightmare: the mic hears the agent. We went <strong>half-duplex</strong> while the agent speaks, then restored interruption with a <strong>client-side RMS VAD</strong> in an audio worklet that emits a <code>barge-in</code> signal. Along the way we killed a class of audio clicks (WAV-header artifacts, PCM chunk misalignment) and worked around iOS ignoring the AudioContext sample-rate hint by reporting the real mic rate and resampling on playback. Every threshold lives in config and a tuning log, so the PM and I can tweak endpointing and barge-in timing without a code change.</p><h3 id="3-configurability-as-an-architectural-choice">3. Configurability as an architectural choice</h3><p>The fastest team is the one that doesn&apos;t redeploy to learn something. So I treated <em>configurability as a first-class requirement</em>, not a nicety. The brand framework &#x2014; pillars, questions, the strategist&apos;s prompts &#x2014; lives in <strong>Google Sheets</strong>, cached locally, owned by our brand expert. Voice behavior (Deepgram model and voice, STT endpointing, barge-in and VAD thresholds) is env-driven and tracked in a tuning log. Web config is the same. The payoff is that the PM and the brand expert can run experiments <em>without me in the loop</em> &#x2014; change a question, swap a voice, tighten endpointing, and watch the next call. That&apos;s the difference between a feedback loop measured in minutes and one measured in deploys.</p><h3 id="the-end-to-end-loop">The end-to-end loop</h3><p>Conversations hold open a WebSocket; everything else (auth, conversation state, criteria progress, report download) is plain HTTP. A completed conversation flushes its confirmed answers to the database. Once enough answers meet the threshold for quality completion, the user can choose to wrap up and generate their report. Report generation (Claude authoring, PDF, email) runs async on <strong>Redis + RQ</strong> workers, off the request path.</p><!--kg-card-begin: html--><pre class="mermaid">
%%{init: {&apos;theme&apos;:&apos;base&apos;, &apos;themeVariables&apos;: {&apos;background&apos;:&apos;transparent&apos;,&apos;primaryColor&apos;:&apos;#ffffff&apos;,&apos;primaryTextColor&apos;:&apos;#1a1a1a&apos;,&apos;primaryBorderColor&apos;:&apos;#333333&apos;,&apos;lineColor&apos;:&apos;#333333&apos;,&apos;fontSize&apos;:&apos;14px&apos;,&apos;edgeLabelBackground&apos;:&apos;#ffffff&apos;}}}%%
sequenceDiagram
    participant B as Browser
    participant API as FastAPI
    participant Q as Redis + RQ
    participant W as Worker
    B-&gt;&gt;API: journey complete
    API-&gt;&gt;Q: enqueue report job
    API--&gt;&gt;B: 202 accepted
    W-&gt;&gt;W: Claude &#x2192; PDF &#x2192; email
    W--&gt;&gt;B: delivered (SparkPost)
</pre><!--kg-card-end: html--><p>Sentry watches all three tiers &#x2014; browser, API, and worker.</p><!--kg-card-begin: html--><pre class="mermaid">
%%{init: {&apos;theme&apos;:&apos;base&apos;, &apos;themeVariables&apos;: {&apos;background&apos;:&apos;transparent&apos;,&apos;primaryColor&apos;:&apos;#ffffff&apos;,&apos;primaryTextColor&apos;:&apos;#1a1a1a&apos;,&apos;primaryBorderColor&apos;:&apos;#333333&apos;,&apos;lineColor&apos;:&apos;#333333&apos;,&apos;fontSize&apos;:&apos;14px&apos;,&apos;edgeLabelBackground&apos;:&apos;#ffffff&apos;}}}%%

flowchart LR
    Web[React + Vite SPA]
    Web <-->|HTTP / WebSocket| API[FastAPI]
    API --&gt; DB[(&quot;SQLite:<br>auth, journey, reports&quot;)]
    API --&gt;|enqueue| Q[(Redis + RQ)]
    Q --&gt; W[RQ Worker]
    W --&gt; LLM[Claude]
    W --&gt; PDF[PDF service]
    W --&gt; Mail[SparkPost]
    API <-->|STT / TTS| DG[Deepgram]
    API <-->|streaming| LLM
    Sheets[(&quot;Google Sheets:<br>framework data&quot;)] --&gt; API
    Web -.-&gt; Sentry[(Sentry)]
    API -.-&gt; Sentry
    W -.-&gt; Sentry
</--></--></--></pre>
<!--kg-card-end: html--><p>Try it: <strong><a href="https://brandsoup.ai/?ref=codydjango.com">brandsoup.ai</a></strong></p>]]></content:encoded></item><item><title><![CDATA[On values, revisited]]></title><description><![CDATA[<p>I was asked recently: <em>What are your core values as a software developer and manager?</em></p><p>I&apos;ve written about values before. But it&apos;s been a few years, with challenges and learnings along the way. Was I going to answer the same way? Had anything actually changed?</p><hr><p><strong>Kindness</strong></p>]]></description><link>https://codydjango.com/on-values-revisited/</link><guid isPermaLink="false">6a34383b27058428dbad0f0e</guid><category><![CDATA[engineering management]]></category><category><![CDATA[values]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Wed, 13 May 2026 22:29:00 GMT</pubDate><content:encoded><![CDATA[<p>I was asked recently: <em>What are your core values as a software developer and manager?</em></p><p>I&apos;ve written about values before. But it&apos;s been a few years, with challenges and learnings along the way. Was I going to answer the same way? Had anything actually changed?</p><hr><p><strong>Kindness and Curiosity</strong></p><p>Software is a team sport. The code is rarely the challenging part. Communication, collaboration, coordination: human interactions are at the core of where we work, and how we move systems forward. </p><p>Something I&apos;ve learned is that effective communication relies on openness, and these open lines of communication must be established and nurtured with my reports, peers, and stakeholders. Kindness and curiosity, applied regularly, is what keeps that openness alive past the first few months. </p><p>Healthy, open communication is the stage for feedback, vulnerability, and how we show up when things are broken or unclear. It&apos;s much easier to have a hard conversation when the space for the conversation is already established. When the lines of communication close, a team can quietly fall apart.</p><hr><p><strong>Stewardship</strong></p><p>This one&apos;s about ownership, but with a wide, strategic lens.</p><p>An engineering managers, we&apos;re not just responsible for a slice of the codebase or our direct reports at a given point in time. We work in complex, dynamic systems. We&apos;re navigating terrain &#x2014; technical and organizational &#x2014; and our job is to increase the team&apos;s leverage, reduce the risk, and find the optimal positions to win. </p><p>This is situational awareness, and it applies equally to growth of people and systems. It&apos;s acknowledging that we&apos;re responsible over how systems change over time, and so does the criteria for a good decision. This applies to evolving complex software systems, growing engineers, and building high-trust, effective teams.</p><p>Stewardship means we&apos;re asking: <em>what does this look like in a year? Does this action move us closer to a goal?</em></p><hr><p><strong>Clarity</strong></p><p>I almost called this one <em>Intentionality</em>, because that&apos;s really what it&apos;s about. Clarity is the outcome; intentionality is the practice.</p><p>Anyone who&apos;s been through a scaling period knows what unmanaged complexity feels like. It creeps in as extra meetings, blurry ownership, metrics that measure the wrong things, systems that no one fully understands anymore. Left alone, it becomes a ceiling.</p><p>Clarity is the discipline of pushing back against that. It&apos;s choosing language, abstractions, caveats, and targets. It&apos;s making the tradeoff explicit instead of letting it make itself. It&apos;s being deliberate about what signals you&apos;re listening for and what success actually looks like.</p><hr><p>Those are still my three. <strong>Kindness and Curiosity</strong>, <strong>Stewardship</strong>, <strong>Clarity</strong>. I don&apos;t think this is a departure from what I&apos;ve written about in the past, just an updated articulation with more emphasis on direction. </p>]]></content:encoded></item><item><title><![CDATA[Velocity depends on reliability]]></title><description><![CDATA[<p>When platform teams talk about reliability, we often talk about it in terms of uptime, SLOs, and incident counts. But how does the concept of reliability fit in with the larger organization? </p><p>Reliability is what enables a focus on delivery as the organization continues to grow &#x2014; it&apos;s</p>]]></description><link>https://codydjango.com/velocity-depends-on-reliability/</link><guid isPermaLink="false">69f2535f27058428dbad0262</guid><category><![CDATA[platform engineering]]></category><category><![CDATA[reliability engineering]]></category><category><![CDATA[engineering management]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Wed, 29 Apr 2026 20:38:09 GMT</pubDate><content:encoded><![CDATA[<p>When platform teams talk about reliability, we often talk about it in terms of uptime, SLOs, and incident counts. But how does the concept of reliability fit in with the larger organization? </p><p>Reliability is what enables a focus on delivery as the organization continues to grow &#x2014; it&apos;s a core responsibility of a platform team. So what does reliability unlock for the engineers building on top of platform? The answer, I think, falls into four buckets.</p><h3 id="safety-%E2%80%93-engineers-ship-without-fear">Safety &#x2013; engineers ship without fear.</h3><p>When the underlying platform is trustworthy, product engineers move faster. They aren&apos;t constantly second-guessing whether a deploy will cause a cascade failure, or whether a schema migration will lock a table for ten minutes. Fear is a tax on velocity. Reducing it is a real contribution, which can be measured through a correlation of sentiment surveys and per-team delivery metrics.</p><p><em>Examples from my own work: canary deployments; ingestion backpressure systems; migration helpers that make zero-downtime schema changes safe and easy; standardized background job patterns so teams aren&apos;t rolling their own fragile in-process hacks; predictable release rollouts.</em></p><h3 id="signal-%E2%80%93-platform-owns-system-health-before-it-becomes-a-product-problem">Signal &#x2013; platform owns system health before it becomes a product problem.</h3><p>If product engineers are the ones noticing that something is wrong, the observability layer is too shallow. If the product engineers are learning about availability or performance issues from users, their priorities may now be shifting mid-sprint, creating project delays. </p><p>The goal is for platform to be paged before product. For platform to resolve any issues before end users are affected. That means alerts on infra resources, SLOs on core services, health checks on shared APIs, and proactive scaling, redundancy, and hardening.</p><p>When platform is on top of it, product teams stay in flow. That&apos;s a velocity improvement, even if it never shows up in a sprint retrospective. These improvements can be measured by &quot;number of incidents&quot;, &quot;risks retired&quot; or &quot;dev hours saved&quot;.</p><p><em>Examples from my own work: infra observability and alerting; service level objectives that match to customer expectations; consistent structured logging to enable easy analysis; useful metrics and dashboards that surface the right signal without noise</em></p><h3 id="speed-to-resolution-%E2%80%93-when-things-break-anyone-can-navigate-it">Speed to resolution &#x2013; when things break, anyone can navigate it</h3><p>Incidents will happen. The question is how much drag they create. Structured playbooks and incident response checklists enable the conditions where any engineer can jump in and flowchart their way to resolution, rather than waiting for the one person who knows the system. </p><p>Once the immediate incident has been mitigated, this is Platforms time to shine. Incidents can come from anywhere, but Platform is at a particular point of leverage to identify and retire common root factors. Good metrics to watch for include &quot;mean time to acknowledge&quot;, &quot;mean time to resolve&quot;, &#xA0;as well as general uptime or availability metrics.</p><p><em>Examples from my work: incident response checklists; incident response escalation flowchart; rollback playbooks; integrated Slack workflows</em></p><h3 id="streamline-%E2%80%93-increase-predictability-in-the-delivery-process-itself">Streamline &#x2013; increase predictability in the delivery process itself</h3><p>The first three buckets are about <em>operating</em> software reliably. This one is about <em>shipping</em> it reliably. CI pipelines that are dependable and fast, self-serve preview environments and infra provisioning to unblock development, and automation of toil common to product teams all reduce the friction engineers feel when getting code to production. My favorites metrics here are build times, deploy frequency, onboarding time, and toil reduction in hours per month. </p><p><em>Examples from my work: parallelization of CI workers; parallelization of unit tests; fixing flakey CI tests; introduction of preview environments and infra self-serve capabilities.</em></p><h3 id="summary">Summary</h3><p>The through-line across all four: <u>platform reliability is a product engineering multiplier.</u> &quot;Keeping the lights on&quot; is the bare minimum &#x2013; the mandate is to remove the drag that slows down every team that builds on top of you.</p><p>If you&apos;re a platform or infrastructure EM trying to articulate the value of your work to product stakeholders, this framing might help. It&apos;s not about uptime percentages &#x2014; it&apos;s about what your reliability work makes possible for everyone else.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[AI documentation dividend]]></title><description><![CDATA[<p>A friend recently asked me what qualities make a great engineering manager, and one of the things I mentioned was risk management &#x2013; specifically, the value of investing in design artifacts like system diagrams, reference architectures, and clear interface boundaries before diving into execution. In my experience, the hard part</p>]]></description><link>https://codydjango.com/ai-documentation-dividend/</link><guid isPermaLink="false">699dc5d627058428dbad0246</guid><category><![CDATA[architecture]]></category><category><![CDATA[agentic]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Tue, 24 Feb 2026 15:39:58 GMT</pubDate><content:encoded><![CDATA[<p>A friend recently asked me what qualities make a great engineering manager, and one of the things I mentioned was risk management &#x2013; specifically, the value of investing in design artifacts like system diagrams, reference architectures, and clear interface boundaries before diving into execution. In my experience, the hard part was never knowing these things were valuable. The hard part was convincing anyone to pay for them.</p><p>That dynamic is shifting in an interesting way. As organizations start investing in agentic AI workflows for software development, there&apos;s a new top-down pressure to produce exactly the kind of context-rich documentation that engineering managers have been quietly advocating for years. Agentic systems need well-defined boundaries, clear interface contracts, and accurate architectural references to make good decisions autonomously. Leadership is now asking for these artifacts because AI needs them &#x2014; and that&apos;s creating buy-in that was historically very difficult to generate.</p><p>The irony isn&apos;t lost on me. Human engineers have always needed this context too. The difference is that &quot;invest in documentation&quot; never made it past a quarterly planning meeting, while &quot;enable our AI agents to work effectively&quot; apparently does. I&apos;m not complaining... I&apos;ll take the win! But it&apos;s worth naming: if your organization is finally building out these maintainability artifacts for AI, make sure your engineers benefit from them just as much.</p>]]></content:encoded></item><item><title><![CDATA[Annual life update]]></title><description><![CDATA[<p>Joni is now three years old, and doing great. The last few years have blown past. It&apos;s been such a blessing to see her go from infant to toddler to little kid to &quot;big little kid&quot;. &#xA0;I&apos;m happy and healthy. My job is</p>]]></description><link>https://codydjango.com/happy-2026/</link><guid isPermaLink="false">69570ea327058428dbad0204</guid><category><![CDATA[life]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Fri, 02 Jan 2026 00:29:43 GMT</pubDate><content:encoded><![CDATA[<p>Joni is now three years old, and doing great. The last few years have blown past. It&apos;s been such a blessing to see her go from infant to toddler to little kid to &quot;big little kid&quot;. &#xA0;I&apos;m happy and healthy. My job is engaging, rewarding, and challenging. Leading a platform team is satisfying, and I&apos;m blessed to be working with some truly exceptional individuals. </p><p>Audrey is wrapping up her first year as an human resources generalist, and she likes it. We love where we&apos;re living, and our house is still slowly undergoing renovations. My mom and one of my sisters moved nearby, which is nice. My other sister in Australia now has a second baby, and we&apos;ve been in contact more frequently.<br><br>I&apos;ve been meditating more frequently over the last year, and plan to keep it up. It sure seems appropriate, considering the precarious world situation we&apos;re all living through. I also hope to spend a little more time this year with robotics, and with physical activity. And less time with renovations :) </p>]]></content:encoded></item><item><title><![CDATA[What does it mean to "operationalize" an  engineering team?]]></title><description><![CDATA[<p><br>In startup mode, it&apos;s the <strong>WHY</strong> and the <strong>WHAT</strong> that see the most consideration. The customer problem, the purpose, the service, the deliverable, etc. The <strong>HOW</strong> is often overlooked, so long as it&apos;s &quot;good enough&quot; and delivered as quickly as possible. A common strategy</p>]]></description><link>https://codydjango.com/what-does-it-mean-to-operationalize-an-engineering-team/</link><guid isPermaLink="false">6812c3a427058428dbad00a9</guid><category><![CDATA[software development]]></category><category><![CDATA[scaling]]></category><category><![CDATA[teams]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Thu, 01 May 2025 15:45:12 GMT</pubDate><content:encoded><![CDATA[<p><br>In startup mode, it&apos;s the <strong>WHY</strong> and the <strong>WHAT</strong> that see the most consideration. The customer problem, the purpose, the service, the deliverable, etc. The <strong>HOW</strong> is often overlooked, so long as it&apos;s &quot;good enough&quot; and delivered as quickly as possible. A common strategy during this phase is &quot;we&apos;ll figure it out as we go&quot; &#x2013; an ad-hoc approach.</p><p>As product-market fit is found, companies often choose to focus on growth, expanding their customer base and acquiring as many as possible within their market. This is the &quot;scale-up&quot; mode, and this is where <strong>HOW</strong> becomes significantly important: how to consistently deliver quality service as customers and usage volume grows exponentially.</p><p>It&apos;s the intentional tackling of the <strong>HOW</strong> problem that is the focus of &quot;Operations&quot;. This is the work of going from ad-hoc processes and reactive firefighting to a structured, process-driven operation that handles scale efficiently. Here&apos;s what operationalizing a reliability engineering team typically involves:</p><ul><li><strong>Playbooks</strong> - Creating standard operating procedures for common incidents, outages, and maintenance tasks</li><li><strong>Controls, Automations and self-service</strong> - Building tools that enable better control of the systems, or to automate repetitive tasks and allow other teams to help themselves</li><li><strong>Observability and monitoring</strong> - Implementation of metrics, logging, and alerting systems that provide visibility into system health and simplify troubleshooting</li><li><strong>Service Level Objectives (SLOs)</strong> - Identifying the critical user journeys, establishing clear reliability targets and tracking performance against them</li><li><strong>Refactoring legacy systems</strong> - Systematically identifying, updating or replacing early &quot;quick and dirty&quot; solutions with more scalable architectures that can handle increased load and complexity</li><li><strong>Incident management framework</strong> - Structured approach to handling incidents with clear roles, communication channels, and post-mortems</li><li><strong>Capacity planning</strong> - Regular forecasting of resource needs based on growth projections</li><li><strong>Knowledge management</strong> - Documentation systems that capture institutional knowledge and reduce dependency on specific team members</li><li><strong>Cross-training and hiring</strong> - Ensuring the team has redundancy in skills and is staffed appropriately for scale</li><li><strong>On-call rotation</strong> - Establishing a fair, sustainable schedule for engineers to handle off-hours incidents with clear escalation paths and support systems to prevent burnout</li></ul><p>The term &quot;operations&quot; has roots in both military and business process management, where it means to convert strategic goals into day-to-day operational processes. In software development, the language really gained traction with the rise of cloud operations in the 2010s, influenced by Google&apos;s approach to running large-scale SRE teams. It boils down to putting something into operation in a systematic, repeatable way.</p><p>Operationalizing is building systems, processes, and team structures that can handle a 10x scale without requiring a 10x headcount. While vertical scaling helps with raw capacity, it doesn&apos;t address processes that won&apos;t scale, or the exponential spikes or system patterns that can lead to cascading failures and erratic behavior.</p><p>In addition to efficiencies, a focus on operations is also highly rewarding for both engineers and end-users. In both cases we&apos;re investing in predictability, meaning a better and more consistent experience with fewer surprises. For engineers in particular, this can drastically improve work-life balance and increase flow time, reducing burnout.</p><p>Of course, it&apos;s not as easy as it seems. Especially when it comes to reworking legacy tech while scaling, or identifying and tuning SLOs. These are areas often underestimated, where experienced senior and staff engineers can make a huge difference. </p><p>For my next post, I&apos;ll tackle the &quot;HOW&quot; of operations &#x2013; very meta! By that, I mean the heuristics I use to identify priorities and sequencing. I&apos;ve found mapping activities to be super-useful in surfacing certain insights, such as value-stream mapping, and cognitive load/complexity mapping, and I think it&apos;s worthwhile of a post. I might also dip into how qualitative/anecdotal data is another useful driver, like the good work being done by the folks over at getdx.com. <br></p>]]></content:encoded></item><item><title><![CDATA[What makes a good manager?]]></title><description><![CDATA[<p>I was recently asked this question by a friend considering a move into engineering management. It&apos;s been a few years since I&apos;ve asked myself this question, and I find it interesting how my perspective on this has changed over the years.</p><p>Before I begin, I&apos;</p>]]></description><link>https://codydjango.com/what-makes-a-good-manager/</link><guid isPermaLink="false">664b6cb127058428dbacfbbe</guid><category><![CDATA[management]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Mon, 20 May 2024 19:31:45 GMT</pubDate><content:encoded><![CDATA[<p>I was recently asked this question by a friend considering a move into engineering management. It&apos;s been a few years since I&apos;ve asked myself this question, and I find it interesting how my perspective on this has changed over the years.</p><p>Before I begin, I&apos;d like to note that I won&apos;t address the manager&apos;s responsibilities, which are frequently framed as delivering value to the organization, often by achieving operational objectives while retaining and growing reports. Instead, I&apos;ll focus on the qualities that make for a great manager within the context of a team.</p><h3 id="consistent-practices-and-behaviours">Consistent Practices and Behaviours</h3><p>A manager creates a stable and productive environment by establishing a repeatable set of practices and behaviours. When team members know what to expect, they can focus their energy on solving problems rather than worrying about unpredictability. Practices can (and should) evolve, but there ought to be a core stability that reinforces a psychologically safe environment for work to get done.</p><p>For example, I have a weekly team meeting with an agenda that acts as a checklist of our most important responsibilities and allows the team to discuss significant issues that may have come up. I also have 1:1 meetings every two weeks and a monthly retrospective to uncover better ways of working.</p><p>I also have a standard method for feedback (both praise and constructive) that I incorporate into my onboarding of any new direct report.</p><ul><li><a href="https://www.linkedin.com/in/mark-horstman-373a3/?ref=codydjango.com">Mark Horstman</a> covers this topic in his book <a href="https://www.manager-tools.com/products/effective-manager-book-second-edition?ref=codydjango.com">The Effective Manager</a> and the <a href="https://www.manager-tools.com/?ref=codydjango.com">Manager Tools Podcast</a>. </li><li><a href="https://lethain.com/?ref=codydjango.com">Will Larsen</a> has a blog post that covers how to systematize just enough for teams to be effective: <a href="https://lethain.com/work-policy-not-exceptions/?ref=codydjango.com">https://lethain.com/work-policy-not-exceptions/</a></li><li><a href="https://www.linkedin.com/in/claire-hughes-johnson-7058/?ref=codydjango.com">Claire Hughes Johnson</a> also recently published a <a href="https://press.stripe.com/scaling-people?ref=codydjango.com">book on this topic</a>, which describes the repeatable set of practices as the manager&apos;s &quot;operating system.&quot;</li></ul><h3 id="regulated-and-open">Regulated and Open</h3><p>Software Development can evoke contrasting opinions, perspectives, and dynamics. Managers who successfully manage their own temperaments are far more effective when collaborating with others during times of increased tension. </p><p>Managers must effectively work with people not just on their team but throughout the organization. No matter the context, an effective manager leads from a place of responsibility, curiosity, and openness. The <a href="https://conscious.is/?ref=codydjango.com">Conscious Leadership Group</a> refers to this place as &quot;above the line.&quot; &#xA0; Conversely, being &quot;below the line&quot; means being closed off, defensive, and reactive.</p><ul><li>The book <a href="https://www.amazon.com/15-Commitments-Conscious-Leadership-Sustainable/dp/0990976904/?ref=codydjango.com">The Fifteen Commitments of Conscious Leadership</a> describes the qualities of conscious leadership in useful detail and provides methods for moving from &quot;below the line&quot; to &quot;above the line.&quot; </li></ul><h3 id="reliable-and-effective">Reliable and Effective</h3><p>A manager is responsible for the standard of quality across their teams. This means modelling professionalism and follow-through. It doesn&apos;t mean that you need to be stuffy or uptight; it just means that you know which qualities are most important to build trust and an effective team and work to push that standard higher. Sometimes, I refer to this as &quot;setting the tone.&quot; </p><p>For example, if I say I will do something, I do it and report back to the team. I use proper spelling, grammar, and full sentences, and I expect that folks come to meetings prepared. I use agendas for meetings, keep them on topic, and end them early instead of running down the clock. </p><ul><li>In his book <a href="https://www.amazon.ca/Art-Leadership-Small-Things-Done/dp/1492045691?ref=codydjango.com">The Art of Leadership: Small Things, Done Well</a>, Michael Lopp highlights that managers must set the highest standard for follow-through, which is crucial in building a high-trust team.</li><li>The central lesson of the book <a href="https://www.amazon.ca/Score-Takes-Care-Itself-Philosophy/dp/1591843472?ref=codydjango.com">The Score Takes Care of Itself</a> is that leaders who set, model, and maintain a high standard will create an environment where success is a natural outcome. </li><li>Another fun read that covers this ground is <a href="https://www.amazon.ca/Turn-Ship-Around-Turning-Followers/dp/1591846404?ref=codydjango.com">Turn the Ship Around!</a> by David Marquet. I liked this one, too. It goes a little deeper into how shifting language can be a powerful tool in shifting behaviours. </li></ul><h3 id="ambitious">Ambitious</h3><p>A line manager often links the CEO or VP and the staff, ensuring effective alignment of organizational goals. With clear understanding and articulation, aligning the organizational vision with the personal drivers of your direct reports is possible, which can result in a powerful source of motivation. </p><p>In addition to responding to top-down objectives, a great manager will also work from the bottom up, looking for opportunities or innovations that could generate new revenue streams or unlock untapped organizational value.</p><p>Lastly, a great manager understands that engineers love hard problems and that setting high targets is a precursor to achieving exceptional outcomes. But just as important is understanding that making unachievable commitments on someone else&apos;s behalf is a source of demotivation. In this regard, it&apos;s important to maintain awareness of the technical environment in which your team is operating and to collaborate with your team to identify ambitious targets that are also achievable. &#xA0; </p><ul><li>The book <a href="https://www.amazon.ca/Drive-Surprising-Truth-About-Motivates/dp/1594484805?ref=codydjango.com">Drive: The Surprising Truth About What Motivates Us</a> does a great job of unpacking how different people are motivated by different factors. It&apos;s worthwhile to check in regularly with your direct reports on the most important factors and then find ways to align those drivers with operational objectives or growth goals. &#xA0;</li></ul><h3 id="risk-adverse">Risk-Adverse</h3><p>Lastly, I don&apos;t often see this aspect come up in discussions as frequently&#x2014;perhaps because it&apos;s often relegated to project management, a separate area. But from my own experience, I&apos;ve noticed that a process that identifies and manages risk early enables far greater delivery and fewer surprises.</p><p>I like starting with a risk mitigation activity with my team that uncovers the assumptions, dependencies, and bets. Then, to raise our confidence, we validate assumptions and spike in the areas where we are least confident. We then move to system design diagramming and technical designs for significant areas. </p><p>If you can do this quickly and repeatably, you will often avoid working on the wrong thing for too long or seeing a project go drastically off-track. A direct report might occasionally feel unfamiliar with the &quot;design up front&quot; approach. They come around when they see that the entire thing can be accomplished within hours, that it generally yields better results, and that it&apos;s fun, too.</p><ul><li>In the book &quot;<a href="https://rightingsoftware.org/?ref=codydjango.com">Righting Software</a>,&quot; Juval L&#xF6;wy emphasizes the importance of addressing areas of volatility in a codebase and the critical role of <em>project design</em> in software architecture. In particular, he states that complex software benefits from considered design, scoping, and sequencing. The <em>design </em>involves defining the architecture, components and interactions; the <em>scoping </em>ensures the functional and nonfunctional requirements are met and communicated, and the <em>sequencing </em>ensures that the development workflow is optimal for the team, which I often interpret as &quot;allowing for the maximum number of iterations on running code&quot;.</li><li>The Pragmatic Engineer has <a href="https://blog.pragmaticengineer.com/efficient-software-project-management-at-its-roots/?ref=codydjango.com">lots</a> of <a href="https://blog.pragmaticengineer.com/what-agile-really-means/?ref=codydjango.com">content</a> about how engineering managers should be familiar with <a href="https://blog.pragmaticengineer.com/how-to-lead-a-project-in-software-development/?ref=codydjango.com">project management and risk management</a>. </li></ul>]]></content:encoded></item><item><title><![CDATA[Missing from my bookshelf: the 15 Commitments of Conscious Leadership]]></title><description><![CDATA[<p>This book was recently recommended to me from Bryan Dunn, the VP of Product at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>. It arrived at my door on Saturday, and I started reading it immediately. My general approach to a new book is to first read the intro and conclusion &#x2013; this generally gives me a</p>]]></description><link>https://codydjango.com/missing-from-my-bookshelf-the-15-commitments-of-conscious-leadership/</link><guid isPermaLink="false">65e9f78527058428dbacfb5b</guid><category><![CDATA[leadership]]></category><category><![CDATA[books]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Thu, 07 Mar 2024 18:33:59 GMT</pubDate><content:encoded><![CDATA[<p>This book was recently recommended to me from Bryan Dunn, the VP of Product at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>. It arrived at my door on Saturday, and I started reading it immediately. My general approach to a new book is to first read the intro and conclusion &#x2013; this generally gives me a good idea of how well the book reads, and how much of an investment I want to make. I was immediately hooked. The tone and language is friendly and interesting; a little hippy-dippy but not unfocused.</p><p>At this point, I&apos;m convinced this is a book that I&apos;ve been missing. Of course every leader likes to think that they&apos;re &quot;conscious&quot; and with a high degree of self-awareness, but this is one of those things that can be perfectly described as a blind-spot. Emotions are tricky to navigate, and I&apos;m eager for more management tricks and tools. I&apos;m excited to dedicate my morning time over the next couple of weeks in the hopes of learning new such tricks and tools from this book. I&apos;ll come back to this post with updates as I go. </p>]]></content:encoded></item><item><title><![CDATA[Scaling People: Tactics for Management and Company Building]]></title><description><![CDATA[<p>In addition to my <a href="https://codydjango.com/new-role-in-new-industry/">new role</a> at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>, I&apos;ve also started reading a <a href="https://press.stripe.com/scaling-people?ref=codydjango.com">recently published book</a> on scaling people management. It was written by Claire Hughes Johnson - former COO of Google and Stripe. I&apos;m excited because it purports to be a pragmatic take on management,</p>]]></description><link>https://codydjango.com/scaling-people-tactics-for-management-and-company-building/</link><guid isPermaLink="false">6507532727058428dbacfacb</guid><category><![CDATA[books]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Sun, 17 Sep 2023 20:21:35 GMT</pubDate><content:encoded><![CDATA[<p>In addition to my <a href="https://codydjango.com/new-role-in-new-industry/">new role</a> at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>, I&apos;ve also started reading a <a href="https://press.stripe.com/scaling-people?ref=codydjango.com">recently published book</a> on scaling people management. It was written by Claire Hughes Johnson - former COO of Google and Stripe. I&apos;m excited because it purports to be a pragmatic take on management, complete with templates and workbook material.</p><p><strong>Update</strong>: I&apos;ve read this book, and it would have been a lot more eye-opening to me when I started my leadership journey. Although I appreciated the articulation and writing style, I had already come to many of the insights on my own. I will recommend this book to new managers or folks leaning in that direction.</p><p><strong>Notes from the introduction</strong>:</p><ul><li>You need process, and you need it sooner than you realize</li><li>A company will not get far without &quot;core processes&quot;: strong management and sound operating systems.</li><li>Companies and teams must establish a playing field where everyone participates and marks progress.</li></ul><blockquote>You know why playing a game is fun? Because it has rules, and you have a way to win. Picture a bunch of people showing up at an athletic field with random equipmnt and no rules. Someone is going to get hurt. You don&apos;t know how to play, you don&apos;t know how to score, and you don&apos;t know how to win.</blockquote><ul><li>Research has found that people who outperform in their fields employ strategies that move them past the autonomous stage of learning, like athletes who use speed workouts to improve their performance.</li><li>A combination of core frameworks, such as hiring and planning practices and underlying leadership principles, can help scale an organization. </li></ul><p>Workbooks: <a href="http://press.stripe.com/scaling-people/workbooks?ref=codydjango.com">http://press.stripe.com/scaling-people/workbooks</a></p><p>Consider reading: <a href="https://www.amazon.ca/Working-Backwards-Insights-Stories-Secrets?ref=codydjango.com">https://www.amazon.ca/Working-Backwards-Insights-Stories-Secrets</a></p><p>Two more books on Stripe Press that I can thoroughly recommend:</p><ul><li><a href="https://press.stripe.com/high-growth-handbook?ref=codydjango.com"><em>High Growth Handbook </em>by Elad Gil</a></li><li><a href="https://press.stripe.com/an-elegant-puzzle?ref=codydjango.com"><em>An Elegant Puzzle </em>by Will Larson</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Democratizing Software Development in the Low-Code Industry.]]></title><description><![CDATA[<p>I&apos;m happy to announce that I&apos;m starting a new leadership position as a Platform Software Engineering Manager at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>. I&apos;m working with a fantastic team to simplify and accelerate software development using AI and low-code/no-code approaches. &#xA0; </p><p>Crowdbotics was founded in 2017 by</p>]]></description><link>https://codydjango.com/new-role-in-new-industry/</link><guid isPermaLink="false">65074a6527058428dbacfa2c</guid><category><![CDATA[career]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Sun, 17 Sep 2023 19:12:59 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;m happy to announce that I&apos;m starting a new leadership position as a Platform Software Engineering Manager at <a href="https://crowdbotics.com/?ref=codydjango.com">Crowdbotics</a>. I&apos;m working with a fantastic team to simplify and accelerate software development using AI and low-code/no-code approaches. &#xA0; </p><p>Crowdbotics was founded in 2017 by Y-combinator alum and Forbes Magazine &quot;30 under 30&quot; Anand Kulkarni. Since then, Crowdbotics has paved the way for low-code software development, enabling anyone to generate production-grade applications in minutes using AI-assisted product requirement analysis, visual building tools and code generation. </p><p>Over 20,000 apps have been launched through Crowdbotics, including mission-critical healthcare applications, venture-backed software products earning millions in revenue, learning management platforms, and government tools. </p><p>I&apos;ll work closely with Product Management to develop and scale the architecture and engineering teams necessary to enable a growth vector in an exciting new domain. </p><p>Although Crowdbotics has a small headquarters in Berkeley, CA, it&apos;s a globally distributed remote-first company with members across all time zones. My team is primarily situated in PDT, although there are a few in EST, as well as members in Nairobi, Dubai and Nepal!</p>]]></content:encoded></item><item><title><![CDATA[Observability at Scale]]></title><description><![CDATA[<p><em><em>This is Part </em>IV<em> in Observability Engineering: Achieving Production Excellence</em></em></p><h3 id="build-versus-buy-and-return-on-investment"><br>Build Versus Buy and Return on Investment</h3><p>This chapter provides solid advice for those who are unfamiliar with the &quot;<a href="https://en.wikipedia.org/wiki/Not_invented_here?ref=codydjango.com">not invented here</a>&quot; syndrome. </p><p>When considering building with open source tools, weigh the full impact of hidden costs like</p>]]></description><link>https://codydjango.com/observability-at-scale/</link><guid isPermaLink="false">64ee39ed27058428dbacf952</guid><category><![CDATA[software testing]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Fri, 01 Sep 2023 20:16:53 GMT</pubDate><content:encoded><![CDATA[<p><em><em>This is Part </em>IV<em> in Observability Engineering: Achieving Production Excellence</em></em></p><h3 id="build-versus-buy-and-return-on-investment"><br>Build Versus Buy and Return on Investment</h3><p>This chapter provides solid advice for those who are unfamiliar with the &quot;<a href="https://en.wikipedia.org/wiki/Not_invented_here?ref=codydjango.com">not invented here</a>&quot; syndrome. </p><p>When considering building with open source tools, weigh the full impact of hidden costs like recruiting, hiring, and training to develop and maintain custom solutions and the opportunity costs of not delivering core business value. </p><h3 id="efficient-data-storage">Efficient Data Storage</h3><p>There are many challenges when it comes to storing but especially querying observability data, which has real-time requirements on billions of rows of ultrawide events of high-dimensionality and high-cardinality data. This chapter uses Honeycomb&apos;s Retriever implementation to elucidate the various tradeoffs. Other publicly available data stores up to the challenge include <a href="https://cloud.google.com/bigquery/?ref=codydjango.com">Google Cloud Big Query</a>, <a href="https://clickhouse.com/?ref=codydjango.com">ClickHouse</a>, and <a href="https://druid.apache.org/?ref=codydjango.com">Apache Druid</a>. </p><h3 id="cheap-and-accurate-enough-sampling">Cheap and Accurate Enough: Sampling</h3><p>Your team is probably more concerned about traces that contain errors or poor performance. Sampling is an excellent technique for improving the signal-to-noise ratio on events you care about, drastically reducing complexity and costs when considering storage and query requirements. </p><p>Because sampling is so valuable when handling observability data at scale, it&apos;s becoming increasingly common for open-source instrumentation libraries such as OTel to provide sampling logic capabilities. </p><p>There are two different sampling strategies to use tactically:</p><ul><li>Head-based: The decision is made immediately and is propagated downstream via headers. Pro: reduces the overhead of collecting and storing unnecessary traces right at the source. Con: Potentially significant or anomalous traces may be missed or incomplete if only some services in a distributed system decide to sample a request.</li><li>Tail-based: The sampling decision occurs at the end of a transaction or request. The system collects all spans related to a trace and then decides whether or not to keep it based on various criteria. Pro: All meaningful traces are retained, leading to better insights. Con: More resource-intensive; implementation is more complex. </li></ul><h3 id="telemetry-management-with-pipelines">Telemetry Management with Pipelines</h3><p>More to come.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Simplifying complexity]]></title><description><![CDATA[<p>As organizations evolve and software grows, so does complexity. Learning how to identify and curb complexity is a core skill to develop as an engineering manager.</p><p>Unconstrainted complexity inevitably results in suboptimal outcomes, such as:</p><ul><li>A slowdown in a team&apos;s ability to accurately assess a problem or deliver</li></ul>]]></description><link>https://codydjango.com/how-i-simply-complexity/</link><guid isPermaLink="false">64c7ea8327058428dbacf648</guid><category><![CDATA[management]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Thu, 03 Aug 2023 20:27:49 GMT</pubDate><content:encoded><![CDATA[<p>As organizations evolve and software grows, so does complexity. Learning how to identify and curb complexity is a core skill to develop as an engineering manager.</p><p>Unconstrainted complexity inevitably results in suboptimal outcomes, such as:</p><ul><li>A slowdown in a team&apos;s ability to accurately assess a problem or deliver a solution</li><li>A slowdown in the time it takes to onboard new engineers</li><li>An increase in incidents and rework</li><li>A drop in morale or an increase in attrition</li></ul><p>It&apos;s impossible to eliminate complexity: some problem spaces are just naturally complex, and there&apos;s no way around it. The trick for an engineering manager is to <em>manage </em>complexity, which means identifying, measuring, and simplifying where possible.</p><h2 id="talking-about-complexity">Talking about complexity</h2><p>Complexity can be found in many forms. It&apos;s helpful to be able to identify which aspect of complexity we intend to simplify. </p><h3 id="aspects-and-measurements">Aspects and measurements</h3><ul><li><strong>Cognitive load</strong>: characterized by an overwhelming diversity of detailed tasks that also increases context switching and few opportunities for deep work or system optimization, resulting in generally slow delivery and low morale. Measure with developer surveys, 1:1s, and onboarding metrics for new hires.</li><li><strong>Process complexity</strong>: characterized by too many cooks in the kitchen, too many meetings, too many required signoffs, slow decision-making, unmet requirements, and frequent change orders. </li><li><strong>Codebase complexity</strong>: characterized by slow builds, slow tests, reduced cycle time on code changes, reduced cycle time on code reviews, and increased rework or deployment rollback. Measure using maintainability index scoring using an index that works for the stage and engineering goals of the organization. </li><li><strong>System complexity</strong>: characterized by no single person knowing how the system works, no known success metrics, or low-quality metrics; quality or performance feedback often comes from end-users, and debugging or root cause analysis requires multiple people and a significant investment. Measure with build times, time it takes from code written to code in production, time for functional tests to run, rework ratios, and other DORA-inspired metrics.</li></ul><h3 id="assessment-and-approaches">Assessment and Approaches</h3><p>The <a href="https://hbr.org/2007/11/a-leaders-framework-for-decision-making?ref=codydjango.com">Cynafin framework</a> is helpful for leaders to assess the operating context to take appropriate actions quickly. The four quadrants are <em>Simple</em>, <em>Complicated</em>, <em>Complex</em>, and <em>Chaotic</em>, where <em>simple </em>is characterized as apparent cause-and-effect relationships where correct answers are based on facts and easily verified, and things become much less linear from there. I won&apos;t go into the details of each quadrant&apos;s characteristics (feel free to read the link or check out the wiki page &#x2013; it&apos;s excellent). But mapping complexities with this framework has often led me to the following actionable behaviours: </p><ul><li>Reduce <em>Chaotic </em>domains to <em>Complex </em>by drawing out a signal from noise by introducing Observability and collaborative Event Storming.</li><li>Reduce <em>Complex </em>domains to <em>Complicated </em>by introducing abstractions, boundaries, patterns, and workflows. </li><li>Make <em>Complicated </em>domains <em>Simple</em> by introducing or improving tooling, access to specialists, or load-shedding via a specialized team to handle inherently complex systems that are core to the organization&apos;s revenue streams.<em> </em></li><li>Eliminate <em>Simple </em>tasks via automation or outsourcing.</li></ul><h2 id="conclusion">Conclusion</h2><ul><li><strong>Divide and Conquer</strong>: Complexity in software is typically managed by a &quot;divide and conquer&quot; approach, which can be applied at any level of granularity when considering software systems.</li><li><strong>Abstractions, Interfaces and Boundaries</strong>: introduce smaller cognitive loads with specialization and bounded contexts modelled on supporting the business&apos;s current and future revenue streams. Move teams to support the bounded contexts, and have those teams own the architecture that they depend on and document with C4 patterns.</li><li><strong>Refactoring to Design Patterns</strong>: Refactor complicated codebase towards named design patterns to increase understandability, maintainability, and flexibility. </li><li><strong>Introductions of Frameworks</strong>: If you&apos;re noticing the same sorts of use cases come up frequently, introducing a framework can make a huge impact, although it might require an up-front investment, so be prepared with a considered plan when proposing to your team. &#xA0; </li><li><strong>Enabling Teams</strong>: A temporary enabling team to aid in strategic refactoring or short-term organizational projects such as GDPR, security improvements, etc. Enabling teams are also great for tackling technical debt or building technical surplus to unlock additional product velocity. They can also be transitioned easily to permanent developer experience teams if desired.</li><li><strong>Complex Subsystem Teams</strong>: Load-shed core complexity from stream-aligned product teams with the introduction of a team designed to handle a particularly complicated area.</li></ul><p><em>Bonus points:</em></p><ul><li><strong>Establish baseline performance measurements with SLAs, SLOs, and SLIs for services in production:</strong> Identifying baseline performance metrics enables a clear focus, especially when things are overwhelming. Knowing the performance and expectations of production services results in understanding the capacity for taking on new objectives and making wise decisions. For example, reducing complexity might be more critical when SLAs are unmet. </li><li><strong>Establish high-level goals with Objectives and Quantitative Key Results</strong>: Identify big goals and ensure they can be achieved incrementally (i.e. a mix of leading and lagging metrics enables progress can be measured throughout development and not just at the very end). Working with Product Stakeholders to identify the right success metrics early results in a much simpler development process and managed expectations. </li></ul>]]></content:encoded></item><item><title><![CDATA[Coaching frameworks]]></title><description><![CDATA[<p>I received a question a few weeks back on if I used a coaching framework and which one. My response was that I use a framework of my own design: a combination of <a href="https://en.wikipedia.org/wiki/SWOT_analysis?ref=codydjango.com">SWOT analysis</a> with <a href="https://en.wikipedia.org/wiki/Objectives_and_key_results?ref=codydjango.com">OKR</a>-style reporting. At the time, it didn&apos;t seem satisfying as an</p>]]></description><link>https://codydjango.com/coaching/</link><guid isPermaLink="false">64c4497727058428dbacf2ff</guid><category><![CDATA[management]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Sat, 29 Jul 2023 04:30:52 GMT</pubDate><content:encoded><![CDATA[<p>I received a question a few weeks back on if I used a coaching framework and which one. My response was that I use a framework of my own design: a combination of <a href="https://en.wikipedia.org/wiki/SWOT_analysis?ref=codydjango.com">SWOT analysis</a> with <a href="https://en.wikipedia.org/wiki/Objectives_and_key_results?ref=codydjango.com">OKR</a>-style reporting. At the time, it didn&apos;t seem satisfying as an answer. The reality is always a little more nuanced; I&apos;ve read multiple books on coaching, practiced various systems with my directs and received executive coaching myself. Over time and experience, I&apos;ve dialled in a system that has resulted in many of my reports&apos; professional growth and promotion. </p><p>But in retrospect, it&apos;s clearer to say that I use the <a href="https://hbr.org/2019/11/the-leader-as-coach?ref=codydjango.com">GROW model</a>. It&apos;s become widespread in tech, and it&apos;s generally the answer that folks want to hear.</p><h2 id="grow-model-of-coaching">GROW Model of Coaching </h2><p>So what is the GROW model? It&apos;s a way of speaking that is intended to result in better nondirective coaching. Why non-directive coaching? Because most leaders naturally employ a directed style of leadership which takes place primarily through &quot;telling&quot; and leans heavily on authority. This style is prevalent in training a report for a specific job that is likely low-variability. </p><p>The challenge of modern teams is a fast-moving world: objectives change, technologies evolve, and it&apos;s no longer feasible to expect a manager or leader always to know the best way forward. Directed leadership also has the unfortunate property of stifling ownership and does not build organizational capacity well.</p><p>A GROW approach to coaching requires patience to learn and apply but is rewarding and energizing when used successfully. Avoiding leading questions means that the direct report always owns the problem to be solved, and the coaching method is specifically tailored to open perspective and draw out insight. </p><ul><li><strong>GOAL</strong>: Asking what the person wants to achieve from the session and in the immediate future, such as &quot;<em>What do you want when you walk out the door that you don&apos;t have now?</em>&quot;</li><li><strong>Reality</strong>: This means asking probing questions about the current situation in detail. The trick here is to inquire about facts describing reality, such as what, <em>who</em>, <em>when</em>, and <em>where &#x2013; </em>but explicitly not <em>why</em>, because it is tied to motivations and justifications, which border on judgment and can raise defences, which is counter-productive. A good question here is, &quot;<em>What are the key things we need to know?</em>&quot;</li><li><strong>Options: </strong>This step is to help broaden the perspective. Often people who are seeking help feel like they have limited options. By opening the floor to creative thinking, more possibilities and perspectives emerge. I learned a trick from Product Management: <em>Diverge for Options, Converge for Decisions</em>. A good question here is, &quot;<em>If you had a magic wand, what would you do?</em>&quot;</li><li><strong>Will: </strong>Asking &quot;What will you do?&quot; encourages detailing a specific plan. Sometimes the plan might just be to learn more about the situation, to show appreciative inquiry in learning more about a problem or someone&apos;s perspective or concerns. Sometimes, it&apos;s about preparing for a conversation or drafting a proposal. Another trick here is to ask how confident the person is in their plan and how likely they will be to act on it. Investing in helping someone through a problem, only for them not to feel confident enough to action on it, can be demotivating for all parties. My job as a people manager is to validate that my coaching serves the intended function.</li></ul><h2 id="the-effective-manager">The Effective Manager</h2><p>This is the book I come back to more than anything. According to Mark Horstman, successful coaching is simply about asking for more. Supporting, mentoring, and coaching is not an end in itself. People managers are intended to drive value for the company. Effective managing is giving frequent feedback on performance, and effective coaching is continuously asking for higher levels of performance. </p><p>This may sound aggressive or counter-intuitive, but in a high-trust environment, it&apos;s a superpower. Too many managers feel like coaching is something to apply to low-performers, but coaching high-performers is satisfying and can yield much more. </p><p>Either way, every direct report should know their performance expectations in their role, and a regular review on the topic should occur. Not every direct will be rushing to exceed, and that&apos;s okay. They know what it is and are directly responsible for their career development. They also know that their manager will work with them to achieve their performance goals.</p><p>These are the steps for effective coaching that MT recommends:</p><ol><li><strong>Collaborate to Set a Goal</strong>: Describe a behaviour or result to achieve by a date. For example: <em>by (four months from now), you will deliver admin features within one week on average without introducing any regressions</em>. (This is an example of the MT goal structure DBQ &#x2013; <em>Date Behaviour Quality</em>). MT specifies that coaching goals are long-term behavioural goals &#x2013; if they can be achieved in less than four months, a frequent feedback model will suffice. &#xA0;</li><li><strong>Collaborate to Brainstorm Resources</strong>: There are no silver bullets. Go for volume, not accuracy. </li><li><strong>Collaborate to Create a Plan: </strong>Each step in the plan contains a deadline and behaviour and is completed when the reporting happens to the manager &#x2013; effectively, the plan is an accountability system that you are directly investing in for the sake of your report. The plan is only for the first few weeks &#x2013; it&apos;s not worth planning four months if they can&apos;t make it past the first week.</li><li><strong>The Direct Acts and Reports on the Plan: </strong>If the system has been set up correctly, we should receive regular updates in the form of task completion emails, and we then are briefly discussing the progress each week in 1:1s.</li></ol><p>Steps 3 and 4 become iterative toward achieving the goal from step 1. If the direct report fails to accomplish a coaching task, we give the direct report negative feedback. MT gives an example: &quot;When you miss your coaching deadlines, that&apos;s more work for later. Can you change that?&quot;. Similarly, positive feedback can be given when the direct report completes a coaching deliverable.</p><p>I love that Manager Tools willingly leverages what we know about organizational behaviour to set short deadlines on doable tasks to increase the chance of completion. Whenever possible, look for opportunities to observe the direct engaging in the behaviour we want, to provide the direct with feedback on what we observe, and make that a regular, very short-scope task. If coaching is behavioural, then the best way to achieve it is to enable and incentivize frequent practice.</p><h2 id="the-coaching-habit">The Coaching Habit</h2><p>This book claims that seven questions and a coaching habit will foster team autonomy and empowerment. The central argument of this book is that successful coaching is through asking questions rather than providing answers. I found this book to be too long for its little substance, but if you are looking for a way to refresh your 1:1 questions, you can look to the seven questions for inspiration.</p><p> </p>]]></content:encoded></item><item><title><![CDATA[Observability for Teams]]></title><description><![CDATA[<p><em>This is Part III in Observability Engineering: Achieving Production Excellence</em></p><h3 id="applying-observability-practices-in-your-team">Applying Observability Practices in Your Team</h3><p>Start with the most significant pain points, and then flesh out your instrumentation iteratively.</p><h3 id="observability-driven-development">Observability-Driven Development</h3><ul><li>A key finding of Accelerate: Building and Scaling High Performing Technology Organizations was that the inverse relationship between</li></ul>]]></description><link>https://codydjango.com/observability-for-teams/</link><guid isPermaLink="false">64b96e6127058428dbacf009</guid><category><![CDATA[software testing]]></category><dc:creator><![CDATA[Cody Redmond]]></dc:creator><pubDate>Fri, 28 Jul 2023 22:59:53 GMT</pubDate><content:encoded><![CDATA[<p><em>This is Part III in Observability Engineering: Achieving Production Excellence</em></p><h3 id="applying-observability-practices-in-your-team">Applying Observability Practices in Your Team</h3><p>Start with the most significant pain points, and then flesh out your instrumentation iteratively.</p><h3 id="observability-driven-development">Observability-Driven Development</h3><ul><li>A key finding of Accelerate: Building and Scaling High Performing Technology Organizations was that the inverse relationship between speed and quality is a myth: high-performing teams can release high-quality code quickly, and these two qualities are correlated and reinforce each other. Conversely, failures tend to happen more often for teams that move slowly and take substantially longer to recover.</li><li>The key metric for the health and effectiveness of an engineering team is <u>the time elapsed from when code is written to when it is in production</u>. Every team should be tracking this metric and working to improve it.</li><li>Isolated test-driven development does not reveal whether customers are having a good experience with your service.</li><li>Observability should be used early in the software development life cycle, during the development process, to help catch defects earlier and reduce the cost of fixing them later. This is what is meant by &quot;Shifting Observability Left.&quot;</li></ul><h3 id="using-service-level-objectives-for-reliability">Using Service-Level Objectives for Reliability</h3><ul><li>Threshold alerting is for known unknowns only. This isn&apos;t sustainable; distributed systems&apos; failures are inevitable and unpredictable. </li><li>A good alert must reflect immediate user impact, be actionable, be novel, and require investigation rather than rote action.</li><li>SLOs decouple the &quot;what&quot; and &quot;why&quot; behind incident alerting.</li><li>SLOs are excellent at communicating how to prioritize reliability vis-a-vis with feature development. If we aren&apos;t hitting SLOs, the focus ought to be reliability.</li><li>Two types of SLOs: time-based measures (99th percentile latency less than 300ms over each 5-minute window) and event-based measures (proportion of events that took less than 300 ms during a given rolling time window).</li><li>For time-based: 99p as the target; for every 100 minutes, I&apos;m allowed 1 bad minute. For event-based: for 100 events, I&apos;m allowed one bad event.</li><li>Use event-based because they provide a more reliable and granular way to quantify the state of a service. They are more precise. They measure brownouts better, like when more events fail but not all of them. You can more reasonably measure an SLO with event-based availability targets.</li><li>If SLOs are not being met, but customers are also not complaining, then perhaps it&apos;s okay to reduce the SLOs, if that could enable product development elsewhere. </li><li>If customers complain, it might be a poor leadership decision to reduce the SLOs further.</li></ul><h3 id="debugging-slo-based-alerts">Debugging SLO-Based Alerts</h3><ul><li>Stop relying on experience to guess what is happening in a system. It&apos;s unreliable and unsustainable.</li><li>Observability is not specific to debugging. Debugging&apos;s concern is to remove a bug, but it says little about the overall state of a given system. Observability will tell you which systems are good candidates to improve, which may involve debugging but could also involve performance improvements, refactoring or redesigning to achieve a target SLO.</li></ul><h3 id="observability-and-the-software-supply-chain">Observability and the Software Supply Chain</h3><ul><li>Slack implemented Observability in the software supply chain, instrumenting the CI pipeline to solve complex problems throughout the CI workflow that were previously invisible or undetected.</li></ul>]]></content:encoded></item></channel></rss>