<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us">
    <generator uri="https://gohugo.io/" version="0.140.1">Hugo</generator><title type="html"><![CDATA[Writing is clarifying]]></title>
    
        <subtitle type="html"><![CDATA[Subbu Allamaraju's Journal]]></subtitle>
    
    
    
            <link href="https://www.subbu.org/" rel="alternate" type="text/html" title="html" />
            <link href="https://www.subbu.org/index.xml" rel="alternate" type="application/rss+xml" title="rss" />
            <link href="https://www.subbu.org/atom.xml" rel="self" type="application/atom+xml" title="atom" />
    <updated>2026-03-15T00:53:11+00:00</updated>
    <rights>© Subbu Allamaraju</rights>
    
    
    
        <id>https://www.subbu.org/</id>
    
        
        <entry>
            <title type="html"><![CDATA[Productivity and Entropy]]></title>
            <link href="https://www.subbu.org/articles/2026/productivity-and-entropy/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2026/productivity-and-entropy/</id>
            
            
            <published>2026-03-07T11:22:43-08:00</published>
            <updated>2026-03-07T11:22:43-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>I&rsquo;ve spent over 25 years watching software systems accumulate entropy and drift into disrepair and failure. I&rsquo;ve led several projects and know the excruciating pain it takes to bring such systems back on track.  That experience makes me cautious about unbounded productivity gains with AI. The early productivity gains are clear, but we should discuss complexity and entropy before jumping to conclusions.</p>
<p>While there is no universal definition of complexity, when we say some software is complex, we usually mean a system with many parts that occasionally behaves in ways that go counter to our understanding. Entropy is a measure of uncertainty and unpredictability. It shows up as tangled dependencies, unpredictable states, cascading failures, etc.</p>
<p>Frederick Brooks explored these topics in the context of productivity 40 years ago in his ACM article titled <a href="https://dl.acm.org/doi/10.1109/MC.1987.1663532">No Silver Bullet: Essence and Accidents of Software Engineering</a>. Since that article is behind a paywall, see this <a href="https://worrydream.com/refs/Brooks_1986_-_No_Silver_Bullet.pdf">1995 reproduction</a>. In that article, Brooks made a few observations: (a) software construction involves two kinds of complexities, essential and accidental, (b) essential complexity is irreducible, and (c) there is no silver bullet for productivity.</p>
<p>AI is reshaping both essential and accidental complexities. We can now automate several aspects of determining what to build and how to build it. It sounds like we found the silver bullet that Brooks has given up on: more tokens → higher productivity → fewer people → more profits. But is that so? Let&rsquo;s probe into the origins of complexity and entropy before jumping to such a conclusion.</p>
<h2 id="path-dependence">Path dependence</h2>
<p>The idea of path dependence is that early choices have irreversible consequences. As a system gets successfully adopted, early choices create a lock-in. We see it in every successful tech company: some early assumptions and designs usually dictate the rest of the software’s evolution. Those assumptions and designs ultimately influence not just code evolution but also team structures and even culture.</p>
<p>Paul David, an economist who introduced the idea of <a href="https://fbaum.unc.edu/teaching/articles/David_AER_1985.pdf">path dependence</a>, uses the <a href="https://en.wikipedia.org/wiki/QWERTY">QWERTY keyboard</a> as an example of how early typewriter designs in the 1880s locked us in since then.  Path dependence constrains future choices. By limiting choice, it increases the cost of changes as requirements change and business conditions evolve.</p>
<p>Once I read about path dependence, I could not unsee its impact in the companies I worked at in my career. At every place, path dependence was at play - large monoliths, custom frameworks that lock the data in particular databases, particular team structures because &ldquo;it has always been that way&rdquo;, etc. Changing such things takes enormous time and effort. Most of what we consider legacy, or technical debt, is often the result of path dependence.</p>
<p>As we add more features to such software, the path dependence constraint will lead people to work around it. Then it becomes more difficult to understand the implications of changes. Entropy accumulates over time as we try to work within the constraints of path dependence.</p>
<p>Will AI help you circumvent path dependence? One might argue so: you could direct an agentic coding tool to refactor and rewrite the code to tear apart path dependence. However, in practice, that can prove to be disastrous. Rewriting any complex system, including all its dependencies, while preserving data and existing user behavior, is a hard task. The risk is high.</p>
<p>The next three are based on two excellent books on systems thinking: <a href="https://www.goodreads.com/book/show/3828902-thinking-in-systems">Thinking in Systems</a> by Donella Meadows and <a href="https://www.goodreads.com/book/show/19009621-drift-into-failure">Drift into Failure</a> by Sydney Dekker.</p>
<h2 id="competing-feedback-loops">Competing feedback loops</h2>
<p>In the first chapter, Meadows introduces the concepts of &ldquo;stocks&rdquo; and &ldquo;flows&rdquo; and two kinds of feedback loops: balancing (stability-seeking) and reinforcing (amplifying, growth-seeking). Stock is the material you work with. In the context of software development, stock refers to the amount of code, services, data stores, various components, teams, and people. Flows are activities we do to manage the stock. Flows change the stock.</p>
<p>The best way to think about stability-seeking and amplifying feedback loops is to ask whether your organization is changing the stock for stability or growth. When focused on stability, you constrain the flow to reduce bugs and improve system stability and performance. When focused on growth, you increase the flow to prioritize business growth. You can try to improve both at the same time, but you can not ignore the tension between the two.</p>
<p>In practice, no software organization does either alone. Some parts of an organization may be stability-seeking (such as your infrastructure or platform teams), while others may be growth-seeking (such as your feature teams). Similarly, your architects and senior engineers may prioritize the architecture’s stability and integrity, while the rest may prioritize speed. The tension between these two leads to conflicting choices and workarounds. The net result is an increase in the overall system&rsquo;s entropy.</p>
<p>Now, bring AI into the picture. Unless constrained, AI will rapidly accelerate conflicting feedback loops. Empowered by a high-speed tool, each team could attempt to optimize the system in conflicting ways - some for stability, and many for growth. Most might get their outcomes in the short term, but very quickly, the competition between these factions will increase entropy faster than it would without AI.</p>
<h2 id="delayed-feedback">Delayed feedback</h2>
<p>Delayed feedback is like the slow drip you forgot to fix in the basement, and now you have mold in the house.  In software, certain delays take time to manifest. For example, you might delay some cleanup or scale-out activity because everyone is busy introducing other changes to the system, unaware that entropy has been increasing and that the system is reaching a critical state.  Things would be fine for some time, and one day you might find yourself in firefighting. The delay in the feedback creates a false sense of safety, which then leads to delayed repairs. Per Dekker, delayed maintenance and repair contribute to systems drifting into failure.</p>
<p>Delays show up in other forms, too. In one case, a minor data corruption issue remained undetected for several months, and correcting it became expensive and time-consuming. In reality, in any large software-powered enterprise, there are likely several such slow feedback loops at play. Such delays usually result in future unplanned maintenance work and drain your productivity calculations.</p>
<p>Will AI help detect such delayed feedback loops sooner? Will it prioritize such repair work over other kinds of work without our prompting? Or will we have more such delayed feedback loops as we rapidly change the system with AI? While we don&rsquo;t have evidence for either, AI will likely introduce more delayed feedback loops, requiring more frequent unplanned maintenance.</p>
<h2 id="staleincorrect-models">Stale/incorrect models</h2>
<p>Meadows also reminds us that whatever we think we know about the world is a model. Models are incomplete, and different people construct different models to deal with the world outside their minds. Meadows says in Chapter 4,</p>
<blockquote>
<p>&hellip; our models fall short of representing the world fully.</p>
</blockquote>
<p>What does this have to do with software? As software ages and multiple people touch the software, our models drift apart. For example, the senior-most person in the company who wrote the original software (and thus the creator of path dependence) might have one model of the software. A junior engineer who joined the organization recently will have a very different model of the software. As software ages, changes by different people with different models lead to even more drifted models of how the system is supposed to work. Eventually, nobody would have the complete picture to reason about the system. Most technical debates I&rsquo;ve witnessed are the result of people holding different models of how the system is supposed to work. People argue about how to add or modify something before checking whether they share the same assumption about how the current system is supposed to work.</p>
<p>As more changes get made, the coupling within the system changes in unexplainable ways. The result is increased entropy. Changes become time-consuming to make and difficult to validate.</p>
<p>AI will likely add more fuel to this situation unless we find ways to coerce everyone to use the same model of how the system is supposed to work. It will be difficult to construct such unified models for large monoliths, or even for monorepos.</p>
<hr>
<p>Will AI have a better model of software (including systems’ runtime behavior and user behavior), carefully balance between stability-seeking and growth-seeking patterns, and manage entropy?</p>
<p>No. The four factors we discussed above - path dependence, competing feedback loops, delays in feedback, and above all, incomplete models will create a complexity ceiling for AI.</p>
<p>Just consider our models. Like us, AI builds a model of the system and uses that model to determine actions. Like all models, an AI-built model would be imperfect too. Further, multiple people working on the same system will likely see their AI tool generate a slightly different model tailored to their use. AI thus magnifies the same model problem we humans have. It is like <a href="https://www.subbu.org/articles/2026/100-teenager-dev-problem/">100 teenage developers</a> working on the same system, each with a different model of the system.</p>
<p>Since we&rsquo;re the ones setting the goals for AI, we will likely continue to favor growth-seeking feedback loops over stability-seeking ones, delay maintenance, and allow our systems to drift toward failure faster.</p>
<p>AI will require us to hold on to good software engineering principles even tighter.    Those who understand this will build systems that grow and last. The ones chasing unbounded productivity gains won&rsquo;t know why they failed.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Agentic IDEs - 100 Teenager Dev Problem]]></title>
            <link href="https://www.subbu.org/articles/2026/100-teenager-dev-problem/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2026/100-teenager-dev-problem/</id>
            
            
            <published>2026-01-25T21:04:41-08:00</published>
            <updated>2026-01-25T21:04:41-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Imagine this situation: You are an experienced dev manager. You know how to assemble 15-20 adult software developers, analyze a moderately complex set of requirements, develop a project plan, break the work down, and delegate tasks across the team. You are capable of running appropriate SDLC rituals and delivering results on a predictable schedule. One day, you arrive at work only to find your team replaced by a hundred hyperactive teenagers. Those teenagers have googled everything and believe they know it all. They are excited about their first job, curious, restless, and eager to start working on their keyboards. Your task is to organize this team to achieve the same results much faster.</p>
<p>Where do you begin? How would you approach this challenge? That’s the kind of skill needed to produce predictable outcomes quickly with agentic IDEs. While my comparison of agentic IDEs to managing a team of 100 teenagers might sound snarky or funny, I recognize that it’s unfair to teenagers. After all, our future depends on them. I’m making this comparison to emphasize that taming agentic IDEs to achieve predictable results is much like getting a 100-teenager software development team to work well.</p>
<p>Here are some reasons why it is important to draw such a reference.</p>
<ol>
<li>Agentic IDEs act confidently. They behave as though they know everything there is to know and impress you.</li>
<li>Yet it takes little effort on your part to coerce them into contradicting themselves, changing their minds, or giving up altogether.</li>
<li>You can give a complex specification to get them to quickly build a working system, but they can also just as easily send the system into chaos when asked to fix a bug.</li>
<li>Unless you are carefully watching, they can break your architecture and make changes in unwanted places. You must be extremely granular and specific with your instructions.</li>
<li>They act like they know how to follow instructions, but they can conveniently ignore them. They will give you vague explanations about why they ignored your instructions.</li>
<li>Depending on how their system prompts were designed, some respond obediently while others respond tersely to your questions.</li>
<li>Once in a while, you have to pull them back by their tails to not get into rabbit holes.</li>
</ol>
<p>None of these patterns should be surprising. LLMs are massive prediction machines. They hallucinate, don’t understand language, code, or concepts. They are sophisticated statistical engines designed to predict the next token. Coercing them to produce decent outcomes is an art and not a science.</p>
<p>So, how would you get them to produce effective outcomes? Through December 2025 and early January 2026, I’ve dealt with three moderately complex problems: modernizing a legacy codebase, an mTLS-based system for authentication and authorization between services, and an internal developer CI/CD platform for creating and deploying apps in the cloud. Each problem would normally take 3-6 people over several months, and I spent about $500 (a decent portion of which went to AWS). In each case, I addressed full-stack concerns and got working solutions.</p>
<p>My experience varied from mediocre to excellent. I used multiple agentic IDEs. As I reflected on the differences between scenarios where they worked well and those where they struggled, I began to notice patterns and formulate hypotheses. I have some evidence supporting these hypotheses, and I will continue to refine them in the coming weeks and months. The goal of these hypotheses is to find out how to tame these agentic systems to produce reasonably correct software solutions.</p>
<p><strong>Hypothesis 1: Good engineering principles matter more than ever.</strong></p>
<p>Let us go back to the 100-teenager analogy. How would you organize a 100-teenager team to do some constructive work?</p>
<p>You would create an overall plan for how the work should be carried out. You would break the work into manageable parts and assign each to a small enough team. You will provide them with clear instructions on what to do. You will outline some dos and don’ts.</p>
<p>You will provide sufficient space and boundaries between subgroups so that each can work independently to accomplish its task. You will consider the dependencies between subgroups and identify what can be done in parallel and what must wait for other subgroups to finish. You will set communication pathways and protocols between the subgroups. You will assign the task of ensuring the correctness of those dependencies and communication to a few. You will tell them how to test that various subgroups did their work correctly to your satisfaction.</p>
<p>In other words, you would meticulously focus on a documented system design, architecture constraints, component choice, project plan, modularity, interfaces, composability, module testability, tests (unit, integration, end-to-end, etc.), acceptance criteria, etc. The same holds for taming agentic IDEs to work for you.</p>
<p>Furthermore, when you have a large number of people (that too, teenagers) working for you, you would focus more on correctness and completion and less on getting an MVP out the door quickly. When I compare the situations where I made steady progress and where I had to fight code regressions, the difference was how well I thought through modularity, interfaces, tests, and acceptance criteria at every phase, instead of short-circuiting the process with poorly tested modules and porous interfaces. The more structured I was in determining how the work should be done and in following contract- and test-driven development, the greater the throughput I achieved with agentic IDEs. The more component-level, integration, and end-to-end tests I had, the faster it was to implement new features or find bugs. Taking shortcuts had the opposite effect. In one particular instance, I wasted almost half a day getting AI fix some regressions. My experience made sense in light of the seven points I listed above.</p>
<p>To summarize, meticulously following good software development practices is essential to get high throughput with agentic IDEs. Some of those principles may matter less when you have a small human development team that can only produce a handful of changes a day, but not with agentic IDEs that can make dozens of changes in minutes.</p>
<p><strong>Hypothesis 2: High development throughput depends on simple, automated, and well-integrated dev tools and processes.</strong></p>
<p>When was the last time you carefully reviewed all the dev tools and processes and eliminated friction points? Probably never or for a long time. But the time is now. Here is why.</p>
<p>The development throughout is a function of the tools and processes employed. Consider these:</p>
<p><em><strong>Dev tools:</strong></em> <em>Source control, local dev setup tools, local builds and tests, artifact repositories, secrets management, CI/CD pipelines, test and integration environments, logging and monitoring systems, distributed tracing, docs and standards, task and bug tracking systems, ticketing and approval flows, internal developer portals, etc.</em></p>
<p><em><strong>Dev processes:</strong></em> <em>Architecture and system design procedures and reviews, planning rituals, sizing and estimation, task breakdown, checkpoints such as standups and status meetings, code reviews, change review processes, etc.</em></p>
<p>Your current development tools and processes, whether you like them or not, are perfectly aligned to yield your team’s current throughput. Furthermore, those tools and processes are a result of your company’s and team’s legacy, culture, technical debt, organization’s structural debt, business conditions, and leadership attitude. To add, most aspects of these tools and processes are evolutionary. Those are often a patchwork of what you inherited, what you learned, and what you instituted over time. Those are likely not designed from first principles to yield high throughput.</p>
<p>Just like the 100-teenager dev problem, agentic IDEs introduce a scaling problem. Your current tools and processes will become bottlenecks as these tools can design, reason about designs, write, test, and debug complex software problems in seconds or minutes rather than hours or days.</p>
<p>For example, in my experiments, I gave my agentic IDE seamless access to my source control system, CI/CD infrastructure, and cloud-based deployment environment. That smooth integration allowed me to let my agentic IDE review and commit code, review CI logs to catch issues, review CD steps, check deployment logs, perform health checks, and, in general, do everything I would do manually.</p>
<p>But if your development flow involves hand-offs across teams (like dev to QA to release), meetings, manual checkpoints, approvals, tickets, fragile test environments, logging and monitoring systems that are hard to access, long lead times between commit to production, etc., then your team’s throughput will be severely constrained. This is the time to carefully review tools and processes, eliminate bottlenecks, and prepare for a world where agentic IDEs, and not just people, are the ones iterating through every aspect of the SDLC. This step will involve moving cheeses and breaking norms, which brings me to my next hypothesis.</p>
<p><strong>Hypothesis 3: Yet, most enterprises will struggle to get high developer throughput.</strong></p>
<p>Here is my stark prediction. Getting licenses to agentic IDEs to everyone at work is the easy part, and most enterprises will struggle to yield consistently high throughput with those tools. Many will get occasional proof points, which I call “accidental wins” when a team performs a task or project at 5x or 10x throughput. Yet, many will likely struggle to achieve sustainable throughput increases.</p>
<p>I am basing this hypothesis on the following factors.</p>
<p>First, most managers are usually detached from the finer details of how work gets done within and across various teams to know how to (a) improve engineering hygiene and rigor to support my first hypothesis, and (b) rewire the team’s dev processes and tools to support my second hypothesis. They are usually busy with meetings, reviews, escalations, 1:1s, and all such operational tasks. Their memory of how good software should be built may also be dated. But leading the change with agentic IDEs requires you know how code moves through your system of processes and tools.</p>
<p>Second, even when a manager is capable and willing, most organizations don’t incentivize improving hygiene and rigor on existing code bases. Say, your team’s test coverage is low, and you want to prioritize improving test coverage for a few sprints. Or you want to invest in refactoring the code to make it more modular. Or you want to invest in automating some long-pending manual workflow. Which product manager or senior leader will support you and make room to prioritize such hygiene factors over shipping a new feature?</p>
<p>Third, managers, due to the nature of the pressures they face, develop throughput-bursting habits over time. For example, consider how you estimate the time required to complete a project. You will base it on prior experience and everything that went wrong in the past. You also make room for some attrition, leaves, dependencies, and so on. However, your estimates will influence and control the pace at which work gets done. To try what it takes to yield high throughput, you should be willing to say yes to bigger ideas. But bigger projects come with risks and uncharted territory. Why bother and leave the predictable territory?</p>
<p>Under the right conditions and organizational factors, managers can be great enablers of increased team throughput by focusing on the factors I identified in my first and second hypotheses. But when those conditions are not right, managers will be the biggest bottlenecks for change.</p>
<hr>
<p>As I wrote last month, agentic IDEs require you to shift your mindset from <a href="https://www.subbu.org/articles/2025/end-of-artisanal-software-crafting">artisanal to industrial software crafting</a>, which introduces a scaling problem. Your systems of SDLC that were originally set up for human developers to emit at most one or two merge requests per day will not allow dozens or more per day with agentic IDEs. It also introduces a leadership problem. As a manager, you may already be dealing with tightened headcount budgets, and <a href="https://www.subbu.org/articles/2025/leading-in-low-trust-times/">trust levels in your team may be low</a>. You may lack the conviction and confidence to stand before your team and proclaim that agentic IDEs are the solution.</p>
<p>Yet, the opportunity to learn and lead change is huge. You now have powerful tools that can turn each member of your team into a superhuman and do impactful work. For many in their 40s and older, this may be the last big change they witness in their careers. It is therefore imperative for managers to get their hands dirty, lead from the front, and figure out how to let their teams become superhumans at work.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[What Counts]]></title>
            <link href="https://www.subbu.org/articles/2026/what-counts/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2026/what-counts/</id>
            
            
            <published>2026-01-04T21:55:12+05:30</published>
            <updated>2026-01-04T21:55:12+05:30</updated>
            
            
            <content type="html"><![CDATA[<p>Welcome to the new year. I spent my time traveling, coding, and reading during the slow period over the past two weeks. This is not the first time I have taken the time to reflect and write in long-form about what matters to me and what I believe (<a href="https://www.subbu.org/articles/2024/leadership-for-results-and-peace-of-mind">1</a>, <a href="https://www.subbu.org/articles/2021/my-leadership-document-2021-edition/">2</a>, <a href="https://www.subbu.org/articles/2024/twenty-tiny-leadership-lessons/">3</a>). But this time, I’m sharing a few things without accompanying prose. These are what I want to count more, at this time.</p>
<p>(+) Learning to share, and earning to give away <br/>(-) Sharing for the echo, and earning to impress</p>
<p>(+) Sharing space <br/> (-) Elbowing</p>
<p>(+) Getting big things done <br/>(-) Incrementality</p>
<p>(+) Taking time to reflect and refine, every day<br/>(-) New Year’s resolutions</p>
<p>(+) Production<br/>(-) Consumption</p>
<p>(+) Subtracting things<br/>(-) Adding things</p>
<p>(+) Typing things, one character at a time<br/>(-) AI-sloppery, sprayed in bulk</p>
<p>(+) Honest silence <br/>(-) Platitudes</p>
<p>(+) Presence<br/>(-) Rethinking the same things</p>
<p>(+) Personhood, playing a role on a canvas<br/>(-) Selfhood, fixated at the center of the canvas</p>
<p>Thanks, Steve, for writing <a href="https://makoism.com/attention/">What Deserves My Attention Now</a>, which motivated me to take a break from what I was doing this week.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Five More Leadership Lessons]]></title>
            <link href="https://www.subbu.org/articles/2025/five-more-leadership-lessons/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/five-more-leadership-lessons/</id>
            
            
            <published>2025-12-30T10:41:04+01:00</published>
            <updated>2025-12-30T10:41:04+01:00</updated>
            
            
            <content type="html"><![CDATA[<p>A year ago, I compiled <a href="https://www.subbu.org/articles/2024/twenty-tiny-leadership-lessons">twenty tiny leadership lessons</a>. That article resonated with many. Here are five more based on what I observed and felt in 2025. I hope you find these ideas helpful.</p>
<p><strong>Learn to deliver big things</strong></p>
<p>Learning to bootstrap and deliver big projects is an essential leadership competency. Here is why. Most corporate tech projects are incremental. With such projects, you improve a thing or deliver a feature or two on a predictable cadence. Such projects may be necessary for continually delivering value on a foundation you have already built. However, incrementality will only take your product or tech stack so far. Such projects won’t give you a chance to make step-function improvements. Incrementality also breeds debt. You need the organizational capacity to handle transformational projects successfully. Taking on large projects also tests your abilities in multiple ways - from formulating a compelling narrative to garnering support for implementing the mechanics for a successful completion. Try to tackle at least one big thing every year.</p>
<p>But here is the challenge. More often than not, large projects struggle to finish, and the promised outcomes never materialize. Most of us have seen these at work: someone initiates a big platform project to unify two or three legacy systems, but they end up with one more unfinished system to manage. Or, someone plans a modernization project to decouple legacy systems, but the systems continue to rely on the legacy. The problem is usually the leader’s upfront underestimation of what is required to complete it, or their inability to prioritize the <a href="https://www.subbu.org/articles/2025/hard-things-first/">hard parts first</a>. Such unfinished projects typically exacerbate the situation for everyone and add to the pile of debt.</p>
<p>As they say in climbing, getting to the top is optional, but getting down is mandatory. Learn to do both.</p>
<p><strong>Don’t start with resources</strong></p>
<p>One of the most common managerial bad habits is asking other managers for resources. Say, team A needs team B to do some work. Team A’s manager would develop a task list of requirements for Team B and approach Team B’s manager to allocate resources on Team A’s timelines. Team B’s manager would typically respond by explaining why the tasks or timelines are not feasible. Things get even more complicated when Team A depends on Team B, and Team B needs Team C to do something to accomplish what Team A wants. Imagine getting everyone to agree on what needs to be done and a timeline. Such dependencies usually lead to stalled projects or watered-down outcomes.</p>
<p>A better approach is to align on the objective or the vision. Imagine how Team B’s manager would react when Team A’s manager approaches them to talk about the business problem and seeks a partnership? That would motivate Team B’s manager to help out. Together, they might also discover some shared problem that both teams could benefit from. In a recent example, when someone similarly approached my team, we probed the issue and identified shared concerns that needed to be addressed, which led to a shared objective. The resource problem disappeared because both teams were willing to address it.</p>
<p><strong><a href="share-space"></a>Share space</strong></p>
<p>Earlier this year, I was reviewing some of the books I had purchased over the past few years but had never read. One of those books was Robert W. Keidel&rsquo;s <a href="https://www.goodreads.com/book/show/1893488.Seeing_Organizational_Patterns">Seeing Organizational Patterns</a>. The central thesis of the book is that autonomy, control, and cooperation are the three variables in any organizational design or role assignment, and that one must purposefully specify which to optimize. In an autonomy-favored design, each team would pursue its work with minimal dependency on others. In a control-favored design, the hierarchy forces alignment among teams, whereas in a collaboration-favored design, people must form working relationships to get anything done. The sentence I most liked from this book is: “Organizational design is a purposeful specification of relationships” among autonomy, control, and cooperation. These days, it is common to see organizational designs that balance autonomy and cooperation.</p>
<p>However, autonomy won’t work without cooperation. To exercise your autonomy, you must learn to share space with others. Let me give an example. In most companies I have worked at, friction between product management and software development teams is common. Why? Each would feel autonomous in certain decisions and would pursue them independently. The product team might independently develop a prioritized roadmap, expecting the development team to follow orders. Alternatively, the development team might independently plan to address technical issues that would disrupt the product team&rsquo;s intended timelines. Each would become upset that the other made those decisions without consulting them. The result is damaged cooperation and a diluted focus on outcomes. A better alternative is to share the space - that is, exercising your autonomy in a collaborative setting. Most of us mistake autonomy for speed, but, contrary to this perception, pursuing autonomy within a collaborative setting is faster than pursuing it independently. Try it out. It will take you a long way.</p>
<p><strong>There is more to technical strategy than writing it down</strong></p>
<p>Search your company’s intranet - you might find several discarded or partially implemented strategy docs, 5-page one-pagers, or 10-page 6-pagers. Strategy is much more than writing it down.</p>
<p>What is strategy? Strategy is the process of driving change from point A to point B. It involves choosing what to do and what not to do. You articulate the strategy in terms of goals, choices, initiatives, and metrics. Then you go through the moves to implement the strategy, which is where the rubber meets the road. Business schools teach models for implementing strategy. While I won’t go into the details of those models, here are some questions to consider:</p>
<ol>
<li>Did you get the hard facts right? The strategy can’t just be “we are going to build this and this.” Have you identified the hard facts to show that doing those things would lead to material benefits?</li>
<li>Do you have the credibility to implement the strategy? Do people trust you? Have you already earned the stripes?</li>
<li>Is there commitment behind the strategy? Do you know who the stakeholders are, and whether they agree with and are willing to defend the strategy’s objectives? The commitment needs to be deeper than lip service. You want people to be excited about the strategy.</li>
<li>Is the timing right? Are the conditions suitable for change? If not, should you wait?</li>
<li>Do you have the right alliances to implement the strategy? Who all needs to work on the implementation? What’s in it for them?</li>
<li>Do you have the right people to execute the strategy? Do they have the skills?</li>
<li>How do you propose to manage change? Strategy may require people to let go of existing ways of doing things, and you may face resistance to change. How do you propose to address such resistance?</li>
<li>Do you have the proper organizational structure to support the strategy?</li>
<li>How will people make decisions during strategy implementation? Who decides? Who provides inputs? Who is accountable for what?</li>
<li>How will you make tradeoffs and manage risks? What are the guiding principles?</li>
<li>Do you have quantitative or qualitative ways of measuring progress?</li>
<li>What processes are required to manage the implementation? Processes help catch blockers early and rebuild necessary alignment as things change.</li>
</ol>
<p>Having answers to questions like this can make strategy implementation fun and rewarding. In their absence, strategies will languish as merely decorative slides or loftily produced documents.</p>
<p><strong>Do less harm</strong></p>
<p>This one is particularly important to me this year. We live in an interconnected world. Most of the choices we make at work or in our personal lives contribute to harm. We all understand direct harm, such as injuring someone or stealing something, and we don’t intentionally engage in such acts. Unfortunately, most of the harm we inflict in the contemporary world is structural and not individual. The fact that you live in a particular place and vote a certain way can make life less equitable for a class of people. A product you build at work can directly displace jobs for a group of people that you may not even know exist. Our shopping habits might have enabled a few oligarchs, who may then have funded activities you would disapprove of. That is the nature of an interconnected world, and structural harm is part of it. Jay Garfield, a renowned Buddhist scholar, elaborates on this &ldquo;structural violence&rdquo; in his <a href="https://blogs.dickinson.edu/buddhistethics/files/2025/03/Garfield-_FD_25-1.pdf">Buddhism and Nonviolence in the Contemporary World</a>. Read it, or better yet, listen to <a href="https://www.youtube.com/watch?v=zQ5CCFjycvY">his lecture</a> at the University of British Columbia in 2023 on the same topic. As he rightfully says in that lecture, &ldquo;ethics is meant to be demanding.&rdquo; Thinking about ethics should trouble us.</p>
<p>Furthermore, 2025 has been a surreal year. Hundreds of thousands more died, and millions were displaced due to war and genocide. We have developed sufficient inertia and political unwillingness to do anything about climate change. Bullying is now an acceptable form of public discourse. Most of the wealthy joined the bullies and narcissists to fortify their fortunes and economic interests. Systems of governance, policy, trade, healthcare, and welfare are being actively rewritten. It is now socially acceptable to belittle and bully the less privileged.</p>
<p>Unfortunately, we are not neutral observers watching the action between perpetrators and victims. We are all part of that action. You may be right to say that it is better than it has ever been historically, but that doesn&rsquo;t change anything if you are on the receiving end. What do you do in such a situation? Engage. Speak up. Support things that minimize harm at work and in personal lives.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[The Beginning of the End of Artisanal Software Crafting]]></title>
            <link href="https://www.subbu.org/articles/2025/end-of-artisanal-software-crafting/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/end-of-artisanal-software-crafting/</id>
            
            
            <published>2025-12-17T20:39:48-08:00</published>
            <updated>2025-12-17T20:39:48-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>We are likely the last generation of developers to have an emotional attachment to the shape of our code. After letting AI modernize a 14-year-old codebase to make it faster and better at low cost, I realized that the era of artisanal software crafting is beginning to end; we are entering the age of industrial software production, and each of our cheeses is going to move.</p>
<hr>
<p>The last time I coded fiercely was during 2011-12. Back then, <a href="https://en.wikipedia.org/wiki/REST">REST</a> and HTTP APIs were the rage. <a href="https://en.wikipedia.org/wiki/Node.js">Node.js</a> was young and rapidly gaining popularity and adoption. I just left Yahoo to join eBay. While at Yahoo, I witnessed the traction <a href="https://en.wikipedia.org/wiki/Yahoo_Pipes">Yahoo Pipes</a> got for easily integrating multiple public APIs and feeds into responses that had the data you needed. However, Yahoo Pipes was a hosted service, and developers could not use it to integrate with their companies’ APIs. Soon after joining eBay, I built a quick prototype of a SQL-based query engine in Node.js to easily aggregate eBay’s internal APIs. In that prototype, I modeled each API as a table and used SQL for selects, filters, joins, and related operations to massage response data. It was lightweight and fast.</p>
<p>I called it <a href="https://github.com/ql-io/ql.io">ql.io</a>. It was like <a href="https://graphql.org">GraphQL</a> before it was introduced in 2015. While GraphQL modeled data as gs a graph, ql.io modeled data sources as tables. A few leaders at eBay saw my demos and encouraged me to keep going, and I went into a mad coding spree. I wrote a more elaborate query grammar, used an open-source parser generator to compile SQL-like scripts into an execution tree, built an engine to orchestrate HTTP requests, and created a graphical user interface with syntax highlighting to learn the syntax and quickly try it out. A few more engineers joined me, and we continued building it. People who saw the demos loved it, and we <a href="https://github.com/ql-io">open-sourced</a> it in November 2011. However, by late spring of 2012, despite receiving nearly 1,000 stars on GitHub, the project struggled to gain adoption both within eBay and beyond. We decided to abandon the project and pursue other areas. I have not touched the code since then, and it rotted badly.</p>
<p>Then, two Saturdays ago, I downloaded <a href="https://kiro.dev/">Kiro</a> (it could have been Cursor or another tool, but Kiro had free credits to get me started), forked ql.io, and pointed Kiro at the codebase. I provided some context about the project and asked Kiro to analyze the codebase. In about a minute, it gave me a detailed analysis of the good, the bad, and the ugly, highlighting long-broken dependencies, language changes, callback hell, long-retired test frameworks, vulnerabilities, and more. I then asked Kiro to propose a detailed plan to modernize it. I set constraints, such as not breaking module-level interfaces and ensuring the test suite remains functional at every step. It gave me a 10-step project plan with detailed steps. I asked some probing questions to modify the plan.</p>
<p><em><strong>We</strong></em> (my dev servant and I) then got to work. Over the following days, we modernized the codebase to work with the latest version of Node.js, adopted modern language features such as promises to address callback hell, upgraded all tests, and rewrote the examples. Through this process, I got Kiro to add more tests to address some lightly tested areas, fixed all the vulnerabilities, wrote a performance test suite, set up test gates on pull requests, and even generated infrastructure code to deploy ql.io on AWS using a serverless architecture — all without touching any code artifacts. Mind that I had to pull Kiro out of rabbit holes, challenge its proposals, and force it to backtrack the changes multiple times. But in the end, it turned out okay. Kiro made thousands of edits to the code, and I did not even bother to review the changes, other than asking Kiro to play the role of an annoying code reviewer and account for the feedback. I leaned on tests to ensure the correctness of what Kiro did.</p>
<p>In case you’re curious, see the <a href="https://github.com/s3u/ql.io">fork</a> and the <a href="https://github.com/s3u/ql.io/blob/master/UPDATED_DEC_2025.md">AI-generated summary</a> of modernization. The codebase is AI-generated, and it does what it was meant to do.</p>
<hr>
<p>THIS IS SCARY AND EXCITING.</p>
<hr>
<p>I believe we are at the very <strong>beginning of the end of artisanal software crafting</strong>, and <strong>we are about to enter into industrialized software building.</strong></p>
<p>How we practice software today is artisanal. In this mode, we carefully choose languages and tools to craft code and develop an attachment to them. We have opinions about its shape and structure, and we have ideas about its beauty and elegance. We build religions around languages and code. Then we set up tools and processes to address the complexity of building software in teams. We create roles such as architects, designers, test engineers, performance engineers, infrastructure engineers, and site reliability engineers to tackle different aspects of building and running software. We do all this because building software has been time-consuming, and we spend our working hours playing these roles and following the processes. The artisanal way helps us cope with that complexity. But we may be the last generation to practice this craft in this way.</p>
<p>When I wrote ql.io, I learned a lot. I developed better mental models of what to build and how to build. You could wake me up at night, and I could explain the design and structure. I could apply the lessons learned in the years that followed.</p>
<p>But this rewrite was different. I had Kiro play the roles of a project manager, an architect, a Node.js developer, a performance test engineer, an infra engineer, and a code reviewer. I felt like I was the master, a jack-of-all-trades focusing more on the &ldquo;what&rdquo; and less on the &ldquo;how.&rdquo; Yet, other than becoming effective at guiding Kiro, I didn’t learn much. But I cleared 14 years of code rot in a few days. The rewrite didn’t take multiple people and months. It was cheap. I could throw it away and do it again in a few days. This is industrial software production. Software thus becomes a fungible, like that trinket you buy on Temu.</p>
<p>While I continue to stand by <a href="https://www.subbu.org/articles/2025/ai-slop-in-code-future-is-here/">my skepticism</a> due to AI hallucinating and having jumbled representations of concepts, AI-native development environments have gotten so much better to get almost the same kind of experience you would have with an imperfect colleague. After all, we are all imperfect in some way.</p>
<p>In the coming months and years, we will continue to industrialize software production. The cost of producing software will likely plummet. We will likely enter an era of cheaply constructed software abundance. Our relationship with code is about to change in ways we didn’t expect even a couple of years ago.</p>
<p>Will we continue with the belief that “programs must be written for people to read and only incidentally for machines to execute” (this was from the first edition of <a href="https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs">Structure and Interpretation of Computer Programs</a>)? Does it matter if people no longer understand the code as long as machines (including LLMs) can read, create, and manipulate the code? Likely not, as software production gets industrialized.</p>
<hr>
<p>As we go through this shift, each of our cheeses will move—some at a crawl, others at a sprint. Our current organizational structures were designed for a world where people handcraft code at a specific, manageable pace. But when production speed increases by an order of magnitude, &ldquo;artisanal&rdquo; habits become bottlenecks.</p>
<p>It will soon be impossible for teams to justify spending weeks on tasks that an &ldquo;agent whisperer&rdquo; (I am borrowing this phrase from a friend of mine, <a href="https://www.linkedin.com/in/sankaran">Anand,</a> who helped me clarify my thoughts for this article) can orchestrate in a few hours. It can get very, very difficult for individuals and teams to justify why they do things in a certain way. It can be difficult for specific tools, internal platforms, functions, and roles to justify their existence. Brace yourself for the change.</p>
<p><strong>If you are an engineer:</strong> Relinquish the glamor of being an artisan. Stop measuring your value by the code you write and start measuring it by your impact. Become an &ldquo;agent whisperer.&rdquo; You define the &ldquo;what&rdquo; and set the boundaries of correctness to meet that &ldquo;what.&rdquo; In an industrial setting, the generalist who can steer the machine is king.</p>
<p><strong>If you are a manager:</strong> Get hands-on to learn what&rsquo;s possible, and then figure out how to lead change to produce some intentional productivity wins. Don&rsquo;t just hand out AI licenses and hope for the best.  Plunge into the discomfort. Consider your team a system and determine what to dismantle to serve a high-throughput world.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[The Future is Here, If You Are Ready]]></title>
            <link href="https://www.subbu.org/articles/2025/ai-slop-in-code-future-is-here/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/ai-slop-in-code-future-is-here/</id>
            
            
            <published>2025-12-04T20:33:48-08:00</published>
            <updated>2025-12-04T20:33:48-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>These are exciting times to be a hands-on software developer. A decade ago, the excitement was about learning and adopting cloud services. Although everyone benefited, not everyone had the opportunity to be on the front lines adopting the cloud, because most of the innovation and change happened at lower levels of the software stack. It is different this time. Innovation and excitement have now landed in development environments like Cursor, Kiro, Copilot, Antigravity, and Claude Code. For the first time, you can experience intent/spec-driven software development: you can declare your intent to your AI-native IDE, and, based on its understanding of the codebase, let it generate code and orchestrate developer workflows. These development environments are now active collaborators.</p>
<p>But there is a catch. The underlying tech hallucinates, lacks conceptual understanding, and is incapable of consistently creating correct, maintainable, and secure code. Unless you get the basics right, we’re looking at AI slop creeping into our codebases and many slow-moving organizations being left behind this wave.</p>
<p>Here is what contemporary research says.</p>
<p>First, LLMs hallucinate. Hallucinations are not bugs; they are inevitable, and scale laws are not the answer to eliminating hallucinations. Though OpenAI <a href="https://arxiv.org/pdf/2509.04664">disputes</a> the claim that hallucinations are unavoidable, research argues otherwise. For example, a widely cited paper, <a href="https://arxiv.org/abs/2310.01469">LLM Lies: Hallucinations are not Bugs, but Features as Adversarial Examples</a>, points out that hallucinations are a property of LLMs and are merely examples we don’t like. Another paper this year, <a href="https://arxiv.org/abs/2409.05746">LLMs Will Always Hallucinate, and We Need to Live with This</a>, challenges the notion that we can fully mitigate hallucinations. I also found papers showing that neither parameter scaling (larger models) nor inference scaling (longer execution) reduces hallucinations.</p>
<p>Second, LLMs lack conceptual understanding. LLMs develop <a href="https://www.amazon.science/blog/do-large-language-models-understand-the-world">internal representations with semantic value</a>, but they don’t understand concepts in the way we do. There are also examples to show that LLMs’ internal representations are a jumble of contradictions. See, for instance, <a href="https://arxiv.org/abs/2506.21521">Potemkin Understanding in Large Language Models</a>.</p>
<p>Third, though there are techniques to minimize hallucinations, there are limits. For example, Chain-of-thought (CoT) prompting can reduce hallucinations by instructing an LLM to decompose the problem. However, research shows that such prompting can also make <a href="https://arxiv.org/abs/2506.17088">hallucinations appear more coherent and plausible</a>. In other words, CoT can make hallucinations more credible. Retrieval-augmented generation (RAG) is a practical option to reduce hallucinations, and yet it does not eliminate hallucinations. For example, the paper <a href="https://www.mdpi.com/2227-7390/13/5/856">Hallucination Mitigation for Retrieval-Augmented Large Language Models: A Review</a> gives several reasons why RAG won’t eliminate hallucinations.</p>
<p>In the context of software development, there is ample research showing security and maintainability issues. For example, Veracode’s <a href="https://www.veracode.com/wp-content/uploads/2025_GenAI_Code_Security_Report_Final.pdf">GenAI Code Security Report</a> found that about 45% of code-generation tasks contained security flaws. They also confirm that larger models don’t perform significantly better than smaller models. Related research shows that more code-generation iterations don’t improve the situation. With respect to maintainability, there is evidence showing increased code smells, redundant dead code, etc., that contribute to long-term debt. See, for example, a recent <a href="https://www.sonarsource.com/company/press-releases/the-coding-personalities-of-leading-llms/">Sonarsource report</a>. Though I’m citing two reports from companies with commercial interests in the problem space, search <a href="https://arxiv.org">https://arxiv.org</a> to find ample research papers with examples.</p>
<p>Jonathan Ostroff, a York University professor, <a href="https://jso.eecs.yorku.ca/2025/09/07/llms-the-illusion-of-thinking/">summarizes</a> the impact of these limitations very succinctly:</p>
<blockquote>
<p>Beyond tests, my experience with LLMs is that they have no concept of software requirements, architecture, and design.</p>
<p>* What is the structure of the system?</p>
<p>* What are the software modules?</p>
<p>* What is the relationship between them?</p>
<p>* Information hiding: What are the externally visible properties of modules at the interface, i.e., the externally visible properties that other modules using it rely upon?</p>
</blockquote>
<p>Where does this leave us? It means two things: first, we can’t rely on LLMs alone to ensure correctness (including quality, robustness, and security) and maintainability (testability, adherence to the coding practices prevalent in your organization, code smells, etc.) of the code they generate. LLMs are too unreliable to guarantee correctness and maintainability. There is a mistaken belief among some developers that you need to find the next best model and get the prompt right to produce correct, maintainable code. That’s not the case. You can’t prompt your way out of this.</p>
<p>But this problem is not new in software development. We have been building reliable systems out of unreliable parts. What you need is closed-loop thinking to yield reliable outcomes, which, in the case of code generation, include code correctness and maintainability. In a closed-loop system, you have an idea of a desired output, and you give an input to the system that you hope will give you the desired output. You then measure the actual output, detect the difference between the actual and desired outputs, and adjust the input to reduce that difference.</p>
<p><img src="/articles/2025/control-loop.png" alt="Control loop"></p>
<p>I’m really excited to see that AI-native IDEs like Cursor, Kiro, Anti-Gravity, Copilot, and others are fast approaching a point where you can begin building correct, maintainable code in a closed-loop setting. It’s time people let go of their classic IDEs. This new genre of AI-native IDEs will surely improve rapidly, helping developers enhance code correctness and maintainability.</p>
<p>We need to get three things right to get the most value out of these tools: (1) well-written specs that encapsulate not only your intent, but also the practices you want the output to follow, and your correctness expectations; (2) comprehensive tests that can validate correctness of your code, and (3) the CI/CD machinery to get fast iterations.</p>
<p><img src="/articles/2025/coding-control-loop.png" alt="Coding control loop"></p>
<p>Most folks I talk to seem to focus more on picking the right AI-native IDE or the next best model, but the focus should be on designing the specs, investing in tests, and building a solid CI/CD feedback loop that enables rapid iteration. In fact, the next generation of CI/CD systems may look different to enable lightning-fast iterations.</p>
<p>Those organizations that already have a culture of comprehensive testing and decent CI/CD systems have a significant advantage now. Those can leapfrog others in terms of developer productivity and rapid reductions in time-to-value. But those with complicated release processes, manual handoffs, difficult-to-test code bases, broken dev/test environments, and painful-to-work-with CI/CD systems will not be able to AI their way out of their pain. That’s the stark reality.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Leading in Low-Trust Times]]></title>
            <link href="https://www.subbu.org/articles/2025/leading-in-low-trust-times/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/leading-in-low-trust-times/</id>
            
            
            <published>2025-11-23T09:57:51-08:00</published>
            <updated>2025-11-23T09:57:51-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>The tech world has been experiencing a low-trust climate in recent years. Cynicism is the air. Widespread and repeated layoffs, the mechanical and impersonal handling of layoffs, delayering, shrinking team sizes, disappearing backfills, tightening budgets, etc., have created a sense of scarcity and mistrust among the rank and file of many tech companies. In such a climate, it is delusional to think that employee trust and engagement toward their leadership has stayed the same as before.</p>
<p>The issue of trust has come up multiple times in my recent conversations with my tech friends. They all shared the same view: the tech industry enjoyed a relatively high level of trust until around the time of the pandemic, but that is no longer the case. One friend even said that having people report to you is now a liability - though it sounds like an extreme case, it might be true in some companies. More and more, people don’t seem to believe their leadership’s strategy and decisions. Additionally, there is fear and uncertainty about getting caught up in the next round of layoffs. Would you trust your leadership chain in such a situation?</p>
<p>Low-trust situations at work have consequences. Ignoring such situations only prolongs the damage. In a low-trust climate, your team would be less willing to follow your lead to support your vision and strategy. They might see your inspirational pep talks about why things are great as delusional or tone-deaf. They would be less enthusiastic or even apathetic to the purpose of your team - why bother when things seem to be falling apart, or you could be out in the next round? Given their fear of uncertainty, they would be less likely to be collaborative and more likely to fall back on poor organizational citizenship behaviors, such as self-benefit and preservation. Organizational citizenship is a psychological concept that refers to voluntary behaviors that go beyond formal job requirements to improve team performance, reduce friction, and generally foster a positive culture. Low-trust situations eventually create a vortex of cynicism. Engagement suffers, and good people will leave the team. This doesn’t sound very optimistic, but we are psychological beings that rely on reason to justify emotions and instincts.</p>
<p><img src="/articles/2025/low-trust.png" alt="Vortex of cynicismm"></p>
<p>It is not my place to judge decisions in the tech industry. These companies have experienced leadership and boards, and they do what they believe is necessary to pursue their economic interests and fulfill their fiduciary duties. You and I don’t have to agree. Companies and industries undergo periods of change for various reasons. Over twenty-five years in the tech industry has taught me that change is constant, and we experience cycles of things we like and things we don’t.</p>
<p>So, how would you lead when your teams don’t trust you?</p>
<p>A common response is to stay silent and hide behind prepared remarks. You might think, after all, that you are not the one who caused the low trust situation, so you would let “them,” the executive leadership, the board, the investors, or some similar group, figure it out and fix it. Or you might act like a victim, vent to your team and peers, and blame the “people upstairs.” Your team may sympathize with you and see you as a buddy on their side, but such behavior won’t help you lead or be an effective manager. These passive leadership behaviors lack humility, courage, and authenticity and keep fueling cynicism.</p>
<p>The solution to this challenge isn&rsquo;t complicated. The best way to handle such situations is to stay authentic. Authenticity is the antidote to fight back mistrust and cynicism. Here are some techniques to consider:</p>
<ul>
<li>
<p>Begin by listening and acknowledging the situation. Create a climate where people feel comfortable telling you how they are feeling. You may not have answers, but people appreciate it when their managers listen and acknowledge how they feel. When I faced low-trust situations, I resorted to listening tours and unscripted Q&amp;A sessions.</p>
</li>
<li>
<p>Be open, honest, and straightforward. Don’t hide behind scripted statements. Transparency, even when the reasons for a low-trust situation may not be popular, helps repair trust. Tell your teams like it is. Transparency is a hallmark of authentic leadership.</p>
</li>
<li>
<p>Only then, provide or co-develop an objective direction. When possible, provide a framework and invite the teams to participate in that process to address the challenges they face. Create conditions for people to collaborate. Collaborative problem solving improves organizational citizenship behaviors. In a collaborative problem-solving setting, attention shifts from scarcity to abundance.</p>
</li>
</ul>
<p>Low-trust situations are not uncommon. Companies go through phases we sometimes don’t like. Leading through such situations calls for authentic leadership. Rekindling trust may be hard and time-consuming, but not complicated.</p>
<p>One last word: the sky is not falling. The tech industry is still one of the few careers where we get paid to learn every day. Over the last thirty-plus years, this industry has created opportunities for many. Most of us in this industry have reinvented ourselves multiple times. The industry is not going away anywhere. The opportunities to learn and reinvent yourself are not going to disappear tomorrow.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Tangled Mess]]></title>
            <link href="https://www.subbu.org/articles/2025/tangled-mess/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/tangled-mess/</id>
            
            
            <published>2025-10-26T09:11:42-07:00</published>
            <updated>2025-10-26T09:11:42-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>Once upon a time, our software was simple. All it took was a database, a user interface, and some glue code between them, running behind a web server farm, to go online. Most of the business-critical data stayed in the database. People rented space in colocation centers and bought servers to run their databases and code. Those colocation centers were not reliable, and your business could go down due to power or cooling failures. The servers were also not reliable, and you could lose data due to disk failures. A nasty cable damage somewhere, and the network could be out for hours or days. To get around such booboos, IT teams rented space in secondary colocation centers, bought servers and expensive replication systems to replicate data to those secondary sites, and took steps to bring up secondary sites in the event of disasters.</p>
<p>Businesses were worried about doing business with other companies whose infrastructure failures could hurt them. So legal people got involved to add contractual language to their agreements. Those clauses required their vendors to implement disaster recovery policies. In some cases, those contracts also required declaring procedures for recovering critical systems at the secondary site, testing them once or twice a year, and sharing the results. Since breaches of such contracts could lead to termination of business agreements, companies hired compliance professionals to draft rules for their tech teams to follow. Tech teams begrudgingly followed those rules to ensure their backups and replication were working and that they could bring up the most critical systems in the secondary colocation centers. Paying such a disaster recovery tax made sense because the infrastructure was unreliable.</p>
<p>It was okay, sort of, until the cloud happened. Cloud providers started offering a variety of infrastructure services to build software. Open source gave us even more flexibility to introduce new software architecture patterns. As engineers, we loved that choice and started binging on it, adopting whatever cloud companies began offering. Of course, this choice gave us a tremendous speed advantage without requiring years of engineering investments to build complex distributed systems. Those services also began offering higher fault tolerance and availability than what most enterprises could fathom. Moving systems from on-prem to the cloud became necessary to take advantage of that flexibility. Many people have built their careers around cloud transformation, and that is still ongoing.</p>
<p>For a while, cloud services were flaky. It fell to customers to keep their businesses running even when a cloud provider’s systems were down. It seemed sensible to work around those problems and build redundancy in a second cloud region. Many people tried that pattern. Some, like Netflix, succeeded, or at least are known to have succeeded; I don’t know if that is still the case today. Many had partial success to the extent of getting some stateless parts of the business running from multiple cloud regions.</p>
<p>Around the same time, the SaaS industry took off. The proliferation of online systems has increased complexity and fueled the hunger for automation across enterprises. This created opportunities for SaaS-based companies to fill that gap and offer a variety of services, from infrastructure to customer service to finance to sales and marketing. Relying on third-party SaaS became a necessity for every enterprise. You can no longer take code to production without depending on a subscription or pay-as-you-go service from another company. The net result of this flexibility and abundance is that almost everything is now interconnected.</p>
<p><img src="/articles/2025/tangled-mess.png" alt="We are a tangled mess"></p>
<p>We are now a tangled mess. There are no more independent systems. Our systems share the fate with large swaths of the Internet. Almost every business now depends on other companies, mostly consuming their services. Thus, all bets on building redundant secondary sites are off. You not only have to get your part right, but you also need all your dependencies to do the same to be fully redundant. Most companies can’t even make their software redundant across multiple locations due to the variety of services they are building, their interconnectedness, and the types of infrastructure needs. After all, building highly available and fault-tolerant systems requires more discipline, talent, and time than most enterprises can afford. Let’s not kid ourselves.</p>
<p>Where does this leave us?</p>
<p>First, get unstuck from the old paradigm of redundancy in secondary sites. That is over-simplified thinking. It no longer makes sense for most companies to waste their precious resources on building redundancy across multiple cloud regions. Yes, cloud providers will fail from time to time, as last week’s <a href="https://aws.amazon.com/message/101925/">AWS us-east-1 outage.</a> Yet they are still incentivized to invest billions of dollars and time in the resilience of their infrastructure, services, and processes. As for yourself, instead of focusing on redundancy, invest in learning to use those cloud services correctly. These days, most cloud services offer knobs to help their customers survive disasters (like automated backups, database failovers, and availability zone failures). Know what those are, and follow meticulously.</p>
<p>Second, if you truly need and care about five or more nines of absolute (i.e., not brown-out) availability for your business, make sure your business can afford the cost. To achieve such availability, you have to do several things right. You need the right talent who understands how to build highly available, fault-tolerant systems. In most cases, you have to develop that talent in-house because such talent is rare. Then you need to standardize patterns like <a href="https://docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/what-is-a-cell-based-architecture.html">cells</a>, global caches, replication systems, and eventual consistency for every critical piece of code you create. You will need to invest in paved paths to make it easy to follow those patterns. Implementing those patterns takes time, and you need to get them right. Most importantly, you also need a disciplined engineering culture that prioritizes high availability and fault tolerance in every decision. Your culture needs to embrace constrained choices and sacrifice flexibility in favor of high availability and fault tolerance.</p>
<p>Third, somehow cajole your compliance and legal people to refine or avoid the dangerous parts like “secondary sites.” Unless your company’s architecture is stuck in time, like 20 years ago, such language no longer makes sense. Refining such language can be easier said than done since some contracts are dated, and fixing that may be the least important priority for your legal teams. Don&rsquo;t get me wrong. You still need to invest in game days and similar failure-embracing exercises to build resilience in your culture. But how you practice resilience needs to evolve.</p>
<p>We are indeed in a tangled mess. Resilience is costly. Know what you need, figure out the business cost, and do what you can.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Rock and a Hard Place]]></title>
            <link href="https://www.subbu.org/articles/2025/rock-and-a-hard-place/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/rock-and-a-hard-place/</id>
            
            
            <published>2025-08-04T13:09:13-07:00</published>
            <updated>2025-08-04T13:09:13-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>It&rsquo;s not worth rehashing that the tech landscape is undergoing a tectonic shift. Thirty minutes on LinkedIn can feel like being caught in a stampede. While some find it exciting and share their enthusiasm openly, I bet many managers are confused, exhausted, and burned out privately. Most are probably leading teams unprepared to adopt AI, unsure how to get involved, understaffed to meet their current workload, and uncertain about how far tightening budgets will go. It’s a good case of feeling stuck between a rock and a hard place.</p>
<p><img src="/articles/2025/rock-and-a-hard-place.png" alt="Stuck between a rock and a hard place"></p>
<p>On the one hand, there is an AI-led technology change happening at a rapid pace. There are new ways of building software that were not possible until now. However, finding strategic, credible guidance is hard, and developing an independent point of view is time-consuming. The signal-to-noise ratio is too low for most people to discern potential from hype. Further, AI investments are still early, but their returns have not yet been fully proven or justified. Where do you even start? If you and your teams aren&rsquo;t already using AI or developing AI agents, you might be worried about falling behind. It is natural to feel concerned about staying relevant in this change.</p>
<p>On the other hand, companies have been cutting back on headcount. The era of large tech teams with many layers of managers appears to be over. Will we go back to the highs of 2022 anytime soon? Likely not. I came across a <a href="https://www.wsj.com/business/the-biggest-companies-across-america-are-cutting-their-workforces-a0e8739a">WSJ article</a> a few days ago that shows most of us in the tech industry already knew: tech jobs peaked sometime during the first half of 2022, followed by a steady decline since the middle of 2023. The percentage of manager jobs has been declining even more rapidly. Simultaneously, there is an implicit call to most managers to leverage AI tools to show productivity gains. But, given the nature of software engineering jobs and various company cultures, situations, legacy, and technical debt, showing productivity gains with any AI-based productivity tool is easier said than done.</p>
<p>Amidst these constraints, it is not unreasonable to feel confused, exhausted, or burned out. What do you do about it? I’ve spent almost three quarters exploring this topic, and here are my suggestions to managers.</p>
<p>Begin by giving up the notion that these constraints are unfair or that you are immune. Business models, economic factors, and business leadership create such constraints now and then. These constraints create opportunities for some but may disadvantage many. It is fair to want to understand what is driving such constraints, but there is no point in feeling like a victim or debating the fairness of such constraints. Instead, I recommend focusing on adapting your leadership style and your teams to the changing situation. But what does this mean in practice? For example, in steady state, your default management style may involve an infinite loop through work intake, execution, and delivery. Such steps allow you to maintain stability. That style won’t work when you want to adapt yourself and your teams for change. To prepare for change, you ought to focus on finding blockers and enablers for change,  inspiring the team, rallying them to embrace change, and providing adequate air cover for change.</p>
<p>Second, tone down the common managerial instinct of treating your org size as a proxy for your impact. The tech sector enjoyed a period of getting headcount to generate new business value. It’s excellent if your org size grew because of that, but I suspect that any such growth would be highly restrained for a while. Instead, focus on creating and showing the impact of the headcount you already have. What matters more is the outsized economic value you can generate without putting your teams through death marches.</p>
<p>Third, most importantly, create space for your team to adapt. Instead of waiting for new headcount that is unlikely to materialize, figure out what is keeping your teams busy and develop a strategy to reduce the workload so that they can invest that time in learning new things and experimenting. Here is a process that might work.</p>
<ul>
<li>
<p>Start by thoroughly diagnosing what is keeping your teams busy. Such a diagnosis will help you improve your understanding of the nature of your team&rsquo;s work, how they receive new work, current processes, prevalent culture, etc.</p>
</li>
<li>
<p>Determine how much time your teams spend maintaining the current systems instead of on new projects that create new value. You may notice technical (like technical debt, quality gaps, and fragile systems in production), process (poor planning, unclear expectations, too many handoffs, poor documentation, etc.), or team/culture-related challenges (unproductive assumptions, apathy, etc.) behind the busyness of your teams.</p>
</li>
<li>
<p>Use such a diagnosis to also reflect on your leadership behaviors and mistakes, such as poor delegation, confusing organizational design, slow decision-making, and lack of role/goal clarity.</p>
</li>
<li>
<p>Create a roadmap to address the findings and simplify your team’s work. Make sure to incorporate people (training, experimentation), processes (planning, communication, etc.), structures (like org design, dependencies, etc.), along with tech in your roadmap. Drive a sense of urgency and inspire the team on why it matters. Get involved to unblock your teams. Make organizational and process changes to simplify the way work is done.</p>
</li>
<li>
<p>Along the way, identify opportunities to leverage AI for repetitive, mundane, or grunt work.</p>
</li>
<li>
<p>As you see results that create space for your team, invest that time to build an objective AI strategy that is aligned with your business objectives.</p>
</li>
</ul>
<p>In other words, there is no magic fix for dealing with these constraints. Steps like the ones above are just part of managing a team. Sometimes you work to bring stability to the team, but other times, you thoughtfully disrupt the current ways of work to drive change. Employ the latter style to create efficiency, and use the savings to invest for the future.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Hard Things First]]></title>
            <link href="https://www.subbu.org/articles/2025/hard-things-first/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/hard-things-first/</id>
            
            
            <published>2025-07-12T21:16:20-07:00</published>
            <updated>2025-07-12T21:16:20-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>Excellence is unlikely to happen if you don’t address the hard problems early in project execution. Habits for cultivating excellence won’t form unless you shed light on hard problems from the start. Excellence requires practice, and you need the team to work through the strenuous parts to build endurance. Psychologically speaking, teams build confidence in themselves when they solve the hard parts early. Self-efficacy enhances a team’s morale and attitude, creating a positive feedback loop that fosters high performance. Simply put, when you lead a team to confront challenging aspects, the team will cultivate the right habits for excellence, and their efficacy levels increase, ultimately leading to improved team performance.</p>
<p><img src="/articles/2025/hard-things-first.png" alt="Hard things first"></p>
<p>Many project ideas fail to reach their full potential for excellence because people either overlook the challenging aspects or assume that those issues will be addressed in some unspecified future. Unfortunately, hard problems rarely become easy over time unless you act. When you or your team formulates a new idea or goal, most get excited about starting something new. There is hope of achieving remarkable success, driving value for your customers or stakeholders, and thereby reaping personal benefits, such as recognition or career growth. As people work on those ideas, more often than not, reality sets in, excitement fades, and the team performance gradually reaches its level of mediocrity.</p>
<p>Even when you build a <a href="https://en.wikipedia.org/wiki/Minimum_viable_product">minimum viable product</a> (MVP) and want to incrementally improve it, unless you make principled choices early and create the proper infrastructure to practice incremental improvements, you may struggle to enhance your product beyond its MVP.</p>
<p>Often, the hard things may be technical, specific to the systems you work with. Let me give you an example from my personal experience to illustrate the point. At one point, in an enterprise-level transformation project, addressing a massive, yet critical, legacy piece of software was the hard problem. In the first incarnation of that transformation project, the project founders didn’t diagnose the current state to identify the hard problems. They started the project and asked the people to run. The project picked up pace, but folks began solving smaller and more convenient aspects of the project. The hard problem remained. Some people became skeptical and didn’t believe in the project’s success because they knew the hard parts, but they were not forthcoming or influential in changing the course. Several months later, the project had to be paused and restructured to address the hard problem and reignite the fire in the project.</p>
<p>However, sometimes the hard problem may be the organization’s readiness or the necessary alignment required for the project to be successful. In one particular case, I had to delay the tactical execution of a project since the team was not ready. The hard problem was finding the right leader and then fixing the team structure. In a more recent situation, there was a struggle to integrate AI into a team’s ways of working. But the hard part was not AI — it involved (a) teams not having the time due to the current busyness, (b) some debt that was contributing to their busyness, and (c) not knowing where to employ and benefit from AI. The team began leveraging AI once we started addressing those hard parts.</p>
<p>I hope I persuaded you of the benefits of tackling the hard problems early. But how do you get going?</p>
<p>First, start with a thorough diagnosis of<a href="https://www.subbu.org/articles/2025/diagnose-before-you-delegate/"> the situation</a> to identify the hard problems. Diagnosis is one of my favorite leadership tools. Most leaders and teams are persuaded and sometimes misled by the words and phrases used to describe outcomes, and fail to take the time to question why success is guaranteed. It’s no wonder projects fail or never rise above mediocrity. Diagnosis helps identify potential blockers for success. It can help reveal organizational, technical, and cultural obstacles.</p>
<p>Second, you must then have the backbone to acknowledge and have the power to influence others to focus on the hard parts. Acknowledging the hard parts privately is one thing, but influencing others to recognize them takes work. People may ignore you and mistake you for a naysayer who does not believe in the leadership or the organization. This brings me to my third point.</p>
<p>Third, practice surfacing and solving hard problems. Start small and gradually build a track record and credibility. Work hard at building the track record early in your career. Recognizing, acknowledging, and solving hard problems is a hallmark of leadership excellence. Such excellence, too, requires practice over time.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Frame for Success]]></title>
            <link href="https://www.subbu.org/articles/2025/frame-for-success/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/frame-for-success/</id>
            
            
            <published>2025-07-02T23:12:14-07:00</published>
            <updated>2025-07-02T23:12:14-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>Language is a loose construct for exchanging ideas, though it is the best tool we have. We try to distill a complex mix of difficult-to-explain mental phenomena and express them through words, hoping that those receiving the message can recreate the same mental images in their minds. But that’s an impossible expectation because that’s not how our minds work. In reality, people on the receiving end interpret those words using their own unique mental processes to assign meaning. Communication is such a difficult thing.</p>
<p>The same is true for problem-solving. Each of us sees the same problem differently, based on our individual experiences, skills, attitudes, and motivations. Essentially, the sender and receiver use their flawed transcodings.</p>
<p>So what? Any big goal you present to a large group can be interpreted in many ways. Individual and team skills, attitudes toward each other and the organization, and personal motivations all influence this process. They cause people to use different mental models to understand the problem and figure out how to solve it. That’s why, in most organizations, as goals are passed down to teams and then to individuals, people develop their own interpretations and come up with creative ways to connect what they believe matters to the organizational goal.</p>
<p>The result: Scattered focus, where everyone’s attention is spread across multiple subgoals, tasks, and outcomes, leading to poor team performance and subpar outcomes.</p>
<hr>
<p>It is the leader’s job to create focus, helping most of the organization see the same problem in the same way, so that the team employs a cohesive set of techniques to solve it. That’s the task of framing the problem. In my previous article, I discussed the importance of <a href="/articles/2025/diagnose-before-you-delegate/">diagnosing before delegating</a>. Framing is another essential step to incorporate before delegating.</p>
<p>Poor framing often leads to poor performance. Here’s an example: once, a team achieved outstanding results in a year, which was impressive. The following year, their performance was sloppy, and they failed to make a significant impact. Why? It was the same team and similar conditions. What changed? An analysis revealed an issue with how the problem was framed. The problem was too vague; people interpreted it differently, and they didn’t focus on finding and fixing the root causes. In other words, the team’s focus was scattered, resulting in poor performance.</p>
<p>In another instance, several smart individuals came together to address a few problems. They all used the right words to describe the situation. They wrote documents outlining what should be done. They formed working groups, held multiple meetings, and provided status updates. Nine months later, nothing had come of it. Why? Their problem statements at the beginning were vague — they sounded correct but failed to create focus, leading to wasted time and missed opportunities.</p>
<p>Such situations taught me that high performance is neither a constant nor a fixed attribute of any team. Just because you bring the best people together to solve a problem doesn’t mean the group will deliver a great outcome. You need to focus on framing the problem in a way that helps the team perform.</p>
<hr>
<p>What is framing the problem? Let me offer three characteristics of well-framed problems.</p>
<p>First, framing a problem is like taking a picture with a narrow depth of field, which brings the subject into sharp focus while blurring the rest of the scene. It involves emphasizing specific aspects of the problem and bringing them into focus while diverting attention from non-essential parts. A well-framed problem leaves less room for misinterpretation. It is intentionally specific about what matters. A well-framed problem fosters alignment among different teams and stakeholders, as everyone understands what truly matters.</p>
<p>Second, due to its narrow depth of focus, a well-framed problem is not open-ended but constrained. People involved in the project would immediately understand what not to prioritize. When the constraints are explicit, everyone knows which problem to address first and what to tackle next. Unconstrained problems, on the other hand, can lead to scattered efforts and potential misalignment among the various participants working on the problem.</p>
<p>Third, a well-framed problem also includes conflicting key results. Let me give you an example. One particular problem involved replicating a large amount of data with a high consistency guarantee but also requiring a certain failover time budget to switch between the primary and the replica. Solving for one or the other is easier than solving for both. This conflict spurred creativity. Initially, the team found it uncomfortable to tackle this conflict, but they eventually found a solution. I used this technique a few other times, and every time, we found creative approaches to handle the conflict. In his book, <a href="https://www.goodreads.com/book/show/60018618-unreasonable-hospitality">Unreasonable Hospitality</a>, Will Guidara shares similar examples of this technique.</p>
<hr>
<p>To reiterate, don’t assume everyone gets it just because you said so. Work on framing the problem to create focus, add necessary constraints and conflicts before delegating the problem. Do this early in any project execution. Such a process can help increase focus and alignment, as well as spur creativity.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Diagnose Before You Delegate]]></title>
            <link href="https://www.subbu.org/articles/2025/diagnose-before-you-delegate/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/diagnose-before-you-delegate/</id>
            
            
            <published>2025-06-14T23:48:53-07:00</published>
            <updated>2025-06-14T23:48:53-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>Diagnosis is often an overlooked step in goal setting, project planning, and execution. I have come across many projects where a senior leader proclaims a worthy goal, some get excited, and most nod — after all, the goal sounds right. The leader then delegates the goal down the hierarchy, and six months later, little progress is made. Eventually, the following year&rsquo;s planning cycle arrives, and old goals are replaced with new ones, repeating the drill. It’s a symptom of a slowly decaying organization with low performance and little accountability.</p>
<p>A more common occurrence is paltry outcomes: goals are well-intended, sound right, are delegated appropriately, people start with excitement, but then encounter execution hurdles; timelines slip, results don’t materialize, people lose faith in the goals, and the goals fizzle out sometime later. So much time and energy lost.</p>
<p>Such instances are relatively common in large organizations due to the sheer complexity of problems and the numerous layers of people involved in completing tasks. Reason? It is usually not an issue of intent or team competence, but rather the missed crucial step of leaders not diagnosing the problem before crafting goals, launching projects, and delegating them down the organization.</p>
<p>I have made this mistake myself a few times. In one case, I led a goal formulation exercise to set goals, delegated them to the respective teams, and waited. Nothing happened. Reason? I had just assumed that everyone knew how to break the problem down and execute. Big mistake. Recognizing this, I conducted a root cause analysis, an effective diagnostic tool. I gathered a few in front of a whiteboard and began asking questions about the problem, how they were attempting to solve it, the hurdles they were facing, the assumptions they were making, and so on. That exercise blew my mind, as I found that the team was stuck due to some technical hurdles, unclear problem decomposition, self-imposed constraints, and unhelpful assumptions. That diagnostic exercise helped me figure out how to bring the project back on track. Participants of that exercise also enjoyed the process as they saw a path forward, and their moods lifted.</p>
<p>In another case, we had a big organizational goal, but one of the teams took some shortcuts in the architecture for expediency. I was uncomfortable with those shortcuts but didn&rsquo;t act. The team gained the initial momentum, but that didn’t last long. Execution slowed down as complexity and debt accumulated. My mistake was not intervening early to diagnose the problem and set the appropriate course of action. In that situation, I didn’t challenge the prevalent beliefs that led to those shortcuts.</p>
<p>The lesson is to incorporate diagnosis into your leadership practice. Diagnosis is a valuable tool for enhancing team performance. You can&rsquo;t drive change and improve team performance without incorporating diagnosis before and even after delegating. Ignoring diagnosis makes you a laissez-faire leader, i.e., one who does not feel the need to provide direction, distances themselves from poor team performance, and eventually avoids accountability. On the other hand, an effective leader would employ diagnosis to form crisp goals, design metrics that matter, craft constraints to drive focus, and design the proper execution rituals for high performance.</p>
<p>But how do you go about diagnosis?</p>
<p>First, begin by moderating the bias for action. You must pause everyone from jumping into action to instead focus on developing a thorough understanding of the problem space, the nature of the outcome, and the constraints involved. Some may get upset with you for holding up everyone, but it is necessary. In one case, when a CTO inspired everyone to pursue an ambitious goal, everyone ran to execute. However, six months later, it became clear that people were running in different directions, solving the easier parts of the problem while ignoring the more difficult parts. Meanwhile, skeptics remained on the sidelines, as they did not see a clear path to success; they waited for the project to fail or for someone to rescue the project. The project regained its traction only after an intensive diagnosis was conducted to establish a structure, set guardrails, and implement a prioritized sequence to solve the problem.</p>
<p>Second, when diagnosing, cut through organizational layers. Don&rsquo;t prematurely delegate the diagnosis to someone. Be active during the diagnosis. Never hesitate to ask questions. If your organizational hierarchy consists of multiple management layers, don&rsquo;t hesitate to go down a few layers below to bring people to a common forum, set the stage, and get down to diagnosis. Don’t worry about not respecting the management layers. Involve them in the process instead.</p>
<p>Third, use diagnosis to discover prevalent assumptions. Ask questions to understand how others perceive different aspects of the problem. What one team considers a significant problem may not be a major issue in the broader context. Similarly, a minor inefficiency or inconvenience at the team level may compound into a bigger deal at the broader organizational level. What may be an efficient approach at a team level may be expensive at a wider level due to its side effects. A well-conducted diagnosis helps you develop shared context across your teams — all participants in the diagnosis benefit from that context. Shared context also helps improve trust because everyone is heard and receives a more comprehensive understanding of the problem. You may also discover prevalent beliefs and attitudes, and learn about how work is done. For example, you might find the prevalence of a fixed mindset or helplessness regarding particular challenges, such as known but often overlooked process inefficiencies, technical debt, and rarely questioned issues, as well as misplaced assumptions about peer teams. Diagnosis helps remove that fog.</p>
<p>Use diagnosis as a leadership tool as often as you need. Simply asking questions is a good start. Consider frameworks like the &ldquo;five whys&rdquo; to ensure your diagnosis is exhaustive.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Leadership Fundamentals and Tech]]></title>
            <link href="https://www.subbu.org/articles/2025/building-influence-with-tech/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/building-influence-with-tech/</id>
            
            
            <published>2025-03-18T08:16:03-08:00</published>
            <updated>2025-03-18T08:16:03-08:00</updated>
            
            
            <content type="html"><![CDATA[<p><a href="https://www.linkedin.com/in/kachchani/">Yassine Kachchani</a> recently interviewed me for his <a href="https://yeka.substack.com/p/learning-to-lead-building-developer">Exec Engineering</a> newsletter. I am crossposting the interview on this site for posterity.</p>
<hr>
<h2 id="highlights">Highlights</h2>
<ul>
<li>Leading teams with firmness and humility</li>
<li>Transforming teams beyond technical solutions</li>
<li>Building developer platforms for flow state</li>
<li>Managing hands-on leadership in small teams</li>
<li>Navigating AI disruption through rapid experimentation</li>
</ul>
<p><strong>Yassine: You&rsquo;ve written extensively about the human aspects of technical leadership. What sparked your interest in the psychology of leading engineering teams?</strong></p>
<p><strong>Subbu:</strong> I came across a fascinating statement by <a href="https://en.wikipedia.org/wiki/Paul_H._O%27Neill">Paul O’Neill</a> several years ago: “With leadership, anything is possible, and without it, nothing is possible.” Let’s zoom out for a minute and consider all the big positive things in recent history. We can’t name many that happened without strong leadership. But, to appreciate this statement, we must know what leadership is. Leadership is nothing but influencing others to follow you. Most of us get that point, but how do you influence others? That question prompted my interest in the psychology of leadership.</p>
<p>Influencing is a serious business. It takes intense self-development, learning about others, and perspective-taking. To influence others, you need to recognize and accept that we are all motivated by different things. You have to model the right behaviors and set the standards for excellence so that others will follow you. It takes inspiring others to do things they wouldn’t otherwise do. You have to have a track record of past outcomes to have the credibility to inspire others. You have to have the tenacity to stick with ambiguous situations. You must have the backbone to take a position and fight for what you believe is right and the humility to let go and yield to others. Above all, you must learn to manage your attitudes and emotions better daily. These are all aspects of human psychology.</p>
<p><strong>Y: Throughout your career, you oversaw major technical transformations that changed how hundreds of engineers worked. What have you learned about leading teams through significant technical change?</strong></p>
<p><strong>Subbu:</strong> I was lucky to have dealt with a few technical transformations over the last 12-15 years. Most of those were complex and required naivete, patience, and humility. Once I got a taste of the first few, I pursued more such opportunities as I found such work incredibly rewarding. Those experiences taught me two good lessons.</p>
<p>First, care enough and then build the courage to put your hands into ambiguous problems. Every company has such issues. These are complex and depend on multiple teams to agree, with many unknowns and no clear path forward. Most organizations struggle and rot when not enough people care and dare to stand up and say, “I’m going to give it a try and get it done.” You also need to build that capacity and culture in your organization.</p>
<p>Second, most technical transformations are not technical at all. They appear to have a technical problem at the core, but once you begin to peel the layers, you will stumble on structural, cultural, and leadership issues. For example, one of the messy transformations I dealt with involved aligning several leaders and their teams over a sustained period. In another example, it took a few organizational tweaks to give space for a few teams to work differently and have the right goals. There were technical components in these transformations, for sure, but those were less significant when compared to driving and managing the change. So, the lesson is to look at problems that require a transformation as change management or adaptation problems, not technical ones.</p>
<p><strong>Y: As both a builder and leader of developer platforms, what patterns have you found most valuable for improving developer productivity?</strong></p>
<p><strong>Subbu:</strong> In my experience, the most useful and successful developer platforms focus on creating the flow state. How do you get to a flow state? You typically get into the flow state when your goals are clear, most steps to realize those goals are clear, and the tools you use give you clear feedback and guide you to move code from your keyboard to a live environment where you can experience the output of your work. In this process, how various tools work well together is more important than the popularity of individual tools. But if most things you need to do force you to pay attention to things outside your goal accomplishment and get lost into rabbit holes to make things work, you won’t reach the flow state.</p>
<p>So, here is my message to teams building developer platforms: focus on simplifying choices, providing clear feedback, and offering a friction-free end-to-end experience to facilitate the flow state. Don’t get distracted by popularity wars like this tech vs. that tech. Engineer your approach to create the flow. Look at your code structure, build systems, test environments, release pipelines, and infrastructure choices, and engineer those to enable a smooth flow. That will help you allow a higher throughput of work.</p>
<p><strong>Y: From your experience building teams of different sizes, what have you found essential for building high-performing engineering teams?</strong></p>
<p><strong>Subbu:</strong> I once made the mistake of imagining that I must do such and such to build high-performance teams. I thought of a prescriptive approach based on what I saw other leaders do and tried to follow. My approach failed miserably. That’s when I realized that what helps drive performance needs to be situational. Many factors go into building high-performing teams, but what works in one situation may not work in another. You have first to diagnose the current situation to determine what may be blocking strong performance. It varies from team to team and organization to organization. Could it be goal setting? Could it be cultural norms? Could it be a structural issue? Could it be politics? Based on your diagnosis, determine what needs to happen to improve team performance.</p>
<p><strong>Y: Many of our readers are leaders running small engineering teams. What advice would you share with leaders who are trying to balance staying hands-on while building their leadership capabilities?</strong></p>
<p><strong>Subbu:</strong> In such cases, you should be ready to wear multiple hats, like managing projects, reviewing code, reviewing or even documenting designs, triaging bugs, etc. To be effective at these, you have no option but to balance being hands-on while acting as a manager-leader for the team. You can’t just do one or the other.</p>
<p>On this note, allow me to refer to a reproduction of a 1950s article in the Harvard Business Review — <a href="https://hbr.org/1974/09/skills-of-an-effective-administrator">Skills of an Effective Administrator</a>. The author, Robert Katz, a management Guru from that era, wrote about three skills for managers: technical, human, and conceptual. Even though that article is over 70 years old, his recipe still holds good.</p>
<p><strong>Y: Following your <a href="https://www.subbu.org/articles/2025/one-day-ai-coding">recent one-day AI coding experiment</a>, what aspects of engineering leadership do you think will become more crucial, not less, as “AI coding” becomes the norm?</strong></p>
<p>Subbu: Driving and managing change is the most essential skill to sharpen to accommodate this AI disruption. The landscape has been rapidly changing and will continue to change for a while. It is also going to be very noisy. The barrier to entry is lower, and the required skills are less specialized than a couple of years ago.</p>
<p>Companies are going to have to figure out how to derive value from this disruption. There are many hypotheses to be tried out, which will require a lot of experimentation across the board. While most experiments will likely fail, those that succeed might alter how people work. This is no longer a technology problem but a change management problem. To be successful, you have to find comfort in letting go of stability to let teams learn, experiment, and be comfortable failing fast.</p>
<hr>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[My One-Day AI Coding Experience]]></title>
            <link href="https://www.subbu.org/articles/2025/one-day-ai-coding/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2025/one-day-ai-coding/</id>
            
            
            <published>2025-01-03T15:11:43-08:00</published>
            <updated>2025-01-03T15:11:43-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>I set a goal for January 2nd: create a Q&amp;A bot to answer questions based on all the articles I wrote over the years and all the Twitter messages I sent. I wanted to complete it in a single day. My project involved crawling my blog, parsing all my tweets, using RAG with the embeddings from parsed content, indexing those in a vector store, and calling an LLM to process my prompts to answer questions. I also wanted to use GitHub Copilot with Visual Studio Code to see how fast I could go. I did some prep work by reading a LangChain <a href="https://python.langchain.com/docs/tutorials/rag/">tutorial to build a RAG app</a> and got some basics working before starting.</p>
<p>My experience blew my mind. By mid-afternoon, I had most of it working. I got so excited that I had to step out to run to cool myself. There are clear implications for dev productivity, generalist software developers, and leaders.</p>
<p>For context, my coding credentials are shallow: I’ve not coded in a while and will not pass a serious Staff Engineer coding interview. Yet, I completed my project by the evening.</p>
<h2 id="my-experience">My Experience</h2>
<p>Let me begin with my developer experience. I generated new code using GitHub Copilot and iterated to meet my needs. Copilot generated more than 50% of my code. I let Copilot teach me how to fix some runtime errors. I asked it to improve my code to handle edge conditions. I generated unit tests and used those tests to find minor issues. I prettified the code and generated documentation. Look at my prompt history to get an idea.</p>
<blockquote>
<p>Write code to crawl a website to find all the unique links on that site. Ignore non HTML content.</p>
</blockquote>
<blockquote>
<p>“Prettify this file.”</p>
</blockquote>
<blockquote>
<p>“Write unit tests for the parser.”</p>
</blockquote>
<blockquote>
<p>“Catch the edge conditions in this file.”</p>
</blockquote>
<blockquote>
<p>“How do I clear indexes in OpenSearch from the command line?”</p>
</blockquote>
<blockquote>
<p>“Write Python code to convert tweets.js in the data subdirectory to JSON and then parse it to extract fields id, created_at, and full_text.”</p>
</blockquote>
<blockquote>
<p>“Adjust the parse_tweets.py code to sort the output by created_at in the ascending chronological order.”</p>
</blockquote>
<blockquote>
<p>“What&rsquo;s wrong with line 29?”</p>
</blockquote>
<blockquote>
<p>“Add code to index embeddings of parsed_tweets to OpenSearch in the file parse_tweets.py file.”</p>
</blockquote>
<blockquote>
<p>“Send one document at a time on line 55.”</p>
</blockquote>
<blockquote>
<p>“Refactor index-the-blog.py and crawler.py to remove duplicated code. Move the crawl and crawl_the_site methods from index-the-blog.py to crawler.py. Also, adjust the unit tests in test_crawler.py accordingly.”</p>
</blockquote>
<blockquote>
<p>“Add response headers for all mocks in test_crawler.py.”</p>
</blockquote>
<blockquote>
<p>&ldquo;Write better code.&rdquo;</p>
</blockquote>
<p>The generated code and Copilot suggestions were not always correct, but I could fix issues quickly to keep moving. The end product works and does what it is supposed to. I indexed all the content in OpenSearch and created a basic command-line Q&amp;A bot. The answers are not spectacular, as the information in my tweets is shallow, but the bot works. You can check it out on <a href="https://github.com/s3u/say-it-like-subbu">GitHub</a>. I could feed more content to the bot to make the answers useful and continue to iterate on it.</p>
<p>I tried the last prompt (<code>&quot;Write better code&quot;</code>) after switching  Copilot to use Sonnet 3.5 Preview to make my code respectable and faster by switching to async IO. It also added more error checks, retries, logging, and configuration. This prompt promoted me from a junior engineer to a senior!</p>
<h2 id="implications">Implications</h2>
<p><strong>Don’t be a skeptic and wait.</strong> We are already at a point for double-digit productivity gains. My coding days started with <code>vi</code>. Back in the day, getting <code>ctags</code> to work with <code>vi</code> to navigate code felt awesome. Later, debugging and refactoring with IDEs like IntelliJ brought modest productivity improvements to handle structurally more complex code. However, AI-assisted IDEs offer the opportunity for double-digit productivity gains to complete a lot of glue work involved in software development.</p>
<p>Sceptics will argue that the generated code is imperfect and point to examples of when the generated code was silly or incorrect. But I question such attitude as being narrow. Given <a href="https://news.mit.edu/2023/explained-generative-ai-1109">how generative AI works</a>, AI-generated code is usually good enough to iterate. <strong>AI assistance makes it easy to consume borrowed knowledge</strong> (like searching Stackoverflow). Once you have assembled the building blocks with an assistant like Cipilot, it is up to you to iterate on it to make it work. Your mileage will vary based on the code and task complexity. However, consider that coding is no longer about writing every character by yourself but about assembling solutions by reusing prior work. AI-assisted IDEs help you iterate the assembly part of coding faster. If you are in tech, learn to take advantage of such tooling instead of waiting skeptically.</p>
<p>Another common skepticism about productivity gains is the argument that most developers spend most of their time on non-coding tasks. While this is likely true, it is an argument for improving inefficiencies in the developer flow, not against using AI-assisted tools.</p>
<p><strong>Generalists have tremendous opportunities to learn and broaden their skills.</strong> The AI space continues to be democratized, significantly lowering the bar for entry. Even two years ago, I could not have done what I did in this project without much more training, expertise, and time. I was, in fact, motivated to work on this project because I felt challenged when someone said, “We need the AI team to help us build a RAG for the chatbot.” I wanted to find out if that is still the case.</p>
<p>My experience shows that most generalists could put together decent solutions, leaving the specialists to focus on more advanced tasks. Most of the complex parts of such solutions deal with usual full-stack development issues like provisioning cloud resources, setting up roles and access policies, collecting and processing data, putting together a user experience, collecting logs and metrics, etc. So, if you are a generalist software developer, learn to put together such solutions.</p>
<p><strong>If you are a manager leading tech teams, figure out how to activate your team.</strong> Leadership faces some challenges: ignorance of what is possible, skeptics in their teams, and organizational bureaucracy preventing such tech adoption. Handle these challenges as a priority in 2025. Get your hands dirty to learn what is possible with these tools and form opinions to shape the direction of your teams. Then, figure out ways to activate your teams, create early wins, persuade the skeptics, and learn to benefit from these tools.</p>
<p>There are as many industry claims of significant developer productivity as there are that counter such claims. A recent <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4945566">MIT, Princeton, UPenn, and Microsoft research</a> showed a 26% increase in task completion by developers. Another <a href="https://uplevelteam.com/blog/ai-for-developer-productivity">study by Uplevel</a> showed that Copilot introduced 41% more bugs. Given the complexity of the software we deal with, both could be true in different circumstances. Such tooling will not eliminate the human in the loop but might help reduce some grunt work. The only way to find out is by trying it out rather than ignoring it. The SDLC will continue to be disrupted throughout 2025 and beyond. Ignorance or apathy is not a strategy for success.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Twenty Tiny Leadership Lessons]]></title>
            <link href="https://www.subbu.org/articles/2024/twenty-tiny-leadership-lessons/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/twenty-tiny-leadership-lessons/</id>
            
            
            <published>2024-12-30T21:45:59-08:00</published>
            <updated>2024-12-30T21:45:59-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Most leadership learning is experiential. We observe, learn, and emulate from others, often subconsciously. Yet, the core of such learning starts shallow, leading to behavioral and decision-making mistakes, learned and uncorrected bad behaviors, and dysfunction. Some get better with experience and scope, but more often than not, we wing it, frequently repeating the same behaviors and mistakes for years. Recognizing this challenge, two years ago, I enrolled in a Master&rsquo;s program in the <a href="https://www.worldcampus.psu.edu/degrees-and-certificates/penn-state-online-psychology-of-leadership-masters-degree#courses">Psychology of Leadership</a> at Penn State University. It turned out to be an excellent investment of time and money. In this article, I share the top twenty things I learned from those studies.</p>
<p><strong>1. Roles and not traits:</strong> At its core, leadership is a role you play in a situation. You don&rsquo;t become a leader just because you show some personality traits. You are a leader when you can influence others to follow you to accomplish a common goal in a particular situation and not otherwise. To become a leader, you must create a willingness from others to follow and work with you.</p>
<p><strong>2. Followership:</strong> The leadership process also includes another critical role: that of a follower. Followership is not about unthinkingly obeying orders but about actively supporting the leader&rsquo;s vision and contributing to the team&rsquo;s goals. You can be a leader in one situation but a follower in another. You must be flexible and willing to follow others for effective organizational outcomes. You will be less influential if your ego prevents you from following others.</p>
<p><strong>3. Being a team member:</strong> Your other role is that of a team member. Consider an organizational setting. Say you manage ten people, and your manager manages eight people, you being one of those eight. What is your role? There are three roles to play. First, you play the leadership role for the people you manage. You could be their mentor, coach, cheerleader, supporter, etc. for those ten, but you are not their teammate. The second role is that of a follower to your manager. The third role you play is a team member with your peers. Being a team member is different from being a leader or a follower. It requires effective collaboration. As a team member, you establish partnerships, influence your peers, be influenced by them, drive or contribute to organizational decisions, and adaptively contribute to broader organizational goals.</p>
<p><strong>4. Leadership and management are complementary:</strong> J. P. Kotter, the management guru, described the <a href="https://hbr.org/2001/12/what-leaders-really-do">differences between leadership and management</a>: leadership is about driving and managing change, while management is about creating order and consistency to cope with complexity. The former involves establishing direction, showing a positive can-do attitude, the drive to get things done, creating a vision, inspiring others, clarifying the big picture, influencing and aligning, etc. In contrast, the latter requires planning, organizing, resource allocation, project execution, staffing, budgeting, incentives, etc. Learning about these differences helps you adequately invest in developing your leadership and managerial skills.</p>
<p><strong>5. Standards for excellence:</strong> Setting standards is a potent tool for driving change. From behaviors to technical or business goals, it is up to you to raise the bar of excellence. Setting standards for excellence is one of a leader&rsquo;s top three jobs. The other two are creating a willingness for others to follow and building teams. Don&rsquo;t accept the status quo. Keep on raising the standards for excellence. Doing so stimulates everyone&rsquo;s creativity.</p>
<p><strong>6. Three skills:</strong> Broadly speaking, leadership growth depends on acquiring three skills: technical, human, and conceptual. Technical skills are the usual domain-specific competencies to execute tasks and are usually the ones that get you your first job. Your leadership growth gets stunted when you find it challenging to work with others. Conceptual skills take you further into articulating visions and establishing roadmaps and strategies. Instead of coasting based on what you learned in school and winging, focus on developing these three skill groups.</p>
<p><strong>7. Task vs. relationship behaviors:</strong> Leadership effectiveness depends on balancing task-oriented and relationship-oriented behaviors. Task-oriented behaviors involve taking the necessary steps to get work done. In contrast, relationship-oriented behaviors involve concern for people. Excessively task-focused leaders usually lack strong human skills and ignore team building. They only focus on results. Excessively relationship-focused people care more about making people feel good than getting things done. People love to work for relation-oriented leaders but may not achieve their potential. You need to find a balance between the two.</p>
<p><strong>8. Power:</strong> Power is the leadership currency to influence others. Your technical expertise, brand, what you have, what others want, role and title, place in the organizational hierarchy, network, and ability to reward and punish others all contribute to your power. How you use them is up to you; your values, standards of behavior, and ethics help you appropriately use your power. As I wrote in <a href="https://www.subbu.org/articles/2023/mid-career-stuckness/">Mid-Career Stuckness</a>, a lack of understanding of one&rsquo;s own and others&rsquo; power and a failure to develop sources of power can get one stuck in one&rsquo;s career. Effective use of power also involves inspiring and motivating others rather than simply commanding them.</p>
<p><strong>9. Defining yourself:</strong> Gaining power and influencing others is not easy, and the situation may not be in your favor. For example, for whatever reason, your boss might have formed an inner circle that excludes you, thus giving you less access to challenging work assignments and resources. Gaining trust and entering that circle may take time and patience. Or, you may be in a less critical part of the organization with fewer opportunities for visibility and influence. Disrupting such a situation could be challenging, but I would not give up. Seek opportunities to contribute to broader organizational outcomes or keep driving improvements in your area. Expect resistance, but don&rsquo;t give up. You will have to find ways to continue to define your role instead of letting the situation box you into a definition. Be persistent.</p>
<p><strong>10. Being situational:</strong> There are many leadership theories, such as authentic leadership, transformational leadership, servant leadership, etc., but being situational is the most practical approach to leadership. It means exhibiting the behavior that the situation requires. To be situational, you must assess the situation and ask yourself what the situation needs. For example, showing anger and frustration is a valid response if the situation demands not tolerating someone&rsquo;s behavior at work. When your team is not yet competent in a particular area, it is OK to be hands-on and micromanage the tasks. But then, when a part of your team is highly proficient and requires the least supervision, it is OK to pay cursory and periodic attention. Applying the same style everywhere is usually the least practical leadership approach. See <a href="https://www.subbu.org/articles/2023/authenticity-and-acting/">Authenticity and Acting</a> for some examples.</p>
<p><strong>11. Being adaptive:</strong> One of the challenges of leadership is diagnosing the problem. Say you inherited a team that is under deep toil. People are overworked. The systems are critical, and yet there is ample technical debt that will take time to repay. People know the solutions to modernize but lack the competencies and time to drive change. What do you do in such a situation? Should you start to modernize the systems first to clear the debt? Should you make an organizational change? Should you fire the bottom performers and get new talent? Where do you begin? The book <a href="https://www.goodreads.com/book/show/6298697-the-practice-of-adaptive-leadership">The Practice of Adaptive Leadership</a> gives a framework for such situations. It describes two kinds of challenges: technical and adaptive. Technical problems have a clear problem definition and a solution. Adaptive problems, on the other hand, require learning and change to identify the problem and the solution.  Most organizational problems are not technical but adaptive.  For such problems, the path from the problem to the solution is not a straight line.</p>
<p><strong>12. Leading strategically:</strong> Strategic leadership is a foreign construct for most mid-management. Middle managers expect the C-suite to develop the company strategy and then hand it down to the hierarchy to align everyone&rsquo;s work to implement it. However, most organizations have areas that could use strategic approaches. For instance, most of my career involved building and improving horizontal platform capabilities to enable other parts of the company. Such areas are unlikely to become part of the overall strategy, and it is up to the mid-managers to lead strategically in their respective functions. But how does it work? Strategic leadership involves identifying a target state, establishing the business case to reach that state, mobilizing and aligning others for support, articulating the right goals and measures, running programs and processes to implement the strategy, and adapting as you go. The more senior you are in the organization, the more important such skills are. Without strategic leadership in the middle, organizations can rot.</p>
<p><strong>13. Ethics and being sensitive:</strong> A tricky and potentially taxing part of being a leader is dealing with sensitive topics where any response could harm someone or send the wrong message. Access to power gives leaders ample opportunities to misuse or abuse that power, creating a toxic work atmosphere. Even indecision in the face of bad behavior ruins the work culture. People overlay their morals and values onto the leader. There is an implicit expectation that leaders know and do what is right. You gain followership when your behavior conforms to and goes beyond such expectations. Alternatively, others lower their standards when they see their leaders lowering theirs. Hence, having the backbone to maintain moral, ethical, and behavioral standards is integral to being a leader.</p>
<p><strong>14. Motivations and attitudes:</strong> As a group activity, the leadership process involves interactions between people with different motivations, attitudes, and behaviors. Motivation drives people to behave a certain way, and attitudes reflect our positive or negative evaluations of the world. Our motivations and attitudes drive our behaviors. However, motivations and attitudes are internal to us, while behaviors are visible. It is worthwhile asking what motivates you. I use that information to develop and maintain positive attitudes. However, since it is tough to judge what motivates others, it is best to avoid guessing their motivations.</p>
<p><strong>15. Inspiring others:</strong> Storytelling and creating an inspirational vision is one of the least frequently used techniques for influencing others. Say you need another team to do some work to unblock your team. The most common path is to approach the manager of that team and ask them what you need from them and by when. The most common response you receive is to come back later since they are busy with their priorities. A better approach is to start with the why and make that team part of that why. When you get this step right, you and that manager will likely find ways to align your objectives for broader organizational success, thus creating a win-win situation.</p>
<p><strong>16. Goals, rewards, and mechanisms:</strong> People perform better when they know what they are expected to do, how their performance will be evaluated and rewarded, and when they have set mechanisms to follow to plan and organize work and track progress. Keeping these un-specified or under-specified leads to subpar performance. There is also a mistaken belief that people know what they are expected to do and how to get there and that there is no need to monitor progress. However, clarity of goals and progress-tracking mechanisms keep the focus and alignment.</p>
<p><strong>17. Watching for biases:</strong> As human beings, we take cognitive shortcuts called heuristics. But, heuristics lead to biases and decision-making errors. For example, based on some project outcomes, you might have concluded that a particular team is underperforming and their manager is incompetent. A closer inspection might have revealed factors outside the team&rsquo;s control. Developing critical thinking skills like role-playing, getting others&rsquo; opinions, and deeper analysis of the situation helps avoid biased decisions.</p>
<p><strong>18. Errors and dysfunction:</strong> We all like good leaders. However, we often encounter leaders who sometimes show dysfunctional behaviors such as indecisiveness, ineffectiveness, moodiness, and unpreparedness. There are a few techniques to practice to minimize such tendencies, like getting 360-degree feedback, including others in critical decisions, and developing self-awareness.</p>
<p><strong>19. Toxicity:</strong> Not all leadership is positive and healthy. Toxic leaders exist; you may work with or work for some of them. These are bullies, abusive, control freaks who purposefully punish or hurt others for personal gains. If you are fortunate, those are not above your level in the organizational hierarchy, so be candid with your feedback. If such toxic leaders are within your organization, act swiftly to weed them out. There is no need to tolerate such toxicity. But if you work for toxic leaders, walk out as soon as possible.</p>
<p><strong>20. Self-awareness:</strong> Finally, leadership requires self-awareness at its core. Can you sit down for ten minutes and treat every feeling, emotion, and thought that comes into your mind as an object separate from yourself? Can you detach from those and let them float by? Can you also do so amid a high-stakes discussion with others? You are self-aware when you can. Self-awareness multiplies your leadership in multiple ways. It helps you shift your focus from your wants and needs to the needs of others and the situation. It sharpens your sense of reality, thus improving your leadership presence. It helps you be situational and adapt to change. It reduces biases in your decision-making. But trust me, developing self-awareness is the hardest of all these lessons.</p>
<hr>
<p>I hope you find these lessons helpful. They helped me better influence, adapt my style to various situations, lead strategically, build a high-functioning team, and develop a solid leadership bench to produce solid outcomes. As Eduardo Briceño says in <a href="https://www.youtube.com/watch?v=YKACzIrog24">his TED</a> talk about alternating between learning and performance zones, it helps to learn about leadership without the pressure of performance so that when you get on that leadership stage to perform, you will have figured out some proper techniques.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Contemplative Reading]]></title>
            <link href="https://www.subbu.org/articles/2024/contemplative-reading/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/contemplative-reading/</id>
            
            
            <published>2024-12-01T14:52:27-08:00</published>
            <updated>2024-12-01T14:52:27-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Like most bibliophiles, I read many books and acquire even more than I can read. Most of my reading is non-fiction across philosophy, psychology, natural history, biographies, economics, health, and business leadership. But, over time, I realized that I forget more than 99% of what I read, and only a few ideas stick in my head. That’s sad. Why spend so much time and energy acquiring and reading books to gain just a few ideas or just the memory of having read a book? That changed this year. About a year ago, I stumbled upon contemplative reading to increase the quality of my reading experience.</p>
<p>Contemplative reading is a slow form of reading, usually involving the reader asking questions like</p>
<p>​	<em>What is the text saying?</em></p>
<p>​	<em>What does it mean?</em></p>
<p>​	<em>What does it mean to me in my life or situation?</em></p>
<p>​	<em>How would I explain this idea in my own words?</em></p>
<p>Essentially, you ask what the material is telling you. You ask yourself if and how it might apply to you. You make notes. You may write about it in your journal. You try to explain to others. Contemplative reading may also be repetitive, where you stay on each topic for hours or even days. This is a slow internalizing form of consuming information to assimilate the essence and blend it with the ideas you already have in your head.</p>
<p>On the other hand, the most common form of reading is fast and consumptive. We read or listen in to get the gist quickly. We want to read what everyone else is reading so we don’t miss out on good ideas. Such consumption is helpful in the short term, but perhaps not in the long term, as the ideas fade away and only the memory of the book survives in our minds.</p>
<p>Not every book deserves to be read contemplatively. For instance, most business/self-help style books are fluffy and repetitive; reading a summary or browsing such books may be good enough. But once you find the right book, contemplative reading is a low throughput high-ROI exercise. Contemplative reading expanded what I read. Now, I’m not afraid of picking up dense books that take time and effort. For example, during this summer and fall, I read Jay Garfield’s <a href="https://www.goodreads.com/book/show/1048288.The_Fundamental_Wisdom_of_the_Middle_Way">The Fundamental Wisdom of the Middle Way</a>. It was a dense commentary book on the philosophical arguments of a second-century Buddhist scholar, Nagarjuna. The text and ideas are abstract. I started reading it in the early summer and got frustrated as I could not understand most of what the author was saying. Then, I switched to a contemplative style from the first page. I made copious notes. I went back and forth. That experience changed what I got from the book, and it became one of my favorite books in my library.</p>
<p>By the way, contemplative reading is not new. Reading in most spiritual practices is contemplative, involving reading, meditating, praying, discussing, etc. It’s worth a try to get more out of reading.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Monkey Business]]></title>
            <link href="https://www.subbu.org/articles/2024/monkey-business/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/monkey-business/</id>
            
            
            <published>2024-10-06T10:08:00+05:30</published>
            <updated>2024-10-06T10:08:00+05:30</updated>
            
            
            <content type="html"><![CDATA[<p>In 1999, Harvard Business Review published <a href="https://hbr.org/1999/11/management-time-whos-got-the-monkey">Management Time: Who’s Got the Monkey?</a> This article uses a monkey metaphor to warn managers about accepting and carrying every problem that comes their way on their backs instead of deflecting or passing on such issues to others. It has been a popular article—I encountered it in multiple conversations. The metaphor of a monkey on the back is easy to explain. The metaphor is so powerful that it motivated me to address some root causes when I first came across it. Though I don&rsquo;t relate to the solutions proposed in that article, I used it in several coaching conversations. The metaphor helps debug the root causes behind managers struggling with busy calendars, not investing in themselves, not having detached vacations, or, more importantly, not having time to be strategic. In this article, let me introduce that metaphor visually and point out some techniques to address the root causes.</p>
<p>Below is a visual illustration of this metaphor — the visualization is mine. Imagine a manager walking in the corridor, encountering a team member struggling with a challenge, and gladly volunteering to solve their problem, thus inheriting a monkey on their back. This &lsquo;monkey&rsquo; could be a project deadline, a team conflict, or a technical issue. As the day went on, the manager would run into various other meetings dealing with misalignments, escalations, due dates, etc., and inheriting more &lsquo;monkeys&rsquo; on their back.  The manager would not mind inheriting one more &lsquo;monkey&rsquo; in their 1:1 with their manager. Thus, by the end of the day, the manager would have plenty of problems to address, i.e., &lsquo;monkeys&rsquo; on their back, leaving no time for self-care, team development, or strategic leadership. That&rsquo;s the gist of this metaphor.</p>
<p><img src="../monkeys.png" alt="Monkeys"></p>
<p>The metaphor sounds funny. It is easy to visualize others carrying monkeys on their backs. But when you are the one carrying those monkeys, how do you fix it?</p>
<p>An easy answer to managing the &lsquo;monkeys&rsquo; is to <strong>set boundaries and develop a thick skin</strong>. This doesn&rsquo;t mean being defensive or apathetic. It&rsquo;s about learning to say no to some issues, accepting others but not immediately, and becoming skilled at deflection. You might even decline some &lsquo;monkeys&rsquo; by providing a list of reasons. Many experienced managers use these techniques. However, it&rsquo;s important to remember that such defensive methods can make you seem unhelpful to others at work and be a poor organizational citizen. As I wrote in <a href="https://www.subbu.org/articles/2024/leadership-for-results-and-peace-of-mind/">Leadership for Results and Peace of Mind,</a> being useful is a leadership behavior I value. Hence, I don&rsquo;t recommend setting boundaries as the only technique. Use it moderately and appropriately.</p>
<p>What else can you do to pass monkeys with ease? Consider a few more essential factors that help you responsibly pass the monkeys.</p>
<p>The first thing to check is the <strong>structure and capabilities</strong> of your team. Ask a few questions:</p>
<ul>
<li>Do you have a clear charter for your team and an idea of what they are supposed to do and not do?</li>
<li>Have you defined the roles and areas of responsibility for each direct report? Do they understand their roles and areas of ownership? Are they capable of meeting those expectations?</li>
<li>Is your team&rsquo;s structure easy for others to understand? Do people outside your team understand who does what?</li>
</ul>
<p>If the answer to these questions is no, you may carry more monkeys than you should. You might not be set up to delegate effectively to your team. Your first challenge is to work on shaping your team. Having a bunch of direct reports does not make you a manager — you have to shape the team for easier management. You must organize the team and develop people for efficient execution and results. Without a clear charter and structure, others have no choice but to come to you for problem-solving. You can not delegate, i.e., pass the monkey, because you don&rsquo;t always know who to delegate it to. If others know who to get to, they might gladly bypass you, which helps reduce the influx of monkeys toward you. Effective delegation can be a game-changer — it develops others and gives you more control over your time and responsibilities.</p>
<p>The second thing to check is your team&rsquo;s <strong>operating processes</strong>.</p>
<ul>
<li>Do you have a ritual or forum to triage ad hoc issues? When someone is looking to hand off their monkey to you, can you instead show them the way of an existing process? The process could be as simple as a bug queue or a roadmap intake process.</li>
<li>Do you have a decision backlog and a decision-making process to groom that backlog of pending decisions or approvals? Some of the monkeys may be pending decisions and approvals. Instead of accepting such monkeys as they come, can you point them to the process?</li>
<li>Do you have a process to deep dive into your team&rsquo;s work so you&rsquo;re better equipped to know what your team is working on, the current state, and any lingering issues?</li>
</ul>
<p>Again, if the answer is no, it&rsquo;s time to take action. Well-designed and implemented processes are powerful. They streamline team management and equip you to handle incoming monkeys. Having such processes in place can make you feel more equipped and prepared to handle the challenges that come your way.</p>
<p>The third thing to check is whether you have a <strong>strategy</strong> for your team. A strategy involves determining what to do and what not to do. It&rsquo;s about making explicit choices concerning what is in your team&rsquo;s scope and what is not. I will get into the specifics of strategy development in a separate article, but a strategy provides a filter to decide what monkey to accept and what not to accept. Having a clear strategy can make you feel more focused and purposeful in your role as a manager.</p>
<p><img src="../monkey-line.png" alt="Separator"></p>
<p>Don&rsquo;t be mistaken — the central premise of this article is not about deflecting or passing monkeys so you can relax. It is about creating discretionary time on your calendar that you can use to invest in what matters. For example, if your answer to why you don&rsquo;t have a point of view on your team&rsquo;s strategy is lack of time, then you must find a way to make time. If you can&rsquo;t disconnect on your vacation because your team is not ready to manage independently for a few days, you&rsquo;ve not done a good job developing your team to step up occasionally. Your calendar tells you whether you have any discretionary time to pick up such developmental activities.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Leadership for Results and Peace of Mind]]></title>
            <link href="https://www.subbu.org/articles/2024/leadership-for-results-and-peace-of-mind/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/leadership-for-results-and-peace-of-mind/</id>
            
            
            <published>2024-07-05T12:04:46-07:00</published>
            <updated>2024-07-05T12:04:46-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>I deeply care about getting results. I like to see things improved. I also want to enjoy my work and like the people I work with to enjoy what they do. Plus, I like to have peace of mind every day. How do you get all three right most of the time, if not always?</p>
<p>After years of testing various ideas and behaviors, I developed a leadership framework that has proven effective in achieving results, enjoying work, and maintaining peace of mind. While there&rsquo;s no one-size-fits-all leadership recipe, I&rsquo;m eager to share a few key behaviors that have helped me and could benefit you.</p>
<p>The following factors motivated me to formulate these leadership behaviors.</p>
<ul>
<li>
<p>Leadership does not just begin at the top and flow down. Leadership is a process of influence. Your effectiveness depends on your ability to influence people across multiple degrees of separation. On the one hand, you are expected to direct and motivate your teams to get results, which can be challenging given expectations, budget, timelines, and their motivations and attitudes. On the other hand, you also need to influence your peers, your managers, their peers, and stakeholders inside and outside your organization to get the necessary resources, funding, support, and, most importantly, alignment.</p>
</li>
<li>
<p>Your work relationships and the influencing process come with emotional baggage. Ambiguity, constraints, setbacks, wins and losses, consequences of failures, power, politics, and other “soft stuff” challenge your psychological state. Very few people gracefully handle such “soft stuff.” To cope, many become passive, selfish, edgy, pushy, dominating, controlling, moody, arrogant, narcissistic, or dishonest. Most of these behaviors have consequences for others, which brings us to the next point.</p>
</li>
<li>
<p>Your character and balanced behavior matter to others. Here, I’m using the word character and not authenticity, as authenticity can mean different things for different individuals. Character has a simpler meaning — it refers to your moral and ethical qualities. As a leader, you can be a force for good for your company, your team, and other stakeholders. Or you can hurt others by playing against, blocking, taking credit, favoritism, etc. Leadership roles give you ample opportunities to be contemptible. The choice is yours.</p>
</li>
</ul>
<p>Given such diverse operating forces, how should one lead to (a) get results, (b) enjoy what they do, and (c) have peace of mind?</p>
<h2 id="the-framework">The Framework</h2>
<p>You can’t have peace of mind, foster an enjoyable working environment, and yet produce results unless you build a harmonious relationship between your role and pursuit, your attitude toward others, and the interests of others. My framework consists of five leader behaviors: (a) practice equanimity,(b) nurture power, (c) drive, (d) be useful, and (e) develop others. Of these five, equanimity is the foundation, on which you layer power to drive, being useful, and developing others. That’s my recipe.</p>
<p><img src="../five-behaviors.png" alt="Five leadership behaviors"></p>
<p>Some of these behaviors may sound paradoxical or defeatist to those who have worked for or learned from aggressive leaders, but as I clarify below, you can have the cake and eat it, too.</p>
<h3 id="behavior-1-practice-equanimity">Behavior 1: Practice Equanimity</h3>
<p>Equanimity, often overlooked in leadership, is a state of even-tempered mind. It allows you to handle victories, failures, praises, and abuses gracefully. This calm state of mind gives you the power of presence, the ability to listen, observe more, and react less. It enhances your self-awareness and emotional intelligence.  With equanimity,  you can lead complex issues with a steady hand and not panic. Most importantly, equanimity ensures you have peace of mind every day.</p>
<p>Equanimity increases distress tolerance and improves your ability to perceive reality, increasing your ability to make better decisions and handle healthy conflicts. When you are equanimous, you are less likely to be swayed by strong emotions or biases, which can distort your perception of reality. This balanced state of mind allows for more objective observation and understanding of situations, leading to a more accurate sense of reality and enabling you to make better decisions and handle conflicts.</p>
<h3 id="behavior-2-nurture-power">Behavior 2: Nurture Power</h3>
<p>Leadership is the process of influencing others to get things done. How do you influence others? You influence others through <a href="https://www.subbu.org/articles/2023/mid-career-stuckness/">various types of power</a>, such as your knowledge, how others perceive you, who you know, your credibility, the budget, and headcount you manage, who you report and manage, etc.</p>
<p>Power gives you leverage. The more types and quantities of power you possess, the more leverage you have to influence others to get things done. So, don&rsquo;t be agnostic of power and politics at work. Acknowledge that power and politics are part of the natural fabric of any organization. Understand the sources of power you have and the sources of power others have, and then continue to nurture your sources of power. It could include your leadership competencies, relationships, what you have done for them, budget, headcount, strategic projects, strategic capabilities, etc.</p>
<p>But don&rsquo;t get anxious about accumulating power. Be patient. Begin by analyzing your sources of power and weaknesses. Develop organizational awareness. Be strategic about nurturing power. Some sources of power, like the title, headcount, and budget, can disappear or change as companies change, whereas your relationships, competencies, and what you have done for others stay with you. Also note that power has a nasty way of corrupting your character. Be aware. You must develop a healthy relationship with power and politics.</p>
<h3 id="behavior-3-drive">Behavior 3: Drive</h3>
<p>Drive gets results. When you are driven, you will find things to improve. No drive, no results. Leadership does not matter much without results. Look around you — how many leaders are actively driving, and how many are just going through the managerial mechanics to stay the course?</p>
<p>Driving does not just mean doing what is expected and keeping things steady. You must have the foresight to see challenging problems and the backbone to stand up to address those. Driving involves challenging the status quo, stepping up, setting up <a href="https://www.subbu.org/articles/2024/goal-crafting">unarguable goals</a>, inspiring others, driving clarity, paving the path, creating necessary alignments, and organizing and operating to get results. To drive must be your job. Mind that drive does not come naturally to everyone. You have to practice again and again until it becomes your nature.</p>
<h3 id="behavior-4-be-useful">Behavior 4: Be Useful</h3>
<p>Being useful is a form of humility. Show humility and be useful to others. Seek to understand how your goals might help others and the broader organization. Ask your peers what you can do to help achieve their goals.</p>
<p>It might seem paradoxical and counter-intuitive to be useful to others instead of always focusing on what you want. Here is a secret — you increase your influence when you shift your focus from your goals to the goals of the broader organization. When you do so, your team will also collaborate more amongst themselves, and they, too, focus on shared goals instead of their narrow personal goals. Try it out — you will realize that being useful to others detoxifies your work life and contributes to your influence.</p>
<p>But being useful takes courage. What if others’ goals are so much more important than yours, and you might need to give up on them to support theirs? That’s possible. So be it. If that is the reality, face it.</p>
<h3 id="behavior-5-develop-others">Behavior 5: Develop Others</h3>
<p>Leadership is a team sport, and your role as their leader is that of a coach. You have two choices: treat your team as tools for you to use to get what you want, or treat them as individuals with distinct motivations and attitudes and invest in their careers by providing opportunities, stretch assignments, and increased scope. Exercise the former to get your way, but make it toxic for your team. Or, exercise the latter to reduce toxicity at work while increasing your leverage. Think of this analogy — when you invest in others, they will come to the war and fight for you, and you are less likely to die alone. It’s a win-win.</p>
<p>But you may only be able to develop some. So, use your intuition to pick your bets. Mentor and coach them. Open up stretch opportunities to increase their scope and performance. As they develop, so does your ability to produce results and influence.</p>
<h2 id="now-what">Now What?</h2>
<p>I didn’t come up with this framework overnight. It took years of asking why I wanted to lead. I experimented with different versions of my ideas to find logic and cohesiveness between them. I also spent nearly two years studying topics related to leadership psychology, such as goal setting, strategy, motivation, attitudes and behaviors, power and influence, ethics, driving organizational change, and leadership theories like servant leadership, transformational leadership, and authentic leadership. I complemented this activity with some philosophy studies.</p>
<p>Of the five behaviors I listed, equanimity didn’t initially make it to my list. But as I wrote and rewrote my framework and experimented with different ideas, equanimity bubbled up to the top. I consider it the most essential characteristic for living and leading well. I strongly recommend you take up some mindfulness practices to learn more about equanimity and how to get into an equanimous state. It takes rigorous practice. If you want inspiration about this quality, watch <a href="https://en.wikipedia.org/wiki/Ted_Lasso">Ted Lasso</a>. In <a href="https://youtu.be/8PmX7zEUg_w?si=IAbw0CPe9M_ADLeC">this clip</a>, what does Ted imply when he asks Sam to be a goldfish?</p>

    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8PmX7zEUg_w?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>The next one to assess is your sources of power and their reach. Nurture power. Don’t treat power as evil. I’ve written about power <a href="https://www.subbu.org/articles/2023/authenticity-and-acting">in</a> <a href="https://www.subbu.org/articles/2023/mid-career-stuckness">the</a> past with some references. I recommend reading <a href="https://www.goodreads.com/en/book/show/8562119">Power: Why Some People Have It and Others Don’t</a> and <a href="https://www.goodreads.com/book/show/198363.Managing_With_Power">Managing With Power</a> by Jefferey Pfeffer and <a href="https://www.goodreads.com/book/show/28815">The Psychology of Persuasion</a> by Robert Cialdini.</p>
<p>The foundation of equanimity and a moderate (not excessive) penchant for power equip you to drive. Being useful to others and developing others helps you lead larger, and these behaviors also contribute back to your equanimity and power.</p>
<p>Let me know if these ideas make sense. If you are interested in exploring your leadership and want to talk to someone, don’t hesitate to contact me. You can drop me a message on LinkedIn or email me at “subbu at this domain” for a coaching conversation.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Goal Crafting]]></title>
            <link href="https://www.subbu.org/articles/2024/goal-crafting/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/goal-crafting/</id>
            
            
            <published>2024-05-05T12:28:30-07:00</published>
            <updated>2024-05-05T12:28:30-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>Goal crafting is one of the most essential leadership activities. Organizational performance and team growth depend on well-crafted goals. Without a good goal-crafting exercise, your teams may focus on what is in front of their noses, solving what seems quickly solvable. Good goal crafting forces you not to ignore or postpone problems that require new ways of thinking, collaboration, or hardships. Without a good goal-crafting exercise, you can get stuck in the status quo or focus on what matters to you or your opinions, not what your stakeholders might need. Good goal crafting creates and drives your organizational strategy.</p>
<p>Here are my guidelines for setting objectives and key results. In this article, I use goal and objective interchangeably and consider <a href="https://en.wikipedia.org/wiki/Objectives_and_key_results">OKR</a> a practical goal-setting framework.</p>
<ol>
<li><strong>Make your goal unarguable:</strong> An unarguable goal is one that most people agree with as it aligns with the organizational principles and direction. You’ve already lost your battle when others debate and argue about the validity of your goal. A well-crafted goal makes people at least say, “Of course, we should do that,” or ask, “Why are we not already doing that?” Unarguable objectives are typically not subjected to individual opinions. People may disagree on how to accomplish such an objective but not disagree with the objective itself.</li>
<li><strong>Manufacture consent:</strong> A leader’s job involves creating willingness for others to work with the organization to support their objectives. Such willingness manufactures consent, and people will refer to the goal when debating priorities or choices. A well-crafted goal makes others associate with you as they like to see the same outcomes because it benefits them. Here is a litmus test — you’ve done an excellent job crafting an objective when other teams speak of your goal as their goal, too. That’s an indication of inspiration and manufactured consent. When others begin to talk of your goal as theirs, you have inspired others to work with you toward that goal, and you have a much higher chance of realizing the goal. You will likely struggle to get their time and support when that does not happen. When my team asks me to escalate some issue to another team, I usually probe the goal first. Often, the root issue turns out to be a misaligned goal and not understanding the broader context.</li>
<li><strong>Let it make everyone uncomfortable:</strong> Well-crafted goals should make your team uncomfortable. They should put them out of their comfort zone, testing their assumptions and technical and human-relationship competencies. Such goals require a growth mindset and learning things that have not been done before. On your part, a well-crafted gaol requires fierce determination and unwillingness to give up. It should force your organization to continually seek options to get around obstacles. In the best case, your organization finds multiple options when no option seems possible.</li>
</ol>
<p>What about key results? Consider two key attributes of key results.</p>
<ol>
<li><strong>Meaningful:</strong> Your key results should be meaningful to your stakeholders. You should craft the key results in terms of what makes sense and is beneficial to your stakeholders. For example, replacing five ways of doing something with one way might benefit your team and be operationally beneficial to them. But why should your stakeholders care about your team’s operational efficiency? What’s in it for them? Perhaps replacing five ways with one way might help your stakeholders eliminate some pain and make them productive. Think of that pain, and craft your key result to focus on that pain. Consider what matters to your stakeholders and not yourself.</li>
<li><strong>Measurable:</strong> Ideally, your key result should be measurable. Typically, objectives are qualitative, and key results are quantitative. Measurable goals force you to be data-driven, reduce the fog of opinions, and improve clarity. What you measure should usually mean something to your stakeholders. In the example of five ways of doing something, your key result could be to improve efficiency for your stakeholders by some percentage or to reduce the time they take to perform some tasks. Measurable key results help you track progress. People will know when they get to the finish line.</li>
</ol>
<p>What about things (i.e., tasks or activities) your team need to do to realize the objective and key results? Key results are outcomes your stakeholders want to see. Those are generally fixed. You might change or refine the activities when the going gets tough, but should generally keep the goals and key results the same. Track your activities separately from your objective and key results.</p>
<p>Be creative. Consider goal crafting as a leadership and team development exercise and not just a word-smithing exercise to represent what you want your organization to work on. Remember that goal crafting creates and enables your strategy.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Thought Spirals]]></title>
            <link href="https://www.subbu.org/articles/2024/thought-spirals/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2024/thought-spirals/</id>
            
            
            <published>2024-03-06T13:18:37-08:00</published>
            <updated>2024-03-06T13:18:37-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Have you been in situations where you are in a thought spiral and stay on for hours or days? It happened to me recently, and that was not the first time. Since I’m of the same species as everyone who might be reading this (except those bots that pretend to be human) and that it is a common source of made-up human misery, I decided to write down my observations.</p>
<p>Recently, I felt less in control due to how I had been processing various events at work and in my personal life. Everything was and is okay, but my processing mechanisms malfunctioned, and I entered a few thought spirals.</p>
<p>I feel less safe and anxious when I go through one of those thought spirals. I make up stories about what is happening. I then begin making up plans and telling more stories about how I might be able to gain control of those situations. Those plans lead to more stories about gaining control, what and who might sabotage those plans, and attention turns towards judging myself, others, or circumstances. Those judgments keep me going in the thought spiral.</p>
<p>While meditation and journaling help, I recognize that the way to exit such thought spirals consists of three timeless recipes. These recipes have been known to us for thousands of years and appear in different ancient philosophies dealing with human consciousness. We need to seek them — more about those later. Here are the recipes.</p>
<p><strong>Recipe 1: Be self-aware when you enter a thought spiral.</strong> Learn to observe your thoughts and emotions. Viewing your thoughts and emotions as an observer might sound puzzling or even delusional, but that ability is nothing but self-awareness.</p>
<p><strong>Recipe 2: Remind yourself that there is nothing for you to control.</strong> The desire for control leads to anxiety. Observe instead of controlling. Reflecting on my behaviors, I influenced and dealt with situations the best when I took an observer position instead of a controller position. Being an observer does not mean watching on the sidelines and keeping quiet. It means being present and processing the proceedings around you.</p>
<p><strong>Recipe 3: Turn your attention towards improving the situation and helping others.</strong> Doing so shifts your focus from anxiety to action. Clarity and success follow when you turn your attention from yourself to others. Again, this idea might sound defeatist and letting go, but it is the other way around. You have little chance of influencing others when you make any issue about yourself. Your chances improve when you make it about others.</p>
<p>Essentially, these recipes remind us that the best way to lead yourself is to take yourself out of the picture. That sounds hard initially, but it unlocks clarity, purpose, and joy. I’ve been told time and again that I lead with a steady hand. Some friends called me Yoda. I worked with some fantastic leaders who excel at maintaining a steady hand. I also know that I fail at it some times. I now know the secret.</p>
<p>These recipes not only help you gracefully exit those thought spirals, they help you gain the power to influence situations and others. My realization began nearly two years ago when I posted a <a href="https://twitter.com/sallamar/status/1530047300436865025">tweet</a> and pinned it to my profile:</p>
<blockquote>
<p>The secret to power in leadership is detachment. Not detachment from the outcome or others, but detachment from yourself and your way.</p>
</blockquote>
<p>The essence was that the best way to lead in difficult situations is not to make it about yourself and gain control. Dealing with such situations requires self-awareness, observation over control, and making it about others, not yourself.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Pluralism]]></title>
            <link href="https://www.subbu.org/articles/2023/pluralism/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/pluralism/</id>
            
            
            <published>2023-12-31T21:31:38-08:00</published>
            <updated>2023-12-31T21:31:38-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>One of my most influential and inspiring experiences in 2023 was reading a couple of <a href="https://en.wikipedia.org/wiki/Ramachandra_Guha">Ramachandra Guha</a>’s books on Mahatma Gandhi. The first was <a href="https://www.goodreads.com/book/show/38213078-gandhi-1915-1948">Gandhi 1915-1948: The Years that Changed the World</a>, which covered Gandhi’s life from 1915 leading up to Gandhi’s assassination in 1948. This book gave me a breadth of Gandhi’s role in India’s struggle for freedom and politics, which I enjoyed reading very much.</p>
<p>But it didn’t answer some of my fundamental questions about Gandhi’s leadership development. So, I picked up <a href="https://www.goodreads.com/book/show/18310148-gandhi-before-india">Gandhi Before India</a>, which traced Gandhi’s life from 1869 to 1914. I found this book much more insightful than the former. It showed Gandhi’s development as a leader from his humble beginnings, his unsuccessful attempts at being a lawyer, and then his journey to South Africa, where his taste of discriminatory policies of British colonialism triggered his development. This book also highlighted the roots of South Africa’s apartheid, which took 100 more years to resolve with its struggle. This book gives you a front-row seat to watch Gandhi’s leadership development.</p>
<p>These books covered nearly 80 years of India’s history in about 1400 pages (excluding author’s notes) of fluid English. These are not just biographical sketches of Mahatma Gandhi. Based on extensive research, Guha narrated India’s culture, history, and certain facets of geopolitics. I’m not done yet. I’m now waiting for my turn at the <a href="https://kcls.org">King County Library System</a> to read <a href="https://www.goodreads.com/book/show/356824.India_After_Gandhi">India After Gandhi</a>.</p>
<p>My initial interest in reading these books was to observe how leaders develop. I had several questions in my mind. How did Gandhi become who he was? What led him to pick up the causes he picked up? What experiences shaped his philosophy of non-violent resistance? Who played what role in his life in shaping his philosophy? Through Guha’s books, I learned much more than I bargained for. In addition to giving answers to these questions, Guha&rsquo;s books strengthened my preference for pluralism.</p>
<p>First, leadership development won’t happen unless you force yourself into situations that demand solving ambiguous problems requiring change and dealing with people of different viewpoints. You can read many books on how to influence others. Still, you won’t get to learn to influence without putting yourself in situations that demand you to develop the ability to influence. This is precisely what Gandhi did in his years in South Africa when confronting the discrimination of British colonizers against the so-called “Asiatics” — these were the peoples that British colonizers brought from India, China, and other Asian countries on indenture to South Africa. Gandhi’s philosophy of non-violent resistance and pluralism evolved during this time. Gandhi, as we know now, might not have happened if he had not put himself in those situations.</p>
<p>Of course, to lead change, you have to have courage to form opinions, stamina to hold your ground, tenacity to keep pursuing the cause with different tactics, patience to influence others, humility to be brutally self-critical and acknowledge mistakes, willingness to do the hard work of organizing and mobilizing people, and presence to reiterate messages again and again through writings and speeches. You see Guha describing all these behaviors in these books.</p>
<p>Second and most important, religious and political pluralism is the only viable path to peace and harmony. That was true during India’s struggles in the 1900s, and it is true today. Pluralism recognizes and permits different interests, convictions, and lifestyles to coexist peacefully. Per Guha, by the 1920s, Gandhi saw the “sustenance of religious and linguistic pluralism was central to the nurturing of nationhood.”</p>
<p>We have ample historical evidence of what happens when we don’t embrace pluralism. Not recognizing and permitting the interests, convictions, and lifestyles of others brought us near-extinction of the natives in the United States, racism and genocides in many parts of the world, the apartheid in South Africa, and even the ongoing Israel-Palestine conflict. It also got Gandhi assassinated in 1948 as the person who shot Gandhi on January 30, 1948, was a Hindu fanatic who got upset by Gandhi’s pluralistic views on Muslims. Though Gandhi persevered with his pluralism to a large extent till his assassination, India had begun drifting towards monoism, which is why Gandhi is less popular now in India than before.</p>
<p>Pluralism is hard. It requires you to check your judgment of others and your religious and political views. Pluralism may force you to give up your beliefs. For example, initially, Gandhi viewed native peoples in South Africa as inferior to Whites and Browns. Later on, he gave up that belief. Monoism, on the other hand, is easy. With monoism, for you to be right, the other person must be wrong. For your way of life to prosper, the other way must be stopped by all means. Unfortunately, monoism gets you clicks and generates anger.</p>
<p>Guha’s books broadened my perspective. I’m glad I read his books. I strongly urge you to read those. Remember that the other side does not need to perish for your side to exist.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Mid Career Stuckness]]></title>
            <link href="https://www.subbu.org/articles/2023/mid-career-stuckness/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/mid-career-stuckness/</id>
            
            
            <published>2023-07-15T16:28:09-07:00</published>
            <updated>2023-07-15T16:28:09-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>It may sound harsh, but let me offer a hypothesis — most of us get disillusioned and potentially stuck in mid-careers, and the most common cause is not learning about power and influence early enough. It is not a lack of technical knowledge and related competencies that makes one get stuck in their mid-career — it is the lack of an understanding of their power, the power of others, and then not developing their sources of power and using those to influence others to get things done — is what gets you stuck often. This stuckness starts with an improper understanding of “power” and “influence” and subsequently not recognizing and appreciating your power and that of others. Based on an ad hoc sample, I can tell that many people at work secretly hope that power doesn’t exist and stay away from it, which is sad and career-limiting.</p>
<p><strong>Why is this usually a mid-career phenomenon?</strong> In the early-career phase, your technical competencies get you the job and, perhaps, a few promotions. By technical, I don’t mean competencies related to software technology but essential skills associated with a particular profession. But as you move further in your career, what gets you the job and helps you succeed is your ability to influence (and be influenced) to produce ever-larger outcomes. Your technical competencies still matter, but not as much as they do during your early career. That’s because larger outcomes appropriate for your job level depend on getting others’ support and contributions to do what you want to get done. Those others may be your direct reports if you’re a manager, your peers, your manager, their peers, and even people outside your company. Even more important, what you want to get done can’t just be anything — it must be consequential and desirable to the organization you work for. So, you need others to cooperate for you to be successful. This is influencing and takes non-technical work.</p>
<p>But we don&rsquo;t consider influencing as work and don&rsquo;t put enough time and effort. There is a simple reason for that — most of us believe &ldquo;we know what&rsquo;s right&rdquo; and &ldquo;can get it done&rdquo; but fail to recognize that succeeding at work requires creating willingness and cooperation between individuals with different motivations and different stakes in any outcome. You can only create that willingness and cooperation by recognizing and appreciating your power, that of others, and each others&rsquo; needs.</p>
<p><strong>What’s the process of influencing called?</strong> It is leadership. As I mentioned in my previous <a href="https://www.subbu.org/articles/2023/followership/">article on followership</a>, <em>leadership is a process of influencing a group of people to produce some common goals</em>. Once you ground this definition of leadership and put aside all the pop-leadership posts on social media (particularly LinkedIn, these days) on what a leader should be or do, it is easy to realize that leadership is an influencing process. When you fail to influence others, you naturally fail to do the job you’re hired for. As Paul O’Neill said in <a href="https://youtu.be/htLCVqaLBvo">The Irreducible Components of Leadership</a>, “With leadership, anything is possible, and without it, nothing is possible.” You can replace “leadership” in this quote with “influence” to get the point — with influence, anything <em>of consequence to others</em> is possible. Without it, nothing <em>of consequence to others</em> is possible. I added “of consequence to others” to highlight that the net outcome should mean something to you and others.</p>
<p><strong>What’s the role of power in this influencing process?</strong> Before answering, let’s first put aside common misconceptions about power. Many associate power with being dictatorial, telling people what to do, being political for self-gain, being brash, contradicting, bullying, etc. We most commonly associate these with “not being nice.” Those are all signs of demonstration of power, but there is more to power than such perceptions. Let’s get back to definitions.</p>
<p>The most commonly used definition of power in leadership is that <em>power is the capacity to influence others’ behaviors</em>. For example, assume that I hold an enormous amount of money and dangle a big bundle of cash in front of you to make you dance against your volition, then my source of power is my wealth. You might consider such power bad or good depending on your beliefs (including ethics) and any harm done. Or, consider that you’re skilled at negotiating with difficult customers, and your boss relies on you and not your colleagues to deal with difficult customers. Then your source of power is your negotiation expertise. Power is essential to influence others, and you need to recognize and develop multiple sources of power to be effective at work.</p>
<p>With me so far? Assuming that you are convinced that power exists and can be a useful tool to influence others, the next question is, <strong>can you recognize your or others’ power?</strong> Why is this question relevant? Influencing is causing a psychological change in others, including their attitudes, behaviors, actions, etc., towards you. Then you better know what they want and where their power comes from. Also, ask yourself what you want and what power you have to influence others. Unless you recognize your power and that of others and what each wants, the influencing process feels like navigating without a compass. Let us review some commonly identified sources of power.</p>
<ol>
<li><strong>Your technical expertise:</strong> Your technical competencies in your professional domain are an important source of power for you to influence others. For those early in their career, their technical expertise is likely the strongest source of their power. As you look around at those early in their careers, what draws others to them is their ability to apply technical skills to get something others want. If your manager always allocates important and difficult technical problems to a few, it is most likely because your manager needs them done well. The more technical expertise you build, the stronger your influence on your manager. You will find this source of power called “expert power” in the leadership literature.</li>
<li><strong>How you feel about others and others feel about you:</strong> When people see you as a role model, like working with you, want to be associated with you, or are drawn towards you for your charisma, you can influence them without formal authority. Treating others with enthusiasm, kindness, and empathy helps you influence others. Don’t make the mistake of always leading with data and using rational arguments to influence others initially. Consider Ted Lasso, the lead character in the TV show of the <a href="https://en.wikipedia.org/wiki/Ted_Lasso">same name</a>. He is not a football expert. You don’t see him rewarding and punishing people. Instead, look at how he feels about others and makes them feel. He was kind, transparent, ethical, present (well, mostly), considerate, etc., which allowed him to unify the team and influence others. He never held grudges, and often said, “Be a goldfish” (referring to Goldfish’s short memory). Check why others were drawn to him. The strongest factor of his influence is how he made others feel. You’re far from building such power if you see yourself as important and others as lesser beings.</li>
<li><strong>What you have and others want, and vice versa:</strong> Don&rsquo;t ignore what others want and what you want. That awareness helps you understand the dynamics of power and influence. Recently, in a coaching conversation, someone asked me about how to influence their boss about a project. I asked that person whether they knew what their boss wanted. The answer was no. Therein lies the trouble — you&rsquo;re seeking someone to support you. But you are not entitled to that support. Before approaching others for what you want, learn about what they want and see if you can be of help. Through that discovery, you might find a path to get you what you want while providing what they want. You may even drop your project if you find a better opportunity in what your manager wants.</li>
<li><strong>Your role and title:</strong> I’ve coached several in their mid-career, who were feeling helpless but possessing important-enough titles at work. I can not overemphasize this — your role and title give you the power to influence others. In the leadership literature, this source of power is also called “legitimate power” — it is the power that comes from others’ perception that you ought to do certain things or act a certain way. Usually, organization structures, roles, titles, and even social norms (like someone being called a “lead”) grant you this power. Say, your title at work is “Director of Engineering” or a “Distinguished Engineer.” You may think of such a title as a nice gesture your company granted you based on your accomplishments — like an honor bestowed upon you. But that’s a myopic interpretation. Your company gave you that title for you to use to produce results. You should therefore be comfortable enough to disagree or disapprove decisions, introduce new ways of working or procedures, or lobby for things because you’re a Director of Engineering or a Distinguished Engineer. Such actions and decisions may sound non-democratic and unilateral, but that’s expected of you based on your role and title. You’re not supposed to act helplessly and ignore to use your role and title to assert decisions and set direction. You should know your role and title-level expectations at your work and go beyond those.</li>
<li><strong>Your place in the org hierarchy:</strong> No matter what you hear about flat organizational structures and everyone being equal, your place in the organizational hierarchy acts as a source of power. Who you report to and who reports to you matters in the influencing process. The reporting relationship may grant you access to information early and often, which you may use to influence others. It may sound unfair, but accept that the reporting relationship can play a role in the influencing process and deal with it rather than ignore it and regret it later. After all, even where people sit in the office (such as people sitting in the same row as the big boss vs. people sitting away) may indicate their importance and contribute to their power in the organization. Pay attention to such subtle factors to recognize your source of power and that of others.</li>
<li><strong>Your relationships:</strong> Your network, including people you know and those who know you, can help you influence others. Relationships give you information, ideas, knowledge, and expertise that can assist you. Without such a network, how would people know that you exist, that you are looking for such and such, and that you can offer such and such? Reach out to others, and be available to others. Be a node in a graph and not a singleton.</li>
<li><strong>Your ability to reward and punish:</strong> If you’re a people manager, you likely possess the ability to reward people (such as promotions, bonuses, equity, etc.) as well punish them by not granting them what they need, or worse yet, take away what they already have, such as letting them go. Such a source of power is common in workplaces, and it influences employees’ behavior. For example, the current economy and recent massive layoffs continue to influence employee behaviors for fear of being the next to be fired. Operating under such fear does not seem fair, but recognize that such factors play a role in influencing behaviors.</li>
</ol>
<p>These are some examples of sources of power. I listed these to give you an idea that you may already be powerful to influence others, what you lack, and recognize the power of others. Such recognition is a fundamental step in the influencing process.</p>
<p>Note that there is no single source of power that works all the time. You have to pick and choose based on the situation and the people involved in that situation. Each source will have different effects on others — some of which may positively influence them toward the common goal, and some may not. There is ample literature to learn more. Read <a href="https://www.nmac.org/wp-content/uploads/2012/08/OES-Understanding-the-Dynamics-of-Power-in-Healthy-Organizations_FINAL_.._.pdf">Understanding the Dynamics of Power in Healthy Organizations</a> for a gentle introduction to power. Get <a href="https://www.gsb.stanford.edu/faculty-research/faculty/jeffrey-pfeffer">Jeffrey Pfeffer</a>’s books like <a href="https://www.goodreads.com/en/book/show/8562119">Power: Why Some People Have It and Others Don&rsquo;t</a> and <a href="https://www.goodreads.com/book/show/198363.Managing_With_Power">Managing With Power</a>. Better yet, find ways to take his classes at Stanford.</p>
<p>Finally, don’t consider that others can’t have power for you to have power. <strong>A healthy demonstration of power is not a zero-sum game.</strong> You can be humane, kind, empathetic, respectful and yet exercise power. Don’t let the pursuit of power take out joy. Being respectful, and making others, including those with fewer sources of power than you, feel better and important helps you and the other person. Your sources of power might vary, but an effective combination of the power of different individuals can produce exceptional outcomes.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Followership]]></title>
            <link href="https://www.subbu.org/articles/2023/followership/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/followership/</id>
            
            
            <published>2023-06-18T08:53:55-07:00</published>
            <updated>2023-06-18T08:53:55-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>In organizational settings, we take leadership far more seriously than followership. Followership is a rarely used term in organizations. In my career, I’ve only heard of followership once when a wiser colleague proposed we include “willingness to follow” as an expectation for senior individual contributors. But unfortunately, followership and “willingness to follow” sound like sycophancy — doing what your boss wants while sacrificing your values and dignity. But there is more to followership than taking orders.</p>
<h2 id="followership-is-a-thing">Followership is a Thing</h2>
<p>A widely accepted definition of leadership in psychology is that leadership is a process of influencing a group of people to produce some common goals. The person influencing others is a leader, and leadership is the process of influencing. Wikipedia <a href="https://en.wikipedia.org/wiki/Leadership">puts</a> it well by incorporating power — “leadership can be defined as an influential power-relationship in which the power of one party (the &ldquo;leader&rdquo;) promotes movement/change in others (the &ldquo;followers&rdquo;).” The source of that power varies from situation to situation and person to person. In some cases, the source of power could be authority; in other cases, it could be softer aspects like expertise, trust, and persuasion.</p>
<p>Nonetheless, the people willing to be influenced in a given context for specific goals are followers. Followership exists wherever leadership exists. Leadership is incomplete unless followers are willing to follow. Yet, we rarely discuss followership. There is far more discourse about leadership than followership. For example, some years ago, my employer brought someone to conduct an all-day leadership workshop. The thesis of that workshop was to persuade that everyone is a leader and should act like one. That’s a fine approach. However, that workshop forgot to mention the other side: everyone is a follower too, and followership is a skill to acquire. Such skills help you accomplish your and your organizational goals.</p>
<p>In leadership, influencing others and being willing to be influenced coexist. Suppose you are not ready to be influenced. In that case, the relationship between you and the person looking to influence you will be ineffective, and you won’t be able to work together to achieve that common goal. This happens far more frequently at work than we acknowledge. As a manager, you sometimes run into situations where most of your team likes you, except some who are less willing to ride along. As a follower, you may not get along well with your manager, while your peers seem okay with that manager. What do you do then? Let me focus on the follower side of the issue in this article.</p>
<h2 id="followership-at-work">Followership at Work</h2>
<p>In organizational settings, for the most part, the org design determines who follows who and who the leaders are. Leadership and followership are roles we play at work. These roles usually start with the org design and hierarchy, and influence comes later. Good managers realize this and begin building relationships with their team from the start, but inexperienced managers may take their leadership and others’ followership for granted. Since they are the anointed “leader,” they expect their “followers” to follow along. Such managers may have good intentions but may tap into their positional power to influence their team, ignoring the softer aspects of power. What do you do when you’re caught in such situations?</p>
<p>In such cases, you could leave the team and the company and find a job elsewhere. You may get lucky to find a better manager elsewhere, but remember that your choice of manager could be one reorg away. As a Gallup survey said, <a href="https://www.gallup.com/workplace/231593/why-great-managers-rare.aspx">good managers are rare</a>. You can’t keep changing jobs until you find a manager with that you can get along. Your choice of your manager is not entirely in your control. Moreover, choosing their manager can be a luxury for many. Understanding followership and developing followership techniques could help you ride along and grow in your career.</p>
<p>First, most of us construct inflated views of ourselves based on past successes. When we encounter a manager who doesn’t share our opinions and ways, we struggle to influence and be influenced. Hence, <strong>put your self-inflated view of yourself aside and figure out your manager</strong>. Listen and build empathy. We expect our managers to listen and be empathetic — play the same card toward your manager. Figure out your manager’s context, strengths, weaknesses, how they operate, and their motivations. It takes work, and that’s one of the aspects of managing up.</p>
<p>Second, <strong>followership requires adaptation from your views and your way to another person’s views and practices</strong>. You should be willing to put aside your views and ways and enthusiastically follow someone else’s views and ways in the context of work. You might develop a better relationship with your manager in that adaptation process. Enthusiasm is vital for survival (i.e., being in the game) and growth (i.e., winning). Don’t be a grumpy and disgruntled follower. In his 1988 article <a href="https://hbr.org/1988/11/in-praise-of-followers">In Praise of Followers</a>, Robert Kelley puts such followers in his “alienated followers” quadrant. In his description, such followers “are critical and independent in their thinking but passive in carrying out their role.” I was in that quadrant more than once in my career. Not a worthy place to be.</p>
<p>But in this adaptation process, you might discover that your manager’s motivations, values, or behaviors are toxic and damaging to you and the rest of the organization. In that case, by all means, you should quit.</p>
<p>Third, also <strong>put your expectation of what a good manager should be aside</strong>. Be practical. Such views can prevent you from understanding your manager and building a relationship. Since good managers are rare, the odds of you working for a perfect manager are slim. One of my friends once said (quoting someone else) that “You don’t have to like someone to work with them.”  You don’t have to like your manager’s values and leadership beliefs. Following does not have to require sacrificing your values. In one difficult situation, my coach once said, “Your manager is acting like a child.” Her point changed my perspective. When I imagined that manager as a tantrum child, my views became clearer, and I could build coping strategies to work with that manager.  In any case, a job is a business relationship between you and your company. So, get off the high chair.</p>
<p>To develop personal resilience, you must learn to play leader and follower roles with various people. Don’t always walk away when the going gets tough. As long as you remember that leadership and followership are roles you play in an organizational setting, tone down your inflated views of yourself and inflated expectations of your manager, you can build a better relationship with your manager and resilience. Don’t take yourself seriously. Be humble. Be proactive and a problem solver. Raise your hand. Get feedback and dissent constructively. Don’t be a grumpy and passive follower. Remember that followership, just like leadership, is essential for goal accomplishment.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Leadership Masterclass for Individual Contributors]]></title>
            <link href="https://www.subbu.org/articles/2023/leadership-masterclass-for-ics/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/leadership-masterclass-for-ics/</id>
            
            
            <published>2023-05-29T22:54:06-07:00</published>
            <updated>2023-05-29T22:54:06-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>I’m excited to announce that I’m offering a limited-edition masterclass for individual contributors (Principal, Distinguished, Staff, or Senior Staff levels) on June 24th, 2023. The sole purpose of this masterclass is to help you improve your leadership skills so you can lead with joy and not frustration.</p>
<p>If you want to attend, sign up for <a href="https://criya.site/p/7e309cb1-f134-4acc-8bf8-2ec31618a77d">Leadership Masterclass for Individual Contributors</a>. Also, forward to others that may be interested in this class.</p>
<p>This masterclass is limited to 10 individuals, offered online. The class is free, but each participant must contribute at least 300 USD to a charity of their choice to be eligible to join this masterclass. I will ask you to provide proof of your contribution. Based on interest, I might offer repeat sessions.</p>
<p>Attendees must have at least ten years of experience as individual contributors, as the material we cover may not be helpful for the less experienced.</p>
<p>Here is why I’m conducting this masterclass and focusing on individual contributor roles.</p>
<p>In most organizations, senior individual contributor roles are some of the toughest to succeed. Organizations expect individuals in these roles to demonstrate several aspects of leadership, such as setting and influencing the direction of several teams, driving consensus, dealing with conflict, establishing standards and procedures, and leading and mentoring others. For most, developing the skills to meet such expectations without the ability to manage and control resources (like people and budget) seems like a frustrating task. Even more frustrating, organizations rarely facilitate leadership development for individual contributors.</p>
<p>This program includes two parts.</p>
<p><strong>Part 1: A two-hour class</strong></p>
<p>In this part, we will broadly cover three topics:</p>
<ol>
<li>Nature of individual contributor roles and potential leadership obstacles</li>
<li>Leadership competencies for effectiveness and continued growth</li>
<li>A framework to self-identify areas for development</li>
</ol>
<p>The material is based on my personal experience, lessons observed from coaching several individual contributors, and a few of my lectures in private settings.</p>
<p><strong>Part 2: A 45-min one-on-one coaching session</strong></p>
<p>In this session, we will discuss your context, unique challenges, and potential opportunities. We will also develop and review a self-development plan.</p>
<p>Sign up today at <a href="https://criya.site/p/7e309cb1-f134-4acc-8bf8-2ec31618a77d">Leadership Masterclass for Individual Contributors</a>.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Boss Test of Goal Crafting]]></title>
            <link href="https://www.subbu.org/articles/2023/boss-test-of-goal-crafting/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/boss-test-of-goal-crafting/</id>
            
            
            <published>2023-02-21T21:54:16-08:00</published>
            <updated>2023-02-21T21:54:16-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Here is a basic test to know if you’ve picked the right goals for your team.</p>
<p>Start with a simple question — Can you explain your goals to your boss and their peers in simple terms? If yes, you may be heading in the right direction, but keep going.</p>
<p>Then ask if your boss can explain and sell at least one of your goals to their boss. If so, that’s better. You’re doing something right and have a higher chance of being relevant to the organization.</p>
<p>But don’t stop there. Can your boss’s boss explain that goal to their boss? If so, you’ve made it. You’re highly likely working on the right things and will potentially survive and advance in your career, provided you deliver those.</p>
<p>This is my “boss test of goal-crafting.” Some of you reading this article may like these questions and agree with them. But many of you may feel that this is just doing what your boss wants regardless of what you and your team think you all should work on. After all, isn’t it your job, as the <em>servant leader</em> of the team, to support and help your team with what they want to work on?</p>
<p>Yes and no. Yes, you should help your team and support what they would like to get done. But no, you should not work on things just because you or your team thinks they are right. You will be doing a disservice to your team if you cannot channel their energy toward what your organization needs, which is what the boss test can help you figure out.</p>
<p>But what should you do when the stuff your team is dealing with is in shambles, and those need fixing? Should you dedicate all your energy to fixing those even if your goal fails the boss test? Alternatively, how about when you and your team know what to do, and your boss is incompetent? Maybe, but tread carefully and better produce a surprisingly positive outcome. But I wouldn’t, under normal circumstances, without first crafting a case to explain to my boss and their peers. After all, if the stuff your team is dealing with is in shambles, your boss better care about it. And it is your job to craft the right story to communicate to make them care.</p>
<p>Does this rule apply to even those areas that are not customer-facing or not in the critical path of the value-generation pursuit of your organization? Absolutely, and even more certainly, yes. The farther you are from value generation in your organization, the more critical it is for you as a manager to craft objectives that matter to value generation. As a manager, finding out what’s important is your job. If you don’t know, you’re not networking sufficiently with the people above you, or you’ve not learned how your organization’s business model works. Fix those problems first.</p>
<p>(I’m inspired to write this article tonight as one of the managers at work asked me today to clarify her understanding of the business value of her team’s work. Kudos to her.)</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Authenticity and Acting]]></title>
            <link href="https://www.subbu.org/articles/2023/authenticity-and-acting/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/authenticity-and-acting/</id>
            
            
            <published>2023-01-28T12:37:07-08:00</published>
            <updated>2023-01-28T12:37:07-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Acting seems like the most inauthentic thing to do — like putting an external façade to manipulate the audience to get the desired effect. Most people learning to lead don’t associate acting with leadership. I balked when I opened the first chapter, “Presence: What Actors Have That Leaders Need,” of Belle Linda Halpern and Kathy Lubar’s <a href="https://www.goodreads.com/en/book/show/599704">Leadership Presence</a> a few years ago. In that chapter, the authors described presence as “the ability to connect authentically with the thoughts and feelings of others.” I was okay with that definition, but it did not make sense to compare it to acting. For me, acting was an external façade, while authenticity was conforming your external behaviors to your internal state. I thought that acting was the opposite of being authentic.</p>
<p>I was not alone. Just last week, an ex-colleague of mine made a similar remark comparing acting in the context of leadership to ingenuity and manipulation.  Some time back, I read Jeffrey Pfeffer’s <a href="https://www.goodreads.com/book/show/8562119-power">Power: Why Some People Have it and Others Don’t</a>. In that book, he wrote a chapter on “Acting and Speaking with Power.” I did not like his style or substance when I first read it.  My firm belief in authenticity made me dislike the association between leadership and acting. That began to change as <a href="https://www.subbu.org/articles/2023/shaping-your-authenticity/">my understanding</a> of authenticity and leadership developed. Let’s look at some examples.</p>
<p>Watch Obama’s speech on the night of the New Hampshire primary in 2008. This is the speech where he rallied the audience and the nation watching television with his “Yes, We Can” message. Watch the video and follow the emotions of the audience.</p>

    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Fe751kMBwms?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>Obama started the address with a light-hearted laughter, but then you will notice concern, anger, disappointment, and optimism in his speech. Also, see the change in the pace of his delivery. He slowed down for applause sometimes, but other times he continued to build up the audience’s emotions. As the speech continued, notice an emotional harmony develop between the audience behind the stage and Obama. Then see the audience erupt in a chorus when he started the part of the speech with “Yes, We Can” at about the 10 min 30-second mark. You will notice that Obama was entirely in control of his and the audience’s emotions. Your political affiliation aside, would you doubt Obama’s authenticity? Would you call it acting?</p>
<p>If you’re not convinced, let’s watch <a href="https://en.wikipedia.org/wiki/Martin_Luther_King_Jr.">Martin Luther King Jr</a>’s “I have a Dream” speech, which he delivered near the steps of the Lincoln Memorial on August 28, 1963.</p>

    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vP4iY1TtS3s?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>In that speech, MLK seemed aware of the historical context of his remarks. His delivery too had a purpose. Listen to him as he switches from describing the “sweltering heat of oppression” to “I have a dream” without a pause at the three-minute mark of the video. Listen to his voice quiver when he says, “not be judged by the color of their skin but by the content of their character.” A few seconds later, listen to his intonation change and pitch rise when he says, “down in Alabama.” Would you doubt his authenticity? Would you call it acting? He knew that the address was a defining moment in the history of the civil rights movement. A New York Times <a href="https://www.nytimes.com/2013/08/28/us/the-lasting-power-of-dr-kings-dream-speech.html">article</a> written on the 50th anniversary of that speech described that speech as a &ldquo;testament to the transformative powers of one man and the magic of his words.&rdquo;</p>
<p>I hope you are convinced by now. Acting is what great leaders do. They choose the right emotions in front of the right audience at the right time for the right purpose. Not doing so dilutes the purpose, and the leader may not get that opportunity again.</p>
<p>Imagine Obama’s state of mind when he made the “Yes, We Can” speech. He didn’t win the primary that day in New Hampshire. He lost to his rival, Hillary Clinton. That speech was supposed to be a concession speech. Yet, that was one of Obama’s best speeches. Consider what might have happened if Obama said, “Good night folks, we lost it,” and left. For those curious, read <a href="https://www.washingtonpost.com/news/morning-mix/wp/2017/01/11/obamas-yes-we-can-thank-michelle-for-that/">the backstory</a> of this phrase in The Washington Post.</p>
<p>That’s the hallmark of great leadership. Great leaders tune their emotions to the need of the hour but do not let their feelings ruin the cause. Note the difference between allowing your internal state to guide your behaviors vs. letting the purpose and audience tune your inner state.</p>
<p>That’s why great leaders can show anger in one meeting, kindness in another, and frustration in another. Each emotion has a purpose. When you don’t tune your emotions and words for the audience and purpose, you are letting opportunities for positive change go. This is why self-awareness and a calm internal state matter for leadership. That’s when you can choose emotions purposefully and time them to the right audience. Doing so does not make you inauthentic. It makes you situational.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Shaping Your Authenticity]]></title>
            <link href="https://www.subbu.org/articles/2023/shaping-your-authenticity/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/shaping-your-authenticity/</id>
            
            
            <published>2023-01-15T21:05:47-08:00</published>
            <updated>2023-01-15T21:05:47-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>There are many genres of leadership theories. One of those is authentic leadership. Regardless of how leadership psychology researchers define it, the most common view of authentic leadership is leading while being true to oneself and acting according to one&rsquo;s feelings, emotions, and values. Unfortunately, most of us make career decisions, exhibit behaviors based on this perception, and shortchange ourselves. Let me give a couple of examples.</p>
<ol>
<li>You believe in empowering others, and you run all your meetings and interactions democratically to let everyone speak, solicit opinions, and then decide based on consensus. It feels good to do it that way. But then you struggle when consensus does not emerge quickly or dissent and strong voices take over the forum. Because telling people what to do and directing them is counter to your belief of empowering others, you remain uncomfortable even when the situation needs direction for the right outcome.</li>
<li>You avoid taking certain roles because you consider them political. For example, you may decide not to choose the managerial career ladder because you believe managers have to deal with politics and make choices counter to their beliefs. Or you may not show up and influence certain forums or people because you think something about them is political or against your core beliefs.</li>
</ol>
<p>There are also many people that chuckle when referring to authenticity. They believe that the world is unfair and that you must play politics to be in and win the game. I once worked with a leader who believed others were out there to get him. For such people, authentic leadership is taking the high road and not accepting reality.</p>
<p>Furthermore, authenticity gets in the way of getting things done for most. But it does not need to be that way. You can be authentic and still deal with reality to evolve to be a better leader. But for that to happen, you must amend how you think of authenticity.</p>
<p>I recently came across an excellent article by Herminia Ibarra of the London Business School, who wrote the following in her <a href="https://hbr.org/2015/01/the-authenticity-paradox">The Authenticity Paradox:</a></p>
<blockquote>
<p>Because going against our natural inclinations can make us feel like impostors, we tend to latch on to authenticity as an excuse for sticking with what’s comfortable.</p>
</blockquote>
<p>That’s right. One of the flaws in our thinking is our belief that our authenticity is innate in us, as though we’re born with certain beliefs and values. We then limit ourselves to certain behaviors and possibilities and remain in a comfort zone that does not challenge our beliefs and values. We filter out possibilities because of the potential conflict with our authenticity.</p>
<p>There is a better way, which I learned a few months ago. As part of my coursework at Penn State, I had a chance to examine my beliefs and probe why I believe in them. This exercise was based on <a href="https://billgeorge.org/">Bill George</a> and his team’s 2007 article <a href="https://hbr.org/2007/02/discovering-your-authentic-leadership">Discovering Your Authentic Leadership</a> and several other papers on the psychology of leadership. Bill George is best known for his books like <a href="https://www.goodreads.com/book/show/255199.Authentic_Leadership">Authentic Leadership</a> and <a href="https://www.goodreads.com/book/show/25957932-discover-your-true-north">Discover Your True North</a>. I never read his works until I was forced to read his 2007 article as part of my coursework.</p>
<p>The key lesson from my exercise was that our self-stories strongly influence our beliefs and values. Instead of treating our authenticity as innate, consider that the stories we tell ourselves shape our authenticity.</p>
<p>I can give an example. People who know me or work with me closely know that I don’t pick battles quickly. That’s because certain situations I saw made me dislike interpersonal conflict and feuds. Because I disliked conflict, I rarely employed conflict as a tool of engagement. I instead chose the belief that conflict is not good and mostly avoided it. Consequently, my conflict muscle remained weak. In certain situations, conflict may be the most effective tool, for example, telling someone their behavior is not cool and they must stop it. Of course, that person would likely disagree with me, and I must be prepared to deal with it.</p>
<p>I would encourage you to do a weekend exercise: write down three or four of your most important beliefs or values. Then ask yourself why you picked those, and write down those stories. Then put yourself in situations that challenge some of those beliefs and values, and let those experiences influence you. For example, if you don&rsquo;t believe in telling people what to do, put yourself in a situation where you have to do that to be effective. If you feel certain people are political, try to find a situation where you need to interact with them to get something done. See what happens. Let yourself change.</p>
<p>In other words, don’t think authenticity is something you’re born with. It’s not fixed. It’s something that you shape with experience. But you need to broaden your experiences to shape your authenticity. Break the mold.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Five Nuggets from 2022]]></title>
            <link href="https://www.subbu.org/articles/2023/five-nuggets-from-2022/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2023/five-nuggets-from-2022/</id>
            
            
            <published>2023-01-08T22:29:51-08:00</published>
            <updated>2023-01-08T22:29:51-08:00</updated>
            
            
            <content type="html"><![CDATA[<p>Hello. Welcome to 2023. The holiday break gave me ample time to reflect on 2022 and distill some insights and lessons learned. Here are the top nuggets I carried from 2022 into 2023.</p>
<ol>
<li><strong>Deal with interpersonal problems with two questions</strong> — What are you observing? How are you feeling? Once you deal with the second, you will be better equipped to deal with the real problem with positive perspectives. We often mix up both and tend to complicate interpersonal situations further. Practice asking these questions, and it gets better over time.</li>
<li><strong>Emotions are not facts.</strong> In most situations, your emotions depend on the perspective you choose to look at a situation. See if it is possible to change your emotions by changing your perspective. More often than not, you will find a better perspective.</li>
<li><strong>Observe more and react less.</strong> It makes you see more and hear more. There are exceptions, of course, but those should be rare. Doing this can be particularly hard when your situation is not going in the direction you were hoping it would go or you&rsquo;re uncomfortable with some aspects of that situation. In such cases, I tend to interrupt or shift the discussion differently. The trick, I realized, is to pause more to see more and become comfortable with letting situations evolve a bit, regardless of what you like to see. Let things pan out a bit before reacting.</li>
<li><strong>Prefer relationships over issues.</strong> Work extra hard to build relationships before approaching others to solve your problems. Know them as people and understand what they are trying to do.</li>
<li><strong>A secret to power in leadership is detachment.</strong> Not detachment from the outcome or others, but separation from yourself and your way. When you put what you want aside, you increase your capacity to observe, listen, and influence others much more profoundly.  Doing this in real-time can be difficult, but try it out.</li>
</ol>
<hr>
<p>This is an ice-breaker article. I’ve taken a break from publishing articles on this website for over six months. I didn’t stop writing these six months, though. I read and wrote extensively during the past six months in classroom situations. That’s right. Last spring, I decided to go back to school. After some research and the help of a close friend, I settled on two — the <a href="https://www.gsb.stanford.edu/exec-ed/programs/stanford-lead-online-business-program">Stanford LEAD</a> program and the <a href="https://www.worldcampus.psu.edu/degrees-and-certificates/penn-state-online-psychology-leadership-masters/overview">Psychology of Leadership</a> degree at Penn State. Both started in September 2022. In the beginning, I found it challenging to manage these on top of my day job. But as time went on, I got into a productive pace and began to enjoy what I was learning.</p>
<p>I can’t wait to write frequently in 2023. Here we go, 2023.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Building Career Resilience]]></title>
            <link href="https://www.subbu.org/articles/2022/building-career-resilience/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/building-career-resilience/</id>
            
            
            <published>2022-07-30T22:26:32+00:00</published>
            <updated>2022-07-30T22:26:32+00:00</updated>
            
            
            <content type="html"><![CDATA[<p>Several weeks ago, I was having a coaching conversation about career choices with someone. The question was whether to choose the individual contributor or the manager career path. That particular individual tried both and was contemplating what was next.</p>
<p>Our conversation centered around a few related questions:</p>
<ol>
<li>What types of work or roles energize you? What kinds of work or roles drain you?</li>
<li>Should you favor roles that minimize the energy drain? For example, if some managerial work drains you, should you go back to designing software and writing code?</li>
<li>How to build career resilience?</li>
</ol>
<p>Aside from letting that individual solidify their choice, that conversation allowed me to answer a few questions that I was facing myself about (a) building a long career with opportunities for personal growth and the growth of others around me and (b) letting my leadership beliefs, behaviors, contributions and impact define my working identity, as opposed to the logos of the companies I work for defining me.</p>
<p>My recently-ended sabbatical also allowed me to think long and hard about these questions, though I could not formulate these questions clearly until that coaching conversation. That’s why I love coaching conversations. In addition to letting the other person explore their career and leadership journey, they help me learn and improve.</p>
<p>From that conversation, we drew a few conclusions.</p>
<p>First, <strong>one must know where their energy comes from and what drains them</strong>.</p>
<p>Each of us learns to get energy from certain activities. These are usually the activities we become skilled at early in our careers and build some success.  Positive reinforcement from such success makes us enjoy and do more of those activities. It’s like a deer always going back to certain ponds for drinking water. Water is there, it is fresh, and you enjoy it. Nothing wrong with it.</p>
<p>But making career choices solely based on where you get energy from can be a mistake, particularly if you want to remain useful and want to grow in your career. Here is why.</p>
<p>Eventually, you mistake such activities as things you are innately good at and continue the positive reinforcement loop. Others then identify you with those activities and may want you to continue those, thus perpetuating that loop. It might feel good when others pull you into conversations because you’re good at problems they want to see solved.</p>
<p>But you may eventually get bored and upset that you’re not getting opportunities to do other activities. I have had this happen to me in my career and have seen it happen to others.</p>
<p>A <a href="https://hbr.org/podcast/2022/06/how-do-i-move-from-a-specialist-to-a-general-leadership-role">recent episode</a> of <a href="https://murielwilkins.com/">Muriel Wilkins</a>’ <a href="https://hbr.org/2020/12/podcast-coaching-real-leaders">Coaching Real Leaders</a> podcast also reminded me of this point. In this episode, the participant, Krish, gets pulled back into a role/function that he is good at. He feels he would be good at other things and is upset that he is not being called to do those other things. Though this episode does not delve into where Krish gets his energy from, the conversation in this podcast makes it clear that he gets energy from diving deep into certain kinds of problems. As a result, those problems keep drawing him back even though he wants to be called to tackle other types of issues.</p>
<p>You may find that <strong>what made you strong and gave you energy in the first place can get you stuck</strong>. So, pay attention to where you get your energy from.</p>
<p>This brings me to the second conclusion. <strong>Learn to draw energy from activities that drain you</strong>. This may sound counter-intuitive at first. Why bother learning to draw energy from things that you don’t enjoy? Here is why.</p>
<p>Think of where you are and where you want to be in your career a few years from now. Can you embark on a journey from here to there by continuing to do the same activities that energize you? In most cases, the answer is no. People operating at that future level most likely draw energy from a different set of activities from what you currently do, and those activities may look draining to you now.</p>
<p>Consider, for example, the process of negotiating, influencing, and coercing others to get something done. If those activities are draining to you, and you prefer to avoid them, for most people, their careers get stuck. Hate spreadsheets? Guess what? Most leadership roles at tech companies deal with spreadsheets. Don’t like conflict? To progress in your career, you’ll have to learn to deal with conflict to get things done. Not comfortable speaking in front of large groups? Most senior roles need you to address groups of people to influence, inspire, and create movement. Don&rsquo;t like working with people? Inter-personal skills are essential for career success and growth.</p>
<p>Third, <strong>the ability to draw energy from diverse sources can help you build a long and fruitful career</strong>. Look at the nature around us. Organisms that can survive in diverse conditions can survive change while others perish. This is true for true when investing. You invest in a diverse portfolio to minimize risk. The same is true for our careers too.</p>
<p>Looking at the example of Krish above, how do you prevent what used to be your strength from getting you stuck? You diversify. You learn to draw energy from other kinds of activities early and often in your career. Diversity builds resilience and creates options. As you diversify, you will discover opportunities you didn’t know existed.</p>
<p>For instance, if you are a software developer good at coding certain problems, consider developing related technical or non-technical skills. Consider learning to influence others. Write. Speak at conferences, or teach others. Run a project. If you are a manager managing a particular problem domain, diversify into other disciplines involving different people, organizational, and technical complexity. Learn about finance. Develop product management skills. Run cross-functional programs. Support customers.</p>
<p>In the beginning, your attempts to diversify may drain you. You may question your decision to diversify and want to return to what you were doing before or your prior energy source. You might miss your prior energy sources as you&rsquo;ve not yet figured out how to draw energy from the newer sources. But eventually, you evolve.</p>
<hr>
<p>How did that conversation help my questions (a) about building a long career and (b) owning my work identity? The answer is to (a) get uncomfortable and learn to do things that may be draining at the moment and (b) do a variety of things at work and outside work.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Inputs and Outputs]]></title>
            <link href="https://www.subbu.org/articles/2022/inputs-and-outputs/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/inputs-and-outputs/</id>
            
            
            <published>2022-06-26T11:15:15-07:00</published>
            <updated>2022-06-26T11:15:15-07:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Focus on what you can control, but not let angst and frustration control you from discovering what you can control.</blockquote><p>One of the best books I read last year was Colin Bryar and Bill Carr’s <a href="https://www.workingbackwards.com/">Working Backwards</a>. Of all the chapters in this book, Chapter 6 on “Metrics” was the most influential for me. It clarifies the difference between inputs and outputs. Gaining weight is an output. Eating healthy and staying active are inputs. Last week’s Supreme Court <a href="https://en.wikipedia.org/wiki/Dobbs_v._Jackson_Women%27s_Health_Organization">ruling</a> reminded me of this book as the verdict was just an output, culminating years of strategy, planning, and execution of certain controllable inputs.</p>
<p>Outputs make you emotional. You get upset when you gain weight. You feel happy when the scale shows a smaller number. You get upset when the stock market is down, and you suddenly seem less wealthy. But you feel glad when the market goes up, even though you know you did nothing to influence the stock market.</p>
<p>Inputs, on the other hand, take strategy and are actionable. Staying active and eating healthy are controllable inputs. These two inputs may or may not get you to lose weight, but at least those are two commonly used inputs you can control to influence the outcome. If those inputs don’t produce the outcome you want, then you have to find other inputs or at least get an appreciation of your uniqueness. Similarly, being frugal and diversifying your investments are two controllable inputs you can control to build wealth.</p>
<p>Along the same lines, we all are upset now since the Supreme Court struck down Roe v. Wade in the <a href="https://en.wikipedia.org/wiki/Dobbs_v._Jackson_Women%27s_Health_Organization">Dobbs v. Jackson</a> case last week. Unfortunately, as legitimate as our feelings are, anger and frustration are unlikely to reverse last week’s Supreme Court ruling.</p>
<p>This ruling is the output of a complex legal and political system with a few controllable inputs that some people understood well and systematically manipulated over the years. Democrats mistakenly continue to focus on just one controllable input, which is to vote. President Obama made the same appeal last week, asking that <a href="https://barackobama.medium.com/my-statement-with-michelle-on-the-draft-supreme-court-decision-to-overturn-roe-v-wade-94c0ae0c541a">we’ve got to elect officials committed to doing the same</a>. But there are more inputs to control, and it takes a strategy and much more patient planning and execution to manipulate the inputs. Republicans understand this, but democrats continue to preach simplistic inputs. We’re less likely to influence the future if we fail to understand the system producing the output and learn about all potential controllable inputs.</p>
<p>In the case of Dobbs v. Jackson, the controllable inputs the right used includes gerrymandering, voter suppression laws, injecting favorable county and state electoral officers and policies, and specific cases to bring to the Supreme Court when the timing is right. The right has been shaping these for years, with several intermediate phases like Obama failing to appoint Merrick Garland to the Supreme Court in the final year of his presidency, Trump becoming the President, and a chance for him to appoint three justices. All of these finally culminated in a decision that took away the right to abortion, which was so far protected by the rights of privacy under the Fourteenth Amendment.</p>
<p>To change a system, we need to understand how it works and how to control it. If we don’t understand the system’s behavior and expect outputs we like to magically manifest, we will get nothing but disappointments. Outputs drive angst and emotions. But inputs need a strategy and patience.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Work as a Socio-Business Relationship]]></title>
            <link href="https://www.subbu.org/articles/2022/work-as-socio-business-relationship/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/work-as-socio-business-relationship/</id>
            
            
            <published>2022-06-05T08:07:17-07:00</published>
            <updated>2022-06-05T08:07:17-07:00</updated>
            
            
            <content type="html"><![CDATA[<p>In recent days and weeks, we have heard <a href="https://www.nytimes.com/2022/05/25/business/bolt-layoffs.html">about layoffs</a> and companies deferring or <a href="https://blog.coinbase.com/update-on-hiring-plans-bcedfa634989">rescinding offers</a>. CEOs and comms teams are doing their best to message the public and their employees to explain the rationale. Some leaders are brash and unapologetic, like in the <a href="https://www.cnbc.com/2022/06/03/heres-the-email-elon-musk-sent-all-tesla-employees-10percent-job-cuts.html">case of Tesla</a>. There is no doubt, these are devastating for the affected people, and some of these actions highlight ethical concerns. We can blame companies and their leaders for these actions, but I think the time is right to remind ourselves that our relationships with employers are socio-business relationships. That&rsquo;s the reality — whether we like it or not.</p>
<p>As you work at any company, you build relations with people, learn, grow, develop others, make money, and sometimes make lasting friendships. You spend most of your waking hours at work or thinking about work. You let inter-personal relationships and work problems get under your skin even during non-work hours.</p>
<p>Yet, we mistake our relationship to an employer as a privileged relationship where you are entitled to certain compensation, benefits, well-being, and continued growth until you choose to end your relationship.</p>
<p>But that’s a mistaken view. Just like you can reject an offer before joining a company or leave your job when a better opportunity knocks on your door, companies too can end their end of the bargain at any time. Though it does not seem fair and we&rsquo;ve room to make it better, but these days, our working relationships with our employers are weaker than other relationships, like your contract with your landlord or your utility company.</p>
<p>But most of us don’t take this seriously. Consider some of the mistakes we make:</p>
<ol>
<li>You don’t keep an updated resume, and you claim that you’ve not written one in X years. Remember that your resume is your story. If you’re not tending to your story, who will?</li>
<li>You don’t pick up the phone when a recruiter calls. But you are your talent agent. If you’re not curious to know why a particular recruiter called you, how do you know what opportunities you’re not exploring? How do you know if you, as a product, are still relevant to others?</li>
<li>You respond to a recruiter saying that you’re working on such an important problem at work that the timing is not right for you to explore other opportunities. What information do you have about your employer to believe that the employer thinks the same way you do?</li>
<li>When a recruiter or a potential hiring manager asks you what you’re looking for in your career, you give vague-sounding answers like “I want to solve good problems,” “help the company grow,” or “lead others to accomplish their potential.” These are not wrong answers but are so generic that they apply to most people. But what is your purpose and vision for yourself? What are your criteria for designing and making your next career choice? What is your vision for the role?</li>
<li>You don’t take the time to summarize and document your accomplishments and lessons learned. If you don’t, who will do it for you?</li>
<li>You are so immersed in what your current job requires of you that you don’t take the time to invest in yourself continually. Your investment ideas are waiting in unread browser tabs and TODO projects that you never have the time to start and finish. Who will do it for you if you don’t continually invest in yourself?</li>
<li>You have no idea of your brand. Your story sounds like everyone else’s, and you have not thought of how to differentiate yourself.</li>
</ol>
<p>There are more, and as a <a href="https://www.subbu.org/articles/2022/managing-yourself/">CEO of a one-person enterprise</a>, it is your job to build your career on realistic assumptions.</p>
<p>On the flip side, let us not assume that our relationships with employers are pure business relationships. People that treat their jobs purely as sources of money in high-tech companies often fail to build social connections to develop themselves in their careers.</p>
<p>I will leave you one tidbit. Last week, I asked a colleague for advice about navigating <a href="https://www.bill.com">the company</a> I joined. He said, “ROI.” I asked, “what do you mean?” He said, “relations over issues.” This is a powerful career advice. His sggestion sums up why our relationships at work are social too. Once you build social relationships with others at work, you can work together well on issues to become a team player. But if you start with issues before building such relationships or do not pay attention to building relations, you may not succeed.</p>
<p>That&rsquo;s why I like to remind you that our relationship with an employer is a socio-business relationship. The sooner we realize this dual nature in our careers, the more resilient we can become in managing our careers.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Org Design Vulnerabilities]]></title>
            <link href="https://www.subbu.org/articles/2022/on-vulnerability-of-orgs/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/on-vulnerability-of-orgs/</id>
            
            
            <published>2022-05-08T15:58:07+00:00</published>
            <updated>2022-05-08T15:58:07+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As I reflect on my experience working with or for some experienced managers in large companies, I realize how good some are at developing…</blockquote><p>As I reflect on my experience working with or for some experienced managers in large companies, I realize how good some are at developing robust org structures that survive leadership changes or other challenges. That experience taught me a few valuable lessons about the implications of poor org designs. While I would defer to Matthew Skelton and Manuel Pais’s 2019 book <a href="https://teamtopologies.com/">Team Topologies</a> for a collection of patterns on org design, I want to share what I learned.</p>
<p>The first lesson is that <strong>good org design matters more than the attention it sometimes gets</strong>. People who enjoy flat structures or those who fear delegation and prefer command-and-control, or those that do not wish to rock the boat seem to focus less on their org design. Reflecting on successful designs, I noticed that their orgs didn’t dissolve when managers left or when their org picked up new initiatives. Their orgs had a cohesive purpose for their team to identify with. People outside the org could make sense of what the org did and did not and found it usually easy to figure out how to engage with them. Some people in such orgs built deep technical expertise and grew. Such orgs also created enough leverage to pick up and deliver large initiatives.</p>
<p>One of my mentors taught me this litmus test — would your org survive structurally if you leave? If the answer is no or “maybe not,” you have some structural issues to resolve.</p>
<p>The second lesson is that <strong>poorly constructed orgs will eventually disintegrate.</strong> I’ve seen complicated org structures that got broken up or deeply reorganized due to a simple change like the departure of the manager of the org. Though some managers deftly managed large, tangled org structures, their orgs were challenging to understand and engage. Those managers spent more time managing people and addressing communication challenges than delivering outcomes.</p>
<p>An org collapsed when the manager left in one particular case, and changes cascaded down the hierarchy. In another case, after their manager left, some of the team members left as they got disillusioned about the org’s identity and purpose, and the org was eventually broken up. Of course, the work suffered too, and rebuilding the work took time. In a similar case, an org was designed around a particular person’s skills and interests, and when that person left, the team disintegrated.</p>
<p>As an extension of the first lesson, the third lesson is that, even though you took care of designing a healthy org structure, <strong>you and your org may eventually suffer the consequences of a poor parent org design</strong>. In such cases, your role may be affected when your boss leaves or someone else tries to fix the org. Your boss’s role may get affected too.</p>
<p>Consequently, ongoing work and communication channels may suffer. Even though cleanups are essential and good, big org cleanups are expensive due to sudden changes in dynamics and communication paths. Periodic incremental structural adjustments are better since they allow people, dynamics, and culture to keep pace with changes.</p>
<p>The same litmus test applies to your parent org too. Would the parent org survive if your manager leaves? You may not have much control over this challenge, but you should watch out.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Career Choices and Business Models]]></title>
            <link href="https://www.subbu.org/articles/2022/career-choices-and-business-models/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/career-choices-and-business-models/</id>
            
            
            <published>2022-04-29T16:12:13+00:00</published>
            <updated>2022-04-29T16:12:13+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>When considering career changes, your first criteria for choosing a company should be its business model. Read more to learn why.</blockquote><p>There are multiple parameters for choosing between career choices. Popular parameters include the total compensation, the type of work you will be doing, the team and the manager, the title and visible perks, a company’s social status, or even their declared purpose (“we’re the world’s blah”). But we generally overlook what’s underneath all these — the business model. I had to think hard recently about my parameters. The first criteria I came up with relates to the business model.</p>
<h2 id="what-is-a-businessmodel">What is a business model?</h2>
<p>I will use a simplified description of a business model here. A company’s business model answers two questions. First, how and where does the money come from. Second, how and where does the money go?</p>
<p>Let us look at some examples.</p>
<ol>
<li>
<p>A company running an online marketplace like eBay, Amazon, Expedia, Airbnb, Etsy, etc., makes money when sellers come to the marketplace to list products and services, and buyers come there to buy those products and services. Aside from building the tech to run the marketplace, the company may have to spend money to get participants, i.e., buyers and sellers, to the marketplace and keep them hooked. Amazon has been doing this for over a decade through capabilities like Prime and Fulfillment by Amazon. Online travel agencies like Expedia establish business partnerships with hospitality and travel companies to bring them to the marketplace. They also incentivize their past customers to return. But a big chunk of the money goes towards acquiring traffic through <a href="https://finance.yahoo.com/news/online-travel-titans-ever-break-143000691.html">search and marketing channels</a> like Google. Other e-commerce and media companies have similar customer acquisition strategies and handle associated costs.</p>
</li>
<li>
<p>Social platforms like Facebook, Twitter, Tiktok, etc., usually make money in two ways — when users see or interact with ads and sponsored promotional content or when the company sells access to the users’ data and insights. To keep this business model healthy and robust, such companies need to bring large numbers of participants (content creators and users) to the network and find ways to increase the users’ time on the platform. The more engaged the users are, the more likely advertisers to promote their content. So, these companies spend vast sums of money on building the best technology possible and then tuning it to bring and keep users on the network. Since such companies depend on getting hundreds of millions of users to their platform to be successful, they provide opportunities to work on solving complex technical problems of scale.</p>
</li>
<li>
<p>A media streaming company like Netflix’s business model is to keep adding subscribers to watch shows, series, and movies. They spend money to license or produce such media to keep acquiring users to subscribe.</p>
</li>
</ol>
<h2 id="question-1-is-the-business-modelrobust">Question 1: Is the business model robust?</h2>
<p>Now that we know what a business model is, the first question is whether the business model is robust.</p>
<p>It boils down to learning about (a) what the company has to do to earn more money and (b) what they have to do to spend less to make that money. For example, if a business model requires paying other companies like Google or Facebook large sums to acquire and keep customers, their business is not likely robust. Their customers might stop coming once they stop spending marketing dollars to reach those customers. Such marketing spending is a big problem for many e-commerce companies. Innovating business models to decouple from such spending is non-trivial. Very few succeeded, and those that didn’t become stagnant.</p>
<p>Why is the health of the business model important? Many reasons.</p>
<p>First, when the business model is not robust, you may find it tough to connect the dots between your work and the business outcomes. You work on what is supposed to be the right initiative to grow the business, but you may not see a timely measurable impact. What happens when the critical business metrics don’t seem to respond to your work? You may become lethargic and develop apathy. Status quo wins.</p>
<p>Second, companies with weak business models tend to have poor incentive structures. Companies can’t pay you top dollar when their business model does not justify spending on attractive incentive structures. Though money is not everything, such companies are less likely to win top talent.</p>
<p>In contrast, a healthy business model can afford to create attractive incentive structures for its employees. The math is simple — when the business model is robust, the company will have more money to spend on incentives.</p>
<p>Third, equally important, strong tech companies emerge and remain so as long as their business models are healthy. A robust business model attracts and retains motivated and talented people who will push to improve technology and culture for self-actualization. Of course, courageous and innovative leadership is also essential, but not without a robust business model. <br>
 <br>
<strong>I argue that your first criteria for choosing a company should be its business model. A robust business model has the potential to create a flywheel to bring motivated and talented people, who will then raise the bar on technology and culture and are motivated to innovate the business model to keep it going strong.</strong></p>
<p>But how do you get to learn their business model when you’re interviewing? You research online. You ask the interviewers or others. Understanding the business models of <a href="https://www.wired.com/insights/2013/10/why-business-models-fail-pipes-vs-platforms/">platform companies</a> can be challenging due to the multitude of complicated and non-linear producer-consumer interactions. Still, you should ask and develop a point of view.</p>
<h2 id="question-2-how-is-the-position-connected-to-the-businessmodel">Question 2: How is the position connected to the business model?</h2>
<p>The next question is how well is the position you’re interviewing for connected to that business model. The answer to this question can shed light on growth potential and incentives. More importantly, the answer can motivate you to work towards enhancing the business model and thus grow in your career. When interviewing, don’t just ask about your team and its peers. Also, ask about how the role can help the business model. If you are interviewing for back-end teams or shared systems, learn how those systems support the business model. Such knowledge over time will help you identify the right problems to solve.</p>
<h2 id="question-3-what-about-vision-mission-purpose-valuesetc">Question 3: What about vision, mission, purpose, values, etc.?</h2>
<p>Those usually inform you of the company’s <em>intended</em> purpose and the <em>desired behaviors</em> of their culture. But in practice, their primary goal is to <a href="https://en.wikipedia.org/wiki/Manufacturing_Consent_%28disambiguation%29">manufacture consent</a> with a business’s stakeholders like employees, partners, and even the society at large.</p>
<p>I’m choosing the phrase “manufacturing consent” without taking a stance on whether manufacturing consent is good or bad. It’s just an effective leadership tool. President Bush manufactured consent through his “axis of evil.” Obama, too, manufactured consent with his “Yes, we can.” So did Trump with his “Make America great again.” You may or may not like what consent they manufactured and what decisions they made based on that consent, and that’s your choice.</p>
<p>For instance, a company with a stated value of being customer-obsessed could keep everyone oriented to improve customer experience and not take decisions that hurt the customer experience. They could also use the same value to bulldoze purportedly customer-centric choices even when those are unfair to other stakeholders of the business model. Examples include arm-twisting suppliers or employing strategies that hurt some common good through <a href="https://en.wikipedia.org/wiki/Cost_externalization">externalization of costs</a>, low wages, questionable labor practices, or some other impact on less visible components of the business model. Therefore, my suggestion is to be aware of a company’s stated vision, mission, purpose, values, etc., but not join a company solely based on those.</p>
<h2 id="question-4-do-you-support-that-businessmodel">Question 4: Do you support that business model?</h2>
<p>The final question to ask is whether you support that business model. Your response will likely be grey and not a binary yes or no. Here is why.</p>
<p>No business or individual operates independently. All work in a networked economy — producing, procuring, consuming, or offering goods and services. In a networked economy, establishing whether a business model is just or not can be challenging — very few companies escape from doing collateral harm to some segment of their stakeholders. As you peel the layers of any business model, you might discover some uncomfortable parts that may not sit well with your beliefs or values.</p>
<p>Let me take an easy example — Starbucks. Its mission is “to inspire and nurture the human spirit — one person, one cup, and one neighborhood at a time.” You can question whether a cup of a caffeinated drink inspires and nurtures the human spirit. Or you might decide not to support their business model due to <a href="https://www.cleanwateraction.org/features/starbucks-and-our-plastic-pollution-problem">their environmental impact</a>. Or you may admire how well they standardized procurement, logistics, and stores to offer quality beverages and serve them in nice-to-hangout locations worldwide while still <a href="https://www.starbucks.com/careers/working-at-starbucks/education/">investing in the growth of their employees</a>. Only you must judge whether their business model is just or not and whether you agree to work for Starbucks or not.</p>
<p>I don’t believe we should shield ourselves from the discomfort of knowing the collateral impact of any business model. You may make a tradeoff to accept some collateral damage. Each of us is making such choices every day anyway, and it is better to make tradeoffs with awareness instead of ignorance.</p>
<p>Probing into whether you agree with the business model or not will help you establish realistic assumptions of your impact on the company’s business model. It will also help clarify that your relationship with your future employer is fundamentally a business relationship and help you become aware of your tolerance of potentially uncomfortable parts of the business model. After all, we all live on the same planet with a shared fate, and our choices have a habit of catching up with us.</p>
<hr>
<p>To summarize, incorporate the following questions in your search for the next job.</p>
<ol>
<li>What is the company’s business model, and is it robust?</li>
<li>How is the position connected to the business model?</li>
<li>Do you understand the business model enough to answer whether you support that business model or not?</li>
</ol>
<p>You might say that the business model is not essential for you compared to the pay, the title, the type of work, etc. That’s fine too, but I suggest that understanding the business improves your career success. You get to know how the company makes and spends money, and as a side benefit, you have a greater chance of becoming a better global citizen.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Must DOs for Interviewers]]></title>
            <link href="https://www.subbu.org/articles/2022/must-dos-for-interviewers/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/must-dos-for-interviewers/</id>
            
            
            <published>2022-03-25T20:10:16+00:00</published>
            <updated>2022-03-25T20:10:16+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Here are three must DOs for interviewers based on my recent interviewing experience with several companies.</blockquote><p>Here are three must DOs for interviewers based on my recent interviewing experience with several companies.</p>
<h2 id="1-bepresent">1. Be Present</h2>
<p>Presence is the most important behavior for an interviewer. Don’t distract yourself during the interview. The candidate would know when your eyes wander off to check an email or a message on your screen. When that happens, you break the communication flow. Don’t let this happen. Stay in the full-screen mode and disable notifications on all your devices. If you are taking notes, let them know.</p>
<p>Look, the candidate is giving you their time and attention. You also agreed to give yours to the candidate. The candidate must also have spent their time researching about you in addition to the company you work for. So, the least you can do is be present during the interview.</p>
<p>Further, do some homework to get to know the candidate before the interview. Most companies tell candidates to research about them prior to the interview. Reciprocate the same to the candidate even for a few minutes before the interview. That process will ease you into being present with the candidate.</p>
<p>Don’t jump into the interview with no time between your prior meeting and the interview. Declutter your mind, your screens, and devices, relax for a few minutes before the interview, and only then join the interview. Don’t start the interview with a “let me open your resume” and start reading while the candidate is waiting or speaking. Show your manners.</p>
<h2 id="2-be-personable">2. Be Personable</h2>
<p>Attempt to connect with the candidate. Smile. You’re in the interview with them to know about them. Regardless of suitability, you and the candidate are fellow human beings, so start at that human level. Be personable.</p>
<p>There is no need to wear a cloak of smartness. You’re there to know about the candidate, but not show off how good you are. Candidates perform the best when they feel connected and respected. Don’t make yourself believe that interviews are about performance under stressful conditions and that you’re there to simulate such situations. Real-world stressful conditions differ vastly from interview conditions.</p>
<h2 id="3-becurious">3. Be Curious</h2>
<p>As an interviewer, you are in a position to judge the candidate. But don’t use the interview time to judge them. Judgement biases communication. Instead, be curious and explore the candidate during the interview, and defer judgment to a time after the interview.</p>
<p>When you begin to judge the candidate during the interview, your body language and tone will undoubtedly reflect your opinion. The candidate will likely feel your opinion subconsciously, influencing their subsequent behavior.</p>
<p>In essence, your judgment, mainly when unfavorable to the candidate, will affect the candidate’s behavior and eventually derail the outcome. Instead, a curious approach will let the candidate open up, be themselves, and play along with you so you can learn more about them.</p>
<p>Don’t make assumptions about things that the candidate has not told you. Ask them probing questions instead to establish facts as best as you can. Don’t jump to conclusions without probing.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Making Up Movies]]></title>
            <link href="https://www.subbu.org/articles/2022/making-up-movies/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/making-up-movies/</id>
            
            
            <published>2022-03-12T14:55:11+00:00</published>
            <updated>2022-03-12T14:55:11+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Continuing from my previous article on managing yourself, another classic trap that impedes personal growth is endlessly playing self-made…</blockquote><p>Continuing from my previous article on <a href="https://m.subbu.org/managing-yourself-3c2fb748d70c">managing yourself</a>, another classic trap that impedes personal growth is endlessly playing self-made movies in your mind and believing in those plots. Let me describe a particular situation.</p>
<p>One evening, I got a call from an ex-colleague out of the blue. We’ve not spoken for years. He wanted to talk, and I said go on. He sounded upset and beaten. For the next ten to fifteen minutes, he gave me a crude sketch of what was going on at work with his current manager, the new manager, some details about how he felt about them, and some feelings of betrayal.</p>
<p>It took a while for me to piece together what was happening from his perspective. Initially, he felt liked by his then-current manager and built a good rapport. He had access to that manager, which allowed him to work on good projects. That manager’s org grew, and now he was asked to report to one of his peers and move to the skip-level. That felt like a rebuke to him. He was concerned about losing access and being pushed back. “What wrongs did I do? Why is my manager punishing me like this?” were his recurring questions.</p>
<p>Sounds familiar?</p>
<p>It was clear from his voice that he had been deeply in distress for several weeks. He seemed depressed and picked up drinking. I could hear the stress in his voice.</p>
<p>After about 30 minutes into the conversation, he became calmer. Let me present the pivotal moment of our discussion as I recall.</p>
<blockquote>
<p>(after several minutes of me probing to understand)</p>
<p>Me: It sounds like you’ve been directing, acting, and living in a movie.</p>
<p>Him: What? Movie?</p>
<p>Me: The film you’ve been acting and directing in your mind.</p>
<p>Him: What?</p>
<p>Me: Yes, the same film where your manager is the villain, and you’re the victim. He is kicking you and punching you, and you’re hurting.</p>
<p>Him: ???</p>
<p>Me: You know that you have the power to get out of that movie and make a different one to play in your head?</p>
<p>Him: Hmm</p>
<p>Him: Now I see what you’re saying. Do you think I imagine all this?</p>
<p>Me: Most likely. Do you agree that your manager may not even know he is in your movie?</p>
<p>Him: Yeah</p>
<p>Me: And he may be directing and acting in a different film right now in which you don’t even exist.</p>
<p>Him: Yes, that’s possible.</p>
<p>Me: So, how about you stop making the movie you’re currently making and choose to make some other movie where you’re not a victim but a hero, where you imagine that things are happening around you and not to you?</p>
<p>Him: I see.</p>
</blockquote>
<p>We then talked about alternatives to his current movie to recognize that he could control nothing but his perception of reality and his actions. He subsequently joined my coaching sessions, and we worked on some improvements.</p>
<p>Here is another familiar movie plot.</p>
<p>Sometimes, you want to have a crucial conversation with your manager or another influential colleague. It could be about a promotion, scope of work, or something of importance. You replay what you will say in your mind several times. You rehearse. You brood over. It’s yet another movie you’re acting in and directing. In the end, that meeting may not happen, may move around, or it may not go like the way you had imagined. This is just wasted mental energy.</p>
<p>Instead of replaying, write down what you want to say, and close the book until you’re about to meet that person. If you feel it is urgent, find a way to get it over with. Call that person on the phone, or slack them. Clarify your assumptions. Talk to others about what you’re thinking. By replaying what you’re going to say, again and again, in your mind, you’re just taxing your brain. Don’t do it.</p>
<p>What is sad about this pattern is how common it is. Why makeup such movies? Why ruminate in those stories and waste energy and time? Ancient philosophies have established that we make up much of our social reality. Cognitive scientists, too, have found the same. Mindfulness starts with minimizing such replays. The trick is to become aware, quickly, and pivot to do what’s in your control right now.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Don’t Chase Data Mesh, Yet]]></title>
            <link href="https://www.subbu.org/articles/2022/dont-chase-data-mesh-yet/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/dont-chase-data-mesh-yet/</id>
            
            
            <published>2022-02-02T22:13:36+00:00</published>
            <updated>2022-02-02T22:13:36+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Data mesh is a nice wishy-washy set of ideas to improve the current state of data. The principles are based on sound reasoning and are well…</blockquote><p><a href="https://martinfowler.com/articles/data-mesh-principles.html">Data mesh</a> is a nice wishy-washy set of ideas to improve the current state of data. The principles are based on sound reasoning and are well intended, but I find the story incomplete to transform the current state of data radically. There is plenty of money flowing into the industry. So there are companies to be funded, differentiated products to be built, customer segments to be carved out, conferences to be held, and we may still miss the opportunity to drive change.</p>
<p>Here is why I say this.</p>
<ol>
<li>You need modern developer-facing abstractions to decentralize data ownership to domain teams. Period. Otherwise, decentralizing centralized functions like data engineering would be more expensive and chaotic.</li>
<li>Those primitives need to expose automated polyglot access patterns to support different types of use cases and users. These patterns include CRUD, search, real-time analytics, streaming to data lakes, generating business events, etc.</li>
<li>More importantly, you need to argue for data mesh in terms of value and not pain. What’s broken is clear, but that’s insufficient to motivate and drive radical changes. Opportunity drives innovation at a much more rapid scale and rate than pain. I find today’s Data Mesh arguments generally pain-based.</li>
</ol>
<p>Let me dive into each of these arguments. This article is a continuation of my previous article on the <a href="https://m.subbu.org/broken-state-of-data-4c8a8a30a0c3">broken state of data</a>.</p>
<h3 id="modern-data-abstractions"><strong>Modern Data Abstractions</strong></h3>
<p>Let’s look back to see forward. Today, thanks to systems like Kubernetes, containers, and cloud APIs, most developers interact with and make changes to complex infrastructure without realizing the complexity underneath. The developer and operator-facing abstractions of systems like Kubernetes eliminated several time-confusing and frictional steps for deploying, scaling, remediating, and managing apps. These made principles like automating everything, infrastructure as code, immutability, and repeatability easy to do. A successive generation of tools made implementing these principles progressively easier, which made DevOps successful. In other words, principles alone won’t drive innovation; you need developer-facing abstractions to make it easy to do the right things.</p>
<p>So, what type of abstractions do we need on the data side? I surmise that these include usual CRUD operations, search, real-time analytics, schema tracking, creating business events, transforming such events, etc. Such abstractions should make domain teams own domain data and do most things without handoffs across org silos or needing an army of people to put these together manually.</p>
<h3 id="polyglot-interfaces-and-multi-sided-abstractions"><strong>Polyglot interfaces and multi-sided abstractions</strong></h3>
<p>Data is always a shared resource. Regardless of how you organize data ownership, you will end up with multiple teams producing and consuming related data. Modern data abstractions must facilitate multiple teams to contribute and utilize data for their needs without manually shoveling data around. For instance, some of your operational systems might use a proprietary query language for CRUD operations, your analytics teams might use SQL, and some app teams might use GraphQL to access that data. It does not mean you need to explicitly clone the data, create glue layers, or rewrite database engines to support polyglot access. Your core data store might do the internal reorganization for you and expose simple operational knobs. Such multi-sided abstractions will further shuffle complexity to be manageable.</p>
<p>This trend is already beginning to happen for some cloud-based offerings. Companies like <a href="https://www.mongodb.com/atlas">MongoDB</a> and <a href="https://www.datastax.com/products/datastax-astra">Datastax</a> seem to be headed in this direction, and there must be others. We should expect the innovation in this space to continue to make polyglot access easy. I suspect that disaggregation of database engines from storage will accelerate this trend and lower performance and cost penalties.</p>
<h3 id="value"><strong>Value</strong></h3>
<p>My final point is about value. We tend to accept known pains. Yup, the current state is painful, but why drive a change when you have ten other value-generating projects in your enterprise? If you are a leader of a data organization in an enterprise, you need value-based arguments to lead socio-technical changes. Without it, your initiative won’t make it to the top-10 key results for your CEO.</p>
<p>Remember that DevOps did not happen just because we said so a thousand times. There was a clear value driver — reduce time to value. That was the single metric to go after. Once you aligned on that metric, change was possible. You were releasing once or twice a month, and now suddenly, you get to release hundreds or thousands of times a day. You’re taking less time to recover from incidents, and your teams are learning from production systems. Such stories broke the dev vs. ops silos and made cultural and organizational changes possible. We had some remarkable examples to show during the early days, like <a href="https://www.youtube.com/watch?v=LdOe18KhtT4">10+ Deploys per Day: Dev and Ops Cooperation at Flickr</a> in 2009.</p>
<p>But we don’t hear such clear arguments for value today. There are plenty of articles on “what is data mesh,” but I could not find any on “why data mesh?” to propose a singular value argument. For example, in <a href="https://www.starburst.io/learn/data-fundamentals/what-is-data-mesh/">one of those</a> “what is” articles, the author says, “the faster access to query data directly translates into faster time to value without needing data transportation.” But how? What’s the return on investment? Another <a href="https://towardsdatascience.com/what-is-a-data-mesh-and-how-not-to-mesh-it-up-210710bb41e0">similar article</a> highlights “greater data experimentation and innovation while lessening the burden on data teams to field the needs of every data consumer through a single pipeline.” That’s a pain argument. There is nothing wrong with these points, but these are not enough to drive step-function changes.</p>
<p>Quantifying value from data is already hard and quantifying value for a significant socio-technical transformation around data is harder. But that’s what you need to drive momentum. I’ve not seen arguments and examples along these lines. Sorry, I don’t know what that is either.</p>
<p>No socio-technical change will happen in one go, and winners won’t emerge overnight. We need multiple attempts over the next several years. Incumbents in the data landscape might not be willing to lead the path initially as it would impact their current business models. Open source will likely need to play a role to make it easier to put things together with standard parts. That’s my hypothesis for the future.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Managing Yourself]]></title>
            <link href="https://www.subbu.org/articles/2022/managing-yourself/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2022/managing-yourself/</id>
            
            
            <published>2022-01-30T16:40:54+00:00</published>
            <updated>2022-01-30T16:40:54+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As the readers of this blog know, I have been offering free coaching sessions since November last year. From then, I’ve coached over twenty…</blockquote><p>As the readers of this blog know, I have been offering free coaching sessions since November last year. From then, I’ve coached over twenty people from several tech companies. I knew of a few from prior experience, but many others were new. Though most of the participants were individual contributors, there were some engineering, product, and program managers as well.</p>
<p>During these sessions, the participants and I explored various aspects of their leadership. Each participant is at a different point in their leadership journey, yet we identified challenges to overcome. In some cases, the challenges were apparent, but in most cases, we had to peel a few layers to discover areas of improvement and tactics to employ. What we felt a challenge turned out to be a symptom of some other underlying challenge.</p>
<p>But as I started spending more time with participants, I began to see a more significant issue. Several sessions underscored one essential skill we all need to acquire: <strong>managing yourself</strong>.</p>
<p>Managing yourself includes managing your internal state (how you feel about yourself and others and your emotions), time, relations at work, dealing with conflicts, setbacks, and difficulties, being present and investing in personal growth. Through these coaching sessions, it’s become clear that most of us aren’t even aware of ourselves, take managing ourselves for granted, and float along in our daily lives.</p>
<p>A few participants told me that time management was their biggest challenge, and they wanted to figure out how to be more efficient at doing and completing all the things they wanted to do. They have tried some approaches, which didn’t work. On probing a bit more, I ended up telling them that they don’t have a time-management problem, and their problem is self-management. Time is not a manageable entity — every moment, we inherit a new moment, and the current moment becomes the past. Each moment comes and goes. But, what we do with those moments is manageable.</p>
<h4 id="youre-the-ceo-of-yourselfa-one-person-enterpriseact-likeone"><strong>You’re the CEO of yourself — a one-person enterprise — act like one</strong></h4>
<p>In the introduction to his classic management book <a href="https://www.goodreads.com/book/show/324750">High Output Management</a>, Andy Grove writes that “you are in effect a chief executive of an organization yourself” (see page xv, in the first chapter). Although he expressly referred to middle managers in that chapter, his point applies to everyone.</p>
<p>Imagine yourself being the CEO of a one-person enterprise. To be a functioning enterprise, you have to set a purpose, a strategy, and objectives for yourself. You have a business plan and metrics. You have an operating plan to function as an enterprise.</p>
<p><strong>As a CEO, every day, you get to decide how you’re going to invest your time, which is your primary fixed capital.</strong> You choose the activities you want to do and those you don’t want to do. You prioritize. A CEO rarely runs the company based on that morning’s news, social media chatter, or the stock ticker. Same for you. Why let incoming email, meetings, rumination, and doom-scrolling dictate how you spend your time?</p>
<p>Every day, you, the CEO, are accountable for the mood in your company. Have an all-hands with yourself and hear what you are telling yourself. Are you setting a purpose for each day, or are you letting daily activities take you in different directions? Are you mumbling to yourself, giving yourself excuses, or do you sound energetic and joyful with clarity of purpose and action?</p>
<p>Ask yourself about your investment plan for yourself. What skills are you acquiring? What are you learning? What alliances and partnerships are you building? Are you being effective at those partnerships?</p>
<p>When you imagine yourself being a CEO of your one-person enterprise, you don’t take conflicts and setbacks at work personally. You tackle those with strategy and tactics. You realize that your relationship with your employer is fundamentally a business relationship.</p>
<p>I find that such a mental model of being the CEO of a one-person enterprise can build self-awareness. It puts you in a position of driving action, not stagnation. It is an effective tool. Try it out.</p>
<p>If you’re open to working with a coach, I may be able to help. I’m still accepting a limited number of people for coaching. Send me a DM on <a href="https://www.linkedin.com/in/subbu/">LinkedIn</a> or <a href="http://twitter.com/sallamar">Twitter</a> to get started.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[2021 in Books]]></title>
            <link href="https://www.subbu.org/articles/2021/2021-in-reading/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/2021-in-reading/</id>
            
            
            <published>2021-12-28T19:40:25+00:00</published>
            <updated>2021-12-28T19:40:25+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Here are the top books that influenced me the most this year.</blockquote><p>Here are the top books that influenced me the most this year.</p>
<p><a href="https://www.goodreads.com/en/book/show/13221308"><strong>Positive Intelligence</strong></a> <strong>by Shirzad Chamine</strong></p>
<p>My coach recommended this book late last year, and I picked it up this year. In this book, Shirzad provides a framework to quiet out the worst (the saboteurs) by naming them and revealing them. His framework helped me discover my saboteurs and recognize them quickly when I see them again. I recommended this book to several people in my circle this year. In my coaching sessions, I ask people to read this book and come back to tell me what they discovered and the justification lies they tell themselves when demonstrating certain behaviors. This exercise usually leads to several insightful conversations and aha moments for self-improvement.</p>
<p>Though unrelated to this book by genre, I also recommend <a href="https://www.goodreads.com/book/show/48930266-seven-and-a-half-lessons-about-the-brain">Seven and a Half Lessons About the Brain</a> by Lisa Feldman Barrett to learn that “we all live in a world of social reality that exists only in our human brains” and that this social reality is neither innate in our minds nor fixed. We have the power to recondition it.</p>
<p><a href="https://www.goodreads.com/book/show/32075449-the-ends-of-the-world"><strong>The Ends of the World</strong></a> <strong>by Peter Brannen</strong></p>
<p>This book completely changed my understanding of the current global warming trend. Here is the uncomfortable truth you discover from this book — unlike the stuff we buy in stores or online, this planet has a “no return” policy on the carbon we extract, transform and consume at the most rapid rate this planet has ever seen. We have no easy and quick way to put back all the carbon we extracted in the last 100+ years in time to stop or reverse the current warming trend. The most effective and natural way to put back the carbon takes tens of thousands of years through a process known as “weathering.” Is the game over? I hope not, but we don’t have the time.</p>
<p>This book led me to Neil Shubin’s <a href="https://www.goodreads.com/book/show/51199750-some-assembly-required">Some Assembly Required</a>, which I also recommend reading.</p>
<p><a href="https://www.goodreads.com/book/show/42118073-trillion-dollar-coach"><strong>Trillion Dollar Coach</strong></a> <strong>by Eric Schmidt, Jonathan Rosenberg, and Alan Eagle</strong></p>
<p>Imagine learning about someone through a few accomplished people. This is a story of Bill Campbell. I finished reading this book just last week. As you read the book, you will recognize the power of listening, care, and candor to influence others. In his <a href="https://www.goodreads.com/book/show/18176747-the-hard-thing-about-hard-things">Hard Things About Hard Things</a>, Ben Horowitz also talks about Bill Campell where he says that “truly great leaders create an environment where the employees feel that the CEO cares more about the employees than she cares about herself” and that “(Bill is) the man who is the best I’ve ever seen at this.”</p>
<p>However, if you’re interested in <a href="https://m.subbu.org/cultivate-the-coaching-practice-b22bcfe1de53">cultivating coaching habits</a>, I recommend starting with Michael Bungay Stanier’s <a href="https://www.goodreads.com/book/show/29342515-the-coaching-habit">The Coaching Habit</a>.</p>
<p>Below is the <a href="https://www.goodreads.com/user/year_in_books/2021/81904769">complete set</a> that I managed to read this year. It was a productive year, and I managed to improve the diversity of books a bit this year.</p>
<p><img src="/img/1__gUR05HGCY2s3O0G3UjPOnQ.png" alt=""></p>
<p>Follow me on <a href="https://www.goodreads.com/user/show/81904769-subbu-allamaraju">Goodreads</a> so I can follow you back to learn what you’re reading.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Feedback]]></title>
            <link href="https://www.subbu.org/articles/2021/on-feedback/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/on-feedback/</id>
            
            
            <published>2021-12-26T16:19:27+00:00</published>
            <updated>2021-12-26T16:19:27+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Asking for feedback can be challenging. It can be uncomfortable to know. It may force you to look at things that you would instead look…</blockquote><p>Asking for feedback can be challenging. It can be uncomfortable to know. It may force you to look at things that you would instead look past. What if there is a better way?</p>
<p>What if we consider that the feedback is already there, floating in front of us, nicely wrapped, and all we have to do is grasp it with our hands, and unwrap it to know what’s inside? What if we seek it like we seek anything new or unopened, with curiosity and no judgment of the giver as well as of the seeker, to see what others saw, to hear what others heard, and to know what others felt?</p>
<p><img src="/img/1__Mj1AyxVOhhtSJgcxntlmRQ.jpeg" alt=""></p>
<p>Yes, that’s the nature of feedback. Whether we seek it or not, it is already there, floating around us, waiting for us to unwrap. If we are present enough, we can get glimpses of feedback from others’ body language, tone, and behaviors. If we’re curious enough, we can ask for it.</p>
<p>The choice is ours — grasp it to learn from it but not judge it or the seeker, or move past it with continued apathy.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Cultivate the Coaching Practice]]></title>
            <link href="https://www.subbu.org/articles/2021/cultivate-the-coaching-practice/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/cultivate-the-coaching-practice/</id>
            
            
            <published>2021-12-12T16:21:14+00:00</published>
            <updated>2021-12-12T16:21:14+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Most managers and companies spend weeks and months hiring but do little to feed and groom the minds of the people they employ – that’s what…</blockquote><p>Most managers and companies spend weeks and months hiring but do little to feed and groom the minds of the people they employ – that’s what my current coaching experience reemphasizes.</p>
<p>We know that complexity in the workplace has increased over the past decade. We are demanding a higher rate of change and lower time to value from each other. We ask individuals to excel in boundaryless situations, influence others and lead cross-functional projects. Yet, most individuals are lost, unguided, alone, stuck, or stumbling to find their better selves at work. Companies compete to offer money and perks and yet rarely equip themselves to feed their employees with the mental nourishment they need to lead themselves. Coaching is one of the ways to provide that nourishment, but it rarely happens at work. Managers often lack the time or maturity to coach their team members.</p>
<p>Suppose you happened to have some coaching moments from someone at work — lucky you, you’re in the minority. If your workplace has a formal coaching program to pair you up with an internal or external coach, you’re in a great place — take advantage of such programs. However, for the majority, these don’t happen. The result is sub-optimal growth and performance. I believe people underperform, not for their lack of abilities and willingness, but for the absence of tools like coaching to lead themselves better.</p>
<p>Since I announced my <a href="https://m.subbu.org/looking-for-a-coach-4735a0f34c78">offer to coach</a> last month, I have had the privilege of conducting nearly twenty coaching sessions. Most participants mentioned that, through these sessions, they have had some breakthrough moments and discovered better ways of leading themselves at work. In a feedback survey I sent, 90% said they would recommend coaching to others. In these sessions, the participants are doing all the hard work reflecting and exploring different options during and between sessions. I was merely present listening, asking questions, observing, offering pointers to explore, and sometimes sharing personal experiences. That’s all. Given this experience, I plan to continue coaching in the future and urge other leaders to do something similar. More about the future later.</p>
<p>If you’re a manager or someone in a leadership role, I want to ask for three things.</p>
<p>First, read Michael Bungay Stanier’s <a href="https://www.goodreads.com/book/show/29342515-the-coaching-habit">The Coaching Habit</a>. The book is easy enough to read and gives you seven excellent steps to practice coaching. <a href="https://www.goodreads.com/book/show/42118073-trillion-dollar-coach">Trillion Dollar Coach</a> by Eric Schmidt, Jonathan Rosenberg, and Alan Eagle is another good book to read, but I find The Coaching Habit more direct to offer the crux.</p>
<p><img src="/img/1__zo5C6VGgXoyz__J__AjYoX2Q.jpeg" alt=""></p>
<p>Second, appropriately incorporate coaching in your 1:1s with the people in your team as well as other teams. Before your 1:1s, declutter and calm yourself, and put all the transactional work aside. You can’t offer coaching moments unless you’re present and are in the moment. Poor work habits like back-to-back meetings, email streams, and multi-tasking make it hard to be present. Don’t waste their time when you’re not able to be present.</p>
<p>Third, don’t judge people. You can’t offer coaching moments to people when you are in the mood to judge. If you feel compelled to judge others based on how they are approaching problems or what they are going through, you are not ready to provide coaching moments. People don’t trust you and open up if they sense that you’re judging. They may also mistrust you if you’re their manager since you can penalize them. Instead, fix yourself not to judge others first.</p>
<p>For some time, I’ve been looking for effective ways to develop others. I now know that coaching is one of the most effective ways to help others raise. To grow as a leader, incorporate appropriate coaching moments in your interactions with others.</p>
<p><img src="/img/1__L9CLWVT__lOD1URHF__f__q__Q.png" alt=""></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Tell Me More]]></title>
            <link href="https://www.subbu.org/articles/2021/tell-me-more/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/tell-me-more/</id>
            
            
            <published>2021-12-07T00:17:58+00:00</published>
            <updated>2021-12-07T00:17:58+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As a form of asking a question, “why” is the queen. Asking for why demonstrates a curious mind at work. We expect a question with a “why”…</blockquote><p>As a form of asking a question, “why” is the queen. Asking for why demonstrates a curious mind at work. We expect a question with a “why” to prompt inquiry. Five whys is a popular iterative interrogative technique to explore causes behind effects. But when dealing with people, “tell me more” is a more powerful way of inquiry than asking for “why.”</p>
<p>Try this next time you want to know why someone did something in a certain way. Instead of asking</p>
<blockquote>
<p>Hi, I noticed such and such about this thing. Why so?”</p>
</blockquote>
<p>ask</p>
<blockquote>
<p>Hi, I noticed such and such about this thing. Can you tell me more?</p>
</blockquote>
<p>There is a subtle but important difference between these two. I won’t tell which one does what to the listener, but one of these forms makes the listener want to protect themselves (imagine the listener wrapping their arms around themselves). In contrast, the other makes the listener open up (imagine the listener opening up their arms relaxed).</p>
<p><img src="/img/1__GhUGTxmT4KAPjJxo6s__iLQ__2x.jpeg" alt=""></p>
<p>Try it out. Replace “why” with “tell me more.” Find the difference?</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Broken State of Data]]></title>
            <link href="https://www.subbu.org/articles/2021/broken-state-of-data/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/broken-state-of-data/</id>
            
            
            <published>2021-11-19T16:31:02+00:00</published>
            <updated>2021-11-19T16:31:02+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>In recent years, data has gotten a more oversized seat at the enterprise table. Data was never less prominent, though the focus used to be…</blockquote><p><em>(Also see <a href="/articles/2022/dont-chase-data-mesh-yet/">Don&rsquo;t Chase Data Mesh, Yet</a>.)</em></p>
<p>In recent years, data has gotten a more oversized seat at the enterprise table. Data was never less prominent, though the focus used to be more on choosing and running operational systems like SQL or NoSQL databases at scale. Given the prominence of closed-loop ML systems and the potential customer value they could generate from analytics (such as statistical, predictive, diagnostic, and machine learning) use cases, enterprises have an even stronger desire to be data-driven.</p>
<p><img src="/img/1__kqRhF2Jytf3cK6WY3l4zQQ.png" alt=""></p>
<p>Just this week, I came across an <a href="https://twitter.com/adipolak/status/1460852764926484483">insightful tweet</a> by Adi Polak, a big data developer at Microsoft, who said, “If you can understand how to produce, collect, manage and analyze data, you’ll own your future.” She could not be more right. However, it turns out that being data-driven is more complicated than what appears on slideware.</p>
<p>Over the last few weeks, I have had a chance to speak with some ex-colleagues about the state of data, the emerging notion of data mesh, and how different vendors talk about data. For those not familiar with data mesh, see <a href="https://www.thoughtworks.com/en-us/profiles/z/zhamak-dehghani">Zhamak Dehghani</a>’s original articles <a href="https://martinfowler.com/articles/data-monolith-to-mesh.html">How to Move Beyond a Monolithic Data Lake to a Distributed Data Mesh</a> and <a href="https://martinfowler.com/articles/data-mesh-principles.html">Data Mesh Principles and Logical Architecture</a> in 2019 and 2020, respectively. You can also find several videos on YouTube on this subject. As an outsider to this space, I have the luxury of a fresh perspective. Here is what I found out from my explorations.</p>
<p>The <strong>state of data is messy</strong> for several reasons, but these four seem to stand out.</p>
<ol>
<li>Fragmented ownership and accountability across organizational boundaries</li>
<li>Centralization of specific functions like database management and data engineering but without a complete skin in the game</li>
<li>Skill imbalance — software development teams rarely treat data as part of their service, and data engineers rarely get exposed to the software development lifecycle; they often speak and approach problems differently</li>
<li>Glue tech that you need to shovel and transform data around to power analytics use cases, including machine learning</li>
</ol>
<p>Often, <strong>the teams that produce data are decoupled from the downstream analytics and ML use cases. Likewise, the people dealing with analytics use cases are typically unaware of operational systems that produce the data.</strong> Data engineering teams get caught up in the middle with a mandate to make an enterprise data-driven. This chasm is not a surprise to the data practitioners who live through this mess.</p>
<p>On the one hand, such central data teams often lack the ownership and skills to implement this mandate. The same is valid on the operational side as well. When reviewing this article, <a href="https://www.linkedin.com/in/mammadz/">Mammad Zadeh</a>, who ran data engineering teams at LinkedIn and Intuit, rightly points out the lack of “right tools to empower developers to take on that responsibility.” When neither side is well-equipped, the enterprise is the loser.</p>
<p>In a recent example, I saw an ML team wait for the data engineering team to fix things in areas they don’t own. A subset of data stopped flowing into a particular destination due to some defect in the source app, but the data engineering team ended up holding that bug in their queue for weeks. They had no idea where to look since they didn’t own those source apps. There is no wonder why data scientists often cite data-related issues like data collection, clean-up, and quality of data at the top of their list of pain points. Machine learning, after all, is a feedback loop problem. You need all parts of the feedback loop working well together for it to learn quickly and produce value. But for that to work well, you must find ways for the operational and analytical worlds to work well seamlessly.</p>
<p><strong>While it is exciting to see the innovation and choice in the database arena, the resulting flexibility has amplified particular challenges</strong>. First, it is hard for software development teams to make database choices for the data model and anticipated access patterns. Second, once a team makes a choice, they have to deal with the consequences of that choice in the face of data or access pattern changes or lessons learned. Changes consume time, create downtime, and could leave dirty data behind. Third, choice breeds sprawl, making it complicated to trace the source of truth, the lineage, and establish which data to consume.</p>
<p>These challenges also contribute to <strong>increased cost and time for governance</strong>. Just knowing what data field exists in what data store could be a program over several weeks. It is not a happy place to be in a centralized data organization entrusted with solving problems like establishing the source of truth, lineage, model management, and governance.</p>
<p><strong>The situation on the analytical side seems worse, with the work often dissolving to keep things going or “keep the lights on.”</strong> By this, I don’t mean that enterprises struggle to do analytics or machine learning. There are great products and technologies for these use cases for sure, but these involve stitching together multiple sources of data, performing data movement and transformations. However, in the current state of affairs, the success of the analytical world depends on first finding the suitable glue and then keeping that glue together end to end. When the glue breaks, things can go unnoticed for a while. When someone notices, many people may need to contribute to fixing it. The current state of affairs does not seem to offer a winning strategy.</p>
<p>In my opinionated observation, there is a <strong>lot of vendor-speak</strong> in the material I reviewed, which shows that the buyers for the products are not the doers but decision-makers keen to get some outcomes quickly. Such decision-makers may lack time to dive deep. I believe that tech designed and sold to decision-makers contributes to widening the chasm between operational and analytical worlds and adds more glue in between.</p>
<p>Also, look at the tool landscape, like Matt Turck’s <a href="https://mattturck.com/data2021/">2021 Machine Learning, AI and Data (MAD) Landscape</a>. It’s a tool bazaar. <strong>Making sense of the landscape can be challenging</strong>, and you may not know if you’re getting the value you want or just adding more tools to your tool chest. The tools in the landscape are growing, and you will undoubtedly need some handcrafted glue to put things together to drive value quickly. Building <a href="https://erikbern.com/2021/07/23/what-is-the-right-level-of-specialization.html">upon an analogy</a> by <a href="https://erikbern.com/">Erik Bernhardsson</a>, <a href="https://benn.substack.com/about">Benn Stancil</a> describes this situation better in his <a href="https://benn.substack.com/p/the-modern-data-experience">The Modern Data Experience</a>, where he says that “hyperspecialization (of tools) makes us great at chopping onions and baking apple tarts, but it’s a bad way to manage a restaurant.” In my experience, ML problems are like running a restaurant — you need to establish decent closed feedback to derive value.</p>
<p>Finally, many <strong>organizations seem to have left out data in their microservices and dev ops transformations of the prior decade</strong>. These transformations radically changed technology and culture through massive decentralization of infrastructure, people, and responsibilities. Yet, we still see large data engineering organizations struggling between producers and consumers of data, holding the problematic parts.</p>
<p>Centralization of certain functions isn’t bad as long there is a clear shared responsibility model. Consider, for example, centralized platform teams that provide CI/CD tools for cloud environments. There is a clear separation of concerns and a shared responsibility model with platform teams owning the tools and individual dev teams owning their apps and apps’ health. <strong>However, I don’t believe that the current toolset and patterns can enable a similar separation of concerns for data.</strong> Consequently, I don’t think it is fair for organizations to entrust data engineering teams to own discovery, governance, data cleanup, etc., in addition to the infrastructure and tools.</p>
<p>When reviewing a draft of this article, my one-time colleague and mentor, <a href="https://www.linkedin.com/in/debashis1saha/">Debashis Saha</a>, who has led data engineering teams at eBay and PayPal, made an excellent observation. He said that “today’s technology creates a polarized architecture” and that “centralized data teams cannot keep up with the needs of the business or the decentralized operational teams that create the data mess.” It’s just hard to succeed.</p>
<p>Where do these challenges leave us? I have a few hypotheses to offer.</p>
<p>First, <strong>I don’t believe that the analytical world would drastically improve unless we take the domain-driven approach to data very seriously in the operational world.</strong> Any change needs to start with data production, most of which usually happens in the operational world. <strong>We likely require a new generation of developer-facing abstractions for operational systems to better bridge with the analytical systems.</strong> I don’t have answers; I have a hunch.</p>
<p>Second, <strong>we need organizational transformations to implement “data as a product” with a bounded context.</strong> It requires shifting responsibilities. You can have centralized teams provide and operate shared tech, but you’ve to give the data ownership and accountability back to domain teams. You also have to hire appropriately and adjust goal setting and planning rituals to support such decentralization. I’m not the first one to say this. Zhamak <a href="https://www.youtube.com/watch?v=KOBgqlHr8tM&amp;t=220s">describes</a> data mesh as a “decentralized sociotechnical approach.” I want to emphasize the social aspect of this description because you have to inflict changes at every level to reap the benefits of the concept of data as a product. But transformations are expensive and require leadership with tenacity, endurance, and foresight. These can be hard to come by.</p>
<p>Third, <strong>while the core principles of the data mesh</strong>, such as (1) domain-oriented decentralized data ownership and architecture, (2) data as a product, (3) self-service data infrastructure as a platform, and (4) federated computational governance, <strong>promise a better state for the analytical world, I don’t believe that there is a straight road ahead</strong> for all the reasons I describe above. Each of these four items requires significant shifts in tech, processes, roles, and responsibilities. I would march with eyes wide open, start from the first principles and be open to changing minds as we go.</p>
<p>Thanks to <a href="https://www.linkedin.com/in/debashis1saha/">Debashis Saha</a> for several discussions and feedback on this article. Also, thanks to <a href="https://www.linkedin.com/in/mammadz/">Mammad Zadeh</a> and <a href="https://www.linkedin.com/in/bnataraj/">Bala Natarajan</a> for their perspectives and feedback.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Looking for a Coach?]]></title>
            <link href="https://www.subbu.org/articles/2021/looking-for-a-coach/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/looking-for-a-coach/</id>
            
            
            <published>2021-11-13T16:07:26+00:00</published>
            <updated>2021-11-13T16:07:26+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Hello. Are you an individual contributor in the tech field? Are you looking to make an impact at work but are running into obstacles? Would…</blockquote><p>Hello. Are you an individual contributor in the tech field? Are you looking to make an impact at work but are running into obstacles? Would you like some guidance to figure out how to influence others? Do you find it hard to deal with conflicts at work? Do you feel you got ideas, but those are not gaining traction? If you’re sensing some of these at work, I can partner with you to uncover some ways to unblock them.</p>
<h4 id="update-see-this-pagehttpswwwcenteredleadershiporg-to-getstarted">Update: See <a href="https://www.centeredleadership.org/">this page</a> to get started.</h4>
<p>Here is how it works:</p>
<ol>
<li>You are an individual contributor with at least seven years of experience.</li>
<li>I will offer three sessions over three weeks, with each for about 45 minutes.</li>
<li>I won’t teach you or offer solutions. We will instead discuss you, the circumstances, and the challenges, and together, we will discover potential options.</li>
<li>You will not have to disclose anything that you do not want to.</li>
<li>You will also not tell me anything you must not, such as proprietary and confidential work-related details.</li>
<li>Our sessions will be completely confidential. You and I agree not to disclose the contents of our sessions to anyone without explicit consent from the other.</li>
<li>These won’t cost you a thing.</li>
</ol>
<p>In return, I would ask you for two things:</p>
<ol>
<li>Give me feedback</li>
<li>Donate a reasonable amount to a charity and share</li>
</ol>
<p>Why am I doing this?</p>
<p>First, it can be tough to discuss such topics at work. Managers have more access to information and expertise to get help with these issues than individual contributors. Managers also get on-the-job practice over time. At the same time, companies expect individual contributors to act as leaders for their career growth, but they rarely provide any guidance. Hence, for this round, I’m limiting these sessions to individual contributors.</p>
<p>Second, I believe in the power of coaching to solve problems. Such issues are not new to me, and I’ve personally navigated such matters and coached others in the past. I’ve also benefited from some excellent coaches.</p>
<p>Third, I’m currently on a sabbatical and have the luxury of time to explore different things.</p>
<p>If you’re interested, follow me on <a href="https://twitter.com/sallamar">Twitter</a>, and send me a direct message. We will take it from there.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Being Nice and Effective]]></title>
            <link href="https://www.subbu.org/articles/2021/being-nice-and-effective/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/being-nice-and-effective/</id>
            
            
            <published>2021-10-23T11:06:13+00:00</published>
            <updated>2021-10-23T11:06:13+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I’m writing this article for the nice people in leadership roles. By the meaning of the word “nice,” such people are kind, polite, and…</blockquote><p>I’m writing this article for the nice people in leadership roles. By the meaning of the word “nice,” such people are kind, polite, and friendly. They generally trust the goodness of the people they lead. They are not usually difficult to work with, care for others, are patient, and listen. They venture to be vulnerable. You don’t hesitate to approach them.</p>
<p>In contrast, not-so-nice leaders believe in their control and power more than the people they lead and hence can be indifferent and challenging to work with. They rarely show humility. They like to be right all the time. You hesitate to approach them. You can spot them in meetings — they run their meetings like court sessions.</p>
<p><img src="/img/1__z7zeN0CpD3kjZGak6btb3A.png" alt=""></p>
<p>I picked up this question of whether nice people can be effective based on a few passing comments of being nice in a couple of situations. The question bothered me a bit, and I wanted to find out.</p>
<p>What does it mean to be effective? Effective is getting things done. Effective is being clear of what you want and what you are willing to forego to produce results.</p>
<p>In 2000, Daniel Goldman wrote a widely referenced article in HBR titled <a href="https://hbr.org/2000/03/leadership-that-gets-results">Leadership That Gets Results</a>. In 2017, HBR Press also published a book by the <a href="https://store.hbr.org/product/leadership-that-gets-results-harvard-business-review-classics/10102">same title</a>. At the beginning of this book, Daniel poses the question “What should leaders do?” and proceeds to answer with “the leader’s singular job is to get results.” Based on some prior research, he then introduces six leadership styles and their impact on an organization’s working environment, which he refers to as “climate.” Here are the six leadership styles.</p>
<ol>
<li>Coercive: This style demands immediate compliance. You get told more often than being asked about what you think. This style hurts the climate.</li>
<li>Authoritative: This style mobilizes people towards a vision. They motivate people through vision and work to maximize your commitment to goals. You would know how your work is contributing to the broader vision. This style has the most positive impact on the climate.</li>
<li>Affiliative: This style creates harmony and builds emotional bonds with the people. Under such leadership, people share ideas and their inspiration with one another. This style also has a positive impact on the climate.</li>
<li>Democratic: This style forges consensus through participation. This style is characterized by listening to people and getting their buy-in to drive flexibility and responsibility, even if it takes more time. This style also has a positive impact on the climate.</li>
<li>Pacesetting: This style sets high standards for performance and creates “do as I do, now” pressure on people in an “I know it all” mode. Of course, this style also harms the climate.</li>
<li>Coaching: This style develops people for the future. In this style, you will see delegation get challenging assignments. You will be lucky to work with such leaders since you grow. This style also has a positive impact on the climate.</li>
</ol>
<p>In this book, he describes climate with the following six factors:</p>
<ol>
<li>flexibility — that is, how free employees feel to innovate unencumbered by red tape</li>
<li>their sense of responsibility to the organization</li>
<li>the level of standards that people set</li>
<li>the sense of accuracy about performance feedback and aptness of rewards</li>
<li>the clarity people have about mission and values</li>
<li>the level of commitment to a common purpose.</li>
</ol>
<p>He identifies that authoritative, democratic, affiliative, and coaching styles have “the best climate and business performance.” The other two styles, coercive and pacesetting, hurt the climate. I’m sure you all have worked with or for managers that employed these two negative styles, and you could not run away from them fast enough.</p>
<p>Coming to being nice, since nice people are kind, polite, and friendly to others, they have better chances at practicing positive leadership styles. We can therefore dispel the perception that you can’t be nice if you want to be effective. Being nice is essential to being effective.</p>
<p>However, nice people can sabotage their effectiveness in at least the following ways:</p>
<ol>
<li>Hesitation to act – could be due to waiting for consensus for decisions, setting a vision but not implementing the mechanisms to translate that vision into outcomes, defaulting to humble inquiry and coaching all the time, or <a href="https://m.subbu.org/leading-vs-participating-203c36e430b9">participating instead of leading</a></li>
<li>Not employing their leverage – see “Behavior 3: Using your leverage” in my <a href="https://m.subbu.org/my-leadership-document-2021-edition-132aec22fc0e">leadership document</a></li>
<li>Being diplomatic and tactful when candor is needed and forgetting that care without candor creates an ineffective climate.</li>
<li>Not saying “no” enough</li>
</ol>
<p>Here is my summary:</p>
<p>First, being nice should not come at the expense of being effective. Likewise, being effective should not require not being nice. You can be nice and effective.</p>
<p>Second, don’t think in terms of extremes of being nice vs. being effective. Find the nuance by developing candor.</p>
<p>Third, don’t stop being nice if someone accuses you of being nice. Kinder leadership styles are in short supply. Instead, invest in radically improving your effectiveness.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Infinity Minus One Possibilities]]></title>
            <link href="https://www.subbu.org/articles/2021/infinity-minus-one-possibilities/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/infinity-minus-one-possibilities/</id>
            
            
            <published>2021-10-16T15:51:09+00:00</published>
            <updated>2021-10-16T15:51:09+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Career changes come in different forms, some of which are more socially acceptable than others. For example, you find a new job and call…</blockquote><p>Career changes come in different forms, some of which are more socially acceptable than others. For example, you find a new job and call the break between jobs “funemployment.” It’s safe; you figured out the next steps and arranged to take a break. It appears to be the most socially acceptable style. Although less common, it is also socially okay to quit your job, take a break for a few months, and explore new opportunities. In terms of acceptance levels, though, it falls slightly behind funemployment. But one of the less socially acceptable styles is for someone to part ways on their employer’s terms and then take the time to explore possibilities. My recent departure from my prior employer fell into the latter category. There it is.</p>
<p><img src="/img/1__Uqfdqunho4B4sEe92fxZmQ.png" alt=""></p>
<p>My situation is not unique — many people go through such career-changing events with far worse ramifications. I have the luxury of time and space to write about it and some friends and family to lean on. Yet, here is why I’m writing this article.</p>
<p>First, I have a choice to make. I can stay ambivalent about my departure and imply that I chose to depart without saying so clearly. I could even call it funemployment. Alternatively, I could choose to acknowledge that the choice was not mine, and yet I’m genuinely curious about what lies ahead. I’m choosing to go with the latter option to face myself with clarity and remove any ambivalence from my mind. You might say that it takes courage to do so, but I think it opens more doors.</p>
<p>Second, I want to break the stereotype that such breakups are bad. I want to highlight that it is perfectly okay to acknowledge such a change and then operate from the point of strength and not weakness.</p>
<p>Third, I’m sharing the <a href="https://en.wikipedia.org/wiki/Mental_model">mental models</a> I used to process the change, which may be of value to others. Once I realized what was happening, I struggled over a weekend to regain my equilibrium. I concluded that what happened was a gift for me to explore possibilities that I may have been ignoring. But that conclusion was not instantaneous — some mental wrangling preceded it.</p>
<p>Over the last several years, I’ve been fascinated with the idea of playing with different mental models to influence how you feel about and react to events around you. For me, this is a way of building resilience and agility. I’ve been able to apply this technique to address several ambiguous technical and leadership problems when I felt stuck or noticed others stuck. I got out of difficult situations with more than one possible option when no option seemed to exist. If there is only one thing I could take away from my last job, it’s learning this ability and applying it at scale.</p>
<p>I think of a mental model as a pair of tinted sunglasses. You swap one pair with another with a different tint, and the world looks different.</p>
<p><img src="/img/1__t__aNnnZJupWabnCN1rCFCg.png" alt=""></p>
<p>As Lisa Feldman Barrett says in her <a href="https://www.goodreads.com/en/book/show/48930266-seven-and-a-half-lessons-about-the-brain">7½ Lessons About the Brain</a>, “we all live in a world of social reality that exists only in our human brains.” This social reality is neither innate in our minds nor fixed. She adds that we “create the social reality with other people without even trying because we have human brains.” Per her research, one way to create the social reality is by “reliably copying one another to establish laws and norms to live in harmony.” In other words, we seem to learn about how we feel about events around us from others. We copy both the useful and not so useful mental models from others.</p>
<p>Thanks to such copying, in most cultures, we default to mental models like below when faced with such situations.</p>
<ol>
<li><strong>Victimhood:</strong> With this mental model, you think something awful happened to you, and you’re a victim. You paint certain people as perpetrators that worked against you and took something of value from you. You feel hurt. You feel right to believe that those perpetrators are wrong and that you’re right. You’re confident that they willfully did this to you. You think that they mistreated you. You wish that, if only those perpetrators cared, were thoughtful, <insert your adjective here> and acted accordingly, this situation wouldn’t have happened.</li>
<li><strong>Self-doubt:</strong> With this mental model, you attribute whatever happened to your incompetence. Once you start judging yourself, you will find several examples of your incompetence. All your prior mistakes dance around you. You worry that you’re not good enough and that you failed. You wonder if you could ever recover from this.</li>
<li><strong>Entitlement:</strong> I find that “feeling entitled” is a companion to “feeling like a victim.” They go hand in hand. As you fight against victimhood, you will begin to remember all the good things you accomplished and wonder how they could harm you despite those good things. You feel that you deserve better and are entitled to a better outcome.</li>
<li><strong>Rumination:</strong> In this model, you start to guess what might have happened and why. You want to find out who said and did what to you and why. You want to understand all the events that occurred and the rationale. You will have so many questions, and you keep thinking about those questions till the cows come home.</li>
<li><strong>Heroism:</strong> You could also think that the place is burning up, and you were going to leave anyway, but perhaps not yet. You feel good about what happened because you know they were wrong, incompetent, etc.</li>
</ol>
<p>These are some examples, and there can be more. All such models seem valid and justifiable. You may vacillate between these models to feel discouraged, helpless, angry, confused, etc., for a while. Depending on the culture you grew up in, and the traits learned in life, you may go through these for minutes, days, or even weeks.</p>
<p>Unfortunately, such mental models do nothing but close doors for future possibilities. They make us stuck in the past and make us carry that burden into the future. But it does not take much to find that you can form a different social reality with a different set of mental models.</p>
<ol>
<li><strong>Things generally don’t happen to you; they occur around you.</strong> Nobody did anything to you. You’re not a victim. You happen to be there when certain things are happening.</li>
<li>In a complex system like a workplace, you know that <strong>there is no single root cause</strong>. You’re okay not to know what happened and why. You know you can choose to second guess what might have happened, but recognize that you can’t do much with those guesses. You let go of rumination.</li>
<li>You admit that your employer, instead of you, making the first step is no different. <strong>A divorce is a divorce.</strong> You recognize that timing of who says it first is of little consequence in the long term. You question why it is okay for you to plan your departure to land elsewhere on your terms, but not the other way around? You challenge the notion that the former is superior to the latter.</li>
<li>You recognize that your <strong>current working identity is undone</strong> (see Herminia Ibarra’s <a href="https://www.goodreads.com/book/show/26089.Working_Identity">Working Identity</a>). You realize that you’re free to explore, unencumbered by your current work identity and the daily grind that comes with that identity.</li>
<li>You are <strong>aware</strong> of your strengths and areas of improvement. You know your accomplishments and what you stand for. You know that when one door closes, you still can discover and open a million other doors.</li>
</ol>
<p>Unlike the first set of models, these models create a different social reality in which you don’t glue yourself to the past but are genuinely curious and excited about what lies ahead.</p>
<p>But discovering such alternative models can be challenging, particularly when emotions due to the first set of models overtake you. Most of the difficulty is being aware of the mental models you’re currently using. It takes practice to remind yourself that there are other mental models to explore. For me, journaling helps.</p>
<p>When things happen, you get to choose — entertain mental models that close doors or only consider mental models that open new doors. You can choose to carry the burden of the past or choose to be present, enjoy the moment, and build for the future. One weakens your backbone with the weight of the history — the other strengthens your spine for the next phase. When putting this way, the choice is simple. The faster you become aware of this choice, the better for you. That’s the gist of what I learned over time at work.</p>
<p>In the end, you might ask if I’m spinning a negative into a positive story and rationalize. Yes, that’s the point of choosing alternative mental models to aim for the outcomes you want. Our social reality is malleable. Conditioning the mind is an essential element in life to improve resilience. It involves picking up mental models that work for you and discarding those that don’t. I could not have gotten certain things done in my career if I hadn’t taken that approach, and I know it is valid for millions of others. That’s the ability I’m taking with me to explore possibilities.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Leading vs. Participating]]></title>
            <link href="https://www.subbu.org/articles/2021/leading-vs-participating/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/leading-vs-participating/</id>
            
            
            <published>2021-10-05T20:45:38+00:00</published>
            <updated>2021-10-05T20:45:38+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Over time, I observed a particular leadership trap that managers and others in leadership roles fall into. The trap is participating as…</blockquote><p>Over time, I observed a particular leadership trap that managers and others in leadership roles fall into. The trap is participating as opposed to leading. I fell into such a trap myself a few times. Let me give you an example to highlight the difference between leading and participating.</p>
<p>This example involved the manager of a large team. The team ran into a defect in a system owned by another group. They first tried to work around the issue and then escalated it to the other team over email. The email thread grew over the next few days to include several others as the problem turned out to be in yet another system. Folks shared ideas on potential causes and fixes over email. It was not clear for days who was playing what role and who was accountable fixing the defect.</p>
<p>The manager was also on the email thread. Along with others, he too asked questions and shared ideas about potential solutions. Days went by. The email thread grew longer. Everyone, including that manager, operated as though they were collaboratively discussing the issue. The issue lingered for 3–4 weeks before someone fixed the problem.</p>
<p>In this case, the manager was participating instead of leading. A leader would rather drive the appropriate sense of urgency, clarify roles and responsibilities, ensure those are understood, and oversee a timely resolution. A leader would participate and discuss the issue only to the extent needed to get enough details for that facilitation; no more, no less.</p>
<p>There is a clear difference between leading and participating. A leader&rsquo;s job is to get results. However, given the plethora of material on various leadership concepts like &ldquo;coaching,&rdquo; &ldquo;servant leadership,&rdquo; &ldquo;empowering teams,&rdquo; managers sometimes forget their role for delivering results and default to participating instead of leading. Under such a management style, problems linger, and outcomes take longer.</p>
<p>I want to describe a few patterns to check whether a manager is participating as opposed to leading.</p>
<h2 id="pattern-1-reiterate-the-right-things-in-the-hope-that-the-right-things-will-happen-automatically">Pattern 1: Reiterate the right things in the hope that the right things will happen automatically</h2>
<p>Knowing and preaching the right things is one thing, but getting everyone to do those things for a positive change is another thing. Knowing and preaching the right are what advisors and experts do. They look at the problem landscape and tell you what you should do. But leaders don&rsquo;t stop there. They need to figure out how to get the team to act on those and produce results.</p>
<p>I recall one particular conversation where a manager explained to me certain things that his product should do. But when I asked how he was going to turn them into reality, he had no plan.</p>
<p>In another case, a manager got the team together to discuss certain best practices. At the end of the meeting, everyone agreed to the best practices that they identified. The manager felt good that the team understood the need for and identified a set of best practices. The team members, too, felt good that they now have the best practices.</p>
<p><img src="/img/1__V5SLRolGmW5CuWvVpz41KQ__2x.jpeg" alt=""></p>
<p>But then the team waited and waited for their manager to tell when and how to introduce those practices. The manager walked away, assuming that the team would practice those on their own. The waiting continued. A few months later, everyone forgot about those and went about their business as before. In this case, the manager assumed that the team would naturally practice but didn’t lift a finger to ensure that they adopted those practices. As Colin Bryar and Bill Carr highlight in their <a href="https://www.goodreads.com/book/show/53138083-working-backwards">Working Backwards</a>, good intentions don’t matter unless supported by mechanisms to translate those into excellent outcomes. That’s the manager’s job.</p>
<h2 id="pattern-2-thought-leadershipping-because-youvethoughts">Pattern 2: Thought-leadershipping because you&rsquo;ve thoughts</h2>
<p>Here is another pattern for people with deep experience in a domain. When they come across a team dealing with problems they had previously worked on, they would get into the details themselves. In doing so, they may lose track of their role and indulge themselves. As far as they are concerned, they enjoy the subject and have valid opinions to give to help the team. But in doing so, they may shut the debate, or waste others&rsquo; time, or worse, inadvertently push the team to make unnatural choices.</p>
<p>I recall one particular senior manager of a large organization who used to have the team bring a series of topics to himself every week. People used to prepare and present that material to that manager. Then they would discuss, and he would offer intellectual opinions. As far as he was concerned, those topics were fun, engaging, and he provided much-needed expertise. The presenters used to feel great at the beginning for the chance to present to such a senior person. That sense faded away later on as no outcomes came out of those meetings.</p>
<p><img src="/img/1__48097IRf6MsfBwKVL2dDjA__2x.jpeg" alt=""></p>
<p>It&rsquo;s okay for a manager to institute rituals to bring information to them, but then they are responsible for letting those rituals yield positive change. In the above example, the discussions were just theater.</p>
<h2 id="pattern-3-being-friendly-with-no-parameters">Pattern 3: Being friendly with no parameters</h2>
<p>Some managers like to be nice to everyone and rarely want to confront anyone or even set parameters. They want to be liked, treat their team as peers, and not let hierarchies come in the way. They prefer to avoid introducing rituals and processes for fear of stepping on the toes of their team members. One manager thought it was more important for three teams collaborating on a project to pick three different tools and rituals for tracking their work than for picking one to reduce the communication burden. Consequently, team autonomy prevailed, but outcomes suffered.</p>
<p>Such managers employ democratic and coaching leadership styles that Daniel Goleman describes in his article <a href="https://hbr.org/2000/03/leadership-that-gets-results">Leadership That Gets Results</a> (also consider reading his book by the <a href="https://hbr.org/2000/03/leadership-that-gets-results">same title</a>). These two styles emphasize building consensus, participation, and developing people over producing results.</p>
<p>These two are basic styles for a manager to incorporate, but only in moderation when appropriate. Without a strong vision and mechanisms for goal setting, goal tracking, decision making, and delivery, such styles fail to create a productive work environment. People generally like to work for such managers as they feel heard and empowered and are free to take the initiative, but may fail to stretch and grow when the manager is too polite to set goals or challenge them. Some individuals may still grow and do exemplary work under such managers, but only because they want to, conditions permitting.</p>
<p>I ran into a few managers that employed this style. One particular manager comes to my mind. He was well-liked by the team for his leadership style. People raved about him when asked to provide feedback for their manager. Yet, the team’s project outcomes slipped, important decisions took weeks, and even those decisions were re-opened and debated because everyone felt empowered to question and discuss ad nauseam. People felt good, but results suffered.</p>
<p><img src="/img/1__BKIxCS9oYSIYbPGWi6rL1w__2x.jpeg" alt=""></p>
<p>The team became productive only after the manager and one or two vocal members left the team, and new folks joined. The new manager took accountability for outcomes and introduced some team rituals for decision-making and goal tracking. These simple adjustments made the team effective.</p>
<p>Here is the bottom line. Assuming a leadership role requires being responsible for results. As I discussed in <a href="https://m.subbu.org/my-leadership-document-2021-edition-132aec22fc0e">my leadership document</a> a few months ago, managers must employ their team as leverage to produce outcomes.</p>
<p>One last thing — hierarchies are real; they have a purpose, and regardless of your leadership style, your title or level in a company&rsquo;s hierarchy make you responsible for outcomes.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Let’s Discuss Attrition]]></title>
            <link href="https://www.subbu.org/articles/2021/lets-discuss-attrition/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/lets-discuss-attrition/</id>
            
            
            <published>2021-09-05T18:45:17+00:00</published>
            <updated>2021-09-05T18:45:17+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Let’s discuss attrition. Attrition gets the most negative attention at workplaces. Folks talk in hushed tones about who is leaving, who is…</blockquote><p>Let’s discuss attrition. Attrition gets the most negative attention at workplaces. Folks talk in hushed tones about who is leaving, who is going where, the types of offers they are getting, and what could be going wrong with your team or company. Managers periodically sit with HR teams to review attrition trends in different geographies, pay levels, and diverse groups of employees, nod their heads and move on. A few courageous folks surface attrition concerns during team meetings, townhalls and all-hands meetings only to get vague answers from their managers. Most of us consider attrition bad and don’t often look at it with a growth mindset.</p>
<p>For those leaving, there is the usual drama of long emails and LinkedIn posts about all the good things they are leaving behind. People write about why they are leaving, and how they are feeling, and sometime later, follow with why they are excited to join a new company. No doubt. It’s natural to feel emotional when leaving a team with whom you spent your most waking hours. It’s also natural to feel excited when embarking on a new journey. This phase replaces all the accumulated negativity of the company they are leaving with the positivity and anticipation of what they will do at the new company. This phase, too, is natural.</p>
<p>The mood is different for those not leaving yet. They fear missing out on the good things those leaving are likely getting. They worry about things falling apart in their current team or company. They feel uncertain of not knowing what others might have known about what’s wrong and speculate why others are leaving. Worse, people feel anxious about their worth and fear that they are not qualified enough to pocket the same kind of jobs that others are getting. These are nothing but symptoms of a fear mindset.</p>
<p>Most managers also play the victim when people leave their teams. They talk to their managers and HR teams about things that are supposedly driving attrition – like compensation, cultural challenges, lack of innovation, the market, the other companies paying more, and so on. I’ve had people come to me and tell me that some team is falling apart because one or two people left that team to work elsewhere.</p>
<p>For a manager, this is an unproductive drama. Fear and feeling uncertain about attrition are not going to take you anywhere. Let’s look at what you should focus on instead.</p>
<p><strong>First, recognize that attrition is natural</strong>. Everyone moves on one day or the other, including yourself. There is no need to be dramatic about it. It’s okay for people to leave a team or a company. Also, realize that companies and teams go through cycles of new work, scaling out the work, stabilizing that work, or even shrinking back. Hiring, attrition, and divestments support these cycles and are healthy.</p>
<p><strong>Second, reasons for attrition vary</strong>. You can try to put each exit into a bucket, but that’s simplistic. There is usually more than one reason for someone to leave a team or a company, and those reasons vary from person to person. I find it more important to get feedback during exit interviews than to speculate about why someone is leaving. It is difficult to know after a person has decided to leave.</p>
<p><strong>Third, and most importantly, recognize that attrition is an output.</strong> You know when it happens, but you can’t control it. It is too late. Instead, you should focus on what you can control. You should also recognize that there is usually a lag of at least a few months between the controllable inputs, the things you should focus on, and the output, which is attrition.</p>
<p>Besides cash and deferred compensation, look at how well your teams are executing. Are roles and responsibilities clear? Are decisions languishing? How quick is your and your team’s decision-making? How is execution? Is the team producing results? Is the work aligned to business outcomes? How are those business outcomes?</p>
<p>Does your team have a purpose and a strategy to realize that purpose? Does your team understand and is driven by that strategy?</p>
<p>Are you investing in the growth and development of the people that work in your team? Are you spotting growth areas for each of your team members and taking the time to invest in their development? Are you facilitating stretch goals to promote growth?</p>
<p>Are you learning? Is your team learning? Is the team continually improving their work? Are they leading the change?</p>
<p>Look at all these things and more.</p>
<p>I’m sure you will find plenty of reasons to improve. Those are what you can and must learn to control. Even then, people will leave your team or company. When they do, congratulate them. Hopefully, your leadership enabled them to grow beyond their current roles and hence new opportunities knocked on their doors.</p>
<p>Every exit gives you, the manager, an opportunity to improve the team structure and dynamics. Attrition loosens the team fabric and gives you a chance to reshape it. Don’t let go of that opportunity.</p>
<p>I’ve had people leave my team. Though I panicked once and wanted to retain someone on impulse, I eventually took the time to figure out what I need for the next phase. That comtemplation and analysis helped me morph the team charter to support our strategy, and hire someone to lead that strategy.</p>
<p>It is also common to see others stepping up when someone leaves their team. When this happens, you have to ask yourself what made you not see it before that person left the team, and what you should have done differently. Perhaps you didn’t realize the person leaving has outgrown their role and you didn’t observe? Perhaps you didn’t notice that the other person is ready to step up but this other person is blocking?</p>
<p>Look around, and you will find examples.</p>
<p><img src="/img/1__dh8g77kOKWnC9LYYxt__nhw__2x.jpeg" alt=""></p>
<p>Finally, keep calm. Remember that we’re all temporary custodians at work. Just focus on leaving things in a better shape than when you started.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[My Leadership Document — 2021 Edition]]></title>
            <link href="https://www.subbu.org/articles/2021/my-leadership-document-2021-edition/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/my-leadership-document-2021-edition/</id>
            
            
            <published>2021-06-11T17:33:58+00:00</published>
            <updated>2021-06-11T17:33:58+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Leadership is a loaded word. We attribute a lot to it; we expect a lot from it; we know when we see it, and yet, we don’t have a concise…</blockquote><p><img src="/img/1__dVaa8NTJejWo__sLVXgvVpg.png" alt=""></p>
<p>Leadership is a loaded word. We attribute a lot to it; we expect a lot from it; we know when we see it, and yet, we don’t have a concise way to describe what it means to be a great leader due to its many facets.</p>
<p>I’m a student of leadership. I’ve been learning, observing, and practicing different facets of leadership for several years. In this post, I want to summarize how I view leadership currently, as of June 2021. I will describe a few core leadership beliefs that I believe in and behaviors that I lean on and practice. These beliefs and behaviors are neither absolutes nor complete. These reflect my personality, what I learned so far, my experiences, and the context at work in which I currently work and lead. These are subject to change as I continue to learn and practice this craft of leadership.</p>
<h2 id="my-beliefs">My Beliefs</h2>
<h3 id="belief-1-leadership-is-about-being-a-betterperson">Belief 1. Leadership is about being a better person</h3>
<p>I fundamentally believe in John C. Maxwell’s point from his 2011 book <a href="https://www.goodreads.com/book/show/11225698">5 Levels of Leadership</a> that “<strong>Leadership is much less about what you do and much more about who you are</strong>.” I read it 7–8 years ago and recently read the second half of the book.</p>
<p>I hold on to this belief as I believe that one must learn to lead themselves before one can lead others. As a person holding a leadership role, you face constant jugglery of tactics and decisions that impact others’ careers, growth, successes, and team outcomes. Unfortunately, a leader’s insecurities, opinions, bad habits, and ego come in the way of deciding what’s suitable for the team’s success and growth.</p>
<p>There were times when my insecurities and blind spots obstructed decision quality and positive change. My approach ended up controlling someone’s ideas once. I wanted to approach the problem space differently and ended up overshadowing that person’s enthusiasm. Later on, I realized my insecurities. There were more. I don’t think I’ll ever be out of the woods as I continue to discover behaviors that I must fix. Leadership is a journey, not a destination.</p>
<p>I’ve seen senior managers with a broad scope of large organizations struggle to lead due to their egos and insecurities. One particular manager wanted to take my spot in a technical forum because he felt entitled to that spot given his title. Another manager was hell-bent on getting his way and couldn’t stand the idea of his teams and others in the company taking a different way. Under his controlling leadership approach, the teams in his org got fragmented, and the strategies went nowhere. A different manager wanted to be in the driver’s seat but did not know where to drive. Finally, one particular leader’s strong beliefs on the charter of specific roles set back the careers of a few individuals by years. I’m sure most of you have stories to tell.</p>
<p>As John C. Maxwell writes in the same book, “<strong>If you want to become a better leader, you must not only know yourself and define your values, but you must also live them out</strong>.”</p>
<p>Upon my coach <a href="https://www.linkedin.com/in/janismachala/">Janis Machala</a>’s recommendation, I recently read <a href="https://www.positiveintelligence.com/about/">Shirzad Chamine</a>’s <a href="https://www.goodreads.com/book/show/13221308">Positive Intelligence</a> to discover a few of my saboteurs and lies I tell myself to justify some of my behaviors. I’m glad I did. Finding and dealing with one’s fears, egos, and poor habits is a challenging but necessary part of leadership growth. Such discovery must be a periodic exercise.</p>
<h3 id="belief-2-to-create-a-high-performing-team-you-must-help-others-grow-asleaders">Belief 2: To create a high performing team, you must help others grow as leaders</h3>
<p>This belief is a well-known leadership expectation, yet it’s often forgotten. You can’t create a high-performing team when you neglect team members’ leadership development. You need your team to grow to be better leaders for you to be a successful leader. Quoting again from John C. Maxwell’s book, “<strong>people development empowers the leader to lead larger</strong>.” Developing people is a force multiplier.</p>
<p>Easier said than done. It is why this belief is number 2 in my list of beliefs. People in leadership roles get busy day-to-day, and other than occasional feedback rituals, they don’t have enough time to develop their people. Consequently, most team interactions become transactions like meetings, reviews, plans, checkpoints, etc. Paradoxically, unless the leader carves out the time and does the hard work of developing their people, the leader won’t have time to scale themselves.</p>
<p>Furthermore, it’s not uncommon to see managers treating their team members as tools to create success. But, unfortunately, the same insecurities, egos, and bad habits that hinder personal growth also impede people’s development.</p>
<p>I must add that developing others requires investing in many other facets of leadership like listening, empathizing, coaching, inspiring, and even feedback, and managing performance mismatches.</p>
<h3 id="belief-3-leaders-must-set-unarguable-goals-for-the-team-theylead">Belief 3: Leaders must set unarguable goals for the team they lead</h3>
<p>I’ve been a practitioner of this belief for some time. I first came across this notion of “unarguable goals” from an un-dated (2009?) Paul O’Neill’s talk on “The Irreducible Components of Leadership.” Watch below.</p>

    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/htLCVqaLBvo?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>In this talk, Paul O’Neill shares a couple of nuggets.</p>
<p>He starts his talk with the first nugget, “<strong>With leadership, anything is possible, and without it, nothing is possible</strong>.” I can not help but repeat this in my head over and over. Sure, there are many components to yield positive change, but leadership is among the key elements. The leader’s beliefs and behaviors can make or break a team.</p>
<p>The best part of his talk is where he introduces the notion of unarguable goals — “<strong>It’s necessary for a real leader to articulate what I call unarguable goals and aspirations for the institution that they lead</strong>.”</p>
<p>Once I heard this, I kept seeing examples. Consider the unarguable goals that leaders in history like <a href="https://en.wikipedia.org/wiki/Martin_Luther_King_Jr">MLK</a> and <a href="https://en.wikipedia.org/wiki/Mahatma_Gandhi">Mahatma Gandhi</a> set for the people they led. Imagine back in the 1920s a lean guy coming back from South Africa to India and setting a goal “I’m going to get freedom for this country.” “Crazy!” others might have said at that time. Establishing such an unarguable goal takes courage and conviction.</p>
<p>I’ve had the most professional and team growth happen when the goal ahead was challenging with no clear path to success and plenty of reasons to give up midway. These are the kinds of goals everyone would agree with, but most would remain skeptical about reaching those due to the hurdles involved. Even in my current role, when I picked up a particular goal last year, more than half of my team were not convinced about reaching the goal. That changed over time, and innovation kicked in.</p>
<p>Unarguable goals drive creativity. Under a genuinely inspirational leader invested in their team’s growth, people go to great lengths to innovate, solve challenging problems, and endure difficulties. While doing so, people develop the skills necessary to deal with ambiguity, obstacles, and setbacks. With the experience gained, they go on to solve even more significant problems.</p>
<p>Positive transformational change starts with unarguable goals. It is the leader’s job to set such a goal for the team they lead. In the absence of such a goal, leadership dissolves into busy work and the illusion of progress. As a result, people don’t get a chance to discover their potential. I recall a particular discussion back in 2016 when a database engineer said that “we don’t know how to run databases well in the data center, and we would never be able to run them on the cloud.” But today, teams at <a href="https://www.expediagroup.com">work</a> run large online databases on the cloud in multiple regions. That’s because we had an unarguable goal to be on the cloud.</p>
<p>But articulating unarguable goals does not mean you makeup goals that you don’t believe in and move on when the going gets tough. For example, a senior leader picked up an ambitious target for a metric for his org in a previous company. Large screens showed the progress in real-time. After a few months, the metric slowed down, that particular leader moved on to another pasture, and the screens disappeared.</p>
<p>On picking an unarguable goal, you must be honest to highlight brutal facts, invest in tackling the hard problems first, be grounded in reality, and continually persuade, inspire and walk with talk. You should expect criticism and pushback from peers and your team members. You must show empathy and patience to talk to people who don’t believe in what you’re saying.</p>
<p>You might say that the particular problems your team is dealing with, the constraints that the team is facing, or the size of your team does not empower you to set unarguable goals for your team. I beg to differ. See my Behavior 2 below. Look across your team and work areas, and you will find opportunities to set unarguable goals.</p>
<h2 id="my-leadership-behaviors">My Leadership Behaviors</h2>
<p>Let me share how I think of leadership behaviors at this time. These are my beliefs in action. These behaviors are far more grounded in my current context than my leadership beliefs. As that context changes, I expect to refine and tune these behaviors.</p>
<h3 id="behavior-1-setting-thepace">Behavior 1: Setting the Pace</h3>
<p>I was reminded of this phrase recently, and hence is at the top of my list. A crucial part of a leader’s job is to set the team&rsquo;s pace. As we see time and again, as teams grow and change, organizational inertia sets in often. An issue first noticed by a team member could linger for weeks and months without a solution.</p>
<p>Setting the pace includes goal setting, tracking progress, timely decision making, continuous progress towards outcomes, hiring, addressing performance concerns, tackling lingering topics, anticipating issues, and asking lots of questions like there is no end. The leader and their leadership team must create a flywheel to keep things moving.</p>
<p>How might setting the pace appears in action? It depends.</p>
<p>It usually starts with a watch for lingering topics and chasing and resolving those as quickly as possible. Nobody likes to work in a team when problems remain for too long. By resolving lingering issues rapidly, you provide direction and a positive working environment for the team. When you let issues linger, you let apathy develop. People stop believing their leaders. They stop caring and move on.</p>
<p>It also involves some processes or rituals to check the pace regularly. Some time ago, one of my friends and an ex-colleague explained the idea of bringing information to you to scale better. There are several ways to do this. For example, in our team, we run a weekly portfolio review where we review all people-related issues like lateral movements, departures, hiring, balancing investments across different initiatives, etc. We have deep dives to go through strategic topics. Other areas require other rituals to bring information, uncover problems, and manage the pace.</p>
<p>Above all, setting the pace requires following the instinct and asking questions. Practicing this behavior requires coaching skills. My mantra is to try to ask five more questions when you think you’ve no more questions to ask.</p>
<h3 id="behavior-2-watching-forexcuses">Behavior 2: Watching for excuses</h3>
<p>Nobody likes the word “excuse,” but the reality, we may not realize when we’re making excuses. But where do excuses come from? There are several sources, but let me share some patterns.</p>
<p>First, <strong>constraints</strong> offer a great way to make excuses. Think of everyday examples — “we lost this particular person to attrition;” “we’re not able to hire quickly;” “we have such and such unmet dependency;” “our team is not trained to do this;” “a particular person is on vacation,” etc. Yes, you wish these go away and that everything will be great afterward. You will only have new constraints to replace old mitigated constraints. Recognize that leadership is a constraint management game. Of course, your parental instinct might indulge you in listening to those constraints and sympathize. But I believe that, as a leader, you can’t accept such reasoning as inalienable and must probe into why and let the team come up with multiple options when no option seems possible.</p>
<p>Second, <strong>making decisions to suit convenience</strong>. When making decisions with incomplete information amidst constraints, I ask if you’re making a decision because it is convenient (say, to avoid some difficult people, org or technical problem) or believe it is the right decision. Unfortunately, convenience can be an enemy of good decisions. Convenience-based decisions tend to come back and haunt.</p>
<p>The third one is <strong>stopping at boundaries</strong>. As organizations grow and multiple teams form, people tend to stop at team boundaries and make excuses of why such and such is not working or slow or not meeting some other expectation. I often remind my team that stopping at such boundaries limits the outcomes we can get for the customer, but it also limits personal growth. When we stop at team or org boundaries, we grow apathy and sion. That’s because you are signaling your team that poor outcomes are somebody else’s fault.</p>
<h3 id="behavior-3-using-yourleverage">Behavior 3: Using your leverage</h3>
<p>The titles that come with leadership roles are not privileges bestowed on particular individuals. Instead, those are expectations on those individuals to use those titles effectively as tools of leverage to get things done. Unfortunately, people with such titles sometimes forget to use those titles for good use.</p>
<p>I recall one particular situation in a previous job when the team I was part of had multiple opinions about the future tech strategy. There was no clear plan, and people were debating for weeks. It was chaotic. One of my close colleagues pulled me aside and reminded me, “Subbu, I think you should be the one setting the direction. Why don’t you draft it down and share?” I worked on it for the next couple of weeks and presented it to everyone. I ended up using my role to align the team towards a particular direction and a path. I’m thankful for that reminder as we executed on that path to produce solid outcomes, though I took some arrows because not everyone agreed.</p>
<p>To this day, when someone brings a problem to me, I remind them their roles and titles give them the power to solve the problem themselves.</p>
<h3 id="behavior-4-following-through-with-commitments">Behavior 4: Following through with commitments</h3>
<p>I won’t delve into this behavior beyond emphasizing that producing timely and quality outcomes is an essential leadership behavior. I believe that people in leadership roles grow as leaders when they help their teams make difficult results possible quickly. Likewise, when leaders take quality and timeliness seriously, teams develop creative options when they find obstacles. It’s a win-win approach.</p>
<h3 id="behavior-5-sharpening-yourknives">Behavior 5: Sharpening your knives</h3>
<p>Here is my belief. I work in the technology industry and deal with certain kinds of technologies. Therefore, I must understand the technologies in use, how we’re building our systems, their strengths and deficits, and trends in the industry. Moreover, I must ask good questions, immerse myself in details when necessary, and know what types of strategic bets to make for the future. Since there is a limit to how much I can understand and grasp, I must know what questions to ask. In other words, as a technologist, I must keep my technology knives sharp.</p>
<p>I know not everyone agrees. I’ve worked with managers who view themselves above technology and details and consequently fail to ask the right kind of questions or set a direction for the team. I like Apple’s approach of <a href="https://hbr.org/2020/11/how-apple-is-organized-for-innovation">experts leading experts</a>. However, it does not mean that the leader must be a superior expert above the team. The leader must be able to speak the same language and capable of zooming in when necessary. You don’t see tennis players coaching football teams. Do you?</p>
<p>But watch for pitfalls. Managers with deep technical experience tend to chase details, offer opinions, and tell their team how to solve their technical problems. Nobody likes to be told. The trick is to curiously ask questions and let the team explore. Use your expertise to ask better questions to promote thinking but not dispense opinions.</p>
<h3 id="behavior-6-picking-up-the-hard-parts-of-growingpeople">Behavior 6: Picking up the hard parts of growing people</h3>
<p>Unlike influential leadership, positional leadership puts managers in charge of precious assets — these are the people who bet their careers on and their company and their reporting managers. In this era of opportunity in the technology industry, people choose companies and managers. Managers can nurture them, grow them, and help them do great things. Or, they can use them as tools, not care for their development, not help them make lasting contributions, and let them wither away and not succeed.</p>
<p>However, growing people does not stop with learning and development activities, providing autonomy, coaching, mentoring, etc. Those are all necessary things. It also must incorporate hard parts:</p>
<ul>
<li>Continually stretching your team beyond what they think they are capable of and making yourself and your team uncomfortable every once in a while</li>
<li>Setting unarguable goals for the team and challenging them with care and respect.</li>
<li>Providing timely feedback without sugarcoating</li>
<li>Active performance management. When you let someone go with a development mindset, you will favor that person to discover a future elsewhere.</li>
</ul>
<p>These are my leadership behaviors and beliefs as of now. As always, I’m writing these down as writing is clarifying. I’m sharing these, hoping that they might help someone on a similar journey as I’m.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Stop Feeding the Monkey – Journaling]]></title>
            <link href="https://www.subbu.org/articles/2021/stop-feeding-the-monkey-journaling/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/stop-feeding-the-monkey-journaling/</id>
            
            
            <published>2021-03-21T15:19:02+00:00</published>
            <updated>2021-03-21T15:19:02+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Consider a few contemporary problems for tech workers.</blockquote><p>Consider a few contemporary problems for tech workers.</p>
<p><strong>Problem Number 1:</strong> Our attention has been fragmented for a while. We all have plenty of doom-scrolling opportunities on all our computing devices. As Cal Newport writes in his 2016 book <a href="https://www.calnewport.com/books/deep-work/">Deep Work</a>, “the rise of these [messaging, social media] tools, combined with ubiquitous access to them through smartphones and networked office computers, has fragmented most knowledge workers’ attention into slivers.” He then adds, “This state of fragmented attention cannot accommodate deep work, which requires long periods of uninterrupted thinking.” Right, but that’s just part of the problem. It affects mental health too.</p>
<p><strong>Problem Number 2:</strong> Distributed offices and the pandemic have amplified the fragmentation – at least for most if not all. Along with everything, we “digitally transformed” even simple acts of getting information. What could be a turn-your-head-to-ask-a-colleague-a-question is now a meeting on both of your calendars or one more Slack thread. I recently joked with a colleague that “you can butt-type a slack channel name to find a real one that you’re already part of.”</p>
<p>People are spending more time “syncing” and “aligning” through their favorite communication tools. Just the other day, I had to set up two 15 min meetings with two different individuals in two different time zones to put two things together.</p>
<p>These acts further sliver focus and attention. Not “syncing” and “aligning,” on the other hand, breed anxiety as you stop knowing what is going on and feel left out.</p>
<p><strong>Problem Number 3:</strong> Slivered focus and attention multiply work in progress. You never get enough information and time at once to finish solving one problem before the next issue or task comes up. The more fragmented your attention is, the more unfinished work you accumulate.</p>
<p>The hilarious part is when people share their screens in meetings. Many people’s browsers nowadays have 10s of tabs. Each tab is potentially some unfinished work in progress. You wonder if they will ever read and process every tab and their anxiety of not doing so.</p>
<p>Also, consider that work at the workspace is increasingly becoming complex. I’ve three-four slow-burning topics on any given workweek and at least one fast-burning fire to handle. These add to the already fragmented mind to juggle between all these topics thinking, feeling, and planning, ad nauseam.</p>
<h3 id="the-consequence">The Consequence</h3>
<p>Likely as a consequence of such problems, I’ve gone through years of feeling completely drained and empty by Friday evenings and used to take most of Saturdays to recover. Then Sunday comes, we start checking and firing emails. We’re back to the war zone by Sunday evening or the loo time Monday early morning.</p>
<p>I don’t seem to be alone. Others seem to be facing similar problems. I often see tired and droopy faces at the end of any workday. People routinely share admissions of being busy and a lot going on.</p>
<p>No wonder. At least in the tech sector, with stakes and rewards being high, there is little incentive to do less. Slowing down is the least attractive option.</p>
<p>We can talk about mitigating or avoiding these problems for hours, but these are not going to go away. I don’t see myself slowing down anytime soon. I don’t see me reclaiming large parts of my calendar anytime soon. I keep trying and failing. There is so much unfinished stuff to do!</p>
<p><img src="/img/1__mpZDIggMbw6O9__G2dsneuw.png" alt=""></p>
<p>I’m not a neuroscientist, and I don’t know what this constant jugglery between unfinished tasks does to the brain. But I can equate the effects of this jugglery to “feeding the monkey” in the brain with an endless stream of entertainment. The monkey first gets excited with the stimulation and keeps jumping from topic to topic, but then eventually gets tired. I needed a way to stop feeding the monkey.</p>
<h3 id="stop-feeding-themonkey">Stop Feeding the Monkey</h3>
<p>Thanks to a tweet by <a href="https://twitter.com/smakofsky/status/1362403202981761028">Steve</a>, I discovered journaling recently. I’m 31 days into daily journaling. So far, I’ve not had the usual Friday-drains.</p>
<p><img src="/img/1__CT58prlf40pb05knVbLTwQ.png" alt=""></p>
<p>At least once or twice daily, I dump all unfinished things and sort them in my journal. I try to organize my thoughts, feelings, and plans into various journals. Once I sort things out in a journal, the monkey has much less to do until new information, new threats, or some change in conditions.</p>
<p>Consequently, I’m much more detached and relaxed on even some of the most challenging days. On the days I fall back to old habits, the monkey takes over, and I’m less focused and drained.</p>
<p>Essentially I’m using a journal to stop feeding the monkey. It’s a technique to let ideas and thoughts breathe. That’s my coping technique.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Being Present]]></title>
            <link href="https://www.subbu.org/articles/2021/on-being-present/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/on-being-present/</id>
            
            
            <published>2021-03-07T20:23:14+00:00</published>
            <updated>2021-03-07T20:23:14+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>The concept of “presence” eluded me for some time. Based on some muzzy ideas that I formed over time, I’ve associated presence with how…</blockquote><p>The concept of “presence” eluded me for some time. Based on some muzzy ideas that I formed over time, I’ve associated presence with how others see me in one-on-one or group meetings. Several questions bothered me. Am I friendly enough or too nice? Am I critical enough or overly critical? Do people see me as soft and gentle and thus ineffective, or do they find me intimidating? Am I giving enough direction, or am I too vague or, worse, overly prescriptive? There is no easy way to know.</p>
<p>I’ve been inconsistent in my approach of being present with varying outcomes. I could get away as long as I was an individual contributor, but as I made my <a href="https://m.subbu.org/jumping-across-career-ladders-ea2d2d8bcdbb">career change</a>, I was left with a troubling realization that I have no formula for conducting myself, and I was “winging it.”</p>
<p>We associate presence with leadership. We attribute “being present” to being charismatic, energetic, confident, commanding, perhaps intimidating, witty, sharp-looking, steering the course, etc. I also thought that leaders were supposed to command others’ attention through “leadership presence.”</p>
<p><img src="/img/1__YSFq7PhzCONaXJJylgqjFw.png" alt=""></p>
<p>There is plenty of leadership mumbo-jumbo on the Internet to tell you that “<a href="http://www.wecatchlight.com/gravitas/">if you want to be perceived as a leader, you have to have gravitas</a>,” and that gravitas is “<a href="https://www.forbes.com/sites/forbescoachescouncil/2019/06/13/how-to-develop-gravitas-and-boost-your-executive-presence/">that certain something that makes a great leader</a>.” There are plenty of kitchen sink articles like <a href="https://trainingindustry.com/articles/leadership/the-5-cs-of-leadership-presence/">The 5 Cs of Leadership Presence</a> and <a href="https://www.lollydaskal.com/leadership/12-habits-building-leadership-presence/">12 Habits for Building Leadership Presence</a> that further confuse and make the concept of presence distant from day-to-day lives for most of us.</p>
<p>Even Kathy Lubar and Belle Linda Halpern’s 2004 book <a href="https://www.goodreads.com/book/show/599704.Leadership_Presence_Dramatic_Techniques_to_Reach_Out_Motivate_and_Inspire">Leadership Presence</a> confused me when I first opened the first chapter with the title “Presence: What Actors Have That Leaders Need.” I had to read the book a second time to skim for the parts that made sense and opened my eyes. This book has some great nuggets, but I had to mine for those.</p>
<p>It took a few iterations for me to learn about presence. I realized that this concept is simple and yet fundamental. When combined with inquiry skills, this concept can be a very productive tool to influence and produce excellent outcomes. I’ve come to appreciate that what differentiates a poor interaction from a great interaction with others is your presence. Furthermore, the farther you get from real work in the corporate hierarchy, being present is the only effective way to lead.</p>
<p>As I realized that presence means nothing but being present, being in the moment, and not in the past and not in the future, parts of Kathy Lubar and Belle Linda Halpern’s began making sense to me. As I re-read the book, nuggets like below started appearing.</p>
<blockquote>
<p>It means being present in the moment — focused totally and completely on what is happening right here and right now. It means, when you’re with people, giving them your full attention, so that they will feel recognized and motivated. (Page 18)</p>
<p>When you’re not present to the people you lead, it weakens their willingness to commit. (Page 18)</p>
<p>The key characteristic of that behavior, we think, is flexibility. It’s the willingness and ability to move and adapt freely as circumstances prescribe right now. (Page 51)</p>
<p>You must practice being in the moment with people. That’s the only way you can properly assess which role is appropriate to play. (Page 65)</p>
<p>(Here the role refers to one of “captain”, “conceiver”, “coach” or “collaborator” from page 63.)</p>
</blockquote>
<p>Here is what it means for me to be present in practice.</p>
<p>When I’m talking to another person, I’m hearing what the person is saying, perceiving any emotions, and asking questions to learn more. I’m not thinking of what happened to me 5 minutes ago, what I like to do later in the day, or some other task or concern. I’m not looking at my watch, not my phone, not my email, and not certainly checking Twitter or Facebook. I’m giving 100% of myself to the moment and the subject of my meeting that person.</p>
<p>Similarly, when I’m in a group, I hear what others say; I’m drawing patterns, asking clarifying questions to seek information and validating assumptions, observing what people are saying, how they are saying, and feeling the temperature of the room. Through these steps, I’m focused on what is happening at that moment in that group. I’m helping the group stay focused on the subject of that meeting by merely asking questions. Again, I’m not distracted by checking email or multi-tasking.</p>
<p>But being present is hard. I rarely get it right 100% of the time. Many things sabotage us from being present. Our brains are like monkeys that wander across topics thinking, feeling, and planning. At least for me, my default state of mind is mental chatter. Furthermore, tools we use at work like emails and slack messages further add to our mental chatter. Consequently, being present takes effort.</p>
<p>Here are a few techniques I’m incorporating to improve my ability to be present.</p>
<ol>
<li><strong>Noting and tucking things away:</strong> I take a few minutes after most tricky meetings to note items down and tuck them away before jumping into the next thing I want to work on or my next meeting. This brief activity helps me declutter and calm my mind before I get to the next topic. Besides, I review my calendar the evening before and make mental or written notes about most of my upcoming meetings. This step helps me better prepared for the impending clutter.</li>
<li><strong>Inquiring:</strong> The second technique is to stay focused by asking questions and listening, and not assuming. You can ask open-ended questions to bring details out. You can ask questions to surface blockers and hidden assumptions. You can ask questions to stretch people out of their current comfort zones. When you think you’ve asked all the needed questions, consider asking few more questions. Finally, depending on your situation, don’t hesitate to switch from humble forms of inquiry to confrontational forms. I highly recommend Edgar Schein’s <a href="https://www.goodreads.com/book/show/17381706">Humble Inquiry: The Gentle Art of Asking Instead of Telling</a> on the subject of inquiry.</li>
<li><strong>Minimizing bookmarking:</strong> I think of bookmarking as the habit of accumulating pointers to information to read, process, and return to those later instead of dealing with it at the moment. It is like opening a new tab in your browser and keeping it open in the hopes of getting back to it when you have the time. As tempting as bookmarking is, it gives you an escape pass from being present. First, I will never have enough time to read and understand everything. Second, even if I have the time, it’s irresponsible to assume that I can build the context and master every topic. Third, even I have the time and can develop the context and mastery, it’s arrogant to assume that my deep understanding of that subject can help others do their job better.</li>
</ol>
<p>Steps like this take practice and training to form muscle memory. I’m leaning on journaling to sharpen my approach. More about journaling later.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Getting Promoted — Push vs. Pull]]></title>
            <link href="https://www.subbu.org/articles/2021/on-getting-promoted-push-vs-pull/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2021/on-getting-promoted-push-vs-pull/</id>
            
            
            <published>2021-02-21T18:23:04+00:00</published>
            <updated>2021-02-21T18:23:04+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I vividly recall a particular one-on-one conversation. …  The question that bothered me most at that time was how to get to the next level.</blockquote><p>I vividly recall a particular one-on-one conversation. Several years ago, I was getting ready for a one-on-one with my manager. I rehearsed my key talking points. It was about whether I was up for a promotion or not, and if not, why not. I had just built and launched a new project. The project got a lot of kudos, and I got moderate recognition. I led a small team to build it, and I designed and wrote critical parts of the code. I was super-pumped about how good I was. I thought I had “arrived.” The question that bothered me most at that time was how to get to the next level.</p>
<p>My one-on-one with my manager came and went. All I got was what I felt to be a general-purpose pep talk. He talked about “pushing yourself up” vs. “others pulling you up” and indicated that at the level I was at then, I needed to work on creating the pull. At that time, it felt unfair and outright wrong to be pulled up. It became clear to me much later.</p>
<p>I didn’t get promoted that cycle and not even the next. When I eventually got promoted a couple of years later, it didn’t start with a one-on-one meeting. My manager called me for my inputs into the case the manager was making for my promotion.</p>
<p>Promotions and growing to the next level are sensitive topics. For the people wanting to get promoted, anxieties increase as they approach the promotion cycle. Like my case above, people ruminate about this topic a lot and bring it up with their managers to get some vague sounding reasons and inputs. You may end up feeling entitled with a reaction like, “I’m doing great, why are you not promoting me.” Or you feel rejected that “this manager/organization/company is not valuing my work”. Alternatively, you may feel dejected, that you’re not worthy of a promotion and that you’re stuck. Unfortunately, these feelings are just saboteurs and may contribute to nothing but lowering your chance of getting promoted.</p>
<p>This topic is tricky for most managers too. Not every manager takes the time to identify and candidly share growth areas for their employees. <a href="https://www.urbandictionary.com/define.php?term=Shit%20Sandwich">Shit-sandwiching</a> is not uncommon. Fearing conflict, managers may obfuscate critical growth areas behind vague platitudes and hints. I’ve had a chance to read some managers’ reviews that gloss over essential development areas so gently that you wouldn’t even notice what the manager is trying to imply. Consequently, you may keep building unrealistic expectations of your readiness. When that promotion does not happen, you may also harm team performance by feeling disengaged, rebellious, or hostile.</p>
<p>Many factors go into promotions. Besides being determined as ready, other factors include scope and budget. The scope can be vague, but it is usually determined by whether the person has a role ready and big enough at the next level to fill. In this post, I will focus on readiness and the types of problems you should be solving to get ready.</p>
<p>There are some great articles on this topic — google for “how to get promoted at work.” Most of those are right and can provide some useful guidance. But of all the tips and suggestions you will hear on this subject, the <strong>most crucial technique</strong> to develop yourself to grow into the next level is to <strong>solve ambiguous problems</strong> and <strong>not settle for well-defined problems with clear expectations and accountability</strong>.</p>
<p>But why?</p>
<p>Career ladders are not linear. Each progression from one level to the next requires acquiring a different set of skills. Earlier parts of your career depend mostly on improving the so-called hard skills. As <a href="https://en.wikipedia.org/wiki/Skill#Hard_skills">this</a> Wikipedia entry describes, these are technical and administrative “skills relating to a specific task or situation” and involve “understanding and proficiency” of “methods, processes, procedures, or techniques.”</p>
<p>You can acquire such skills by solving hard problems by yourself. Through learning and practice, you can polish your hard skills to produce outcomes faster and better with little or no supervision, and thus you can increase your impact on the team. This approach can help you get promoted a few times, perhaps relatively quickly. During this time, you will likely become comfortable pushing yourself to acquire hard skills, and people recognize you and will continue to lean on you to solve similar problems.</p>
<p>As you enter your comfort zone, the linear career progression through the acquisition of hard skills will stall. That’s when you will start to hear about “soft skills” like “influencing,” “conflict resolution,” “teamwork,” “empathy,” “communication,” and such vaguely described leadership traits when asked about getting promoted.</p>
<p>But how do you acquire soft skills?</p>
<p>Just like you acquire hard skills by solving increasingly tricky hard problems, you can develop soft skills by solving increasingly complex ambiguous problems.</p>
<p>Every company has plenty of ambiguous problems with the potential to transform and create significant opportunities. The problems are often messy (read my post on <a href="https://m.subbu.org/the-value-is-in-dealing-with-the-messy-stuff-d535f5f42b39">The Value is in Dealing with the Messy Stuff</a>), and not everyone wants to touch those. Ambiguous problems have unclear, or several paths forward, and every direction appears to have its and pitfalls. Your opportunity is to create a path forward when no path seems plausible, for which you will need to be uncomfortable and demonstrate courage to take steps without knowing all the facts. You’re not guaranteed to succeed, and your approach and decisions could lead to failure. Such problems often fall in between multiple teams, and you will need to navigate teams, know and align people, and influence and persuade them to do certain things. People may not agree to the approach or trade-offs, and you will need to learn to deal with conflict and convince others. Since you won’t have all the information, you won’t make all the decisions. Thus you will learn to facilitate decision making thereby enabling others to make decisions. As Tanya Reilly describes in her <a href="https://noidea.dog/glue">Being Glue</a>, you will learn how to do glue work. Such glue work may require you to focus on invisible decisions — these are meta-decisions you make to make others make decisions.</p>
<p>In other words, <strong>ambiguous problems are gold mines to acquire soft skills.</strong> If you want to get promoted, first learn to raise your hand to solve ambiguous problems. Look around at work, and you will find those quickly. When you find such problems, try to persuade others about why those are significant problems, and be open-minded about what they say. If such problems are not apparent, ask your manager or the manager’s manager to learn what’s holding back their organization and their key priorities for the team. Above all, don’t shy away from such problems. <strong>Don’t ask, “tell me what I should do.” The opportunity is for you to figure out.</strong></p>
<p>As you succeed in solving such problems, others will notice. Someone or some group will want to pull you up to the next level so that you can help solve even more significant, more complex ambiguous problems. You will get promoted as people need you at the next level. They will pull you up because they need you at the next level. That’s what my manager was trying to explain years ago.</p>
<p>Here is my advice. <strong>Instead of letting the promotion anxiety distract you, focus on building and improving your hard and soft skills and be ready for that knock on the door.</strong> Raise your hand to solve problems before raising your hand for that next level.</p>
<p>You might argue that all this sounds ideal, that your organization is political, that promotions don’t work like that, and that you need to impress your manager and that manager’s manager, and so on. I can’t speak for every company culture, but I ask you to examine if your opinions about your organization are your saboteurs.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[2020 — A Year of Privilege]]></title>
            <link href="https://www.subbu.org/articles/2020/2020-an-year-of-privilege/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2020/2020-an-year-of-privilege/</id>
            
            
            <published>2020-12-31T23:06:50+00:00</published>
            <updated>2020-12-31T23:06:50+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>2020 was a weird year. Many things were different twelve months ago. At first, there was the pandemic. Before we even realized what the…</blockquote><p>2020 was a weird year. Many things were different twelve months ago. At first, there was the pandemic. Before we even realized what the pandemic meant and the work-life changes that were yet to come, the travel industry (I work for a <a href="https://www.expediagroup.com/">travel company</a>) took a big blow along with many other sectors. It felt that there was no end to the uncertainty and need for change at work and home. Then add the social and political turmoil that we all went through. Millions of people lost their jobs. Some businesses may not come back. The manager of a food distribution center I volunteered at a couple of months ago told me that they serve several times more people this year than last year. A <a href="https://www.worldbank.org/en/news/press-release/2020/10/07/covid-19-to-add-as-many-as-150-million-extreme-poor-by-2021">World Bank report</a> says that the pandemic “is estimated to push an additional 88 million to 115 million people into extreme poverty this year.”</p>
<p>But as I introspect my life and look around into the lives of people I know, things seem just fine. Indeed, everyone went through changes. Despite some inconveniences, most seemed to have adopted well. Nobody stopped buying things. Thanks to millions of <a href="https://news.trust.org/item/20191021154702-2qrbp">gig-workers that we don’t mind exploiting</a>, we’re all getting what we need and want conveniently delivered to our homes. People are meeting in small bubbles and enjoying their lives. Everyone baked, and I did too. Folks are investing in their health, wealth, and well-being. For the most part, stock markets did well. Per CNBC, the <a href="https://www.cnbc.com/2020/12/31/techs-top-seven-companies-added-3point4-trillion-in-value-in-2020.html">top seven tech companies added $3.4 trillion</a> in value in 2020. Many in the tech industry got richer.</p>
<p>How come?</p>
<p>Did we make all the right choices at the right time to prepare for a year like this? Maybe those who did not work hard and failed to make the right decisions are paying the price? It seems convenient and comfortable to think so.</p>
<p>Or is it because of the privilege we accumulated over the years through all the opportunities provided to us?</p>
<p>As I introspect my own life, circumstances, opportunities, and choices, I’ve no reason to believe that I worked hard and made all the right choices at the right time every time.</p>
<p>I must admit that I’m privileged. My gender, who I was born to, the schools I went to, the companies I worked for, and the people in my personal and professional life slowly but steadily contributed to my privilege over the years. I can’t wash off this privilege with some year-end charitable donations, or some pithy words of wisdom.</p>
<p>That’s my lesson in 2020.</p>
<p><img src="/img/1__Wg6ff6O7E1WQDDVhwGdubA.png" alt=""></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Jumping Across Career Ladders]]></title>
            <link href="https://www.subbu.org/articles/2020/jumping-across-career-ladders/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2020/jumping-across-career-ladders/</id>
            
            
            <published>2020-11-16T20:27:09+00:00</published>
            <updated>2020-11-16T20:27:09+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I went through a career reboot earlier this year. All these years, I grew in my career through the individual contributor (IC) ladder…</blockquote><p>I went through a career reboot earlier this year. All these years, I grew in my career through the individual contributor (IC) ladder. Sometime during 2019, I realized that it was enough. I wanted to reboot my career and create more opportunities to grow as a leader by switching over to the manager career ladder. Thanks to certain people who believed in me, I got an incredible opportunity to build and lead a new team at the beginning of this year.</p>
<p>I kept quiet on this blog till now, mainly because my mind was as clear as mud for several months. The journey was rocky first, and I had to retool how I work with others, strive for outcomes, and lead. Though I expect to continue this process, my head is less muddy than it was even a couple of months ago. Many people, including the people who report to me, helped with this transition; and I can’t be grateful enough to them. I’m also thankful to the people who suspected my readiness as it helped me understand why.</p>
<p>Most people who manage others start small earlier in their careers and slowly grow to manage other managers and managers of managers. As I skipped these usual stages, I got the luxury of making certain mistakes and developing perspectives that experienced managers may have forgotten about. I want to share my perspectives in this post as I realize that I’m not in the majority and that others may find these useful.</p>
<p><img src="/img/1__JKyK4RbBLK9d6HymEZIJYg.png" alt=""></p>
<p>Some of what I share below may sound discouraging for those in the IC ladder, but these are important considerations no manager would tell you. Let me also be clear that I’m a sample size of one, that others may not share my perspectives, and your mileage might vary.</p>
<h2 id="ic-and-manager-career-ladders-are-not-equivalent">IC and manager career ladders are not equivalent.</h2>
<p>IC career ladders are not new in tech companies, and more and more companies seem to be clarifying and establishing separate career ladders for ICs and managers. These ladders clarify competencies, expectations, and differences between different levels in each ladder. For those looking to understand their career progression possibilities, such ladders provide at least a theoretical direction.</p>
<p>Some companies end their IC ladders at roles like Principal Engineer and Senior Staff Engineer, while larger tech companies tend to extend these to Distinguished Engineer and Fellow roles. Career ladders, when published, highlight corresponding manager levels. For instance, a Principal Engineer level might correspond to a Director level, and a Distinguished Engineer level might correspond to a Senior Director. A Fellow might correspond to a Vice President. But these vary from company to company.</p>
<p>As you move up along the IC ladder, you get a perspective of big problems worthy of solving, plenty of access to senior leaders and organizational resources, a seat at the table to influence impactful strategic decisions, and a latitude to work across org boundaries. These are perks that people in the lower levels of the IC ladder or even the manager ladder can only dream about. Besides, nobody will stop you from exploring different problems.</p>
<p>People at the top of this ladder usually have huge followership; they have done a lot to help grow the company and are well respected. It is also common to groom and promote internal candidates into these roles instead of hiring from outside. When someone leaves at this level, the position may not get backfilled at the same level.</p>
<p>However, these roles don’t go on forever. First, IC roles reach a plateau sooner than managerial roles. Your career progression stops upon reaching the senior-most IC level. This may be acceptable for you as long as you retain the flexibility to solve your company&rsquo;s most impactful or niche problems just through influence.</p>
<p>Furthermore, IC career ladders tend to run steeper than the corresponding managerial ladders. Just count the number of individual contributors and managers at the topmost IC level and the equivalent managerial level in your company. Fewer and fewer get to climb to the top, with most getting stuck in the middle. Although this is generally true for managerial roles, manager ladders seem to suffer less from this steepness.</p>
<p>As I began to realize that I’m leaning more on influence than on specialized skills to get things done, the fanciness of the IC ladder began to fade away, which brings to my second point.</p>
<h2 id="to-be-successful-as-an-ic-you-must-be-a-great-influencer">To be successful as an IC, you must be a great influencer.</h2>
<p>I can’t emphasize this point enough. If you are an IC and like to continue to grow in your career and do impactful work, you better learn to like people and learn to influence them. Don’t expect to continue to grow in your career by being the fastest or the best coder in the team. Even your deep domain knowledge acquired through working for years on the same set of systems might not help you keep going. Eventually, others below your level will do better than you do. The sooner you learn to scale yourself through influence, the better for you. I sometimes run into ICs that want to code and don’t want to deal with people. That may appear fine but be aware that such an attitude will limit your career growth.</p>
<p>The single most important advice I give to ICs is to learn to solve ambiguous problems. Ambiguous problems force you to learn to influence. It’s common to equate dealing with people and influencing them as “messy politics,” and I can tell from experience that it is a mistaken and counterproductive perspective.</p>
<p>In my case, all the impactful problems I could solve in recent years were entirely through influence. But influence is a slow process. While it may take several weeks or a few months for you to go deep into a problem and find a way to solve it, depending on your organizational culture and structure, you may have to spend a lot more time influencing and mobilizing others to execute the solution.</p>
<p>Moreover, as you go up the IC ladder, you will find that individuals and teams within the existing organizational structures can already pick up all easier problems. Consequently, the problems you pickup tend to be ambiguous with no clear ownership and accountability. Solutions may not fit well within existing structures and processes. Therefore, you need to have patience and tenacity to use your influencing skills to navigate organizational boundaries to align people.</p>
<h2 id="ic-roles-are-also-consultative">IC roles are also consultative.</h2>
<p>Influencing is a great force multiplier. When successful, you will find others preaching your ideas and approaches and multiply your impact.</p>
<p>However, the flip side of leading through influence is settling for consultation. As you get better at influencing, you may find that your role becomes increasingly consultative in nature. You will often get asked for inputs, and those inputs often count. However, inputs are not decisions. Due to organizational or business considerations that you’ve limited control over, your inputs may not see the light of the day. Accountability for outcomes usually lies with managers. Consequently, many key decisions, including hiring, team structures, objectives, decisions to start/stop projects, etc., lie with managers.</p>
<p>Also, no one is obligated to follow you and line up behind you unless they see value in what you’re proposing. Consequently, even when you succeed in influencing people across organizational boundaries, people may decide to follow their managers and not you in case of conflict.</p>
<h2 id="these-ladders-diverge-as-you-move-up-making-it-harder-tojump">These ladders diverge as you move up, making it harder to jump.</h2>
<p>IC and manager ladders diverge as you move up. Opportunities to jump from the IC ladder to the manager ladder become far and few as you move up the IC ladder. The longer you stay in the IC ladder, the harder it would be to jump to the manager ladder. Jumping is possible, but you need to be patient and need sponsors who believe in you and clear obstacles.</p>
<p>Finding such sponsors won’t be easy. Even the people that worked with you closely in the past and leaned on your technical and influencing abilities to get major projects done will hesitate to take the risk of sponsoring you or giving you the opportunity. They may believe, rightfully so, that you are not ready or that you may not succeed as a manager. I’ve had this happen to me as well, and understand the risks involved. There are several valid reasons, but let me cite the three that I found most important.</p>
<ol>
<li>First, your organizational leaders would have no way to judge how you would react in difficult or emotionally challenging situations. To give you a simple example, consider the difference between providing poor feedback about someone to their manager and acting on such poor feedback about someone you manage. It’s easier to give feedback than to take timely and constructive actions on people you manage. Others have no way to know how you would handle such situations.</li>
<li>Second, leading through influence as an IC is different from managing. As a manager, you will have to learn to use managerial leverage to improve organizational performance. For example, as an IC, you will tend to get down to work and develop one or more ways to solve the problem when you find an interesting problem. But as a manager, your job is not to solve it yourself. Your job is to leverage the people in your team, create a sense of why it is important to solve the problem, orchestrate means for the team to figure out how to solve the problem, and then set up supporting mechanisms to ensure that the problem gets solved.</li>
<li>Third, in case of failures, managerial roles have a larger blast radius than corresponding IC roles. It is easy to contain or repair any damage that an IC can cause to an organization. You can contain the repair to just that individual. But containing or repairing an ineffective, or arrogant, or know-it-all manager’s damage can be difficult. You may have to rebuild the entire organization.</li>
</ol>
<p>There are more. As an IC, you may have theoretical knowledge of such differences and situations from reading books and observing managers. You may have hypothetical solutions to tackle challenges that managers need to deal with. But without a track record and muscle memory formed through trial and error, your chances of failure are high.</p>
<p>As they say, the grass is greener on the other side. Both roles offer you a way to learn and drive change. But, if you’re an IC that wants to jump to the managerial ladder, be patient. Continue to develop leadership competencies like influence, creating paths for ambiguous problems, dealing with conflict, etc. Even if you decide to stay on the IC ladder, these competencies will take you farther than your domain skills. As <a href="https://twitter.com/whereistanya">Tanya Reilly</a> says in her <a href="https://leaddev.com/hiring-onboarding-retention/not-all-engineering-leaders-are-engineering-managers">Not all engineering leaders are engineering managers</a>, “many of the leadership skills that make for good managers (e.g., setting a clear direction, caring about other humans, understanding the business, building consensus, communicating ideas) are also the ones that make stellar senior, staff, and principal engineers.”</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Lessons from 2019]]></title>
            <link href="https://www.subbu.org/articles/2019/lessons-from-2019/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/lessons-from-2019/</id>
            
            
            <published>2019-12-31T17:49:08+00:00</published>
            <updated>2019-12-31T17:49:08+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As I look back into 2019 and prepare myself for 2020, I’m proud of two things. First, leading through influencing with little positional…</blockquote><p>As I look back into 2019 and prepare myself for 2020, I’m proud of two things. First, leading through influencing with little positional power. Second, further polishing my skills to deal with ambiguity. Not unlike other years, there were ups and downs along the way, with abundant opportunities to lead, make mistakes, observe others making mistakes, and learn from those. Here are my top seven lessons from 2019.</p>
<p><img src="/img/0__bvoYktA71KqmaVY6.png" alt=""></p>
<h4 id="lesson-1-dont-romanticize-about-what-you-want-to-build-and-how-you-want-to-developit">Lesson 1: Don’t romanticize about what you want to build and how you want to develop it</h4>
<p>Big ideas are essential to motivate, inspire, and energize. There are many examples at workplaces. Consider, for instance, re-platforming your code to follow some new-found design principles, or building new special-purpose logging and monitoring platform, or adopting a contemporary architecture using the latest and greatest tech. However, such ideas are just untested hypotheses, and may or may not solve your customer problems. So instead of selling what you want to build and how you want to develop it, focus on outcomes, and find ways to test your hypothesis by working backward from those outcomes incrementally. Romanticize about the results and not ideas.</p>
<h4 id="lesson-2-have-a-point-of-view-on-what-to-standardize-and-what-notto">Lesson 2: Have a point of view on what to standardize and what not to</h4>
<p>Standards are a double-edged sword. On the one hand, you can cripple innovation by standardizing a lot. Excessive standardization can also lead to a culture of dependency and mistrust. On the other hand, standardizing little creates a wild west. You get agility early on but won’t be able to scale the organization due to limited leverage, lack of repeatability, and lateral moves of people.</p>
<p>However, over the last several years, cloud providers have entirely disrupted how organizations have been standardizing their infrastructure, developer platforms, and all the enabling systems. It’s time for a new way of thinking.</p>
<p>Here are three rules of thumb to decide the kinds of things you want to standardize while leaving the rest to teams to determine as they see fit.</p>
<p><strong>First, identify architectural invariants:</strong> These are principles you want to follow that remain mostly unchanged with technology. Examples include:</p>
<ol>
<li>Protocols and interfaces (APIs) between producers and consumers of the business capabilities, including security and access controls</li>
<li>Rules for making tradeoffs when building software, for instance, between optimizing a process for customers and partners, balancing between availability and security, or latency and availability, etc.</li>
</ol>
<p><strong>Second, make common agreements:</strong> These are conventions, tools, and practices you want to keep primarily aligned. Examples include your network designs, policies, and tools for managing costs and security controls, data locality, etc. Evolve these as paradigms change but keep mostly common for everyone.</p>
<p><strong>Third, know where you want to foster rapid change:</strong> These are areas of differentiation for your business. If there are tools already available in the industry for the agility of these areas, adopt those quickly as standards to unlock agility, but don’t force standards onto desperate problem areas. For instance, your front-end teams may want to use a particular CI/CD system while your data science teams may use a different approach for their workloads. Identify additional common agreements (2) needed to balance between flexibility and commonality.</p>
<h4 id="lesson-3-be-comfortable-about-not-having-anopinion">Lesson 3: Be comfortable about not having an opinion</h4>
<p>It is a typical leadership mistake to lead discussions with strong opinions. I’ve seen very senior leaders start with their views. Strong opinions can cripple dialog and push the org culture into a box. Strong opinions are also an indicator of “I know it all” mindset. As I <a href="https://m.subbu.org/opinions-c71172f6df76">wrote in the past</a>, organizations may start or suspend significant initiatives based on opinions of positional leaders with titles at work. Eloquent opinionated individuals take over conversations in meetings to steer the course to conform to their views. Senior leaders’ names get dropped to shift the course of an activity or to override some data.</p>
<p>It takes courage and trust in the process to leave opinions outside when entering discussions. Yet, it opens options you may not have considered before.</p>
<h4 id="lesson-4-take-the-time-to-form-mental-models-of-how-thingswork">Lesson 4: Take the time to form mental models of how things work</h4>
<p>Related to lesson 3, this is another lesson I learned this year. There are cases where you need to build a point of view and make decisions to move forward. In one particular case, on tackling a problem in one context, I had the opportunity to come up with producing similar outcomes in a different context. Instead of starting with the same recipe, I went on talking to several individuals closer to that context, asking them what they think are the issues and challenges, and how they would address those. This listening approach gave me a ton of insights to develop a point of view on how to approach the problem. It also helped me garner support for the approach.</p>
<h4 id="lesson-5-choose-opportunity-overfear">Lesson 5: Choose opportunity over fear</h4>
<p>On any day, when making decisions, choose opportunity over fear. It is not uncommon to come across arguments based on fear and uncertainty of competitors, third parties, and other entities. Concerns of vendor-lock-in is an excellent example of a fear-based approach. When presented with arguments, ask questions to turn attention towards opportunity. Opportunity based discussions usually uncover more options than fear and uncertainty based discussions.</p>
<h4 id="lesson-6-resist-status-management">Lesson 6: Resist status management</h4>
<p>When going through change, be okay with not having a status in the change and yet be willing to influence or even lead the change. I was fortunate to work closely with some individuals who demonstrate this ability so well. However, the most common tendency is to focus on how you fit in the change and not on what the change is about. Read more at <a href="https://m.subbu.org/status-management-d632e3c73d12">Status Management</a>.</p>
<h4 id="lesson-7-build-resilience-not-to-getrattled">Lesson 7: Build resilience not to get rattled</h4>
<p>Finally, know what you do well, and invest in yourself to build resilience not to get rattled. Interactions at workplaces can and do shake us. Not every meeting or email goes well. Workplace interactions are often based on limited information and lack kindness and empathy. When faced with such situations, I remind myself that the stuff is usually happening around you, and not to you. It helps to observe, explore a few mental models to understand what’s likely happening, and build personal resilience by selecting beneficial mental models. One of my career goals for 2020 is to further master this skill and more importantly teach others how to improve their personal resilience.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Studying an Incident]]></title>
            <link href="https://www.subbu.org/articles/2019/studying-an-incident/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/studying-an-incident/</id>
            
            
            <published>2019-12-30T15:36:18+00:00</published>
            <updated>2019-12-30T15:36:18+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>It is not often you get an opportunity to study an incident to illustrate a few lessons. A recent incident that I describe below teaches…</blockquote><p>It is not often you get an opportunity to study an incident to illustrate a few lessons. A recent incident that I describe below teaches three key lessons:</p>
<ul>
<li>There are multiple perspectives on what happened and how to improve. The more complex the system is, the more perspectives you’re likely to discover.</li>
<li>Asking for what went well and how things worked, instead of just asking about what went wrong, opens possibilities for improvements that you would otherwise miss.</li>
<li>Resilience is what people do, and being resilient involves likely doing things you’ve not done before.</li>
</ul>
<p>Below is an approximate representation of the incident timeline with certain notable events. I’ve omitted a few partially explored parallel paths.</p>
<p><img src="/img/1__x5v1JAi9__8kgU94ZNOMqFQ.png" alt=""></p>
<h3 id="multiple-perspectives">Multiple Perspectives</h3>
<p>First, notice that there are at least four separate perspectives of this incident.</p>
<p>Team A that operates the shared compute cluster:</p>
<blockquote>
<p>“We should have checked before deleting the cluster … We should avoid manual deletes like this … We should create smaller clusters to reduce the blast radius …We should chaos test this …”</p>
</blockquote>
<p>Team B that owns the apps in the critical path:</p>
<blockquote>
<p>“They (team A) did what? How could they? … Can we bring up these apps quickly in the second region? … Who knows the steps? … Who do we need to verify?”</p>
</blockquote>
<p>Team C (external) that runs the throttled AWS services</p>
<blockquote>
<p>“They (team A) did what? How could they? … How do we (recover from the throttle)? … What is the risk to other consumers of those APIs? …”</p>
</blockquote>
<p>Team D that is orchestrating the events on the incident bridge:</p>
<blockquote>
<p>“How is the rest of the site doing? What else went wrong? … Can we shift traffic to the other region? Why not? Have we tested this before? … Do we have a list of apps running on that cluster? … Who do we need to call?”</p>
</blockquote>
<p>Such perspectives show that the narrative of the postmortem report can vary based on who is writing the postmortem. Collecting all these perspectives, reconstructing the incident, and identifying potential corrective actions, may take separate interviews with each group. A single live large gathering of all the parties involved in a post-incident review meeting may not uncover all these perspectives. A typical operational review with a senior titled person at the head of the table will undoubtedly miss most of these perspectives, and the discussion will most likely focus on what that person feels everyone should do.</p>
<h3 id="what-went-wrong-vs-what-went-well-andhow">What Went Wrong vs. What Went Well and How</h3>
<p>A common practice of conducting incident postmortems to ask “what went wrong,” then a series of whys to find what that happened, and then identify future corrective actions to prevent such an incident from reoccurring.</p>
<p>Such an approach, in this example, will lead to the first event in the incident timeline, which is when an operator made a change to delete a compute cluster. Subsequent probing would discover that that the operator made an incorrect assumption, that the operator did not make sufficient attempts to verify that assumption, and that the change was not peer-reviewed.</p>
<p>Consequently, you would identify potential corrective actions like the following:</p>
<ul>
<li>Automating all deletes to include validation checks</li>
<li>Peer-review of all manual changes</li>
<li>Avoid creating large clusters to reduce the blast radius</li>
<li>Chaos testing cluster rehydration</li>
</ul>
<p>However, asking for “what went well and how” would uncover a different set of events and potential corrective actions.</p>
<p>Recall from the timeline that the deleted cluster was hosting 100s of applications, most of which were customer critical. But why was impact not broader than noticed? What protected the rest? This line of questioning would uncover the following:</p>
<ul>
<li>Most of those apps are redundantly deployed in a second region on a similar compute cluster in an active-active configuration.</li>
<li>The traffic management layer automatically routed the traffic to those apps after the apps hosted on the deleted cluster became unavailable.</li>
<li>The compute cluster in the second region scaled up automatically to support additional traffic.</li>
<li>However, a few apps, including the ones found to be in the critical path of the impacted customer segment, were not redundantly deployed in the second region.</li>
<li>The deployment system and the post-deployment configuration and validation checks were time-consuming, which prevented the quick deployment of those apps in the second region.</li>
</ul>
<p>In other words, a certain amount of robustness was built into the architecture, which helped limit the impact.</p>
<p>You would then come up with a different set of action items from those identified in the “what went wrong” approach.</p>
<ul>
<li>Ensure that all critical apps are deployed in at least two regions. Q: How do we know what is critical?</li>
<li>Identify all critical apps. Q: How do we keep it up to date?</li>
<li>Periodically test automated failover between regions.</li>
</ul>
<p>This example shows that probing for both “what went wrong” and “what went well and how” are essential. Each contributes to improving your understanding of the complexity of the system, how things work and identify potential corrective actions. Extending this line of thinking to all the perspectives listed in the previous section further enriches this understanding.</p>
<h3 id="resilience-is-what-peopledo">Resilience is What People do</h3>
<p>Finally, this incident also illustrates that resilience is what people do. This incident involved opening up minds to alternative explanations, conducting parallel streams of analyses, adapting to new information as it emerged, and attempting things not done before. Each major component involved in this incident behaved as it was supposed to. Regardless, the system as a whole faced a catastrophe, and it took human coordination, quick thinking, and ingenuity to recover from the disaster. In fact, what is typical between incidents is how people come together to restore the system, with the rest being unique to each incident.</p>
<p>As John Allspaw says:</p>
<p>Though such a distinction between robustness and resilience seems nuanced and pedantic, understanding and appreciating the difference can lead to vastly different thinking, investments, and outcomes. For example, not recognizing this difference may limit you to only focus on software solutions like below.</p>
<ul>
<li>Improving observability, so you’re quick to know and learn about the dynamic behavior of the system.</li>
<li>Building or adopting closed-loop automation systems — These are solutions that follow an act-observe-correct pattern in a closed-loop to automatically remediate components of a system when those are observed to be drifting from their desired state.</li>
<li>Adopting cloud-managed services for their availability and more predictable behaviors, to replace do-it-yourself solutions.</li>
<li>Reducing blast radius to contain faults and to minimize coupling with techniques like circuit breakers and fall-backs</li>
<li>Traffic shifting and shedding for quick recovery</li>
<li>Chaos testing the system by subjecting it to various failure hypotheses</li>
</ul>
<p>These are all essential investments. But such steps alone will not let the overall system, which includes people, the tools they use, and the rituals they follow, build the capacity to adapt to changing conditions during a catastrophe and to learn from those conditions. You need to go beyond to include the following to build resilience.</p>
<ul>
<li>Understand how humans interact with the system and the assumptions they make when operating the system.</li>
<li>Avoid language that prevents dialog and discovery during and after incidents.</li>
<li>Move away from root cause hunting to understanding how the system works, improve your mental models for the system, and use that understanding to invest for the future.</li>
<li>Ensure that people with titles are also learning. Most in such positions likely have dated understanding of how to build and operate complex production systems. However, since such people set the tone of the culture for their teams, it is vital for them to also learn in this process.</li>
</ul>
<h3 id="in-summary">In Summary</h3>
<p>For any company generating value from its production systems, complexity is a moat. Despite our attempts to shuffle the complexity through automated layers of abstractions, complexity is the natural state of real-world systems. Each layer we add and each change we make change our assumptions about how the system is supposed to work, and how it is actually working. Incidents provide an excellent opportunity to validate those assumptions and discover ways to improve. The practice of continuous learning from incidents must be an integral part of your operations-culture to build resiliency.</p>
<p>Thanks to <a href="https://medium.com/@willie.wheeler">Willie Wheeler</a> for reviewing an earlier draft of this post.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Retinitis Pigmentosa]]></title>
            <link href="https://www.subbu.org/articles/2019/retinitis-pigmentosa/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/retinitis-pigmentosa/</id>
            
            
            <published>2019-12-23T02:33:32+00:00</published>
            <updated>2019-12-23T02:33:32+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Nature and evolution offer some astounding patterns. Imagine a genetic disorder that affects males (sufferers), while their female…</blockquote><p>Nature and evolution offer some astounding patterns. Imagine a genetic disorder that affects males (sufferers), while their female siblings (carriers) carry the same disorder to pass onto their male children to suffer from, and to their female children to carry to the next generation? In this pattern, females (carriers) show no signs of this disorder, suffers carry their mutation through their female children, and male children born to a sufferer escape this affliction. Some male children born to a carrier may also escape as well.</p>
<p><img src="/img/1__VULvXBScFrIhImX8HLWTOA.png" alt=""></p>
<p><a href="https://en.wikipedia.org/wiki/Retinitis_pigmentosa">Retinitis Pigmentosa</a> is such a genetic disorder that causes gradual loss of vision. There are three known variants of this disorder, one of which is transmitted from generation to generation through X-linked chromosomes. This X-linked variant exhibits the pattern I described above. My description of this pattern is based on empirical observations and is not scientific.</p>
<p>That’s what has been ailing our family tree for generations. No, I’m not suffering from this, because I’m the male child born to a sufferer. My father is a sufferer who lost his vision during his 30s and yet managed to have a rewarding career teaching accounting for undergrads until his retirement. He relied on the family to read from books, and to prepare lecture notes.</p>
<p>What’s even more astonishing is the story of one of my ancestors, <a href="https://en.wikipedia.org/wiki/Chilakamarti_Lakshmi_Narasimham">Chilakamarti Lakshmi Narasimham</a>, born in 1867. He writes in his autobiography that he had difficultly reading in school or playing in low light in his childhood, and lost his vision entirely during his adulthood. Yet, he lived an active life as a prolific playwright and novelist in the <a href="https://en.wikipedia.org/wiki/Telugu_language">Telugu language</a>. He was also a social reformer and was active in the movement for India’s freedom from the British. He wrote several original plays, stories, and novels. He even started and ran magazines and translated plays from <a href="https://en.wikipedia.org/wiki/Sanskrit">Sanskrit</a>. He wrote his autobiography, published in 1942, at the age of 75 by dictating the text to two scribes. His books are bought and read even today.</p>
<p>I came upon his autobiography just this week. While reading this book, I learned that his maternal grandfather, who was not born blind, also gradually lost vision by his mid-30s. This finding puts the earliest occurrence of this disorder in our family tree in the early 1800s. Any documented or oral evidence of this disorder beyond this is likely lost. Even my father didn’t know that his ailment is a genetic disorder until the 1990s. Most doctors he saw treated him for <a href="https://en.wikipedia.org/wiki/Near-sightedness">Myopia</a> (nearsightedness).</p>
<p>There is still no cure for this, other than a carrier female deciding not to have children. Prospective experimental treatments cost a lot and are accessible to just a few.</p>
<p>In the era of plentiful of platitudes, it is easy to say that, despite such disorders, you can still accomplish a lot in your life. My father’s resilience is an example. Yet, having watched several sufferers (my father and his brothers), I know that life without vision is tough. The rest of us who can see don’t exactly make it easy for those who cannot see.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Why Learn from Incidents]]></title>
            <link href="https://www.subbu.org/articles/2019/why-learn-from-incidents/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/why-learn-from-incidents/</id>
            
            
            <published>2019-12-17T20:33:44+00:00</published>
            <updated>2019-12-17T20:33:44+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Resiliency related discussions usually delve into so-called “resiliency practices” like circuit breakers, bulkheading, and timeouts…</blockquote><p>Resiliency related discussions usually delve into so-called “resiliency practices” like circuit breakers, bulkheading, and timeouts, followed by monitoring gaps, then release safety practices, fault-containment patterns like sharding and redundancy, and even chaos testing. Sometimes, these discussions also digress into concepts like “auto-remediation” and “self-healing.” But what rarely happens though is any question of learning.</p>
<p>This absence of learning from incidents in such discussions is not surprising. The number of peoples that realized the role of learning from the success and failure of production systems in the IT industry is still small. For even the die-hard pager-warrior teams, “learning from incidents” is an esoteric concept. Safety is a relatively new topic in this industry.</p>
<p>Moreover, most work cultures want you to demonstrate bias for action and not “understanding” or “learning.” After your team recovers your system from a production incident, you’re often measured by how quickly you take the next steps, which include publishing a postmortem, determining action items, and finishing those quickly. “Wait, I’m learning” is not an expected answer. In our work cultures, we suppose learning to be automatic and implicit, and not something to talk about or explicitly do.</p>
<p>But why learn from incidents, or more generically, from working or failing production systems? Why is it relevant? Let me share a few reasons why, based on my personal experience.</p>
<p>First, learning from incidents helps close the gap between how you imagine the system to be working (the “as designed” state), and how it is working (the “as it is” state).</p>
<p>We use a variety of mental models to explain how complex production systems work. We form those mental models based on what we know about those systems. The inputs for these mental models include documented designs, code, configurations, metrics, monitoring charts and other artifacts. However, as our production systems undergo change, and as they age, our mental models become rustic and drift from reality. What was true about a system six months ago or even six days ago may not be true today.</p>
<p>Consequently, our understanding of the “as designed” state remains incomplete. Moreover, each person in the team may have a different understanding of the “as designed” state of the system. Team members use their incomplete understanding to make further changes, thus potentially compounding the gap.</p>
<p>Incidents allow you to validate or even dispute your assumptions about how you imagine the system to be working. There is no better way than to learn from incidents to validate or dispute assumptions and bridge silos of understanding. By walking away from an incident after restoration, you lose that opportunity.</p>
<p>In other words, incidents provide a feedback loop to correct and improve your understanding. Such improved understanding can help you improve the system.</p>
<p><img src="/img/1__tVVKNtQ893LE5a1ESAVflw.png" alt=""></p>
<p>Not learning from incidents is like running production systems in an open loop with gut feelings and blind faith.</p>
<p>Second, learning from incidents grounds you into realizing that resilience is beyond a technology problem. Most of us routinely use terms like “resilience,” “robustness,” or even “self-healing,” and “auto-remediating” interchangeably. However, until you start to learn from incidents, you may not realize that people, processes, and culture are part of the system and play a vital role in keeping the system resilient.</p>
<p>As <a href="https://www.linkedin.com/in/jallspaw/">John Allspaw</a> writes in <a href="https://www.adaptivecapacitylabs.com/blog/2017/12/19/taking-human-performance-seriously/">Taking Human Performance Seriously</a>, “the expertise and adaptive capacity of engineers is what keeps serious incidents from happening more often, and what keeps incidents from being more severe than they are.”</p>
<p>But how does this observation help improve systems that are currently falling over often?</p>
<p>When you’re dealing with such a system, you can’t just rush to using tech solutions alone. If you do, you might soon realize that your approaches are not working and that you must influence the culture first. Let me give you a couple of examples.</p>
<p>Imagine a work culture that insists on finding “the root cause” within a certain number of hours after an incident? Over time, teams in that culture get used to writing shallow postmortems to point to a “cause” so that they can move on to other work. The same happens in work cultures that insist on “five whys.”</p>
<p><img src="/img/1__Co5KmP5jm1rqHj9HG7cT9w.png" alt=""></p>
<p>Learning is non-linear, whereas the “five whys” approach makes you explore a linear sequence of events to find a purported cause. Instead, suppose you create a mechanism for the team to discuss what happened and what could have happened in an open format, they might walk away with a better understanding of how their system works, and what they could do to improve it.</p>
<p>Or imagine a work culture that uses a metric like “revenue loss” to measure the resilience of production systems. Teams in that culture get used to ignoring all other performance indicators as long as revenue loss is negligible. Consequently, they develop apathy towards issues that don’t result in revenue loss. Fixing such apathy then becomes a leadership challenge and not a technology challenge.</p>
<p>Though there is no cookbook for learning from incidents, recognize that it is a group learning activity. It involves sharing what you know, testing your assumptions, and adjusting approaches. Unlike individual learning, group learning allows for possibilities for critical thinking and exploration through dialog. Furthermore, it is not sufficient that the learning start and stop within the dev and operations teams. You also need leaders within the organization to foster the learning mindset for resilience.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Public Speaking]]></title>
            <link href="https://www.subbu.org/articles/2019/on-public-speaking/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/on-public-speaking/</id>
            
            
            <published>2019-10-26T07:08:20+00:00</published>
            <updated>2019-10-26T07:08:20+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Public speaking is one of the most uncomfortable things I do. Though I’ve spoken occasionally over time, despite knowing the subject and…</blockquote><p>Public speaking is one of the most uncomfortable things I do. Though I’ve spoken occasionally over time, despite knowing the subject and having done the work to earn the stripes to speak, I’ve always dreaded the experience. My usual speaking recipe used to be as follows — prepare some slides just days before the talk, think through some talking points, and show up behind the podium with no other form of preparation. The ideas that I originally had often ended up becoming too complicated or too flimsy to articulate well in the allocated time. Add my introversion and my imposter syndrome to the list.</p>
<p><img src="/img/0__al99LW8CpHsxOKWq.jpg" alt=""></p>
<p>I know I’m not alone. A lot of us struggle with public speaking. Most don’t even try for fear of failing. Public speaking can be intimidating and stressful. Though I don’t claim to be an expert public speaker, I want to share the single most important lesson I learned this year.</p>
<p>I began to take some steps last year. Initially, I watched several videos of other speakers and TED/TEDx talks. I also worked with a speaking coach for a few months. The coach made me realize some common mistakes of body language, tonality, breathing, the pace of delivery, etc. We also recorded some mock talks. Watching those was a terrible experience. The most important benefit of working with a coach, though, was to receive instantaneous feedback.</p>
<p>Yet, it took ten more talks and about a year to find a working formula. Here is the most important lesson I learned.</p>
<p><strong>Build and own your plot first.</strong> Until this year, I used to prepare slides first. Nowadays, I take a more contemplative approach that does not start with slide-making.</p>
<ol>
<li>Build a storyboard on a few sheets of paper or a text file. Each entry on the board includes an idea and a few talking points. Starting on a few sheets of paper or a text file helps focus on the plot instead of colors and fonts in PowerPoint, Google Slides, or Keynote.</li>
<li>Shuffle the order of the entries in the board into a plot with a beginning and an ending. Keep refining the order and talking points until the flow is linear and cohesive. Through this process, simplify the plot so people can follow you. A few twists and turns are okay but avoid disjoint ideas as they will make you struggle through transitions, and will confuse the audience. Moreover, the order should be natural for you to tell.</li>
<li>Only then translate the storyboard into slides. Use pictures and diagrams, with as few words as you can. If you’re using text, prefer large fonts. This approach will help the audience focus on you and not the screen.</li>
<li>Save the slides into images, and insert those images into a document. Then type your talking points after each slide. See one of <a href="https://m.subbu.org/forming-failure-hypothesis-3185db4eec22">my latest talks</a> for an example.</li>
</ol>
<p>Try to spend the most amount of time on the last step. This step is your playground to refine your plot. The beginning of your script should invite the audience into your plot. I wouldn’t worry about narrating your life story or how great the company you work for is unless those facts are part of your plot. Give some hints about your plot in the beginning. Also, take the time to summarize your key takeaways at the end.</p>
<p>This essential step helps you form muscle memory. Muscle memory helps you avoid looking at your slides or speaker notes when speaking. It frees you up to move on the stage and be yourself, and not remain glued to the podium. The act of writing down the script also forces you to think and clarify your points. It allows you to try various options to narrate your plot in your own words. Don’t skip this step unless you’ve given the same talk before.</p>
<p>I learned a few other lessons as well.</p>
<p><strong>First, don’t get intimidated by those who speak well.</strong> There are so many articulate, confident, and persuasive speakers. But remember that they did not become as such overnight and may have gone through similar difficulties. Observe how they speak, but don’t feel threatened by their skills. Instead, stay humble and focus on your journey to improve.</p>
<p><strong>Second, be open to feedback.</strong> Invite others to give you feedback. Let others tell you about your filler words, body language, slides, your pace, how you move or not move on the stage, etc.</p>
<p><strong>Third, remember that you’re the expert with a few things to share.</strong> The audience wants to learn from you, but not to punish you for being a poor speaker. Breath, calm down and be yourself.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Penalties and Purgatory]]></title>
            <link href="https://www.subbu.org/articles/2019/penalties-and-purgatory/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/penalties-and-purgatory/</id>
            
            
            <published>2019-10-09T19:05:41+00:00</published>
            <updated>2019-10-09T19:05:41+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I spoke on this topic at the ServerlessConf New York on October 8, 2019. Below are the slides and speaker notes. The thesis of my talk is…</blockquote><p>I spoke on this topic at the <a href="https://nyc2019.serverlessconf.io/">ServerlessConf New York</a> on October 8, 2019. Below are the slides and speaker notes. The thesis of my talk is to discuss a few questions:</p>
<ol>
<li>The community universally seems to agree that the combination of functions, events, and fully managed cloud-native services makes serverless what it is. Is this conclusion premature? What can we learn from contemporary solutions like Kubernetes?</li>
<li>Can code size reduction alone into smaller deployable units help reduce the time to value? Is there an inflection point of such reduction increasing MTTR?</li>
<li>How to do you make a case for tech adoption, and why it essential to understand how your business works?</li>
</ol>
<p>Given that is is a 20 min talk, it stayed high level.</p>
<h2 id="the-setup">The Setup</h2>
<p><img src="/img/1__FQk__LvYwTj23OXVFmgK04g.png" alt=""></p>
<p>Imagine you discover serverless today? You will find that the programming model is simple. You’re shipping small functions independently. This programming model is a microservices style taken to its logical conclusion. Then you will find that there are no servers to provision or manage radically simplifying the ramp-up and operational cost. Then you will find that the runtime model keeps costs transparent and follow the demand.</p>
<p>As promising as this direction is, it is important to challenge ourselves a bit and ask a few questions.</p>
<h2 id="slides-andnotes">Slides and Notes</h2>
<p><img src="/img/1__jtj5f5__eu8OLjWqmA1sy3g.png" alt=""></p>
<p>This talk grew out of my experience leading cloud migration at the Expedia Group. I had a unique opportunity to burn my opinions several times through over the last three and a half years. I had a chance to question my own beliefs, discard several of those, and form a few simpler ones. Hence you will find me taking a contrarian point of view on this stage.</p>
<h2 id="belief-serverless-is-thefuture">Belief: Serverless is the future</h2>
<p><img src="/img/1__dK8MWXV8vbeNWYVUSCTo0Q.png" alt=""></p>
<p>Most of us at this conference, including those promoting alternative technologies, do believe that serverless is the future. Five, ten, or fifteen years from now, we can all look back to reminisce that we were there when it all started.</p>
<h2 id="the-programming-model">The programming model</h2>
<p><img src="/img/1__z7tnrZmq208CylGvNCLn9Q.png" alt=""></p>
<p>But then let us look at the modern view of the serverless programming model. The programming model today consists of three things:</p>
<ul>
<li>Functions as primitives in a constrained programming runtime to run stateless computational logic</li>
<li>Cloud-native services to do the heavy lifting for a wide variety of middleware services and state</li>
<li>Events and remote-procedure calls to glue everything together</li>
</ul>
<p>Is this all we need to embark on the serverless journey? Back in 2019, I posed this question to someone in a cloud company, and the person answered yes. I didn’t believe it then, and I don’t think it is even now.</p>
<h2 id="why-arent-we-thereyet">Why aren’t we there yet?</h2>
<p><img src="/img/1__FstyVNTok56ylDeDlFbutQ.png" alt=""></p>
<p>Serverless adoption has been on the rise. Where I work, we continue to witness an almost linear increase in function invocations over the past two-three years. We also hear AWS Lambda continues to enjoy wide-spread adoption from a large variety of organizations to solve unique and innovation problems.</p>
<p>Yet, why is the world not moving to serverless quickly enough? What could be holding us back?</p>
<h2 id="counter-belief">Counter belief</h2>
<p><img src="/img/1__6VbTNdm7dr34X__sXCaQltA.gif" alt=""></p>
<p>Let’s examine a counter belief that sees serverless as an evil capitalistic pursuit to let cloud providers take all your code and data, and lock you into their claws. Though it is easy to make fun of this belief, this is real. Fear sells.</p>
<h2 id="what-properties-can-we-borrow-from-kubernetes">What properties can we borrow from Kubernetes?</h2>
<p><img src="/img/1__iLc6twNrNRtPZKWN5MVeiA.png" alt=""></p>
<p>For those that buy into that point of view, the alternative is a solution (Kubernetes) that provides distributed systems primitives on boring infrastructure primitives to let you run a variety of workloads on top.</p>
<p>While it is tempting to make fun of this approach in serverless conferences and meetups, how about we ask ourselves a simple question — what properties can we borrow from this approach? What can we learn, instead of picking a side? I won’t answer this myself, but I would encourage each of you to explore.</p>
<h2 id="landscape">Landscape</h2>
<p><img src="/img/1____Zvboc0kUgbwPg0lDy__0tQ.png" alt=""></p>
<p>Let’s look at other contemporary beliefs driving our thinking.</p>
<h2 id="belief-small-isbetter">Belief: Small is better</h2>
<p><img src="/img/1__9S__OHHl40Y72KaKH9SIsxg.gif" alt=""></p>
<p>We’ve been pursuing this idea that small is better through the adoption of microservices over the last 7–10 years. We’re witnessing tremendous gains of developer agility and lower time to produce value. This model has allowed every team to move at the pace they need to create value for their customers. A function-based programming model takes this approach to its logical extreme, where you’re constrained to write nothing but functions.</p>
<h2 id="code-size-and-time-tovalue">Code size and time to value</h2>
<p><img src="/img/1__xqi__bLfMPgbH1c__7tLJSGA.gif" alt=""></p>
<p>Yet, does a further reduction of code alone will continue to reduce the time it takes to provide value? I don’t think so. I believe there is an inflection point beyond which you may not see a further reduction in time to value.</p>
<h2 id="a-not-so-uncommon-phenomenon">A not-so-uncommon phenomenon</h2>
<p><img src="/img/1__Sfiw__XEXgDk3aV__wf1WA__g.gif" alt=""></p>
<p>Here is some evidence from my experience <a href="https://m.subbu.org/if-only-production-incidents-could-speak-555d68b6abfc">studying production incidents</a>. With thousands of applications running in production environments, I came across several examples where a fault in one part of the environment has an indirect impact on another part of the environment several layers away. Such incidents take time to detect and remediate.</p>
<h2 id="comprehension-penalty">Comprehension penalty</h2>
<p><img src="/img/1__fc4bOIliz4sdEOTKZvwq5A.png" alt=""></p>
<p>Without additional constraints, microservices-based architectures can lead to reduced comprehension of production environments, which can widen the gap between “as designed” (our assumptions of how things are supposed to work) and “as it is” (how things are working in the real world) states. This gap can contribute to increased MTTR.</p>
<p>(For more discussion on “as designed” and “as it is” states, see <a href="https://m.subbu.org/forming-failure-hypothesis-3185db4eec22">Forming Failure Hypotheses</a>.)</p>
<h2 id="where-are-the-app-primitives-in-serverless">Where are the app primitives in serverless?</h2>
<p><img src="/img/1__sPZYJ1UvZlDps6SolYZLpA.png" alt=""></p>
<p>This observation brings us to the question — have we found all the runtime primitives for a serverless future? Where are the application-centric primitives for:</p>
<ul>
<li>run-time boundaries between applications, with clear demarcation of private and state and behavior?</li>
<li>service interfaces</li>
<li>non-fate sharing architectures?</li>
</ul>
<p>Are there aspects we can learn from others? Are we throwing away most things we learned through the last 10–20 years? I don’t know the answers to these questions, but I believe that we must continue to explore.</p>
<h2 id="ourco-vs-theotherco">OurCo vs the OtherCo</h2>
<p><img src="/img/1____HxAqFzZDrpeecGHzCtdyw.png" alt=""></p>
<p>Let’s switch gear to tech adoption hurdles. Most developers I speak to share this belief privately. We often hear about tech adoption success stories at conferences and blog posts, while in reality, most of us worry that the places we work at don’t seem to be adopting the latest and greatest, including serverless. What could be going wrong?</p>
<h2 id="tech-investment-cycles">Tech investment cycles</h2>
<p><img src="/img/1__L__T1e5aqEizMJ__G3nKK0Yg.png" alt=""></p>
<p>Imagine you went through an investment cycle (people, money, and time) to build a product. Sometime later, a tech innovation comes along. You may have to wait for your next investment cycle to be able to lay hands on that tech innovation. The point to recognize is that your investment cycles may not line up with the tech innovation cycles, and it is okay.</p>
<h2 id="multiple-generations-and-migrations">Multiple generations and migrations</h2>
<p><img src="/img/1__Hkq7mETsuzCnS__Ks3w5uSA.png" alt=""></p>
<p>The second hurdle we run into older code that does not seem to go away fast enough. Here is what usually happens.</p>
<p>You have a product built yesterday, which is producing value for your customers. It is mature, functional, and yet complex to manage as it has so many band-aids to keep it working. You get upset with this complexity and want to build the next-gen to incorporate all the learnings from the product you created yesterday. But you’ve not finished yet. You might still start to experiment with new ideas.</p>
<h2 id="survival-penalty">Survival penalty</h2>
<p><img src="/img/1__e1c0p7HDkXk27lJvjMmHKg.png" alt=""></p>
<p>The longer your company survived, the more generations of systems that you accumulate. You will be able to retire some, but those too take time. This phenomenon is the natural cost of staying long and going through multiple innovations to run any company. You need to develop business acumen to get comfortable with this.</p>
<h2 id="fear-anxiety-or-escalation-wonthelp">Fear, anxiety or escalation won’t help</h2>
<p><img src="/img/1__unoEP69icTW567__sFZS85A.png" alt=""></p>
<p>As developers, we tend to resort to fear, anxiety, or escalation. We worry about our teams not adopting the latest and greatest. We hope that some senior leaders at your company turn your wish into a dictum. You desire to be able to push people to adopt the ideas you believe. But these rarely work.</p>
<h2 id="influence-canhelp">Influence can help</h2>
<p><img src="/img/1__yyae1ElKTg6M5SZ9IuV0vQ.png" alt=""></p>
<p>Influence can help. But how do you influence?</p>
<h2 id="understand-how-your-businessworks">Understand how your business works</h2>
<p><img src="/img/1__s5qDLi7Z7krfnuiyTefpGg.png" alt=""></p>
<p>To be able to influence, you must learn to understand how your business works. Your business is typically turning a few things through a business model to produce value for your customers. The value may be revenue or some other benefit that your customers care about.</p>
<p>To influence, ask the following questions:</p>
<ul>
<li>How does your business work?</li>
<li>How does it generate value?</li>
<li>What is your company currently pursuing?</li>
<li>How can you contribute to that pursuit?</li>
</ul>
<p>Once you find answers to these questions, align yourself with that pursuit.</p>
<h2 id="conclusion">Conclusion</h2>
<p><img src="/img/1__P8LZl83lxbJcjOVsa8aLBg.png" alt=""></p>
<p>Where does this leave us?</p>
<p>First, stay humble. Don’t get attached to the side you picked. Picking sides may be fun and entertaining, but those don’t matter in the long run.</p>
<p>Second, prefer faster, better, and cheaper as much as possible.</p>
<p>Third, challenge the cloud primitives offered to you. No cloud provider holds the keys to all innovation.</p>
<p>Finally, align yourself with value generation to drive technology adoption.</p>
<h2 id="thank-you">Thank you</h2>
<p><img src="/img/1__oEXAy2ww4IlsCnVC1q3jvA.png" alt=""></p>
<p>Thank you, ServerlessConf NYC.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Forming Failure Hypothesis]]></title>
            <link href="https://www.subbu.org/articles/2019/forming-failure-hypothesis/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/forming-failure-hypothesis/</id>
            
            
            <published>2019-09-27T22:49:40+00:00</published>
            <updated>2019-09-27T22:49:40+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Subjecting systems to failures is supposed to increase confidence in their stability. But why? How do you form useful failure hypotheses…</blockquote><p>Subjecting systems to failures is supposed to increase confidence in their stability. But why? How do you form useful failure hypotheses? How do you reason about their safety? Why should your organization listen to you and invest in testing your failure hypotheses?</p>
<p>I recently gave a couple of talks on this subject:</p>
<ol>
<li>“<a href="https://www.thestrangeloop.com/2019/safety-in-chaos-forming-realistic-failure-hypotheses.html">Safety in Chaos: Forming Realistic Failure Hypotheses</a>” at Strange Loop 2019, St Louis, on Sep 13, 2019</li>
<li>“<a href="https://chaosconf.io/">Forming Failure Hypotheses</a>” at Chaos Conf 2019, San Francisco, on Sep 26, 2019.</li>
</ol>
<p>These talks summarize over two years of my quest to improve production stability at work. Through this time, I had to put aside some of my prior beliefs, learn from the constant chaos that our production environments are, and form new hypotheses. Slides and speaker notes are below.</p>
<h2 id="the-setup">The Setup</h2>
<p><img src="/img/1__hB0Tdy9TPUoeP9GpItWxRA.png" alt=""></p>
<p>Chaos engineering has only been around in the information technology industry for just about ten years. In contrast, other areas like patient care, emergency response, space and aeronautics, manufacturing, industrial engineering, mining, etc., went through several centuries or decades of learning through disasters to incorporate processes and practices to promote safety.</p>
<p>This nascency is why we continue to hear about the rationale for chaos testing , the tools and techniques to practice this discipline, and occasional success stories. What we don’t hear about though, is that the road is rarely smooth, that chaos engineering programs don’t always work as expected, and often die after a while.</p>
<p>The gist of my talk is as follows.</p>
<ol>
<li>For your chaos engineering efforts to succeed, you must invest in learning from incidents.</li>
<li>Chaos engineering programs that don’t consider learning from incidents will likely fail after initial enthusiasm and excitement.</li>
<li>The need for and value of chaos engineering will fall in to place once you take the time to learn from incidents.</li>
</ol>
<h2 id="slide-2-slides-andnotes">Slide 2: Slides and notes</h2>
<p><img src="/img/1____wrWkmMefWrIRD2hIml9Gg.png" alt=""></p>
<p>You’re in the right place for the slides and notes. Look for other recent articles on this blog for more background material.</p>
<h2 id="slide-3-what-is-chaos-engineering">Slide 3: What is chaos engineering</h2>
<p><img src="/img/1__TJTKrmDWfTUyI9JgmWaMZQ.png" alt=""></p>
<p>Let’s take a brief look at this definition of chaos engineering.</p>
<blockquote>
<p>Chaos Engineering is the discipline of experimenting on a system in order to build confidence in the system’s capability to withstand turbulent conditions in production.</p>
</blockquote>
<p>Chaos engineering is about making a calculated hypothesis about the system being able to withstand certain turbulent conditions. It is not about randomly killing servers or breaking other things. Some older descriptions of chaos engineering still refer to just doing those kinds of things.</p>
<h2 id="slide-4-a-visual-representation">Slide 4: A visual representation</h2>
<p><img src="/img/1__nQk4HftuNgRtfG73NvbTCw.gif" alt=""></p>
<p>Here is an easier representation.</p>
<p>Imagine a system operating in a stable zone in the middle. You make a hypothesis that the system will continue to operate in that state even after you introduce a perturbation, like a server crash, hardware failure, or network degradation or even a network partition, as long as the perturbation does not push the system beyond the (assumed) fault boundary (shown by the upward arrow). You ensure that the system is not pushed beyond that boundary.</p>
<p>If the system returns to the stable condition, you proved your hypothesis. If, however, your assumption of the fault boundary is not valid, you may find that the system goes into the danger zone.</p>
<h2 id="slide-5-questions-to-consider-during-thistalk">Slide 5: Questions to consider during this talk</h2>
<p><img src="/img/1__6sgTNHpoVu4VehNG3S7R__Q.png" alt=""></p>
<p>As we get through the rest of this talk, keep the following questions in mind. We will answer some of these questions directly, and the rest indirectly.</p>
<p>First, what is the system? Is it the just software and config, the servers and the network, and the storage? Or, does it also include tools, processes, and culture that is used to build and operate the software, config, and the infrastructure?</p>
<p>Second, how do you form a chaos testing hypothesis? Do you copy what some else did? Do you just guess? Or do you come up with your own? If so, how?</p>
<p>Third, how do you ensure system safety? How do you guarantee that the test does not push the system from a stable steady-state into an unstable state that you cannot quickly isolate, and protect your customers from?</p>
<p>Fourth, why should anyone listen to you, and invest time and energy for chaos engineering? How do you justify the cost of this activity against all other priorities that your organization is pursuing?</p>
<h2 id="slide-6-foray-into-chaos-engineering">Slide 6: Foray into chaos engineering</h2>
<p><img src="/img/1__aWW8wEOn____jYxAJngusOnQ.png" alt=""></p>
<p>Here is how a typical journey to chaos engineering starts. You either start cloud adoption or at least some modernization through some of the latest and greatest tech for agility. You start breaking down monoliths and begin to adopt cloud-native technologies. Things seem to be going well with a lot of excitement in the air.</p>
<h2 id="slide-7-how-to-build-resilience">Slide 7: How to build resilience</h2>
<p><img src="/img/1__hni8F1K4BUQ99t82D5u22Q.png" alt=""></p>
<p>Then reality hits you, and you start to deal with outages. You also encounter some cloud outages like the recent AWS AZ loss in us-east-1. You will discover that your automation has bugs, or that you’ve not automated everything well. You will find that your changes are also causing production issues. Then you start to think about resilience. How do you build resilience?</p>
<h2 id="slide-8-enter-chaos-engineering">Slide 8: Enter chaos engineering</h2>
<p><img src="/img/1__3NfRpm8piLu6VPRANN__59w.png" alt=""></p>
<p>That’s when you discover chaos engineering. You research it. You read some books. You will find some tools to practice chaos engineering. It sounds fun and exciting. You roll up your sleeves and get down to work.</p>
<h2 id="slide-9-not-everyone-likes-you-to-attack-theirapps">Slide 9: Not everyone likes you to attack their apps</h2>
<p><img src="/img/1__n8v5qGeR2VfALme80UtTtw.png" alt=""></p>
<p>When you approach teams in your organization that you’re going to subject their apps and services to chaos engineering tests, some teams will enthusiastically tell you to attack their apps.</p>
<p>You will come across some teams that will say “No way. Our stuff is mission-critical. Don’t bother us,” while others would say, “We’re busy now. We don’t have time for this. Come back in x months.”</p>
<p>Such reactions will compel you to exclude all those apps and services, and work only with the teams that enthusiastically support you.</p>
<h2 id="slide-10-randomly-killing-servers-only-uncovers-trivial-issuesonly">Slide 10: Randomly killing servers only uncovers trivial issues only</h2>
<p><img src="/img/1__5FmV5iFlG7jgEDjy3t5BWw.png" alt=""></p>
<p>Then you will discover that randomly killing servers only uncovers trivial issues. This is plausible given that the teams that are enthusiastic about chaos engineering have already invested in some basic robustness practices in their apps and services. Those that have not take such steps are not anyway participating.</p>
<h2 id="slide-11-you-cantwont-test-more-seriousfailures">Slide 11: You can’t/won’t test more serious failures</h2>
<p><img src="/img/1__HzT__wKOK2__9KA6EDdEvK0g.png" alt=""></p>
<p>You also can’t and won’t try serious failures because you know those would get you into trouble. These could include blackholing your critical database, or breaking the network between two data centers.</p>
<h2 id="slide-12-self-doubt">Slide 12: Self-doubt</h2>
<p><img src="/img/1__ycQYZ__dX3OyTdWayAoFzzg.png" alt=""></p>
<p>The outcome — you become frustrated. You start to doubt yourself. You start to think that you or your company is not competent enough to adopt chaos engineering when every other company seems to be doing chaos testing all the time!</p>
<h2 id="slide-13-valley-ofdespair">Slide 13: Valley of despair</h2>
<p><img src="/img/1__RwesVTo__LzFS6BVfGjH0Kw.png" alt=""></p>
<p>That’s how you get into the valley of despair. Your chaos engineering program is likely to die at this point.</p>
<p>I faced this situation about a year and a half ago. How do you get out of this valley?</p>
<h2 id="slide-14-null-hypothesis">Slide 14: Null Hypothesis</h2>
<p><img src="/img/1__ZT0cOD2__asKtVxOrEBlQHg.png" alt=""></p>
<p>For the sake of discussion, let’s consider a hypothesis that “chaos engineering has nothing to do with a system’s capability to withstand turbulent conditions in production.”</p>
<p>Starting with such a hypothesis lets you discover if, why, and when chaos engineering might help.</p>
<p>More importantly, some of the pioneers in the industry that discovered the need for chaos engineering, and incorporated this discipline into their org culture, went through a journey of self-learning and discovery. Starting with a null hypothesis might help you go through a similar discovery process but within the context of your production systems, your tools, and your org culture.</p>
<h2 id="slide-15-how-is-the-system-behaving-in-production-today">Slide 15: How is the system behaving in production today?</h2>
<p><img src="/img/1__AofHZspSbFP__oZcF5y__F6w.png" alt=""></p>
<p>To start with this null hypothesis, let’s set aside the question of making the system withstand turbulent conditions. Let’s instead ask how the system is behaving in production today.</p>
<h2 id="slide-16-as-designed-vs-as-itis">Slide 16: “as designed” vs. “as it is”</h2>
<p><img src="/img/1__GLFv1kyVoBig__ZFHXd__pEw.png" alt=""></p>
<p>How do you check how is the system behaving in production today?</p>
<p>You can start with the “as designed” state. Your documents, diagrams, and even code give you an indication of how the system is designed and intended to work, but not as it is working in production today. Furthermore, even the metrics we measure, logs we collect, and the alerts to setup represent the as “designed state“:” and not the “as it is” state. In other words, the “as designed” state is biased by your expectation of how the system is supposed to work, but not how it is working today. The “as designed” state is as nothing but an imaginary state. It is an approximation, not real. It remains incomplete as the system complexity increases.</p>
<p>The “as it is” state, on the other hand, is complex. We don’t fully understand and can explain all parts of it. We can’t fully explain why it works when it works, or why it is not working when it is not working. When it fails, we struggle to explain why. We use war metaphors to conduct incident procedures.</p>
<p>Unlike docs, diagrams, code, logs, metrics, etc., incidents tell us about the “as it is” state of a system.</p>
<h2 id="slide-17-learn-from-incidents">Slide 17: Learn from Incidents</h2>
<p><img src="/img/1__m__3t7KOmA__YuMTnqfeXocA.png" alt=""></p>
<p>That’s exactly what I did when I entered the valley of despair. I studied incidents.</p>
<p>See my prior blog post <a href="https://m.subbu.org/incidents-trends-from-the-trenches-e2f8497d52ed">Incidents — Trends from the Trenches</a>, and slides of my OSCON 2019 talk <a href="https://m.subbu.org/if-only-production-incidents-could-speak-555d68b6abfc">If Only Production Incidents Could Speak</a> for more details of my approach and findings. In this talk, I’m going to share a few highlights.</p>
<h2 id="slide-18-changes-are-contributing-to-a-majority-of-theimpact">Slide 18: Changes are contributing to a majority of the impact</h2>
<p><img src="/img/1__pW8LtjxkJ1fqaw1Oyktxtw.png" alt=""></p>
<p>My first observation is that changes are contributing to a majority of the impact. In addition to the references from the previous slide, also see <a href="https://m.subbu.org/taming-the-rate-of-change-439e3dccbb5d">Taming the Rate of Change</a>.</p>
<h2 id="slide-19-second-and-higher-order-effects-are-hard-to-troubleshoot">Slide 19: Second and higher-order effects are hard to troubleshoot</h2>
<p><img src="/img/1__dtkWup1gEgmfPMu0XNe3BA.gif" alt=""></p>
<p>The second observation is that, due to the mixed nature of our production environments with fast-changing and slow-changing services, as well as monoliths and micro-services and tech debt, it is getting hard to reason about second and higher-order effects of changes and failures.</p>
<h2 id="slide-20-unclear-faultlines">Slide 20: Unclear fault lines</h2>
<p><img src="/img/1__88gAfGuVCFxk9U4sVODU2w.png" alt=""></p>
<p>My third observation is that the fault boundaries (or “blast radius” of failures) are unclear. Often, the “as designed” state does not include the intention of fault boundaries. When they exist in the design, they remain untrustworthy.</p>
<p>I’ve witnessed incidents where a change or issue in one part of a system impacted an unsuspecting another part of the system surprising many people on incident bridges. I’ve witnessed incidents where hundreds of millions of dollars of investments in supposedly redundant data centers in different locations could not empower incident commander to make a decision to shift traffic away from a data center outage due to a power failure, all because the incident commander could not determine if it is safe to shift traffic due to some unknown interdependencies between those data centers.</p>
<h2 id="slide-21actions">Slide 21: Actions</h2>
<p><img src="/img/1__K75n8J7vAicf86OxPI4uww.png" alt=""></p>
<p>What do these findings motivate you to do?</p>
<p>First, improve release safety through progressive delivery of changes, so that you are safely introducing changes into production.</p>
<p>Second, ensure tighter fault domain boundaries in the “as designed” sate. That is, be explicit and intentional in your design about <a href="https://m.subbu.org/fault-domains-and-the-vegas-rule-923fc037119">fault domain boundaries</a>.</p>
<p>Third, implement safety in the “as designed” state. This involves implementing not only fault domains but also other robustness techniques like being able to shed or shift traffic, failovers, fallbacks, circuit breakers, etc.</p>
<p>And then, determine what failures to test in production. In particular, the second and third activities above will allow you to increase the severity of your tests and help you discover the “as it is” state. You can’t test your hypothesis unless you account for such safety conditions in the “as designed” state of your system.</p>
<h2 id="slide-22-reflecting-on-myfindings">Slide 22: Reflecting on my findings</h2>
<p><img src="/img/1__lb7HjCa8fTRufNCRGY__fCA.png" alt=""></p>
<p>As I reflect on my approach incident analysis, what I find most rewarding is the act of learning from incidents. The discovery of the patterns like those I shared in previous slides are interesting and relevant, but not as much as the act of learning from incidents itself.</p>
<p>This journey made me realize the importance of learning from incidents. Incidents tell us about the “as it is” state, and listening to incidents leads us to discover chaos engineering. It makes you realize that chaos engineering would prepare you architecture, tools, processes, and culture to be resilient to failures.</p>
<h2 id="slide-23-but-how-to-prioritize-suchwork">Slide 23: But how to prioritize such work?</h2>
<p><img src="/img/1__3B1QYlAuEs6hD9jgCHpy3A.png" alt=""></p>
<p>How do you prioritize such work? How do you convince various decision-makers at your organization to invest time and resources for chaos engineering?</p>
<p>First, pick the most critical areas to get the most value of your investments into this kind of work. This is because not every system brings in the same value. Pick the ones that are most important, and worth protecting in your organization.</p>
<p>Second, learn to articulate value. Don’t let anxiety drive the conversation. Most organizations start to rally troupes after major incidents to invest in hygiene activities like chaos engineering. However, such approaches may not always be sustainable.</p>
<p>I will give you an example. Last year, some of us were in a room debating whether to invest in deploying a critical part of our stack in a second region and invest in testing for failover between two regions. Some of us in the room were arguing for such an approach as, in our minds, it was the right thing to do. The rest in the room argued that doing so would cost more money, and more importantly adds a few months to the project timeline. That group wanted to defer the second region investments to a future date.</p>
<p>Ultimately what settled the debate was the back-of-the-napkin calculation by one of our teammates. With a few calculations, he pulled up an approximate per-minute revenue driven by that part of the system and asked how much downtime we can afford. We debated on whether an hour, or two hours, or 15 minutes, or 30 minutes is okay. Finally, most in the agreed that we should not go beyond 15 minutes, and agreed that we’re unlikely to hit that 15-minute mark without investing in a second region and practicing failover. Debate settled.</p>
<p>In this example, the value is a dollar number. But it does not have to be the case. Depending on your situation, pick a value indicator that reflects one of speed, quality, or cost. Most businesses and stakeholders are interested in being “faster, better, and cheaper.” Appeal to those when formulating value-based arguments.</p>
<p>Also, realize that not every part of the system may need to have the same robustness. Certain amounts of losses may be acceptable for some parts of your system. Tailor your investments accordingly.</p>
<h2 id="slide-24-journey-out-of-the-valley-ofmisery">Slide 24: Journey out of the valley of misery</h2>
<p><img src="/img/1__VPxeAfoj__npw0k6KXXVVuQ.png" alt=""></p>
<p>Given this, how do you get out of the valley of despair?</p>
<p>First, learn from incidents.</p>
<h2 id="slide-25-andthen">Slide 25: And then</h2>
<p><img src="/img/1__TXHvzIs__86LpnOWEtwkUrw.png" alt=""></p>
<p>And then, learn to make value-based arguments and decisions.</p>
<h2 id="slide-26-how-do-you-learn-from-incidents">Slide 26: How do you learn from incidents?</h2>
<p><img src="/img/1__lVKTuYfu8d78OkIozmDJ6g.png" alt=""></p>
<p>But how to learn from incidents? I don’t know. There is no documented text-book approach to learn from incidents. I took a particular approach to learn from incidents, which allowed me to make some observations and form new opinions. I’m sure there are other styles to make different observations.</p>
<p>That is why learning from incidents needs to be part of your org culture. You want everyone, and not just a few, learn from incidents.</p>
<h2 id="slide-27-how-does-it-feel-when-you-learn-from-incidents">Slide 27: How does it feel when you learn from incidents</h2>
<p><img src="/img/1__tEN2__MQCVTDSTU80cSjpLA.png" alt=""></p>
<p>While there is no textbook approach to learn from incidents, we can describe how it feels when you begin to learn from incidents.</p>
<h2 id="slide-28-learning-from-incidents">Slide 28: Learning from incidents</h2>
<p><img src="/img/1__jV7zJXWg4kGdXF34rY4lnA.png" alt=""></p>
<p>First, you’ve built and updated several mental models of how the system works when it does, and doesn’t when it doesn’t. You have a better understanding of the scale and complexity.</p>
<p>Second, you’re not chasing symptoms but are beginning to understand the system as a whole. For instance, instead of creating a backlog of action items after each incident, you may start to look for systemic improvements.</p>
<h2 id="slide-29-learning-from-incidents-continued">Slide 29: Learning from incidents (Continued)</h2>
<p><img src="/img/1__gTQ9GMiT__uYvIKzMLr7WBg.png" alt=""></p>
<p>Third, you begin to understand the role of people, processes, and tools for success as well as failure. You will realize that resilience is not just about code, config, and servers, but it is also about the culture.</p>
<p>Last, you’re able to articulate the value of hygiene investments, including chaos engineering.</p>
<h2 id="slide-30-lessonslearned">Slide 30: Lessons Learned</h2>
<p><img src="/img/1__HXMI5U0M5ciSwkKpBVL36A.png" alt=""></p>
<p>Lessons learned.</p>
<h2 id="slide-31-learn-from-incidents">Slide 31: Learn from incidents</h2>
<p><img src="/img/1__iHw9x__nMiOQ71zaK7o2cxw.png" alt=""></p>
<p>Lesson number one — learn from incidents. The need for and value of chaos engineering will fall in to place once you take the time to learn from incidents.</p>
<p>Lesson number two — sorry, but there is no lesson number 2.</p>
<h2 id="slide-32-thankyou">Slide 32: Thank you</h2>
<p><img src="/img/1__nH3F3j5YMhhl5OYyOUnVaw.png" alt=""></p>
<p>Repeating what worked for others may not get you far. Increase the time you spend on the “as it is” state to discover what works best for you.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[If Only Production Incidents Could Speak]]></title>
            <link href="https://www.subbu.org/articles/2019/if-only-production-incidents-could-speak/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/if-only-production-incidents-could-speak/</id>
            
            
            <published>2019-07-18T15:14:54+00:00</published>
            <updated>2019-07-18T15:14:54+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Below are the slides and extended speaker notes from my talk on July 18, 2019, at OSCON 2019 with the same title as this post. See my…</blockquote><p>Below are the slides and extended speaker notes from <a href="https://conferences.oreilly.com/oscon/oscon-or/public/schedule/detail/75851">my talk on July 18, 2019, at OSCON 2019</a> with the same title as this post. See my prior posts for related material:</p>
<ul>
<li><a href="https://m.subbu.org/taming-the-rate-of-change-439e3dccbb5d">Taming the Rate of Change</a> (November 19, 2018)</li>
<li><a href="https://m.subbu.org/incidents-trends-from-the-trenches-e2f8497d52ed">Incidents — Trends from the Trenches</a> (Feb 26, 2019)</li>
</ul>
<h2 id="the-setup">The Setup</h2>
<p><img src="/img/1__k06xW7h7ALG9yQi__TLyQ1Q.png" alt=""></p>
<ul>
<li>I have a lot of stories to tell you after studying over 1500 production incidents over the past year. But since these are far too many, And we’ve only about 30 minutes, we will focus on patterns in broad strokes, and reemphasize some practices.</li>
<li>Why study incidents? First, I have several accumulated opinions, and I needed a way to shake those up to form better hypotheses grounded in reality. Second, most companies belong to “we’ve too much to do” category. No team has time to implement all the best practices in the world in their architectures to be highly fault-tolerant, elastic, flexible, and cheap. Trade-offs are essential. You’ve to pick and choose what you want to work on and why. An analysis like this provides you with some patterns to focus on.</li>
<li>I will cover four topics in this talk — (1) cultural inhibitors in the industry about production incidents, (2) how I approached incident analysis, (3) some key patterns observed, and (4) some hypotheses and recommendations.</li>
</ul>
<h2 id="slides-andnotes">Slides and Notes</h2>
<p><img src="/img/1____AA3VA5vTNAR0pbp6jr7gw.png" alt=""></p>
<p>You’re in the right place for the slides and notes.</p>
<h2 id="cultural-inhibitors">Cultural Inhibitors</h2>
<p><img src="/img/1__MaRRbIJis__cmkZKGFjASgQ.png" alt=""></p>
<ul>
<li>One of the things I realized when studying incidents is that the time you spent after incidents is as important, if not more important than the time spent during an incident. That’s because incidents tell you a lot about your architecture, your investments, your processes as well as your culture.</li>
<li>However, a few cultural inhibitors prevent us from learning from incidents.</li>
</ul>
<h2 id="cultural-inhibitor-1-single-root-causefallacy">Cultural Inhibitor 1: Single Root Cause Fallacy</h2>
<p><img src="/img/1__R3Q6ztUr6fN33Z97Y2mm0g.png" alt=""></p>
<ul>
<li>This is the traditional model of looking at incidents, which is why most incident reporting systems still include fields like “root cause” and “component”. In this model, you look for a particular component or activity that caused the incident.</li>
<li>The hypothesis behind this point of view is that, if only such and such component had not failed, or if someone did a particular activity exactly as it was supposed to be done, the incident could have been averted.</li>
<li>For instance, whenever there is a hardware component failure is involved in an incident, the focus tends to shift to that component. Ultimately the vendor that sold that component gets called into the incident, and asked to provide a “root cause analysis”. I’m aware of stories where some of these vendors reply with “canned root cause analysis” reports to please their customers.</li>
<li>However, most large-scale complex systems are always under some stress, and yet appear to operate in stable zones. When certain conditions align, they get pushed into unstable zones, causing customer impact. We call this- as an incident.</li>
</ul>
<h2 id="what-caused-the-kings-crossfire">What Caused the King’s Cross Fire?</h2>
<p><img src="/img/1__Z6eVgxfM9M0NdmNnmkjdCw.png" alt=""></p>
<ul>
<li>This is a great example to dispell the single root cause fallacy, thanks to my colleague <a href="https://www.linkedin.com/in/ian-butcher-60a8b8/">Ian Butcher</a> who shared this with me some time ago.</li>
<li>What caused the fire? Was it the match? The wooden steps in the escalator? 20 years of layers of old paint on the ceiling? Staff not knowing how to the water fog equipment to put off such fires?</li>
<li>Read more about this on the <a href="https://en.wikipedia.org/wiki/King%27s_Cross_fire">Wikipedia</a>.</li>
</ul>
<h2 id="swiss-cheesemodel">Swiss Cheese Model</h2>
<p><img src="/img/1__luSXrU8twPqBQlDkSjK0ig.png" alt=""></p>
<ul>
<li>James Reason’s 2000 paper titled “Human Error: Models and Management” describes the Swiss Cheese model to make a point that accidents occur when several hazard conditions align.</li>
<li>In this paper, the author differentiates between two styles of understanding human error — the person approach, and the system approach. In the person approach, you look for first-order causes, like the mistakes a person did to cause an accident. In the system approach, you look at systemic factors and try to improve the system.</li>
<li>Each hole the slice is a latent hazard condition. When some of those conditions align, you have a loss.</li>
<li>You will see this in the recent HBO series on Chernobyl. Chernobyl didn’t explode because one single component failed or one person or team didn’t follow the procedure. The protagonists show several systemic failures over the years that lead to the Chernobyl disaster. These included technology, people, culture, processes, and leadership.</li>
</ul>
<h2 id="cultural-inhibitor-2-not-supposed-tohappen">Cultural Inhibitor 2: Not Supposed to Happen</h2>
<p><img src="/img/1__eqOc2VXtfKB5kmVruZ368A.png" alt=""></p>
<ul>
<li>It is not uncommon to see teams treat incidents as events that are not supposed to happen, except when someone didn’t do their job are they are supposed to do, or some system didn’t work as it is supposed to.</li>
<li>We play heroics when they happen. We congratulate on incident recoveries. We then hurry to get back to business as usual.</li>
<li>This mindset that incidents are not supposed to happen also prevents us from learning from incidents.</li>
</ul>
<h2 id="cultural-inhibitor-3-the-big-ones-vs-therest">Cultural Inhibitor 3: The “Big Ones” vs the Rest</h2>
<p><img src="/img/1__EMYMETxObR59C1JQai57Wg.png" alt=""></p>
<ul>
<li>High impact incidents steal our attention. We always remember the “big ones”. We talk about those for months/years. We give plenty of attention to the big ones in social media and the press.</li>
<li>Low impact incidents, on the other hand, languish for our attention. We quickly forget them. In most enterprises, teams don’t write postmortems or look for improvements.</li>
<li>This is natural because it’s not obvious why you should spend time on low-impact incidents.</li>
<li>However, this attitude also prevents you from learning from incidents. Every incident is a signal from your production environments about the state of your architecture, your tech debt, your processes, and culture. You can’t improve any of these unless you pay attention to these signals.</li>
<li>Every incident matters, and yet, you can’t treat each as a snowflake. So, how do you study incidents?</li>
</ul>
<h2 id="approachdont-categorize">Approach — Don’t categorize</h2>
<p><img src="/img/1__b9MTFRzGQm4pfDZ__ZFEdng.png" alt=""></p>
<ul>
<li>If you’re interested in learning from incidents, toss out incident categorization like this.</li>
<li>Bad way: Database, Network, Storage, Server, Vendor, Partner, DevOps, …</li>
<li>When you categorize incidents like this, you tend to point fingers to particular components in your architecture. You can produce nice reports, but you will miss opportunities for systemic improvements.</li>
</ul>
<h2 id="approach-look-for-patternsinstead">Approach: Look for Patterns Instead</h2>
<p><img src="/img/1__2XUdbTm2lmhgfCEUPzGdPw.png" alt=""></p>
<ul>
<li>Look for patterns instead. Patterns may tell you a different story from any particular incident.</li>
<li>As I spent more time studying incidents, I realized that focusing on patterns helps us make better value-based arguments to make sustainable improvements.</li>
<li>Otherwise, you will get frustrated that your post-incident processes like post-mortems, availability scorecards, error budgets, etc are not working, and you’re not making the impact you hoped to.</li>
<li>Let us look at five common patterns from the incidents I studied.</li>
</ul>
<h2 id="pattern-1changes">Pattern 1: Changes</h2>
<p><img src="/img/1__2i0KH7YwFlwIvz7CVCKkMA.png" alt=""></p>
<ul>
<li>The first pattern that came up in my analysis is production changes. A change may be a release of new code, or a config change, or maybe even an A/B test.</li>
<li>I find that a majority of incidents happen when a change is in progress or was recently made.</li>
<li>In my first analysis last fall, changes accounted for about 70% of the customer impact. In the second analysis on a larger set of incidents that occurred in 2018, change triggered impact was about 35%. In my most recent round, about 50% of the impact was triggered by production changes.</li>
<li>Often the impact was immediate. You start to notice an impact some key business metric and then realize that the change was botched.</li>
<li>In some cases, changes introduce latent failures that stay dormant for days. Those are difficult to debug or reproduce and can be frustrating to deal with. We will cover those later in this talk.</li>
<li>Let’s look at some well-publicized examples in the industry.</li>
</ul>
<h2 id="twitter-incident-lastweek">Twitter Incident Last Week</h2>
<p><img src="/img/1____Cw5G5Rx6zUW8yA2N1BMAw.png" alt=""></p>
<ul>
<li>Twitter had an incident last week. They reported that “the outage was due to an internal configuration change”.</li>
</ul>
<h2 id="google-blob-storage-incident-in-march2019">Google Blob Storage Incident in March 2019</h2>
<p><img src="/img/1__sqdhoaAMdZ0OqXazluoTkQ.png" alt=""></p>
<ul>
<li>Take a look at this postmortem report published by Google in March this year. Google’s internal blob storage had an outage. Their postmortem reported that “SREs made a configuration change which had a side effect of overloading a key part of the system for looking up the location of blob data”. Boom!</li>
</ul>
<h2 id="facebook-instagram-whatsapp-incident-in-march2019">Facebook, Instagram, WhatsApp Incident in March 2019</h2>
<p><img src="/img/1__zZehZGkOSulxQwu9giBD3A.png" alt=""></p>
<ul>
<li>You may recall a Facebook incident in March when Facebook, Instagram, and WhatsApp simultaneously suffered a massive outage. The next day, Facebook posted a cryptic tweet attributing the incident to a “server configuration change”.</li>
</ul>
<h2 id="google-2016-paper-evolve-or-die-high-availability-design-principles-drawn-from-googles-network-infrastructure">Google 2016 Paper: “Evolve or Die: High-Availability Design Principles Drawn from Google’s Network Infrastructure”</h2>
<p><img src="/img/1__8zbqlVqer2G6Bwz76pOQKQ.png" alt=""></p>
<ul>
<li>There isn’t a lot of industry research that shows similar patterns, except this 2016 paper from Google which reports that “a large number of failures happen when a network management operation is in progress within the network”. No wonder.</li>
<li>These are not anomalies. Most enterprises have many examples like this. I’ve seen hundreds of examples where I work.</li>
<li>Are these companies incompetent and don’t know how to make changes to their production incidents? I don’t think so. All these companies run incredibly complex systems at large scale, and changing such systems is hard.</li>
<li>Let me offer a few hypotheses on why.</li>
</ul>
<h2 id="first-more-changes--moreentropy">First, More changes ⇒ More entropy</h2>
<p><img src="/img/1__6GmFgYq4EOVV59YT9rDrQQ.png" alt=""></p>
<ul>
<li>At the Expedia Group, where I work, we make a few thousand changes a day. As we made steady progress in our cloud investments, we see a near-linear increase in the number of daily production changes.</li>
<li>Why does this matter? With each change, you’re adding to the entropy that already exists in the production environment. In addition to features and bugs in your code, you’re also introducing new failure modes or revealing existing failure modes.</li>
<li>Do note that, a vast majority of the changes are successful. In one particular batch of incidents over 6 months, I noticed that just about 5 out of 10,000 changes triggered a production impact.</li>
</ul>
<h2 id="second-difficult-to-know-secondhigher-order-effects">Second, Difficult to Know Second/Higher-Order Effects</h2>
<p><img src="/img/1__CSZkyyVNB4w49IQx50y5uA.gif" alt=""></p>
<ul>
<li>As we invest to reduce the size of our code through micro-services, and CI/CD, complexity is shifting to connectedness.</li>
<li>This connectedness is increasing the chance of success (which is to quickly create more customer value) or failure (which is the difficulty to comprehend).</li>
<li>Furthermore, our production environments include a mixture of fast-changing and slow-changing systems including those that we can’t get rid of like those big circles on this slide.</li>
<li>These make it difficult to know or predict second- higher-order effects of changes.</li>
</ul>
<h2 id="every-change-is-a-test-in-production">Every Change is a Test in Production</h2>
<p><img src="/img/1__62ErPMvGuBP9L6ugnE4Wgw.png" alt=""></p>
<ul>
<li>Consequently, every change feels like a test in production. There is no escaping from this.</li>
<li>Pre-prod testing can help, but no amount of pre-prod testing can make production changes predictable and safe.</li>
<li>Due to high entropy, it is getting harder to mimic production environments to test changes. Our pre-prod environments, when they exist, lack the same entropy and scale that our production environments offer.</li>
<li>Let’s get comfortable with this trend.</li>
</ul>
<h2 id="pattern-2-latentfailures">Pattern 2: Latent Failures</h2>
<p><img src="/img/1__yTO7RhsIhNEPT7nJ58AowA.png" alt=""></p>
<ul>
<li>The second pattern I observed is latent failures.</li>
<li>These remain hidden in the environment for days, weeks or even months and don’t immediately cause issues. These wait for conditions to align, just like the swiss cheese in James Reasons’ swiss chess model.</li>
<li>Example: Config changes caught when nodes are recycled or scaled up days later.</li>
<li>Example: A change was made to a service behind a cache. The cache hid the fault for a few days until the cache was refreshed.</li>
<li>Example: Auto-scaling kicks in to scale up a cluster, and new nodes pick up the wrong config.</li>
</ul>
<h2 id="config-drift">Config Drift</h2>
<p><img src="/img/1__6hmsl2UcHYWKyS__r__rh9ug.png" alt=""></p>
<ul>
<li>Config drift is a special kind of a latent failure.</li>
<li>Why do we have config drift? That’s because we rarely automate everything. We automate more frequently used workflows or more frequently occurring conditions, and leave the less frequently used ones in our backlogs. Those backlogs rarely shrink.</li>
<li>Unfortunately, those low-frequency workflows end up relying on tickets, manual steps, change requests, and team memory. Very few people would know how to make those changes, and when they leave or change teams, any knowledge leaves with them.</li>
<li>Any automation we do in the low-frequency areas is often open-loop, meaning that there is no observer to monitor and correct config drift. Over time, systems drift from their desired state.</li>
<li>I saw several drift related incidents with switches, routers, firewalls, and databases which don’t get as much automation love as CI/CD for stateless apps do.</li>
<li>One particular example I remember is a database failover. The automation let the active node failover to the passive node, but the passive node remained in the read-only state due to configuration drift.</li>
<li>In another case, a redundant firewall device failed to take over when the primary device failed. It turned out that someone manually made a config change several months before the incident, and forgot to undo it.</li>
</ul>
<h2 id="pattern-3-mismatched-assumptions">Pattern 3: Mismatched Assumptions</h2>
<p><img src="/img/1__KD9ICblmDdd9TZ9ILr9XmQ.gif" alt=""></p>
<ul>
<li>The third pattern I noticed is mismatched assumptions between layers. Production environments are large distributed systems with several layers between most components.</li>
<li>Each of those layers may make different assumptions about interfaces, behavior, scale, latency, availability, etc, and you may not know when you’re violating those assumptions.</li>
<li>But where do layers come from?</li>
<li>Layers between producers and consumers in a service-oriented architecture.</li>
<li>Or, wrappers on wrappers to fix interfaces or data munging</li>
<li>Or, between apps and automation platforms those rely on. For instance, a monitoring agent can make a node unavailable when it is just busy processing a request and waiting for a downstream system to respond.</li>
<li>Sometimes, we create layers to work-around organizational issues, thanks to Mel Conway. Those layers make their own assumptions about their downstream services.</li>
</ul>
<h2 id="pattern-4-not-thenetwork">Pattern 4: Not the Network</h2>
<p><img src="/img/1__StTCyZVqTOJiqTzoiEsMvQ.png" alt=""></p>
<ul>
<li>When I shared the outline of this talk with a colleague of mine, he remarked that “crap rolls downhill”, and the network gets blamed more often than it deserves.</li>
<li>The network may be unreliable, but you can’t easily distinguish between a slow dependency or an impaired network. So, during incidents, teams start with the network only to realize factors like application slowness, bad timeouts, resource (CPU/mem) starvation, etc.</li>
</ul>
<h2 id="pattern-5unknown">Pattern 5: Unknown</h2>
<p><img src="/img/1__C7pXYQ1m96dW06yVdd5HZQ.png" alt=""></p>
<ul>
<li>Finally, a sufficiently large number of incidents have no clear reason for failure. They usually start with a key business metric going the wrong way. While you’re busy troubleshooting, the metric recovers on its own, and you don’t know why.</li>
<li>Such incidents show that we don’t fully understand the dynamics of production systems.</li>
</ul>
<p><img src="/img/1__ad485FGteb7UT6E__RmMp3w.gif" alt=""></p>
<ul>
<li>Let’s now look at some practices to improve. None of these are new techniques. Yet, I’m bringing these up to remind that improvements require systemic investments.</li>
<li>The first practice I recommend is to progressively increase confidence in the delivery of production changes.</li>
<li>I can not emphasize this practice enough. In order to go fast with continuous delivery, find ways to progressively increase confidence.</li>
<li>Do whatever it takes to increase confidence in the change <em>before</em> (in test and pre-prod environments) making the change, and <em>while</em> making the change. Don’t consider passing tests in a pre-prod environment as a green signal to go full-steam with a change in prod.</li>
<li>In this example here, the system is deployed in three independent fault domains. Choose independent data centers (like cloud regions) for those fault domains.</li>
<li>Don’t make the same change, whether it is code or config, everywhere at the same time. Instead, introduce the change slowly.</li>
<li>Progressive changes might feel like a slow approach. But only if you’re babysitting the rollout. Bake progressive delivery into your CI/CD instead.</li>
</ul>
<h2 id="practice-2-fail-partially">Practice 2: Fail Partially</h2>
<p><img src="/img/1__pO0jjAQm1BWS66zzg8s9ew.png" alt=""></p>
<ul>
<li>When there is an incident, your first task should be to protect the customer and the business but not to debug to know what happened.</li>
<li>You can afford to protect the customer and the business only when you invest in fail-safe mechanisms.</li>
<li>In this slide, I’m illustrating three important mechanisms.</li>
<li>First, the app is compartmentalized into three independent failure domains. When you spot an issue with one of these, you may be able to shift traffic away from it to healthy fault domains. You can also use the same pattern to scale out your service.</li>
<li>Second, you may shed some part of the traffic to preserve the rest of the traffic. You may apply rate limits, drop connections, show shunt pages, and send 503s.</li>
<li>Third, implement circuit breaks and falls backs for dependencies so you can limit cascading failures.</li>
</ul>
<h2 id="practice-3-vaccinate">Practice 3: Vaccinate</h2>
<p><img src="/img/1__5ermousWY8MNcAeHmBuoKw.png" alt=""></p>
<ul>
<li>Another name for this is “chaos testing”. I prefer vaccination because it makes the point of introducing faults to build immunity.</li>
<li>When planning your tests, incorporate tests to exercise fault domain boundaries, assumptions of scale and latency between layers, scale up and scale down conditions, as well as traffic shedding and traffic shifting.</li>
</ul>
<p><img src="/img/1__IWm2__1D6nJCPSIPdl55HGw.png" alt=""></p>
<ul>
<li>The fourth practice in my list is to not away from incidents after recovery. Learning from an incident starts after the incident.</li>
<li>First, clean up after the incident. Leftovers usually contribute to config drift.</li>
<li>Second, write post-mortems. In addition to looking for contributing factors, think of systemic improvements to make.</li>
<li>Validate any fixes. Let those fixes form a new hypothesis for your chaos tests.</li>
<li>Yes, these are time-consuming activities. Do spend the time to learn.</li>
</ul>
<p><img src="/img/1__Qk4NI2p6ETGkua9YU3b0mg.png" alt=""></p>
<ul>
<li>Time and resources are always finite, while our backlogs are nearly infinite. Every team has enough work to do for years to come.</li>
<li>Amidst all this work, how do you influence the prioritization of work to improve production stability? How do you convince your team, or your manager, or person in charge of making prioritization decisions to invest in resiliency related improvements?</li>
<li>Examples: Architecting fault domains, investing in chaos testing, validating fixes after incidents, etc take time.</li>
<li>Learn to attribute value to those types of work. Learn to measure the effects of incidents like lost revenue, customers, time, productivity, etc.</li>
<li>If you’re not able to make such value-based arguments, you may remain frustrated.</li>
</ul>
<p><img src="/img/1__6xFw__jgE0T1MzIboW0__pqQ.png" alt=""></p>
<ul>
<li>To summarize my talk, incidents provide an excellent way to learn about your architecture, people, processes, and culture.</li>
<li>Study incidents. Form study groups to discover patterns from incidents. Patterns like the one we discussed here empower you to make value-based arguments to influence your teams.</li>
<li>If you’ve time to do just one thing, invest in release safety.</li>
</ul>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Status Management]]></title>
            <link href="https://www.subbu.org/articles/2019/status-management/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/status-management/</id>
            
            
            <published>2019-06-10T18:06:28+00:00</published>
            <updated>2019-06-10T18:06:28+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I learned about “status management” recently while reading Daniel Coyle’s The Culture Code. Since then I can not stop seeing status…</blockquote><p>I learned about “status management” recently while reading Daniel Coyle’s <a href="http://danielcoyle.com/the-culture-code/">The Culture Code</a>. Since then, I can not stop noticing status management.</p>
<p>Unfortunately, as we are always going through change, as our work interactions are turning more and more fluid, and as role/responsibility boundaries are getting blurrier, “status management” is becoming an epidemic in most work interactions. Our reactions are often motivated by how each of us wants to “fit in”, which is an individual objective in the emerging status and not necessarily on how to impact the change, which is a group objective. In these cases, status management decides what an individual says or does. We see plenty of examples at work or on social media, of people giving <a href="https://m.subbu.org/opinions-c71172f6df76">opinions</a> which are often designed to maximize their “status”. Decoupling oneself from their intended status during a change is hard and yet essential to inflict the shift.</p>
<p>Daniel introduces status management through a case study of how two groups, a group of kindergartners and a group of business students, conduct themselves in <a href="http://www.peterskillmandesign.com/">Peter Skillman</a>’s <a href="http://www.peterskillmandesign.com/spaghetti-tower-design-challenge">Spaghetti Tower Design challenge</a>. This is a fairly common challenge used for team building.</p>
<p><img src="/img/0__5LRYbn6j__mQmik2Y.jpg" alt=""></p>
<p>You can read an excerpt from this part of the book on <a href="http://danielcoyle.com/excerpt-culture-code/">Daniel Coyle’s website</a>, but let me share the part that stuck with me.</p>
<blockquote>
<p>The business school students appear to be collaborating, but in fact they are engaged in a process psychologists call status management. They are figuring out where they fit into the larger picture: Who is in charge? Is it okay to criticize someone’s idea? What are the rules here? Their interactions appear smooth, but their underlying behavior is riddled with inefficiency, hesitation, and subtle competition. Instead of focusing on the task, they are navigating their uncertainty about one another. They spend so much time managing status that they fail to grasp the essence of the problem (the marshmallow is relatively heavy, and the spaghetti is hard to secure). As a result, their first efforts often collapse, and they run out of time.</p>
</blockquote>
<p>In the rest of the book, Daniel walks through the skills necessary (such as building safety, sharing vulnerability, and establishing purpose), to help “tap into the power of our social brains to create interactions exactly like the ones used by the kindergartners building the spaghetti tower.”</p>
<p>The trick, I think, is being okay not to have a status in the change, and yet be willing to influence or even lead the change. This requires that you feel safe that your job is not at risk even if you have no status in the change, or you trust your ability to find something else to do. This ability is one of the essential characteristics of growing as a leader. Not having status is not a failure.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Opinions]]></title>
            <link href="https://www.subbu.org/articles/2019/opinions/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/opinions/</id>
            
            
            <published>2019-05-30T22:30:43+00:00</published>
            <updated>2019-05-30T22:30:43+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Some of the best meetings I’ve had in recent years are those that I have had no opinions on. These were meetings where folks had…</blockquote><p>Some of the best meetings I’ve attended in recent years are those that I have had no opinions on. These were meetings where folks had disagreements, and the best I could offer was to walk in with an acknowledgment that I’ve no opinion, and that I’m here to help figure it out. Before each of those meetings, I did spend the time to research the problem statements, learn about the points of view, and consider potential trade-offs involved. Yet, as I walk in, I offered no solutions. I had nothing to gain or lose. I had no sides to pick. I might or might not have a role to play in the outcome.</p>
<p>Some of my not so effective meetings are those in which a couple of us in the room held strong opinions on the topic, were very articulate about those opinions, and were bent on keeping the discussion conform to their opinions.</p>
<p>Nowadays, my rule is to leave opinions at the door as much as possible.</p>
<p><img src="/img/1__F8MbY__6T__jHZDYLwfcN3XA.png" alt=""></p>
<p>But leaving opinions at the door is easier said than done. What if you can’t control the outcome? What if you don’t like the result? What if the result ends up disrupting what you’re currently doing or conflicts with what you want to accomplish? What if you end up not having any role in the outcome? This state is like walking on shaky ground and can make you uncertain about yourself.</p>
<h2 id="role-ofopinions">Role of Opinions</h2>
<p>However, opinions are an integral part of how we think. They play a crucial role in our decision making. They help us process and discard vast amounts of information and only zoom into those parts that seem relevant. Opinions make it easy for us to decide and act quickly.</p>
<p>Most of us hold opinions on a wide range of topics regardless of our expertise on those topics. We employ opinions to appear knowledgeable, persuasive, competent and confident. We rely on opinions as proxies for knowledge, thoughtfulness, and competence. For example, I’ve opinions on the state of politics, technology trends, arts and sciences, environment, religion and so on. I’m no expert on most of these topics, and yet, I can appear and feel like an expert by liking, commenting on, or sharing expert opinions on social media.</p>
<p>Opinions also give you confidence and make you feel certain. Imagine the confidence you feel when walking into a discussion, or before taking action? More often than not, such confidence is likely based on the opinions you formed on the subject.</p>
<p>Opinions are also easy. That’s why we all have plenty of them. Opinions are not scientific facts, and so we don’t need to prove ours. You can discard any point of view with “it is just your opinion.” Opinions are not hypotheses. So, we don’t need to subject them to testing with data.</p>
<p>That’s also why we can form opinions quickly. In contrast, activities like deliberation, discovering facts, and testing hypotheses are slow and time-consuming. You have to work hard to unearth facts, form hypotheses, and test them.</p>
<p>Over time, opinions become part of our identity. As others discover our opinions, they put us into groups. They make us stereotypes. Opinions make it easy for others to deal with us.</p>
<p>We often hang out with people that share our opinions. Since we are more likely to be persuaded by ideas that form in our minds than those of others, we form allegiances with people that express opinions that are similar to ours. Consequently, the social groups that we’re part of converging into closed echo chambers. Such grouping makes us feel safe. We <em>belong</em>.</p>
<h2 id="the-trap">The Trap</h2>
<p>Workplaces are no different. We use opinionated software frameworks and tools for productivity. We pick or discard solutions just because we don’t “like” something about those.</p>
<p>Even in the most data and hypotheses-centric workplace cultures, opinions continue to rule. That’s because, apart from not needing scrutiny to form one, forming opinions is a part of how we think.</p>
<p>Therein lies a trap.</p>
<p>Through the eloquent and repetitive articulation of opinions, we have the power to extinguish deliberation and dialog and shape the course of the group that we are part of. Most political speech and marketing spin function like this. The war on Iraq from 2002 is an excellent example in recent history. Then White House and the cabinet managed to shape the public opinion with little factual information to back up the claim of weapons of mass destruction. Fires from that war are still raging in the middle east. Similarly, we’re currently going through a period of opinion-shaping about global warming, where opinions and their articulation matter more than facts and hypotheses.</p>
<p>Similarly, significant initiatives get launched or suspended based on the opinions of positional leaders with titles at work. The highest-paid person’s opinions (<a href="https://exp-platform.com/hippo/">HiPPO</a>) may override data and other observations. Eloquent opinionated individuals take over conversations in meetings to steer the course to conform to their opinions. Senior leaders’ names get dropped to shift the course of an activity or to override some data, purely based on such leaders’ perceived opinions.</p>
<p>However, firmly held opinions can prevent us from learning. Opinions water down dialog and discovery of facts. They block us from listening.</p>
<p>Instead of letting a free-form dialog happen, when we don’t leave our opinions at the door, we end up forcing discussions to conform to our opinions. Meetings dissolve into arguments. Consequently, our own opinions become a barrier between us and potential opportunities. Opinions can get us stuck.</p>
<h2 id="leaving-opinions-at-thedoor">Leaving Opinions at the Door</h2>
<p>That’s why it is important to practice the art of leaving the opinions at the door. There are several tricks to help.</p>
<p>First, recognize that you can’t afford not to have opinions on everything. You keep/nurture opinions on most things but the most important ones. Not having an opinion in front of an opinionated group will get you bulldozed. Not every workplace culture may have a framework for <a href="https://michaelshermer.com/2001/11/baloney-detection/">baloney detection</a> and for minimizing such bulldozing. Using written forms (not slideware) of communication to lay out arguments can help.</p>
<p>Second, don’t be lazy when forming opinions on important topics that matter to you. It takes hard work to form well-grounded opinions. Keep verifying your opinions by adding facts.</p>
<p>Third, when disagreeing, ask yourself if you’re disagreeing based on facts, or based on your opinions. Change your disagreement into a question. At the same time, avoid the tendency to ask leading questions to confirm your opinions.</p>
<p>Finally, be willing to let go of opinions. I find that getting data, studying alternatives, and <a href="https://extraguacblog.com/2017/03/05/50-shades-of-gray-opinions-mental-models-probability/">seeking dis-conforming facts</a> help us let go of opinions.</p>
<p>Our opinions are like the debt we carry on our backs, wherever we go. They are useful until they are not. I remind myself that, to be comfortable with not having opinions, I must be comfortable with saying that I don’t know, yet.</p>
<p>I will leave you with this <a href="https://www.goodreads.com/quotes/7447184-i-never-allow-myself-to-hold-an-opinion-on-anything">quote</a> by Charlie Munger.</p>
<blockquote>
<p>I never allow myself to have an opinion on anything that I don’t know the other side’s argument better than they do.</p>
</blockquote>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Incidents — Trends from the Trenches]]></title>
            <link href="https://www.subbu.org/articles/2019/incidents-trends-from-the-trenches/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/incidents-trends-from-the-trenches/</id>
            
            
            <published>2019-02-26T18:26:22+00:00</published>
            <updated>2019-02-26T18:26:22+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Most publicized production incidents are war stories. Each involves drama with dead ends, twists and turns, and a victory at the end…</blockquote><p>Most publicized production incidents are war stories. Each involves drama with dead ends, twists and turns, and a victory at the end. Something innocuous happens, that then snowballs across several layers to take down some parts of a business. A big chunk of internal or external customers gets impacted. Several teams spend long hours on a conference call or in the war room to mitigate the customer impact.</p>
<p>You may recall well-publicized incidents like the <a href="https://aws.amazon.com/message/41926/">AWS S3 outage</a> in 2017 that impacted several AWS customers, including Apple iCloud, or the <a href="https://en.m.wikipedia.org/wiki/2016_Dyn_cyberattack">cyber attack</a> on <a href="https://dyn.com/dns/">Dyn DNS</a> that affected several American and European sites, or last year’s <a href="https://www.amazon.com/">Amazon.com</a>’s <a href="https://www.cnbc.com/2018/07/19/amazon-internal-documents-what-caused-prime-day-crash-company-scramble.html">Prime Day</a> outage.</p>
<p>Such incidents are rare, and yet they remain in our memories for years. In reality, most production environments encounter incidents almost every day. As you see below, <strong>the cumulative cost and customer impact of such incidents can be much larger than the infrequent dramatic ones.</strong></p>
<p>During the fall of 2018, I set out to develop informed opinions on how to improve the availability of production systems at work. There is no dearth of architecture patterns, tools, techniques and processes available to improve availability. How do you determine which ones to focus on and when, and make continuous improvements? That was the question I was grappling with. More important, I also needed a way to challenge some of my own prior opinions.</p>
<h2 id="incident-analysis">Incident analysis</h2>
<p>In order for this, I could think of no better way than to study incidents to spot patterns. During November and December of 2018, I spent several weeks to study several hundred production incidents. This sample set covered a very large set of customer-facing apps and services running on-prem and cloud, including some that are yet to be modernized, as well as the on-prem infrastructure. I meticulously went through each critical incident, read incident logs, and where available, reviewed postmortem reports and classified incidents based on a few categories of potential <em>triggers</em>.</p>
<p><em>A clarification on the terminology here.</em> I’m using the term “trigger” and not “root cause” to classify incidents. This is to emphasize the fact that most production incidents have several root causes. A trigger may just have surfaced an incident.</p>
<p>This analysis was time-consuming and laborious. Yet, the insights I gathered were well worth the time I spent. In this article, I want to share my findings, offer some hypotheses to explain the findings, and what could be done to improve availability.</p>
<p>The chart below summarizes my findings. It shows the top 5 triggers behind these incidents, ordered by the cumulative customer impact.</p>
<p><img src="/img/1__I6igQWlZj4me8MLStVlbmw.png" alt=""></p>
<p>The size of each slice represents the customer impact as measured by certain metrics, and not the number of incidents.</p>
<p>Contrast this chart to the one below, which shows the incidents by number under each category.</p>
<p><img src="/img/1__OfcU7R9KvXP2jiPHp6whLA.png" alt=""></p>
<p>I omitted some categories in these charts due to those not being relevant for this article. A similar analysis of a different sample set of incidents might produce a different set of triggers, though I suspect that the above shows common trends across most large enterprises undergoing constant change. Few peers in the industry also conferred that they notice similar patterns.</p>
<h3 id="observation-1-change-is-the-most-commontrigger">Observation 1: Change is the most common trigger</h3>
<p>About a third of the impact was triggered by changes. Of this, about 50% was due to software deployments. In my classification, a change could be any of the following:</p>
<ul>
<li>Automated CI/CD releases</li>
<li>Semi-automated deployments legacy apps</li>
<li>Manual changes</li>
<li>Configuration changes, such as traffic routing, or ingress/egress filters</li>
<li>Experiments (A/B tests)</li>
</ul>
<p>As I showed in <a href="https://m.subbu.org/taming-the-rate-of-change-439e3dccbb5d">Taming the Rate of Change</a>, given that the production environment at work undergoes a few thousand changes every working day, the change failure rate is still low. The impact, nonetheless, is significant.</p>
<p>This observation supports the anecdotal evidence for a low number of incidents during long weekends and holidays when production changes are low. Just last week, a colleague of mine quipped that production systems were mostly stable during the recent <a href="https://www.google.com/search?q=seattle+snowmageddon+2019&amp;source=lnms&amp;tbm=isch&amp;sa=X&amp;ved=0ahUKEwjwkcqKucngAhWX_YMKHX2wBBYQ_AUIDigB&amp;biw=958&amp;bih=1089">Seattle Snowmageddon 2019</a> because most people could not get to work. Some areas also lost power and Internet access during that time.</p>
<p>A couple of months before this analysis that produced the above pie charts, I analyzed a smaller sample of just over 100 critical incidents that covered a particular set of business functions. For each incident, I asked a simple question — was there a change that preceded the incident. I grouped all incidents with a “yes” into one bucket, and everything else into another bucket. The result is below.</p>
<p><img src="/img/0__LEX7qUs7lSVxU12e.jpg" alt=""></p>
<p>The result was surprising and extremely alarming. Over two-thirds of the sample of incidents was triggered by one or more changes. This finding led me to the latter analysis of the larger sample of incidents. Change is still at the top, by customer impact.</p>
<p>There is prior research to support this observation. An 2016 ACM paper titled <a href="https://dl.acm.org/citation.cfm?id=2934891">Evolve or Die: High-Availability Design Principles Drawn from Google’s Network Infrastructure</a> makes the following observation based on a detailed analysis of over 100 high-impact network failure events:</p>
<blockquote>
<p>a large number of failures happen when a network management operation is in progress within the network.</p>
</blockquote>
<h3 id="observation-2-config-drift-accumulates-over-time-and-masks-potential-future-incidents">Observation 2: Config drift accumulates over time and masks potential future incidents</h3>
<p>The second trigger from the top is config drift, which contributed to about one-fifth of the impact.</p>
<p>For those not familiar with config drift, consider a cluster of nodes each of which is expected to maintain a certain configuration. The configuration may include the OS, OS level or application level dependencies, security groups and such access controls, config files etc.</p>
<p>The cluster could be a SQL database in an active-passive configuration, a Zookeeper cluster, or pair of network switches. In order for the cluster to stay healthy in case of failures of any one node, each is expected to be in a certain configuration. Now, say, due to someone manually making changes, or an automation defect, one of the nodes does not have the expected configuration. This is config drift.</p>
<p>It is fairly common for config drift to stay dormant for weeks or months and surface only when some other event happens. In one particular incident, one of the network switches configured in a pair drifted from its configuration. Months later, the other switch failed for some of the reason, and the drifted switch could not take over. This lead to network disruption. I’ve witnessed similar incidents in the past with other types of clusters, and have stories to tell.</p>
<h3 id="observation-3-we-dont-always-know-why-systemsfail">Observation 3: We don’t always know why systems fail</h3>
<p>The next biggest in my finding was a large number of incidents that recovered on their own after a while. Though this category was the third by customer impact (per the first pie chart in this article) on my list, it accounted for over 40% of the incidents (per the second pie chart) I examined.</p>
<p>To reiterate, for over 40% of incidents, there was an alert of customer impact, an incident was declared, relevant people got on the incident bridge, and while the investigation was ongoing, the impact mitigated by itself.</p>
<p>Unfortunately, such incidents don’t get the attention of postmortem analysis, and hence corrective actions.</p>
<h3 id="observation-4-infrastructure-issues-are-less-frequent-than-commonlybelieved">Observation 4: Infrastructure issues are less frequent than commonly believed</h3>
<p>Infrastructure related failures like data center power, disk or other hardware, WAN link etc. are less frequent than most people believe. The same is true for public cloud service or region failures. Such issues accounted for a smaller percentage of customer impact in my analysis.</p>
<p>In some of the incidents I reviewed, while initial investigations pointed to misbehaving infrastructure (such as a particular vendor’s appliance failing), further analysis revealed botched changes (see Observation 1) or config drift (see Observation 3).</p>
<h3 id="observation-5-certificate-related-issues-continue-to-be-aheadache"><strong>Observation 5: Certificate related issues continue to be a headache</strong></h3>
<p>Finally, the fifth in my list is incidents related to certificate handling. There were just a handful of incidents in this category, and yet the impact was not insignificant. The issues related to forgetting to renew certificates in time or not coordinating the renewal across multiple systems. While these are easily fixable through automation or even processes, such errors continue to happen in complex production environments.</p>
<h2 id="what-is-goingon">What is going on</h2>
<p>Given the large sample size covering a diverse set of apps, services, and technologies, analysis like this provides an opportunity to better understand contemporary production environments at a high level. Below is my hypotheses of what might be contributing to these trends.</p>
<p><strong>First, we trip on ourselves when making changes.</strong> The biggest risk to the availability of production systems is constant change. Due to the adoption of microservices, and investments into containers, CI/CD, and the cloud, our ability to make changes in production environments has been rapidly increasing. There is no turning back from this trend due to productivity gains. However, change safety is not always an inherent feature in the tools used to make changes.</p>
<p>As I argued in <a href="https://m.subbu.org/taming-the-rate-of-change-439e3dccbb5d">Taming the Rate of Change</a>, these technology trends are contributing to the following:</p>
<ol>
<li><strong>Hyperconnectedness:</strong> Enterprises are increasingly deriving value from connecting various services in numerous ways. In a sense, the value of the enterprise is slowly shifting from nodes (systems doing particular things) to edges (interconnectedness). This is increasing possibilities for both success and failure.</li>
<li><strong>Side effects:</strong> Amidst hundreds or thousands of services, anyone making a change to a particular microservice is unlikely to know all the consumers of that service across multiple layers.</li>
<li><strong>Hope driven releases:</strong> Production environments are often the only reliable environments to test a change. As most enterprises are decentralizing once-common release engineering discipline, pre-production environments are becoming stale, unreliable, and lightly monitored. Consequently testing in production is increasingly becoming vogue.</li>
</ol>
<p><strong>Second, the desire for speed may be stealing focus from automation.</strong> This analysis makes it clear that automation is rarely complete, with less frequently used parts of any workflow getting the least amount of attention.</p>
<p>Furthermore, as we move on from one generation of technology and architecture to the next one, we rarely leave the prior generation in the best possible shape.</p>
<p>Consequently, as systems age, less frequently used parts accumulate config drift. Unlike the other form of bugs, drift tends to remain dormant until some other event occurs before leading to a fault.</p>
<p>This trend is not limited to on-prem services. Apps and services deployed on the cloud are also subject to config drift. Teams adopting new technology usually start with automation to get going quickly, but not necessarily automate manageability tasks that come up in the future. This keeps the door open for drift to creep in.</p>
<p><strong>Finally, the large number of incidents in the unknown category shows that our ability to comprehend the physics of hyperconnected systems is limited.</strong> Furthermore, as systems seem to recover on their own, we’re also losing the opportunity to learn from such incidents.</p>
<h2 id="potential-ways-toimprove">Potential ways to improve</h2>
<p>This analysis certainly helped me refine my opinions on areas of investments. I want to highlight a few techniques to help deal with the trends I noticed.</p>
<p><img src="/img/1____WXFrLY1zX7ih3eq9IiQAg.png" alt=""></p>
<p>First, the most important take away from this analysis is improving <strong>change safety</strong>. Progressive deployments (i.e., introducing the change bit by bit), feature flags, <a href="https://martinfowler.com/bliki/BlueGreenDeployment.html">blue-green deployments</a>, predictable rollbacks, and shadow testing are some of the ways to improve change safety. Anyone interested in increasing deployment frequency must also invest in such safety strategies.</p>
<p>The second area of investment is <strong>fault containment and redundancy</strong>. Some of the complex incidents take time to restore, and traffic shifting to a redundant copy (active or passive) may provide a faster and reliable alternative to in-place fire-fighting. See my article on <a href="https://m.subbu.org/fault-domains-and-the-vegas-rule-923fc037119">Fault Domains and the Vegas Rule</a> for a description of how redundant fault domains can help reduce time to restore. Another excellent article to read on this topic is <a href="https://www.allthingsdistributed.com/">Werner Vogels</a>’ <a href="https://www.allthingsdistributed.com/2018/03/ten-years-of-aws-compartimentalization.html">Looking back at 10 years of compartmentalization at AWS</a> which describes how AWS uses “compartmentalization” for horizontal scalability as well as to contain faults to smaller domains.</p>
<p>However, maintaining redundancy is non-trivial. Apart from designing for redundancy, periodic traffic-shifting practice drills are essential for maintaining fault domain integrity and readiness to shift traffic.</p>
<p>The third area of investment is to <strong>either commit fully to automate systems or use a cloud-managed service to take care of most of the automation</strong>. I always recommend the latter due to increased time to market and lower operational overhead. Though this does not fully eliminate the possibility of config drift, it can at least help reduce the number of moving parts you’ve to automate yourself.</p>
<p>Next in the list of areas of investment is <strong>observability</strong>, in particular, tracing, to improve steady-state understanding of today’s hyperconnected production environments. Traces and service graphs help improve a team’s understanding of how their services are used and how they are behaving during the steady-state.</p>
<p>The fifth and the second most important area after change safety is investing to <strong>increase the time spent after incidents</strong> through post-incident rituals. Across the industry, most teams treat incidents as distractions and are eager to get back to regularly scheduled work as soon as systems are restored. This trend needs to change as incidents teach us about non-linear behaviors of complex hyperconnected systems. At work, we’re experimenting incorporation of a few post-incident rituals like peer-reviews of postmortem reports, and in some cases, subjecting the system in production to the similar triggers after fixes have been made.</p>
<p>Prior to this analysis, my approach to improving the availability of production systems involved adopting defensive strategies like <a href="https://github.com/Netflix/Hystrix">Hystrix</a>, ensuring redundancy, and adopting chaos testing. These are all essential techniques in a toolbox. This analysis gave a perspective on where to zoom in, and of course, boldly highlighted the need for change safety.</p>
<p>Let me end with a caveat. Any analysis like this will highlight some broad strokes while obscuring specifics. Take such findings as one of several inputs.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[The Value is in Dealing with the Messy Stuff]]></title>
            <link href="https://www.subbu.org/articles/2019/the-value-is-in-dealing-with-the-messy-stuff/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2019/the-value-is-in-dealing-with-the-messy-stuff/</id>
            
            
            <published>2019-01-10T13:17:34+00:00</published>
            <updated>2019-01-10T13:17:34+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Over the last several years, I had the opportunity to lead a few projects that were too large for any single team to execute. I also dealt…</blockquote><p>Over the last several years, I have had the opportunity to lead a few projects that were too large for any single team to execute. I also dealt with problems that did not fit to the existing team and org structures at all. Some of these were also “multi-VP” problems (see below). These were messy and ambiguous projects that tempt you to give up, and walk away.</p>
<p>I decided to write down my observations and lessons learned as I find that people who want to grow in their careers as managers or individual contributors must be comfortable to deal with such problems. Otherwise, they are unlikely to be able to influence and deliver anything of consequence.</p>
<h2 id="it-starts-withsilos">It starts with silos</h2>
<p>Who doesn’t blame silos at their place of work for its slowness, bureaucracy, and dis-function? Who does not want to eject themselves from such places to land in magical silo-free lands where things move perfectly fluid?</p>
<p><strong>We blame silos for their resistance to change.</strong> Silos are known to produce architectures, processes, and operations that follow communication lines between those silos, with little regard to the overall problem. This is the essence of <a href="http://www.melconway.com/Home/Committees_Paper.html">Conway’s law</a>:</p>
<blockquote>
<p>Any organization that designs a system (defined more broadly here than just information systems) will inevitably produce a design whose structure is a copy of the organization’s communication structure.</p>
</blockquote>
<p>In his <a href="http://melconway.com/Home/pdf/simplify.pdf">Toward Simplifying Application Development, in a Dozen Lessons</a>, Conway later clarified that the importance of this principle is to probe</p>
<blockquote>
<p>(whether) your design organization is keeping you from designing some things that perhaps you should be building.</p>
</blockquote>
<p>or even more important, to ask the following question.</p>
<blockquote>
<p>Is there a better design that is not available to us because of our organization?</p>
</blockquote>
<p>This question is the quintessential litmus test for silos. Most of us who had frustrating experiences with silos would answer affirmative to this question.<br>
 <br>
<strong>Yet, we also prefer small independent autonomous teams for faster decision making, short feedback loops, and to move accountability closer to where the information and execution is.</strong> In fact, we can sum up the whole micro-services movement as one to create small silos for agility and efficiency to create value quickly. Through micro-services, and micro-services inspired architectures, we are facilitating small independent deployments of code, each of which does one thing well, and are removing the coordination tax monoliths need to create value. As Wikipedia <a href="https://en.wikipedia.org/wiki/Microservices">notes</a>:</p>
<blockquote>
<p>it parallelizes <a href="https://en.wikipedia.org/wiki/Software_development" title="Software development">development</a> by enabling small autonomous teams to develop, <a href="https://en.wikipedia.org/wiki/Software_deployment" title="Software deployment">deploy</a> and scale their respective services independently</p>
</blockquote>
<p>Fair enough. But notice the dichotomy between wanting to break silos apart, and yet wanting small autonomous teams (i.e., silos) to move fast.</p>
<p>Why this dichotomy? Can these both wants be right? <strong>Is there a way to have the efficiency and agility of small teams and yet avoid the trap of Conway’s law?</strong></p>
<p>This dichotomy is not fictional. <strong>You can lead no major body of work of consequence without facing this dichotomy.</strong> Regardless of your title or role at your workplace, dealing with this topic is an essential prerequisite to growing influence and leadership. <strong>You are unlikely to influence change if you remain frustrated with this dichotomy, or avoid it altogether by ejecting yourself to land elsewhere.</strong></p>
<h2 id="silos-are-efficiency-centers">Silos are efficiency centers</h2>
<p>The first thing to recognize is that we need silos for a reason. Once we understand how to decompose a large problem into several smaller problems, silos help solve those parts efficiently. You structure the silo as a work center to concentrate around the information to solve the problem, equip it with the resources needed, and push decision making to the silo. Thus, each silo becomes a center of efficiency to produce value quickly.</p>
<p>Silos allow clear roles and responsibilities. You know where to go and who to ask when there is a problem. Everyone in the silo is in close proximity to the information needed to autonomously make or change decisions. This leads to empowerment, and empowerment leads to accountability.</p>
<p>Silos also breed their own micro-cultures, which include rituals, processes, rules, language, pride, and ownership.</p>
<p>The culture and processes that the silo breeds for itself are usually optimized to run status quo efficiency. The status quo may be one or more problem areas, execution of certain tasks to produce some well-defined outcomes, or of producing something of value that fits in a broader context. A “user profile” team in an e-commerce company or the shipping team in a retail store are perfect examples of silos.</p>
<p>The silo’s micro-culture also makes up an invisible boundary around it. The “pride and language” that each silo develops constitutes the other face of a coin called “ownership and accountability.”</p>
<p>Out of necessity of autonomy and efficiency, silos develop a terminology of “us and them.” Hence they appear insular and resistant to change. For example when you approach the “user profile” team (a silo) for what you think is really an important feature, they may get a response that “our team will decide after the next sprint” or that “we have decided not to build that feature for x, y, and z reasons.” You may think that they are resisting change by being inflexible when in fact they may just be exercising their autonomy.</p>
<p>As we shall see below, such resistance is not always the silo’s fault.</p>
<h2 id="ambiguity">Ambiguity</h2>
<p>Silos become inefficient when you’re attempting any major change that spans multiple existing silos. Silos appear friction-some when you overlay a transformational change on top of existing silos.</p>
<p>I face this challenge with most large problems I work on. These problems don’t always map to existing silos. I can’t tell which of the existing teams can help solve the problem.</p>
<p>I will give you one fictional example of what I used to jokingly call as a “multi-VP” problem.</p>
<blockquote>
<p>A multi-VP problem is one that either requires multiple VP level managers to work together to structure a solution, or the implementation of the solution takes longer than the tenure of a single VP level manager. That tenure may be around 2–3 years, where as the solution may take 5–6 years. In either case, the chance of getting the problem solved successfully isn’t high.</p>
</blockquote>
<p>Here is my fictional example. It entails breaking a large monolith database that everything in a company depends on for most of the data, into smaller decoupled databases to facilitate a micro-services architecture. Sounds familiar?</p>
<p><img src="/img/1__7yozr__zxyEMcaRIs__9IRDg.png" alt=""></p>
<p>The technical architecture for the problem is simple. It may involve building blocks like picking a new cool database technology, data modeling, data migration, dual-writing data, data migration, adapters for switching between old and new database etc. for each logical chunk of data in the monolith database. <strong>Drawing up the architecture is the easy part.</strong> Everyone gets excited about this part as it is considered innovation.</p>
<p>However, who should actually do the dirty of work of implementing this architecture? I’ve had some colleagues complain that they “need power” to “push through” their architecture.</p>
<p>Should we ask the team that manages and administers the monolith database to implement this architecture? That team may be equipped with the skills needed to administer the database servers, and databases efficiently. They may be the best in the company to run that database at scale with high availability. They may be adept in capacity management, upgrades, backups and restorations without a glitch. They may be experts in schema management and indexing. Just by looking at the query, they may have developed the skills to spot bottlenecks. But they are unlikely to lead a micro-services transformation as they may have never looked at the apps that depend on the database, or have the faintest idea of what those apps actually do, or practiced any coding.</p>
<p>How about we ask one or more of the tens of teams that depend on that monolith database? Not having the need to know anything about the nitty-gritty of managing a database on their own, they are likely used to throwing all their database tasks over the fence to the team managing the database. They probably also have long scrolls of features to build. Over time they might have developed certain development cadence that has no cycles left to learn and pick up database related work.</p>
<p><strong>This is the nature of an ambiguous problem. It is large for any single team to pick and solve. The problem involves many building blocks with no clear mapping to existing silos. Implementing a solution takes a lot of time. The outcomes are unclear and are not guaranteed. You may encounter several surprises along the way.</strong></p>
<p>I struggled, in the beginning, to get such problems solved. I used to get frustrated and sometimes considered moving on instead of trying to find a way. <strong>This changed once I tweaked my mental model.</strong></p>
<p><strong>My original mental model saw the organization as being political, inflexible, bureaucratic, and incapable of change with pockets of teams, vested in their survival, resisting any change.</strong> This is a fairly common mental model employed by a lot of us. However, this model is flawed, lethargic, and instills stagnation and not change.</p>
<p>My attitude changed once I changed my mental model. Now I see such problems as being ambiguous in nature. <strong>My mental model now recognizes quickly that existing silos are not optimized to resolve the ambiguity, that there is no problem with the existing silos, that the new problem requires a new approach, and the opportunity may be mine to break it down.</strong></p>
<h3 id="disrupt-current-silos-to-create-newsilos">Disrupt current silos to create new silos</h3>
<p>When faced with ambiguous problems like the “multi-VP problem” above, first recognize that you need to disambiguate the problem, restructure the complexity of the problem, and influence the organization to instill change. This is easier said than done. It requires empathy with existing silos, humility to let go of your ideas, and patience and tenacity to influence others.</p>
<p>While I can’t write down a prescription that everyone can follow, below are some of what worked for me, and what I saw others practice.</p>
<ul>
<li>Owning up the problem, by recognizing that there is an opportunity to step up and own the problem, as messy as it may be, instead of acting like a victim facing a villain. You should be comfortable with the mess that comes with owning up an ambiguous problem.</li>
<li>Developing and clarifying why. It is not sufficient to say that the problem you saw is important. You have to be able to break it down into specifics that others can relate to, identify themselves with, and are motivated to solve. This, of course, requires identifying and building coalitions, and proactively identifying risks and blockers.</li>
<li>Following through the execution of a solution by helping form new silos to efficiently solve the problem. This may be the hardest part. But recognize that no other person may have spent as much time as you on the problem, and there is likely no one who can do this step for you.</li>
<li>Finally, remaining focused on the outcomes and not on “how” you want the problem solved. That is, you should be willing to let go of your ideas of the solution so that new silos can develop to own and efficiently solve the problem.</li>
</ul>
<p>These are all traits of leadership.</p>
<p>Some of the most effective leaders I had a chance to work with are master-disambiguators. When faced with making a transformational change, they focus on disrupting existing silos only to form new silos to lead the change. They rely less on positional power and more on influence to disambiguate the problem and develop ways for others to contribute to a solution.</p>
<p>Back to the point. Instead of blaming existing silos, you may have to form new silos to make transformational changes. This does not mean re-organizing the existing teams into a new reporting structure. You may do so at a later time, or skip it entirely if the culture of the organization is built around units of work and not reporting relationships.</p>
<h2 id="deal-with-the-mess-to-make-animpact">Deal with the mess to make an impact</h2>
<p>To conclude, silos are not bad. Most silos are centers of efficiency. Instead of always trying to overlay a new transformation, whether small or large, on top of existing silos and getting frustrated with the slowness and friction, you may have to first structure a solution, then figure out what kind of silos you need to execute efficiently, and then step up to lead that change. You proceed, and then discover that the new work centers (silos) are not helping the next transformation. You go through the same process again. This is a cycle.</p>
<p><img src="/img/1__4f4r7f0VXHKJYI3Ef62RZg.png" alt=""></p>
<p><strong>You will stop blaming the organization for its silo culture once you recognize that existing silos are optimized to run the status quo efficiently, but not to lead a change.</strong></p>
<p>Conway may have recognized this when he writes about his second lesson in <a href="http://melconway.com/Home/pdf/simplify.pdf">Toward Simplifying Application Development, in a Dozen Lessons</a>:</p>
<blockquote>
<p>Lesson 2: If you want the cleanest possible product you have to find the simplest possible design before organizing to build, or else you have to be prepared to reorganize.</p>
</blockquote>
<p>Let me reiterate that this stuff is not easy. The dichotomy between wanting to break silos apart, and yet wanting small autonomous teams is a natural process of instilling change. It can be frustrating. There will be ups and downs. Success is not guaranteed and you will make mistakes. Therein lies an opportunity.</p>
<p><strong>Update on Jan 12, 2019:</strong> In response to this post, Sean Gilles <a href="https://sgillies.net/2019/01/10/silos-and-opportunities.html">observed</a> that I used “silo” and “team” interchangeably sometimes, and offered the following difference between the two</p>
<blockquote>
<p>A team is part of an organization’s model of how problems get solved and silos are part of the observed reality of how problems get solved.</p>
</blockquote>
<p>Thanks Sean.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Contemporary Views on Serverless and Implications]]></title>
            <link href="https://www.subbu.org/articles/2018/contemporary-views-on-serverless-and-implications/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2018/contemporary-views-on-serverless-and-implications/</id>
            
            
            <published>2018-12-29T23:53:42+00:00</published>
            <updated>2018-12-29T23:53:42+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>We want near-instantaneous elasticity of resources and never have to pre-allocate resources or pay for more resources than needed. We also…</blockquote><p>We want near-instantaneous elasticity of resources and never have to pre-allocate resources or pay for more resources than needed. We also want all the operational best practices baked into a runtime to free us from having to worry about most of the low-level automation, operations, and robustness to run our code. These are two of the most fundamental pursuits of cloud computing for nearly a decade, and serverless is the closest available to realize these opportunities.</p>
<p>However, as I look back into 2018, I found the year to be confusing for serverless on the message, value, and direction. Despite the potential, availability of a number of <a href="https://github.com/anaibol/awesome-serverless#frameworks">frameworks</a>, publication of a number of <a href="https://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Dstripbooks&amp;field-keywords=serverless">books</a>, and <a href="https://serverlessconf.io/">several</a> conferences worldwide on this subject, and more important, continued enterprise adoption, we’re slow to realize the benefits.</p>
<p>What may be holding us back are our mental models and views on serverless. As a recent paper “<a href="https://arxiv.org/pdf/1812.03651.pdf">Serverless Computing: One Step Forward, Two Steps Back</a>” noted, “the notion of serverless computing is vague enough to allow optimists to project any number of possible broad interpretations on what it might mean.” I couldn’t agree more.</p>
<p><img src="/img/1__httWfZ72tzHi3YZ5vgyoZQ.png" alt=""></p>
<p>In this post, I want to summarize three contemporary views of what counts as serverless, and the implications of these views. My goal is to show that our views determine the outcomes and that unless we refine our views, we may not find a better future for ourselves.</p>
<h3 id="1-serverless-as-someone-else-managing-yourservers">1. Serverless as someone else managing your servers</h3>
<p>In this view, a serverless capability shifts the operational responsibilities to a provider, so that, you, as the consumer of that serverless capability, do not have to think about managing servers. All the associated responsibilities like server provisioning, operating system upgrades, maintenance, capacity management etc., therefore, shift from the consumer to the provider of the capability. This view supposedly frees you from thinking about “ops” and lets you focus on your code.</p>
<p>In the extreme, you can extend this view to classify any service that someone else runs as being serverless. Here I’m using <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Wikipedia’s definition of a service</a> as “a discrete unit of functionality that can be accessed remotely and acted upon and updated independently”. The slide below from <a href="https://twitter.com/kelseyhightower">Kelsey Hightower</a>’s tweet exemplifies this point of view of serverless as an operational construct. At the time of writing this, I’m not aware of the original author of this slide.</p>
<p>Per this view, any cloud service qualifies to be “serverless”. You can grade each service by its “degree of serverless-ness” based on the ease of gaining agility, elasticity and cost efficiency. The easier a service gets these qualities, the more serverless the capability is. That’s what you see in the slide above from left to right.</p>
<p>CNCF’s <a href="https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview">serverless working group</a> also falls into this view when describing “backend-as-service” (BaaS).</p>
<blockquote>
<p>Backend-as-a-Service (BaaS), which are third-party API-based services that replace core subsets of functionality in an application. Because those APIs are provided as a service that auto-scales and operates transparently, this appears to the developer to be serverless.</p>
</blockquote>
<p>BaaS is a jargon-word to describe multi-tenant <a href="https://en.wikipedia.org/wiki/Middleware">middleware</a> services.</p>
<p>A key limitation of this view is that it constrains you into focusing on outsourcing the heavy-lifting to a provider while ignoring a key property of serverless, which is that serverless also includes a programming and run-time environment to let you write and run your code.</p>
<p>For example, consider S3 and Lambda. Both are multi-tenant, elastic, auto-provisioned, pay-per-use services, though one offers you an API to store objects while the other gives you an opinionated programming framework and run-time to write and run your code.</p>
<p>This view also favors cloud providers like AWS that operate many managed services like those you see in the slide above, but not portable opensource serverless frameworks that exist in the wild today. Most open source and third-party serverless solutions require you to provision some resources and manage those yourself. For example, running a framework like <a href="https://github.com/openfaas/faas">OpenFaaS</a> or <a href="https://kubeless.io/">Kubeless</a> on Kubernetes is not serverless per this view since you still need to provision, manage, upgrade, and secure your Kubernetes clusters.</p>
<h3 id="2-serverless-as-functions-andevents">2. Serverless as functions and events</h3>
<p>In this point of view, serverless is a programming model consisting of small units of code written as functions triggered by events through a declarative configuration. It is the idea of micro-services taken to its logical limit. In this view, functions, and events are the developer-facing abstractions to write applications.</p>
<p>This view entirely focuses on developer-facing abstractions. Per this view, any framework offering functions and events as abstractions is serverless. It really does not matter who operates the run-time and the resources that runtime needs. Below is tweet by <a href="https://twitter.com/chadarimura">Chad Arimura,</a> who leads Oracle’s <a href="http://fnproject.io/">Fn Project,</a> that summarizes this preference towards developer experience.</p>
<p>I’ve heard other proponents of Kubernetes based function frameworks <a href="https://www.youtube.com/watch?v=TWWYMXSj07w">express a similar view</a>. As this view does not focus on who runs the servers, it provides the broadest umbrella for several open source projects to offer innovative and fun to use function and event-based programming frameworks.</p>
<p>Though developer experience is important, this view ignores properties like elasticity, cost efficiency, and lower operational overhead. You might also wonder if this view is nothing but a reverse-engineering of AWS Lambda to recreate the developer experience without the cost and operational efficiencies.</p>
<h3 id="3-serverless-as-functions-as-a-servicefaas">3. Serverless as functions as a service (FaaS)</h3>
<p>This most commonly used view of serverless describes what was originally offered by AWS Lambda in 2014, and now followed by a few other cloud providers. It incorporates both a function and event-based stateless programming model, and a run-time offered as a service. In addition, you’ve access to a rich set of cloud services for middleware functions.</p>
<p>While this view serves certain stateless application patterns very well, it also pigeon-holes us into not thinking beyond functions and events. We can’t express every one of today’s and tomorrow’s programming problems in the world in the form of loosely coupled stateless ephemeral event-triggered functions.</p>
<p>No other work describes the consequences of this pigeon-holing better than the recently released UC Berkeley paper “<a href="https://arxiv.org/pdf/1812.03651.pdf">Serverless Computing: One Step Forward, Two Steps Back</a>”. Below are some example highlights from this paper.</p>
<ol>
<li>For a model training problem: “Lambda’s limited resources and data-shipping architecture mean that running this algorithm on Lambda is 21×slower and 7.3× more expensive than running on EC2.”</li>
<li>For a low-latency prediction serving via batching problem: “This “serverful” version (that replaces Lambda and SQS with EC2 and ZeroMQ respectively) had a per batch latency of 2.8ms — 127×faster than the optimized Lambda implementation.” Text in parenthesis is mine.</li>
<li>For a distributed computing problem: “in the (unachievable) best-case scenario — when each leader is elected immediately after it joins the system — the system will spend 1.9% of its aggregate time simply in the leader election protocol. Even if you think this is tolerable, note that using DynamoDB as a fine-grained communication medium is incredibly expensive: Supporting a cluster of 1,000 nodes costs at minimum $450 per hour.”</li>
</ol>
<p>There are several other undocumented examples like these. For instance, I would not pigeonhole many of Apache Spark powered large-scale data crunching solutions into event-triggered functions.</p>
<p>Cloud-native managed services may fill the void for solving such problems while still offering elasticity, cost and operational efficiencies of serverless. I made <a href="https://m.subbu.org/serverless-looking-back-to-see-forward-74dd1a02cb62">such an argument in the past</a>, and yet I recognize that waiting for such developments does nothing but stifle experimentation and innovation.</p>
<h3 id="what-isnext">What is next?</h3>
<p>Where do these views lead us? Not far from where we’re today.</p>
<p>Though I can’t back up with numbers, it is very likely that less than a tiny fraction of a percent of today’s worldwide compute capacity is used for running serverless workloads. The serverless opportunity is nearly infinite, and it is clear that today’s views on serverless won’t get us to a point of providing near-instantaneous elasticity, cost, and operational efficiencies for most programming problems. It is foolish to assume that we’ve all the serverless primitives necessary to solve all current and future programming problems.</p>
<p>Yet, I’m hopeful of the future. More examples like the UC Berkeley paper above shall continue to shine the light on limitations of contemporary views on serverless.</p>
<p>I also look forward to us acknowledging that event-triggered function as the primary developer facing abstraction is just one of several possibilities and that we need new types of frameworks offered as services to solve other types of problems.</p>
<p>Tomorrow’s serverless offerings will likely be “frameworks as services”, with “function as a service” being just one possibility to solve a certain class of stateless programming problems.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Taming the Rate of Change]]></title>
            <link href="https://www.subbu.org/articles/2018/taming-the-rate-of-change/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2018/taming-the-rate-of-change/</id>
            
            
            <published>2018-11-19T17:41:44+00:00</published>
            <updated>2018-11-19T17:41:44+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>These are great times for pushing code to production. Thanks to the cloud, micro-services, and investments in CI/CD pipelines, teams that…</blockquote><p>These are great times for pushing code to production. Thanks to the cloud, micro-services, and investments in CI/CD pipelines, teams that used to release code once or twice a month to production until a few years ago are now introducing production changes several times a day.</p>
<p>For example, at the Expedia Group, which is where I work, we are witnessing a significant increase in change frequency (number of production changes a day), with change lead time (from committing code to a successful production deployment) for most changes in minutes. See the chart below that shows change frequency over the last two years.</p>
<p><img src="/img/1__slsDE__eQYUpRd1eWYpz53A.png" alt=""></p>
<p>Change frequency is an indicator of time to create business value. In order to create value in a given amount of time, you need to be able to release your code a certain number of times and learn from those changes. The less frequently you release, the longer it can take to create value. Increase in rate of change shows that you’re reducing the time to create value, thus increasing team performance. Conversely, low change frequency indicates high time to create value and low team performance.</p>
<p>As the 2018 <a href="https://cloudplatformonline.com/rs/248-TPC-286/images/DORA-State%20of%20DevOps.pdf">State of DevOps</a> report says,</p>
<blockquote>
<p>Those that develop and deliver quickly are better able to experiment with ways to increase customer adoption and satisfaction, pivot when necessary, and keep up with compliance and regulatory demands.</p>
</blockquote>
<p>However, change frequency alone is not a sufficient measure of team performance. As the same State of DevOps report aptly captures, <strong>production stability is an equally important measure of team performance</strong>. What good is high change frequency if the production environment is falling apart often for long periods of time? There is also empirical evidence to show that <strong>incident frequency stays low when change frequency is low</strong>. See below to notice a correlation between incident frequency (red line) and change frequency (green line) when the change frequency low. The correlation is seen during periods of holidays when fewer changes were being made in production.</p>
<p><img src="/img/1__1jDNqjxdbB1g3d0Rf2vKMg.png" alt=""></p>
<p><strong>Update:</strong> See my later article <a href="https://m.subbu.org/incidents-trends-from-the-trenches-e2f8497d52ed">Incidents — Trends from the Trenches</a> for more evidence. My analysis of several hundred production incidents shows that change is the top trigger behind incidents.</p>
<p><strong>But can an organization sustain increasingly high change frequency while simultaneously improving production stability? Don’t the tools and cultural changes used to increase change frequency also improve production stability?</strong> It depends. The very tools and cultural changes to increase deployment frequency may also contribute to increased fragility.</p>
<p>Based on metrics for deployments (first two rows in the table below) and stability (third and fourth rows), the DevOps Report also categories teams into the elite, high, medium, and low performance. Once you start investing in micro-services and CI/CD, teams move from low/medium performance to high/elite performance based on deployment metrics.</p>
<p><img src="/img/1__bGhgVYU1__LXdG1G0FaPGLw.png" alt=""></p>
<p>However, a similar transition based on stability metrics is not automatic. Why so?</p>
<p>This question has no simple answer. Chaos people offer that continual chaos testing will help surface fragility. Monitoring and observability people want you to integrate with their tools to see what is going on. Service mesh people ask you to adapt their solutions to baking some of the stability best practices into your application runtime. The answer is a mixture of all these and more.</p>
<p>In this post, let me explore what is likely happening today, and what it might take to improve stability without sacrificing speed.</p>
<h2 id="observation-physics-of-interconnectedness">Observation: Physics of Interconnectedness</h2>
<p>Interconnectedness is a common attribute of most contemporary architectures. Our systems are an interconnected heterogeneous set of fast-changing and slow changing components.</p>
<p><img src="/img/1__EACd6rWTB79XEUbDfTS8FA.png" alt=""></p>
<p>From experience, we can make the following observations of such architectures:</p>
<ul>
<li>Since not every part of the architecture has the same need for high change frequency, each part may get different levels of people and time investments. You may chip away some parts of a monolith to gain change efficiency for those parts, and leave the remaining untouched. Consequently, monoliths and debt remain integral to some of our systems for far longer than we expect.</li>
<li>As it is getting easier to introduce new apps, overall architectures of our systems are changing faster than we can document them. This puts time pressure on the available knowledge and fragments team memory.</li>
<li>It has never been easier to introduce a diverse set of languages and frameworks into the architecture, leading to another dimension of heterogeneity.</li>
<li>With new code comes newly hidden assumptions about how various parts of the system work in the happy path, let alone assumptions about boundary conditions and failure modes. Every person making local decisions makes those with a peripheral understanding of how other components work. This is unavoidable as we can’t fully grok the complexity of our systems.</li>
<li>Cost and complexity of replicating these architectures end to end in dev/test environments are rapidly increasing, which is leading to testing a subset of changes directly in production. Testing in production is an acceptable and needed practice now.</li>
<li>Though a number of tests still get run in dev/test environments, most of those tests are localized and don’t exercise the interconnectedness of our architectures. The same is true about stress testing.</li>
<li>Traditional capacity/stress testing assumes that our systems are linear, producing predictable and proportional outputs given valid inputs. However, interconnectedness makes the relation between inputs and outputs of the overall architecture non-linear. The components of the architecture may appear linear, but not the overall system. Past success, based on certain initial conditions and inputs, therefore, does not predict future success.</li>
<li>Consequently, we don’t get to fully experience the dynamic and non-linear nature of our architectures until when there is a fault in production.</li>
</ul>
<p>Whenever I participate in incident response, I take interest in observing how the participants reason about what went wrong and how to recover. Discussions on the bridge and incident Slack channels demonstrate some of the above observations. Participants offer assertions about what went wrong, and what should be done to fix. They base it on their own certain, deterministic and causal understanding of how the system is supposed to behave. Some would be right and some would be futile guesses. Sometimes resolutions are quick, and in some cases, resolutions take hours.</p>
<h2 id="observation-unclear-or-porous-fault-domain-boundaries">Observation: Unclear or Porous Fault Domain Boundaries</h2>
<p>With rapid change, new components come into critical paths often. What was a stable path yesterday may have a few new components today with not-yet-well-understood failure modes. This leads to unclear or porous <a href="https://m.subbu.org/fault-domains-and-the-vegas-rule-923fc037119">fault domain boundaries</a>.</p>
<p><img src="/img/1__tSc1ySvdx7D7CjE60maHkw.png" alt=""></p>
<p>You may have had confidence till yesterday that a failure inside the fault domain does not cascade outside, and vice versa. New dependencies can erode your confidence quickly. Was the timeout for the new dependency configured correctly? Was that new dependency aware of the new traffic you may be planning to take? Is that dependency soft (i.e, we can still the request albeit in a degraded mode? Or hard (i.e., a fault in that dependency cascades)? You may not have enough time to catch up to answer such questions as the architecture is constantly changing due to high change frequency.</p>
<h2 id="observation-incomplete-automation">Observation: Incomplete Automation</h2>
<p>Automate everything is a great slogan. In reality, automation is rarely complete.</p>
<p><img src="/img/1__2tXp3afQQRbHB9UhBCfCAA.png" alt=""></p>
<p>There are several reasons why.</p>
<p>First, <strong>most frequently executed parts of our workflows get the highest priority for automation investments</strong>. For instance, CI/CD investments for stateless apps and services far outweigh similar investments for stateful parts. Stateful parts include your self-hosted databases, caches, queues, streams etc. The rationale is simple. In any given architecture, the need for change frequency is usually higher for stateless components than for stateful components. The usual attitude is to let the in-house expert deal with the stateful parts. “How was that database setup?” — you ask. The answer may be, “We don’t know. The DBA (or name your expert) set it up for us.”</p>
<p>Similarly, if one of your clusters is known to fail 3–4 times a year, would you spend two sprints to fully automate it, or jump into those failures to fix whenever there is a failure? Though the latter is nothing but unplanned work and contributes to the accumulation of forgotten failure modes, Managers and prioritization decision makers often pick the latter over the former. This seems counter-intuitive, but most people don’t work across long time horizons when prioritizing work.</p>
<p>Second, <strong>you need closed-loop automation for lights out management of systems.</strong> In a closed loop system, an observer monitors common failure conditions and autonomously takes corrective actions. However, <strong>building closed-loop automation is hard and time-consuming.</strong> Thanks to modern frameworks like Kubernetes, we’re in a much better spot today than ever before to implement closed-loop automation. However, <strong>having a solution is different from actually using it.</strong> This could be because you invested in your current automation sometime before a solution came along, and you may have sunk enough time, resources and processes to quickly change it all.</p>
<p>Third, <strong>the ease of use of cloud services makes it very tempting to create and configure resources manually through cloud consoles and CLIs.</strong> We all know it is wrong but do it anyway. As memory fades and team composition changes, those become brittle to change.</p>
<p><strong>Configuration drift is one of the painful consequences of incompleteness of automation.</strong> Drift is like tree rot. It happens slowly, one config variable at a time, one hidden assumption now and then, just a few misconfigured alerts, and one more manual tweak here and there. That’s how drift accumulates over time.</p>
<p>Over my career dealing with infrastructure and automation, I’ve witnessed many cases with drift accumulating over a period of time to disrupt planned work, degrade critical services, cause difficult to explain bugs, or long times to restore because a critical team member is not on the bridge and so on. The lesson I learned is to always strive to increase the level of automation but also expect drift. I would plan to measure and monitor for drift regularly, and not blame incompleteness of automation for the failures drift may have caused.</p>
<h2 id="observation-chaos-withoutsafety">Observation: Chaos Without Safety</h2>
<p>Chaos engineering is not about randomly introducing faults into production systems. As <a href="https://principlesofchaos.org/">Principles of Chaos Engineering</a> explains, The idea of chaos engineering is to come up with hypotheses, create conditions to test those hypotheses, and then prove or disprove. Through such hypotheses testing, you gain a better understanding of the physics of your system. You help surface hidden and forgotten assumptions. Such understanding is essential to time to restore when failures happen.</p>
<p>However, despite some industry success stories, and even though chaos engineering is <a href="https://www.gremlin.com/community/tutorials/chaos-engineering-the-history-principles-and-practice/">nearly 9 years old</a>, its practice is still nascent in the industry. It is not often you would run into a team that says “We understand the value of chaos engineering. So we allocated x% of the development budget for chaos engineering practices”. A more likely answer is “This just isn’t the time to deal with chaos when we’re overbooked and understaffed. We’ll look at it later.”</p>
<p>As a mainstream activity, chaos engineering is perhaps where automation was 5–8 years ago, and experimentation (such as A/B testing) was 10+ years ago. So, what gives?</p>
<p>I see a few reasons for this hesitation.</p>
<p>(In this discussion, I’m ignoring those that that like to treat production systems as sacred that must not be willfully broken. Can’t help you. Sorry.)</p>
<p>First, a <strong>lack of confidence of recoverability from intentional failures</strong> inhibits the practice of chaos engineering. Would the system survive? What if we end up creating a massive production outage? Do we have the time to deal with the aftermath? Even in organizations that don’t punish people for breaking production systems on purpose, lack of confidence is a blocker for chaos testing.</p>
<p>Second, <strong>chaos engineering, when practiced in poorly understood complex environments, can tip the system beyond the point of equilibrium.</strong> You may not have the safeguards necessary to contain the effects of a chaos test. An intentional failure can quickly cascade, and lead the system into the zone of instability.</p>
<p>Finally, <strong>most enterprises lack dependable disaster recovery environments and practices</strong>. The fault domain, in such cases, envelopes the entire production environment across one or more data centers. Consequently, when a chaos engineering test goes berserk, there is no escape pod to fail-over to a healthy environment. Your only option is firefight the failure in place. Who would want to intentionally create a large fire, and then jump to fight it?</p>
<h2 id="culture-of-safety-to-therescue">Culture of Safety to the Rescue</h2>
<p>Stability concerns amidst high change frequency is a new reality for us to accept and adapt to. Like most things, stability consideration is not the sole terrain of any single tool or a practice.</p>
<p>Below are three phases of practices to consider to develop a culture of safety.</p>
<h3 id="before-the-changenormal-course">Before the change/Normal course</h3>
<p><strong>Design and build for redundancy:</strong> Redundancy helps improve safety. Lack of redundancy impedes your ability to test failure hypotheses, and thus your understanding of the physics of the system.</p>
<p><strong>Pipelines to release safely</strong> through progressive or compartmentalized delivery, feature flags, blue-green deployments, canary releases, and finally change logging.</p>
<p><strong>Pipelines to rollback:</strong> Sometimes rolling back suspected change may be the quickest option to restore from failure. Exercise CI/CD pipelines for rollback.</p>
<p><strong>Failover testing:</strong> This is an important activity to perform to increase confidence in chaos engineering, and to practice reducing time to restore by way of traffic shifting. This type of chaos testing can be much more valuable than simply turning off random machines in your environment.</p>
<h3 id="during-anincident">During an incident</h3>
<p><strong>Change visibility:</strong> Quickly review changes to isolate potential suspects.</p>
<p><strong>Rollback:</strong> Rollback suspected changes.</p>
<p><strong>Roll forward:</strong> If rollback is not possible, rolling a new forward may be your next best option, provided you’ve visibility into key production metrics.</p>
<p><strong>Failover:</strong> If you can’t rollback, or can’t push a new fix, then fail-over to a healthy copy. This step takes practice. The investments made during the normal course to failover traffic to a redundant copy will come in handy here.</p>
<h3 id="after-theincident">After the incident</h3>
<p><strong>Postmortem:</strong> The amount of time you spend after the incident is more important than the time spent during the incident.</p>
<p><strong>Low/medium performing teams don’t spend enough time after an incident to analyze what happened, to curate and document the findings, lessons learned, and action items; and to follow through those action items in a timely manner</strong>. They get burnt out during the incident, and attention drifts away to other things in a few days.</p>
<p>On the other hand, <strong>high-performance teams conduct periodic operational reviews to review postmortems and follow up actions. They don’t let go of the post-incident learning phase.</strong></p>
<p>Consider each postmortem as an opportunity to learn and reason about the physics of your systems, and not just as a chore to report the findings.</p>
<p><strong>Post-incident validation testing:</strong> Once the fixes are made, validate design and code changes by testing if the system would survive a similar failure. Most available chaos testing tools help mimic a variety of failures. Test it in production as much as possible to increase confidence.</p>
<p>Remember that safety does not mean slowing down. It does not mean batching a large set of changes into big bang releases. A culture of safety means being deliberate of the actions, aware of the production environment, and conscious of customer experience. It requires you to develop an understanding of the complexity and the interconnectedness. The more you understand, the faster you can go.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Cloud Optimization Circus]]></title>
            <link href="https://www.subbu.org/articles/2018/cloud-optimization-circus/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2018/cloud-optimization-circus/</id>
            
            
            <published>2018-06-20T15:06:39+00:00</published>
            <updated>2018-06-20T15:06:39+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>If you are a cloud adopter rapidly adopting cloud services, but not developing the finance governance muscle, you will certainly be…</blockquote><p>If you are a cloud adopter rapidly adopting cloud services, but not developing the finance governance muscle, you will certainly be visiting the cloud optimization circus frequently.</p>
<p>I compare cloud optimization exercises to going to a circus because those exercises invite all the same characters and emotions that you find in a circus. There is fear (of wasting money), trickery (by folks showing you how much you could be saving), illusion (of savings that don’t exist where you’re told they exist), excitement (of finding savings), and drama (of playing heroics). It may be fun and entertaining once or twice. Not so when you’ve a mission to accomplish, unless, of course, the mission is going to the circus.</p>
<p><img src="/img/1__9wjfdQzUhDFHr2hE3fOCig.jpeg" alt=""></p>
<p>Security and costs are the two biggest risks of cloud adoption. Security is a risk because, teams that optimize for agility on cloud tend to ignore security initially only to realize later. Cloud certainly gives the building blocks for security, but it is up to you to use the building blocks in the intended manner. Cost is the second on my list. Cloud is cheaper once you understand how cloud costs work, and develop the governance muscle. Cloud can be very expensive otherwise.</p>
<h2 id="spend-vsdemand">Spend vs Demand</h2>
<p>Back in February 2018, I gave a talk at the Container World Conference on <a href="https://www.slideshare.net/sallamar/are-we-ready-for-serverless">Are We Ready for Serverless</a>. One of the key themes of my talk was that serverless frameworks like AWS Lambda are the closest available today to ensure <strong>required supply of resources follow the demand</strong> <strong>for resources</strong>. Here is a hypothetical supply-demand chart.</p>
<p><img src="/img/1__P__8v__35P66exH__9ZZ3b6KQ.png" alt=""></p>
<p>Curve A shows the resource demand. This is the sum total of all resources required to run the business, which in this example varies during the day and the week. Curve B is the ideal supply and spend. In the best case, supply, and hence spend, closely follows the demand. This is possible with serverless frameworks. Curve C is what usually happens in cloud environments. Though supply varies due to auto-scaling and ephemeral usage, such as dev/test activities during the day tapering off over nights and weekends, it usually stays above the resource demand. Curve D shows the supply in data centers where it typically stays flat.</p>
<p>Let’s ignore serverless here. Though it is the most efficient and requires no effort to maintain the spend to tightly follow the demand, only a tiny fraction of total cloud workloads today run on serverless frameworks like Lambda. Serverless potential is yet to be realized at large, and each enterprise will have to carve out its own journey in the coming years.</p>
<p>Majority of cloud workloads today run on virtual machines followed by multi-tenant managed services including network and storage services. Though some managed services bill you for what you need and use, for the vast majority, the task of making the supply (C) to efficiently follow the demand (A) falls on development teams, an assortment of nascent tools, and mostly reactive practices.</p>
<p>However, the task of making the spend efficiently follow the demand is easier said than done. Cost consideration is usually an after thought as most cloud adopters’ early focus remains on speed of delivery and not cost efficiency.</p>
<p>Unfortunately, this topic does not get much attention in the cloud community. Cost worries are usually brushed aside with suggestions like “use auto-scaling”, “use spot instances”, “fix your automation to clean up”, or “turn off your machines when you leave work”. Look at conference talks, meetups and blogs — you will rarely hear about spend management practices, how to project costs, how to understand detailed billing data, how to maintain efficiency, best practices, failures, lessons learned etc. Consequently, <strong>most cloud adopters fail to realize the strongest lever that cloud offers — which is to manage the spend to vary with the demand</strong>. But such a lever won’t exercise by itself. You need to equip the organization with tools, practices and processes to actually do the work.</p>
<p>For enterprises migrating from traditional data centers to the cloud, <strong>spend management is a lever that they don’t have in the data center</strong>. In the data center world, you do your best to estimate what you need in a year or so from now, spend all that, and hope it meets the need. There is no turning back if you find yourself with spare capacity. This is why most tech teams operating in traditional data center environments consider data center resources as free for all practical purposes. It would be <strong>a great missed opportunity to not deliberately practice efficient spend management</strong> as you ramp up on the cloud.</p>
<p>Over the last two+ years of leading cloud migration at <a href="https://www.expediagroup.com">work</a>, I’ve had a chance to look at this area very closely, and take part in building a successful cloud finance governance engine to increase cloud spend efficiency. Let me share my observations and experience.</p>
<h2 id="problem-1-data-is-plenty-and-insights-areshallow">Problem 1: Data is Plenty, and Insights are Shallow</h2>
<p>A <a href="https://www.rightscale.com">RightScale</a> post from November 2017 states that about <a href="https://www.rightscale.com/blog/cloud-cost-analysis/where-10b-waste-public-cloud-costs">$10 billion is wasted</a> each year across AWS, Azure and Google. Another report by <a href="https://www.rightscale.com">BusinessInsider</a> from Dec 2017 proclaims that “<a href="http://www.businessinsider.com/companies-waste-62-billion-on-the-cloud-by-paying-for-storage-they-dont-need-according-to-a-report-2017-11">companies waste $62 billion on the cloud by paying for capacity they don’t need</a>”.</p>
<p>These are staggering numbers for sure. In my experience, we can’t quickly project such numbers at the enterprise level without producing a bottom up baseline through exercises like <a href="https://en.wikipedia.org/wiki/Zero-based_budgeting">zero-based budgeting</a> applied to every workload. These are time consuming activities involving testing every workload for the best <a href="https://en.wikipedia.org/wiki/Price%E2%80%93performance_ratio">price-performance ratio</a>. Even predictions produced by tools like <a href="https://aws.amazon.com/premiumsupport/trustedadvisor/">AWS Trusted Advisor</a> and cloud cost dashboarding tools like <a href="https://www.cloudhealthtech.com">CloudHealth</a> fall short in reality as these tools lack the context of the workload. Consequently, most dev teams don’t often pay enough attention to these predictions.</p>
<p>Furthermore, detailed billing reports like the <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-reports-costusage.html">AWS Cost and Usage Report</a> provide a wealth of detailed billing records. Here a few sample billing records.</p>
<blockquote>
<p>73xfp4egijc5zblnu4easfnmvmnw4gsdxpwo7v2jxu4epqct6q7a,2018-06-02T01:00:00Z/2018-06-02T02:00:00Z,,AWS,Anniversary,xxx,2018-06-01T00:00:00Z,2018-07-01T00:00:00Z,xxx,Usage,2018-06-02T01:00:00Z,2018-06-02T02:00:00Z,AmazonS3,USW2-Requests-Tier2,ReadLocation,,cf-templates-xxx-us-west-2,1.000000        0000,,,USD,0.0000004000,0.0000004000,0.0000004000,0.0000004000,&quot;$xxx per 10,000 GET and all other requests&quot;,,&ldquo;Amazon Web Services, Inc.&quot;,Amazon Simple Storage Service,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S3-API-Tier2,GET and all other requests,,,,,,,,,,US West (Oregon),AWS Region,,,,,,,,,,,,,,,,,,,,,,,,,,, API Request,,,,us-west-2,,,,,,AmazonS3,Amazon Simple Storage Service,xxx,,,,,,,,,,,,,,,,USW2-Requests-Tier2,,,,,,,,,xxx,xxx,OnDemand,Requests,,,,,,,,,,,,,,,,,,,,xxx,,,,,,,,,,,xxx,,xxx,xxx,,,xxx,,,,<br>
ip4a5gnjucytps5c7nittxxgwj3jo5yc5sszhu4kkk2wqqyzv4rq,2018-06-05T19:00:00Z/2018-06-05T20:00:00Z,,AWS,Anniversary,xxx,2018-06-01T00:00:00Z,2018-07-01T00:00:00Z,308506315341,Usage,2018-06-05T19:00:00Z,2018-06-05T20:00:00Z,AmazonVPC,USW2-DataTransfer-Regional-Bytes,VpcEndpoint,,arn:aws:ec2:us-west-2:xxx:vpc-endpoint/vpce-xxx,190.5361101758,,,USD,0.0100000000,1.9053611018,0.0100000000,1.9053611018,$0.010 per GB - regional data transfer - in/out/between EC2 AZs or using elastic IPs or ELB,,&ldquo;Amazon Web Services, Inc.&quot;,Amazon Virtual Private Cloud,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,US West (Oregon),AWS Region,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Data Transfer,,,,us-west-2,,,,,,AWSDataTransfer,AWS Data Transfer,xxx,,,,,,,,,,,US West (Oregon),AWS Region,,IntraRegion,,USW2-DataTransfer-Regional-Bytes,,,,,,,,,xxx,xxx,OnDemand,GB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,</p>
</blockquote>
<p>Depending on your scale and activity, you might see millions of records like these every day. <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/enhanced-lineitem-columns.html">These records</a> span over tens of resource types and product families, and tens of thousands of usage types. As new features are introduced, and as your adoption grows, the volume and detail, and hence the complexity of these records, also grows.</p>
<p><strong>On one hand, having such a wealth of data shows the true power and potential of on-demand pay-per-use model of the cloud.</strong> This data can help you understand the implications of your architecture choices, be able to correlate workload patterns with costs, and make price-performance trade-offs. Insights from this data, when gained, can help <a href="https://medium.com/expedia-engineering/cloud-and-finance-lessons-learned-d54d626d4bc7">bring cost awareness to the engineering culture</a>.</p>
<p><strong>On the other hand, most billing tools available today mainly focus on providing dashboards with high level metrics, but not many insights.</strong> For example, in one particular case, recommendations from Trusted Advisor showed significant potential savings in certain areas, while analysis of the raw billing data revealed much bigger opportunities elsewhere. The latter required deeper understanding of the billing data to spot inefficiencies.</p>
<p>Developing a deep and solid understanding of billing records is an engineering problem that consumes time and investments. It’s like understanding operating system level metrics. It is not optional to not understand such metrics. You’ve to build tools to process the data, visualize, and then derive insights. You can not also centralize all this to one particular tech team or a finance team, as you need every team spending on the cloud learn to gain their own insights. Such insights need to complement performance metrics to gain awareness of price for performance. This is why I believe that <strong>cost awareness must be part of the engineering culture</strong>, and it starts with developing an understanding of billing data.</p>
<h2 id="problem-2-optimization-practices-arereactive">Problem 2: Optimization Practices are Reactive</h2>
<p>Unlike other drivers like dev agility, availability, and security; cost related practices often tend to be reactionary. Cost concerns come to the front seat only when there is a sense of urgency to reduce cloud costs. Otherwise, cost concerns get left in the garage back home. Whenever there is a realization of cost increases beyond budgets, organizations scramble to conduct optimization exercises, and when the dust settles, go back to the business as usual.</p>
<p><img src="/img/1__EhEc8poPHBK3____PJQvLIJA.png" alt=""></p>
<p>Part of this is due to Problem 1 above, which is not looking at the billing data, and/or not gaining enough insights from the data, and thus not being able to incorporate cost awareness into the engineering culture. The remaining of it is due to the holy trinity of cost, speed, and quality.</p>
<p><img src="/img/1__saJQxXYGKNQTnXqfGCtM6Q.png" alt=""></p>
<p>In order to produce an outcome of a certain quality, at any given time, <strong>you can either move fast while spending more, or move slow and be efficient</strong>. You can’t maximize all the three at the same time. The key question to ask therefore is, <strong>how much cost inefficiency are you willing to tolerate for a given amount of quality and speed</strong>.</p>
<h2 id="problem-3-stigma-andfud">Problem 3: Stigma and FUD</h2>
<p>Though we hear about wastage on the cloud from reports like those I cited above, apart from a few “how we saved such and such by doing so and so” blog posts, we don’t hear much about building sustainable practices of spend management and governance; and most importantly real stories about failures.</p>
<p>There is a reason why. Most of us <strong>mentally equate having to optimize cloud spend to the business not being healthy</strong>. We compare it to other usual cost cutting measures that most companies take at various points in their cycles, such as letting people go, avoiding business travel, reducing discretionary spending etc, shutting down offices etc. Though more experienced managers and leaders see these as natural acts of cost governance, common perception remains otherwise. A shadow of stigma follows cost optimization.</p>
<p>However, most successful companies build cost governance into everything they do, whether it is hiring, business travel, discretionary spending, or technology related spending. Cloud costs are no different. <strong>Acknowledging that cloud spend is a variable that you can manage, that you must maintain the spend at a certain efficiency, and removing the stigma from cost optimization are essential to building a culture of cloud cost awareness.</strong></p>
<p>Wherever there is a stigma, there is FUD. I’ve heard stories of cost optimization practitioners in the wild that make claims like “we will show you how to save $XXX, just give us $Y”. One friend once shared a story of a consulting team proposing to optimize for a percentage cut of the savings realized. Do you remember “termination assistance” from <a href="https://en.wikipedia.org/wiki/Up_in_the_Air_%282009_film%29">Up in the Air</a> (pun intended)?</p>
<p><img src="/img/1__l2XoG41KOnkpzm2MyDRjlg.jpeg" alt=""></p>
<p>Such approaches might make sense in places where cloud adoption is not strategic, and is treated as a utility, like a third party maintaining your corporate media web site. However, these approaches don’t produce sustainable results for anyone running serious workloads on the cloud. While not rejecting the need to seek help, you’ve to equip yourself with tools, automation and cultural changes. This is the philosophy behind DevOps — <strong>you make teams autonomous and hence accountable for development and operations for higher team performance</strong>. The same goes for cloud costs too.</p>
<h2 id="cloud-finance-governance-andops">Cloud Finance Governance and Ops</h2>
<p>This brings me to commonly dreaded term “governance”. Instead of treating cost optimization as a necessary evil, what we need is a practice of cloud finance governance and operations. Optimization is a part and parcel of governance. Here is how I describe cloud finance governance.</p>
<blockquote>
<p>Cloud finance governance is pushing for responsible spending practices, and introducing checks and balances. It is about learning to operate spend management levers to trade between between speed, cost efficiency, and sometimes even quality.</p>
</blockquote>
<p>Governance is not a bad word. Governance is not bureaucracy. Governance is not introducing roadblocks. When done right, governance is empowering, rewarding, and helps us exercise new muscles. Governance is what responsible families, cultures, societies and businesses must do in order to be adaptable and be resilient.</p>
<p>While prescribing a general purpose blueprint for how to practice cloud finance governance is tricky as each organization needs to determine what works best for them, below are some of the essential building blocks.</p>
<p><img src="/img/1__z__bECmFQi2e__kg07GewCfw.png" alt=""></p>
<h3 id="1-attribute-costs">1. Attribute Costs</h3>
<p>You can’t govern and optimize what you can’t measure. I was in situations with charts showing large unallocated cloud spend on a big screen in front, and struggling to explain where that money was going. You can’t optimize, let alone govern, if you don’t know who is spending what. Resource attribution to people and teams is fundamental to operating successfully on the cloud for cost as well security reasons.</p>
<p>There are several techniques to consider to maintain high percentage of attributed costs:</p>
<ol>
<li>Metadata to map people and the organization structure to applications and resources</li>
<li>Resource tagging of all taggable resources — be aware that not all cloud resources are taggable</li>
<li>Using separate accounts for different types of workloads to reduce accumulation of shared expenses — particularly those due to untagged/untaggable resources, including network ingress/egress costs, NAT gateways, firewalls etc.</li>
<li>Modeling how to attribute cost of shared services — your organization may be running large shared services for logging, monitoring, caching, proxying, analytics, experimentation etc. Since these are used by many teams, you may end up in a situation of nobody being able to explain the cost of such services.</li>
</ol>
<h3 id="2-gaininsights">2. Gain Insights</h3>
<p>The next step is to gain insights from the billing data. Insights aren’t easy and automatic. I approach this step by first observing cost and usage data across different dimensions (time, regions, accounts, dev/test/production environments, resource types, usage types, instance types, allocated vs unallocated costs, etc), asking questions, making hypothesis, and validating those hypothesis. This is an iterative process over time.</p>
<p>In order to do these, you need access to the raw billing data, stored and indexed in a form that allows fast and easy queries. At work, we built a data warehouse using Redshift and ElasticSearch for billing data. This system loads raw billing data as soon as it lands in S3, merges it with the metadata of people and applications, and loads into an ElasticSearch cluster for queries and visualizations. This process helped us several times to improve our overall understanding of costs, efficiencies and inefficiencies, and areas of improvement.</p>
<h3 id="3-automatehygiene">3. Automate Hygiene</h3>
<p>While we like to automate everything, in reality, automation is never complete, and the degree of completeness varies by what you’re optimizing your automation for.</p>
<p>You may, for example, optimize for speed and availability, and decide to leave older deployments for a week or to allow for rollbacks. You may optimize for performance for your analytics workloads and decide to keep all your offline data in the <a href="https://aws.amazon.com/s3/storage-classes/">S3 standard access</a> class, and run the compute on pricey instance types. You may have a bug in your automation that forgets to propagate tags from EC2 to EBS, thus increasing unattributed costs. Your teams may have forgotten to upgrade some <a href="https://aws.amazon.com/ec2/previous-generation/">legacy EC2 instances</a> that may be pricier for the same performance. I’ve seen all such scenarios and more that lead to waste.</p>
<p>You can improve hygiene by crafting policies (such as “all unattached EBS volumes shall be deleted after 48 hours”), and then automating those policies.</p>
<h3 id="4-build-spend-management-levers">4. Build spend management levers</h3>
<p>Remember that cloud spend is not a fixed sunk cost. It is a variable expense that can you manage. There are several levers possible:</p>
<ol>
<li>Continually iterating the architecture to improve the price-performance ratio. Though it is commonly referred to as right-sizing, in reality, it is all about testing, looking at past data, and adjusting resource choices to improve price-performance ratio.</li>
<li>Shedding unnecessary/unwanted traffic</li>
<li>Scaling down passive regions (for applications using active-passive architectures)</li>
<li>Adjusting SLAs for your analytics jobs to take longer time to complete</li>
<li>Using cheaper tier options for S3 and EBS to trade performance for cost efficiency</li>
<li>Adjusting data retention policies</li>
<li>Using cheaper resources for test workloads</li>
</ol>
<p>Furthermore, if you’re still running in the hybrid mode with some apps serving traffic both in your data centers and the cloud, another lever may be to shift traffic one way or the other to balance between variable cloud costs and fixed data center costs.</p>
<h3 id="5-forecast">5. Forecast</h3>
<p>Forecasting is another important aspect of developing a finance governance process, particularly for those moving workloads from the data center to the cloud, or those building new systems. During such phases, cloud spend tends to increase at a higher rate than in the steady state. Forecasting is less reliable during such phases as you may not have past data to build forecasting models. Regardless, you can correct for this by forecasting more frequently — ramp up some volume of traffic, build models for forecasting, forecast, then ramp up more. Also read <a href="https://medium.com/expedia-engineering/cloud-and-finance-lessons-learned-d54d626d4bc7">Cloud and Finance — Lessons learned</a> from a year ago on this topic.</p>
<h3 id="6-budget">6. Budget</h3>
<p>Forecasting is what you expect to spend in future based on your cloud adoption plans, your team velocity, and the architectures your team is building. The budget tells you how much is being set aside for that area of spend. The difference should tell you how to tweak the plans, architecture, and levers you can exercise to meet the budgetary goal. Usually finance teams determine your budget.</p>
<p><img src="/img/1__IRN__sQZGgUyqSxv1Cl__2wQ.png" alt=""></p>
<h3 id="7-operational-reviews">7. Operational Reviews</h3>
<p>Lastly, incorporate all cost related metrics, and insights into your periodic operational reviews. Most teams use such rituals to review overall KPIs of applications, and the status of projects the teams are working. Add cost related topics to the same. This is a place to observe billing data, to ask questions to develop better understanding of the data, to identify ambiguous areas, and to keep on improving the governance muscle.</p>
<p>To reiterate, cloud gives you many levers to manage costs. Discovering and exercising those levers requires thinking of how to govern cloud costs, and building the automation and processes to develop insights into costs, creating spend management levers, and knowing how to make cost vs speed vs quality tradeoffs.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[DevOps and Governance]]></title>
            <link href="https://www.subbu.org/articles/2018/devops-and-governance/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2018/devops-and-governance/</id>
            
            
            <published>2018-02-11T20:33:13+00:00</published>
            <updated>2018-02-11T20:33:13+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Regulation and threat aware DevSecOps culture is where DevOps was 5–10 years ago. Auditors, controls, regulations and compliance are not…</blockquote><p>Regulation and threat aware DevSecOps culture is where DevOps was 5–10 years ago. Auditors, controls, regulations and compliance are not the topics that most autonomous, empowered, cloud-native, continuous-delivery practicing, run-what-you-build teams know much about or want to welcome.</p>
<p>Despite the collective progress we made during the last 5–10 years to break the walls between software development, release management, and operations, there is still a wide chasm between contemporary DevOps culture, security, and compliance to controls.</p>
<p>Any enterprise that collects money, processes and stores customer and payment data, and partners with other enterprises is required to comply to certain controls. These controls set some expectations on what the architecture and DevOps practices must conform to. Depending on the areas of the business and geographies served, these controls may come from <a href="https://en.m.wikipedia.org/wiki/ITGC">IT General Controls</a> provided by <a href="https://en.m.wikipedia.org/wiki/Institute_of_Internal_Auditors">Institute of Internal Auditors</a>, laws like <a href="https://en.m.wikipedia.org/wiki/Sarbanes%E2%80%93Oxley_Act">Sarbanes-Oxley Act</a> (SOX) to govern accurate financial reporting, EU regulations like <a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">GDPR</a> for data protection of all individuals, <a href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">PCI DSS</a> for information security of payment card data, etc.</p>
<p>More important, some of these laws and regulations require certain executive level roles to attest that the enterprise conforms to those controls, failure of which may have material consequences. Most of these controls are also subject to internal and external audits for compliance. Auditors look for demonstration of evidence at a statistically relevant level.</p>
<p>However, when internal or external auditors approach dev teams, they may get a frowning “we know the right thing to do, why are we talking about this now” response. As far as dev teams are concerned, security teams, with their big-brother approaches, are blockers for getting things done quickly; and audits and compliance are drills that they have to grudgingly deal with periodically.</p>
<p>Folks that are responsible for security and controls consequently end up resorting to strong-arm techniques to get conformance. The result is cultural divides between each of these groups representing different interests. Controls frustrate dev/ops teams, and exasperate controllers and auditors. The outcomes are friction and potentially ineffectiveness of controls.</p>
<p>There are several reasons for this continued divide.</p>
<ul>
<li>Most of us on the tech side have a cursory understanding of regulations, compliance, and the audit procedures. Similarly, most regulators and auditors don’t always keep up with the changing technology and engineering practices.</li>
<li>Each of these groups operate with different sets of skills and experiences. Lack of familiarity between these teams leads to differences in expectations or mistrust.</li>
<li>Due to the general purpose and yet binding nature, regulatory language often looks ambiguous to tech teams, leading to subjective interpretations. For instance, PCI requires “file integrity monitoring or change detection systems check for changes to critical files, and notify when such changes are noted”. The interpretation depends on whether an application is stateful or stateless, how code and configuration are packaged and distributed, and how the data is managed. This ambiguity leads to tech teams not fully understanding and realizing what they need to do. Rules may sometimes appear arbitrary.</li>
<li>Cloud further frustrates controllers and auditors. Though there are a number of building blocks on the cloud to build secure and compliant applications, those are not sufficient to ensure governance and show proof of compliance. You’ve to string together processes and automation for governance. Just the loss of access keys alone have exposed many organizations to data theft in recent years. While periodic rotation of access keys is a necessary practice to reduce the risk, it is up to each enterprise to invent processes and automation to implement such practices. There is a lot more that cloud providers can and must do than providing lower level buidling blocks and the <a href="https://www.aicpa.org/interestareas/frc/assuranceadvisoryservices/sorhome.html">System and Organization Control (SOC)</a> reports. There is a vaccum of higher level cloud services that simplify the cost of governance.</li>
<li>Though most tech teams understand that security is of paramount importance, they may lack sufficient understanding of rules and regulations that govern different types of environments (like production, PCI vs non-PCI, PII vs non-PII, analytics vs non-analytics etc.) and the rules that security teams impose on interactions between these environments. Again, such lack of familiarity leads to mistrust and perimeter friction.</li>
<li>Traditionally, security teams operate under a shroud of secrecy with a “we will tell you what to do, but not why” culture. This is partly driven by the desire to keep ongoing threats confidential. Lack of such awareness further fuels mistrust and friction.</li>
<li>Contrary to the blame-free DevOps culture tech teams tend to practice, certain regulations require certain roles to take the blame. In order to ensure that audits are impartial, audit teams enjoy a certain amount of autonomy with clear separation of duties. Separation of duties may end up strengthening the wall between tech teams and auditors.</li>
</ul>
<p>Unfortunately, solutions are non-trivial and may take time. While technology in the form of automation and tools for compliance and verification is necessary, these cultural devides won’t disintegrate until and unless controls and security become part of an organization’s DevOps culture.</p>
<p><img src="/img/1__NOkDptvhDdncAqppsNtDBA.jpeg" alt=""></p>
<p>This won’t happen without short and frequent feedback loops between people and processes dealing with tech, security and compliance. Teaching and joint-learning should accompany these feedback loops to align mental models and vocabulary of each of these teams.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Serverless: Looking Back to See Forward]]></title>
            <link href="https://www.subbu.org/articles/2017/serverless-looking-back-to-see-forward/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/serverless-looking-back-to-see-forward/</id>
            
            
            <published>2017-11-12T22:27:41+00:00</published>
            <updated>2017-11-12T22:27:41+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Last week, I attended an all-day CIO forum on cloud in Seattle, organized by one of Seattle’s top venture fund groups. Several notable…</blockquote><p>Last week, I attended an all-day CIO forum on cloud in Seattle, organized by one of Seattle’s top venture fund groups. Several notable speakers and panelists spoke about their views on containers and kubernetes, public and hybrid clouds, provider lock-in and portability amongst providers, and of course, serverless computing.</p>
<p>I observed two patterns that day. First, there is a genuine concern about cloud provider lock-in. Second, there is a desire and hope to avoid or at least minimize such lock-in by embracing open source abstractions and platforms, most notably Docker and Kubernetes. These patterns are best illustrated by the answer I got for my question to one of the key guests of the day.</p>
<p>My question was whether this individual would spend six months to build and launch a new service that works and takes advantage of everything one particular public cloud offers, or spend two years to make sure that the same would run on multiple public clouds. The answer I got was that, though he might start with the former for agility, he would invest in the latter for the long-term. The implication I sensed in this answer was that the latter is the right thing to do. I didn’t press on to ask if he had an opportunity to test this hypothesis in the real world.</p>
<p>While I’ve not shied away from stating my opinions on <a href="https://m.subbu.org/how-to-think-about-multi-cloud-46ea0dfba8dd">multi-cloud</a> and <a href="https://m.subbu.org/cloud-lock-in-and-change-agility-78d63978ddfd">cloud lock-in</a>, this event made me acknowledge the necessity to take a few steps back from these views, and notice some changes that have been slowly happening over the last five plus years in the industry.</p>
<p>In this post, I would like to narrate three slow changing themes in the industry, and postulate where we might land in five plus years from now. My hypothesis for the future is that serverless services will take the center stage for most common application development, and consumption of open source for infrastructure automation and services will continue to drift from being strategic to opportunistic. Looking back to see forward might help us shape and take advantage of that future and not fight it to be left behind.</p>
<p><img src="/img/1__fOBUH1GimYwp9__L87cAsJQ.png" alt=""></p>
<p>These themes are not independent, and are reinforcing and accelerating one another.</p>
<h2 id="theme-1-inversion-ofcontrol">Theme 1: Inversion of Control</h2>
<p>AWS Lambda is the first successful application of inversion of control for the data center. Inversion of control is a design principle in which applications receive flow of control from a generic framework. By implementing certain common and generic tasks, the framework relieves applications from having to implement those generic tasks at the expense of losing explicit flow of control.</p>
<p>Inversion of control is not a new concept. Wikipedia’s <a href="https://en.wikipedia.org/wiki/Inversion_of_control">entry</a> points to a 1998 <a href="https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/">reference</a>. However, application of this concept at commodity scale to data center resources is relatively new. This is because of the complex nature of the common qualities that most applications need in the data center. These qualities include the following:</p>
<ol>
<li>Just-in-time allocation and de-allocation of resources like compute (baremetal or virtual machines), network segments (for network isolation), network filters (firewalls), load balancers, and storage (file or block)</li>
<li>Elasticity of such resources to allocate nothing to as many as needed, with the needed quality of service</li>
<li>Keeping applications robust and available in the face of common infrastructure failures</li>
</ol>
<p>As essential as these qualities are, achieving these still takes Herculean efforts in most data centers around the world today. Just try to get a new 1,000 node Hadoop cluster in an enterprise data center. You would be lucky if you get a working cluster in six months. Though compute virtualization has helped to an extent, resources in data centers are still horridly non-malleable. Through a series of evolutionary changes, we are now getting ready to abstract this complexity into frameworks operated as services, and the early benefits from services like AWS Lambda are clear.</p>
<p>See below for the inversion of control moving custom purpose built automation into app frameworks operated as services.</p>
<p><img src="/img/1__4E0yAJYt0r__wEYEnaQKF3g__2x.jpeg" alt=""></p>
<p>It is unfortunate that we call this inversion of control as “serverless”. Framework as a service is a less confusing choice to describe the new abstractions. Regardless, every development happened so far is helping us build better frameworks, and the trend shall continue.</p>
<h2 id="theme-2-disaggregation-ofstate">Theme 2: Disaggregation of State</h2>
<p>Most enterprises have built or used open source “platform as a service” tools that make it easy and quick to create, build, deploy and run applications. Such platforms succeed(ed) when dealing with stateless code like web apps or stateless micro services, but fail(ed) to tackle state. Examples of stateful applications include SQL or NoSQL databases, search clusters, key-value stores etc.</p>
<p>State introduces extra complexity into automation as it requires you to think of distribution aspects like cluster awareness, synchronization, consistency, sharding, replication, and partition tolerance; and quality of service aspects like fast startup, IO latency, IOPS etc.</p>
<p>Just think of how much code you could delete from Kubernetes if all it did was to run stateless microservices. Building generic automation abstractions for stateful systems is hard and time consuming, and most of all, it takes experience to get the abstractions right. Even replacing a failed node from a stateful system takes special considerations and most enterprises don’t dare automate such tasks for fear of losing critical data.</p>
<p><img src="/img/1__9BXLyu3DnppznoeWhVv1EQ__2x.jpeg" alt=""></p>
<p>Moving state to external managed services like S3, Dynamo, BigTable, Spanner is lowering the bar for application automation, which is thus eliminating some of the complexity from frameworks operated as services for the provider. For the consumer, this trend is also eliminating operational tasks that system and database administrators usually perform.</p>
<h2 id="theme-3-power-of-the-ecosystem">Theme 3: Power of the Ecosystem</h2>
<p>The most important change that is accelerating the adoption of serverless frameworks operated as services is the strengthening ecosystem of services in each public cloud today. Without the ecosystem, AWS Lambda would not have gained as much adoption as it did in such a short time.</p>
<p>Just to give an example, at Expedia, we ran over 6.2 billion invocations of AWS Lambda in October this year. Though this number is small when compared to other types of external or internal traffic we serve, Lambda’s rapid adoption would not have been possible without the surrounding service ecosystem with IAM, SNS, SQS, API Gateway, KMS, S3, Dynamo, Kinesis etc. Most of these Lambda functions are about 100–150 lines of long and are written in a day or two. Of course, we also built a <a href="https://techblog.expedia.com/2016/12/06/the-inside-scoop-on-primer-expedias-internal-cloud-deployment-tool/">deployment platform</a> that makes creating and running Lambdas a breeze.</p>
<p>Without such a mature ecosystem, AWS Lambda would just be a curious cloud-enabled <a href="https://en.wikipedia.org/wiki/Common_Gateway_Interface">cgi-bin</a> service.</p>
<h2 id="to-fight-or-not-tofight">To Fight or Not to Fight</h2>
<p>These three themes are reinforcing and accelerating one another.</p>
<ul>
<li>Frameworks as services like Lambda wouldn’t be possible without disaggregation of state and a strong ecosystem of services.</li>
<li>Similarly, adoption of S3 as an infinitely elastic data lake is fueled by the ease with which you can create and terminate data processing compute clusters like Hadoop map-reduce and Spark in a serverless manner without worrying about HDFS for state durability.</li>
<li>Complexity shift from apps to the service ecosystem is clearing the way for faster development and adoption of frameworks as services.</li>
</ul>
<p>Resisting any of these themes has a cost. For example, resisting AWS Lambda for fear of lock-in reduces agility, raises infrastructure cost, and increases complexity of automation. Not moving data from an enterprise storage system to a cloud storage service like S3 for fear of losing control on data increases cost of data storage, makes storage less secure, increases automation complexity, and increases friction for systems that need to deal with state. Not adopting cloud provider managed services for fear of lock-in reduces agility, and raises the cost, particularly the cost of lost opportunity.</p>
<p>What’s in store for the future then?</p>
<p>Cloud services will continue to shift the complexity away from applications further fueling adoption of frameworks as services on public clouds. Docker and Kubernetes will become less relevant in the developer land than they are today as proprietary frameworks take the center stage. This is not a threat to open source. Open source shall maintain its place in many other forms.</p>
<p>Despite fears, natural laws of economy will shift the gravity towards frameworks operated as services. Since these are services and not code, these will remain proprietary. AWS Lambda may have been the first of its kind but won’t be the last. There is a lot of code in the industry that needs to move to app frameworks operated as services, and we will likely see more frameworks in future.</p>
<p>Even when multiple cloud providers offer the same open source abstraction, portability will be unlikely due to proprietary warts and the proprietary service ecosystem.</p>
<p>In summary, here is my suggestion. Participate in this journey, learn and not be left behind.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Technology Decision Making and Architecture Reviews]]></title>
            <link href="https://www.subbu.org/articles/2017/technology-decision-making-and-architecture-reviews/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/technology-decision-making-and-architecture-reviews/</id>
            
            
            <published>2017-09-29T14:13:38+00:00</published>
            <updated>2017-09-29T14:13:38+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>In this note, I would like to implore you to not use architecture reviews as a means to improve quality of technology decisions. Instead, I…</blockquote><p>In this note, I would like to implore you to not use architecture reviews as a means to improve quality of technology decisions. Instead, I would ask you to rely on acts of <em>asking for</em>, and <em>giving</em> feedback in open forums that favor autonomy, constructive feedback and dialog over correctness and objectivity of decisions.</p>
<p><img src="/img/1__xBJfOTTKgFjzkYSNBW3SXg__2x.jpeg" alt=""></p>
<p>Technology decision making processes like architecture review boards, architecture working groups, virtual architecture teams (VATs), or “A” teams (with the “A” standing for either “architecture” or the “best of the breed”) that rely on “review” of decisions tend to be slow, impede team autonomy and produce top-heavy decisions.</p>
<p>On the other hand, processes or rituals that use dialog and feedback as a means of offering improvements put the autonomy back in the hands of those seeking feedback, and empower them to determine how best to incorporate the feedback into actions. Without the autonomy to make decisions, whether optimal or not, no team can learn and own outcomes.</p>
<p>When you take the feedback centric approach, those giving feedback would be forced to formulate constructive and actionable feedback instead of arguing against the decision or explaining why the proposed decision is wrong or inferior. Since there is no review, there are no approvals to make, and no up or down votes to give. Opinions on why any particular decision is good or bad become immaterial, unless those are followed by constructive and actionable feedback showing better alternatives. Any bar-raising push for improvements happens via constructive feedback and not outright disapproval.</p>
<p>The onus for incorporating the feedback falls back onto the one seeking the feedback, thus maintaining autonomy. The feedback is non-binding. The feedback seeker is free to disregard the feedback or interpret it in ways that he/she sees fit.</p>
<p>Wouldn’t this approach likely to produce inferior outcomes? Before answering this question, let us look at the rationale behind commonly practiced architecture reviews.</p>
<h3 id="meritocracy">Meritocracy</h3>
<p>Most architecture review initiatives start with a desire to improve quality of decisions. Teams wanting to make decisions come prepared to present their designs and analyses in the form of a proposal. A nominated set of individuals discuss, review, offer feedback and/or critique. These individuals are usually considered the best in their roles.</p>
<p>Upon presenting the proposal, a decision is either reached or not reached by a process of approval or voting. If a decision is made, the presenter(s) will get to implement the decision. When a decision could not be reached, the presenters may need to come back with an improved proposal at a later time.</p>
<p>This approach assumes that the individuals reviewing the proposals know it all, and have earned the feathers to offer critique on any topic. Instead of helping the proponent improve by way of feedback, this style puts the emphasis on a review and approval of a proposal under the guise that those reviewing know the answers. This is very rarely the case. Even when it is, it disenfranchises those implementing the decisions.</p>
<p>Regardless, teaching someone how to make better decisions by way constructive feedback is far more valuable than making better decisions for them. When there is no teaching, there is no learning. When there is no learning, there is no improvement.</p>
<h3 id="silos-and-the-principle-of-leasteffort">Silos and The Principle of Least Effort</h3>
<p>What also prompts such architecture review boards or forums is increased size from a small team to a larger organization of several teams. When the size is small, decisions are easily understood by everyone and feedback flows through quickly. But silos form as the size increases. Individuals outside the silo find it difficult to understand what decisions are being taken, and the rationale behind those decisions. Nonetheless, decisions still move swiftly within each silo due to the autonomy.</p>
<p>However, autonomy without external feedback often leads to local optima ignoring alternatives that can help produce a global optima. In the absence of feedback, the principle of least effort takes over, and the team may gravitate towards known and comfortable decisions avoiding uncomfortable alternatives.</p>
<h3 id="architecture-feedback">Architecture Feedback</h3>
<p>I would argue that it is okay for the feedback process to produce inferior outcomes in the beginning, as long as there is a mechanism for the feedback to flow continually. The feedback, coupled with the autonomy to own the outcomes by the proponent, will eventually autocorrect decisions.</p>
<p>If you are ready to rechristen your architecture review ritual into an architecture feedback ritual, here are some suggestions for the feedback seekers and feedback givers.</p>
<h4 id="feedback-seekers">Feedback Seekers</h4>
<ul>
<li>Approach as though you don’t have all the answers, let alone the best answer.</li>
<li>Remember that the purpose of feedback is to learn, and that feedback is not intended to disenfranchise you of your autonomy.</li>
<li>Don’t defend your solution. Consider that there are many ways to solve the same problem.</li>
<li>When you don’t like the feedback or agree with it, explain to open dialog, but not to defend your position.</li>
<li>Ask what you may be missing.</li>
<li>Take notes and ask clarifying questions about the feedback.</li>
<li>Avoid defensive phrases like “we decided” or “we want to”. Instead, start with “Here is what I/we thought … What do you think?”.</li>
<li>Don’t outright reject the feedback if you’ve already thought about it. You might instead say, “Thanks for the suggestion. Let me reconsider”, or “Would you mind walking me through this further? I couldn’t come to the same conclusion.”</li>
</ul>
<h4 id="feedback-givers">Feedback Givers</h4>
<ul>
<li>Approach as though you don’t have all the answers, let alone the best answer.</li>
<li>Practice how to give constructive feedback about the things you disagree with.</li>
<li>Work on shaping your anxiety to push for what you consider as better choices into constructive feedback.</li>
<li>Ask clarifying questions to understand the context behind proposed decisions.</li>
<li>Instead of “This won’t scale/work/whatever”, try alternatives like “I’ve observed that this approach might not scale/work/whatever. Here are the reasons why. … I will be happy to walk you through such and such alternative.”</li>
<li>Set and raise the bar while providing additional context.</li>
<li>Don’t challenge or overtake the presenters’ autonomy to incorporate the feedback in the best way possible, including completely ignoring your feedback.</li>
<li>It’s okay to not have an opinion. Don’t be compelled to voice one.</li>
</ul>
<p>Though this approach might sound radical, I submit that, the only way to raise the bar on technology decision making while preserving team autonomy is through feedback and dialog.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Accept | Tentative ✓ | Decline]]></title>
            <link href="https://www.subbu.org/articles/2017/accept-tentative-decline/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/accept-tentative-decline/</id>
            
            
            <published>2017-09-18T02:39:34+00:00</published>
            <updated>2017-09-18T02:39:34+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I’m done with the excuse of not being in charge of my time. Over the last two months, I started taking a few steps to deliberately simplify…</blockquote><p>I’m done with the excuse of not being in charge of my time. Over the last two months, I started taking a few steps to deliberately simplify my calendar. I now manage extended blocks of work time on most working days. With the exception of a few, most of my meetings are recurring meetings. I skip meetings where I’m not required to help make decisions. I try to combine ad hoc meetings into other scheduled meetings.</p>
<p>The early results are positive. I’m more productive, less stressful, calmer and more focused than before. I’m still looking for patterns and refining my techniques. and I’ve ways to go.</p>
<p><img src="/img/1__ROZHr7DoC2kUdwcchfxDWw.png" alt=""></p>
<p>I know I’m not alone when I admit that great chunks of our work time are spent in meetings. There were weeks where I spent 70–90% of my work time in meetings. Even during those weeks when this percentage was low, my free time consisted of 30 or 60 minute slivers spread throughout the work day. These fragments were clearly not sufficient for any deep work. I tried to catchup and get focused work done in the evenings and weekends. It worked, but only for a while.</p>
<h3 id="few-lessons">Few Lessons</h3>
<p>Like most others, I too took meeting overload as a consequence of increased collaboration, scope of work, and responsibilities. I thought that I just needed to master the art of multi-tasking and being effective despite frequent interruptions and context switching. A few resources helped me realize that this notion is just a fallacy.</p>
<p>First, thanks to Susan Cain’s <a href="http://www.quietrev.com/team/susan-cain/">Quiet,</a> I learned that excessive meetings and frequent context switching over-stimulate my mind, and that each of us “<strong>need very different levels of stimulations to function at (our) best</strong>”. On any given day, the more think time I take the less stressful I’m. The more time I spend in meetings and context switching, the more tired I become at the end of the day.</p>
<p>To further quote from Quiet,</p>
<blockquote>
<p>What looks like multitasking is really switching back and forth between multiple tasks, which reduces productivity and increases mistakes by up to 50 percent.</p>
</blockquote>
<p>Say no more to multi-tasking.</p>
<p>Second, thanks to an external speaker series at <a href="https://www.expedia.com">Expedia</a>, I had a chance to listen first hand to Eduardo Briceño talk about <a href="https://mindsetonline.com/thebook/buythebook/index.html">growth mindset</a>, and “learning and performance zones”. The gist of his talk was that, <strong>as we spend years in our careers, we get stuck in the performing zone, and spend little, if any, in the learning zone</strong>. In the performing zone, we repeat and practice what we already know. We continue to demonstrate the same set of capabilities intent on minimizing mistakes and being effective.</p>
<p>Learning zone, on the other hand, is where we “<a href="http://blog.mindsetworks.com/entry/transforming-school-from-performance-to-learning">engage in activities designed for improvement, fully concentrated on what (we) haven’t mastered yet, and expecting to make mistakes from which (we) can learn</a>”.</p>
<p>To quote from Eduardo’s TED talk <a href="https://www.ted.com/talks/eduardo_briceno_how_to_get_better_at_the_things_you_care_about">How to get better at the things you care about</a>,</p>
<blockquote>
<p>The reason many of us don’t improve much despite our hard work is that we tend to spend almost all of our time in the performance zone. This hinders our growth, and ironically, over the long term, also our performance.</p>
</blockquote>
<p>However, time for learning zone does not create by itself. I needed to explicitly carve out time to be in the learning zone. The simplest way to carve out time for learning is to limit the number of meetings where I’m expected to be just in the performing zone.</p>
<p>The third source that is helping calibrate my time in meetings is Cal Newport’s <a href="http://calnewport.com/books/deep-work/">Deep Work</a>. Cal describes Deep Work and Shallow Work as follows.</p>
<blockquote>
<p><strong>Deep Work:</strong> Professional activities performed in a state of distraction-free concentration that push your cognitive capabilities to their limit. These efforts create new value, improve your skill, and are hard to replicate.</p>
</blockquote>
<blockquote>
<p><strong>Shallow Work:</strong> Non-cognitively demanding, logistical-style tasks, often performed while distracted. These efforts tend to not create much new value in the world and are easy to replicate.</p>
</blockquote>
<p>Though being in the performing zone does not necessarily mean shallow work, deep work does require long durations of distraction free work time.</p>
<p>So, what’s the most important work I do at the end of every work week? It is curating next week’s calendar.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Paying it Forward]]></title>
            <link href="https://www.subbu.org/articles/2017/paying-it-forward/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/paying-it-forward/</id>
            
            
            <published>2017-07-31T22:57:18+00:00</published>
            <updated>2017-07-31T22:57:18+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I recently had an opportunity to volunteer for an Indonesian company called Vasham through the RippleWorks Foundation. Over a period of…</blockquote><p>I recently had an opportunity to volunteer for an Indonesian company called <a href="http://vasham.co.id/">Vasham</a> through the <a href="http://www.rippleworks.org/">RippleWorks Foundation</a>. Over a period of four months, I worked with Vasham’s IT and leadership teams to observe, review, and help define a roadmap and teach some habits to practice execution. My role was more that of a coach than that of a problem solver. This four month experience allowed me to peek out of the West Coast tech bubble and work with a passionate group of individuals committed for a cause in Indonesia.</p>
<p><img src="/img/1__EuAKY5LCx____QPakt1l2GuQ.png" alt="">
<img src="/img/1__ta9jFMir2xp7uH6AHJer__Q.png" alt=""></p>
<p>RippleWorks pairs up volunteer experts with social ventures like Vasham throughout the world. Vasham is a four year old Indonesian venture that wants to bring small Indonesian farmers above the poverty line by providing financing, expertise, and income security through out the farming cycle. There are at least 18 million farmers living below the global poverty line in Indonesia. Most of these farmers own small pieces of land, often about 2 acres. The farming cycle includes procuring farm inputs, farming, harvesting, and selling the the yield. Vasham plays a role in most of these activities through field operations, IT, financing, and procurement.</p>
<h3 id="making-people-worktogether">Making People Work Together</h3>
<p>Vasham originally requested me to review their IT roadmap, improve efficiency, and help create a short-term (about a year) and a long-term (three years) IT roadmap. Vasham’s leadership walked me through their vision for the future, expected growth, and their technology needs. Given that the scope is an IT roadmap, I started my work with a technology lens.</p>
<p>Over the last four years, Vasham has been iterating with a few business processes to support the farming cycle, and built some IT systems to support those processes. It therefore made good sense for me in the beginning to shine spotlight on integration of their systems, automation of manual processes, and modernization of their technology stack.</p>
<p>However, this approach didn’t take me far enough. The more time I spent understanding the team, their organization, efficiencies and inefficiencies, and their operating constraints, the more I realized that lack of a technology architecture and a roadmap is not the problem. What Vasham needed was an ability to break down ambiguity, learn to be data driven, improve partnership between IT and operations, practice incremental execution, and deliberately turn unplanned work into planned work. These are common challenges for any growing organization.</p>
<p>Once this became clear, we switched gears to the following:</p>
<ul>
<li>How to measure efficiency of their business processes through certain KPIs, and identify poorly performing areas</li>
<li>How to do agile planning to define a few work streams, and show how to prioritize</li>
<li>How to practice daily stand-ups, biweekly planning and retrospective sessions</li>
<li>How to let the leadership team facilitate feedback loops between their IT, operations, and finance teams through regular operations reviews</li>
</ul>
<p>My four month volunteering experience with Vasham helped me reinforce a few points.</p>
<ul>
<li>First, irrespective of how an organization is structured, it is important to establish, nurture and maintain feedback loops between teams to make the organization learn and function efficiently.</li>
<li>Second, roadmaps are relatively easy. The hard part is forming sustainable habits that get you there. These habits should let the teams measure, summarize, share, take feedback, and improve.</li>
<li>Third, the belief that tech talent is not acquirable is pervasive. I had to challenge Vasham’s IT team that they too can be good at Python (one of their internal systems was built in Python) by just making continuous learning a part of their jobs.</li>
</ul>
<h3 id="pay-itforward">Pay it Forward</h3>
<p>There are many ventures like Vasham that are trying to solve problems off the beaten path. The problems are ambiguous. Constraints are severe. Sponsorship is hard to get. These problems need a mixture of technology and human operations to create an impact. Attracting skilled and experienced individuals to work for such organizations is a constant struggle.</p>
<p>Here is my appeal. Seek the opportunity to volunteer for organizations like the RippleWorks Foundation, and pay it forward. I know I’m looking forward to my next one. It’s the least we can do. Bersama kita bisa. Together we can.</p>
<p><img src="/img/1__rgKP1LhuIFKn__LPiIM6oUA.png" alt=""></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[DevOps, Postmortems and Cloud Spend]]></title>
            <link href="https://www.subbu.org/articles/2017/devops-postmortems-and-cloud-spend/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/devops-postmortems-and-cloud-spend/</id>
            
            
            <published>2017-07-27T15:45:34+00:00</published>
            <updated>2017-07-27T15:45:34+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As I wrote previously here, here, and most recently here, I’m a strong advocate and practitioner of “cost awareness as part of DevOps…</blockquote><p>As I wrote previously <a href="https://m.subbu.org/state-of-aws-compute-pricing-600abe1a3ff6">here</a>, <a href="https://medium.com/expedia-engineering/cloud-and-finance-lessons-learned-d54d626d4bc7">here</a>, and most recently <a href="https://m.subbu.org/devops-is-not-devops-fba20cc3e384">here</a>, I’m a strong advocate and practitioner of “cost awareness as part of DevOps culture”. Cost related activities like choosing the architecture with cost in mind, forecasting for scale, and optimization to reduce waste are some of the several activities that DevOps teams need to conduct in order for autonomous teams to succeed.</p>
<p>In this culture, spikes or unexpected patterns in cloud spend are like production incidents. What do you do when you’ve a production incident? Once you restore the system, you conduct a postmortem, ask the whys, make observations, note lessons learned, and take corrective actions for the future.</p>
<p>That’s exactly what we did yesterday as we were analyzing numbers for a prior month. We observed that the spend is not in line with the expected. We conducted a postmortem asking the whys. Here is a simplified version.</p>
<blockquote>
<p><strong><em>Issue:</em></strong> <em>We spent more that we expected by a certain amount</em>.</p>
<p><strong><em>Metrics observed:</em></strong></p>
<p>Ratio of reserved (EC2 and non-EC2 combined) to on-demand instances: Fell from 71% to 64%</p>
<p>Utilization of reserved instances: Remained at 96%</p>
<p>Volume of compute: Increased as expected with forecast</p>
<p>Price per unit of compute (an aggregate metric to spot trends): Increased from $x to $y</p>
<p>Compute vs network costs: Marginally increased inline with forecast</p>
<p><strong><em>Whys:</em></strong></p>
<p><strong><em>1. Why did the ratio of reserved to on-demand instances fall?</em></strong></p>
<p>Because we ran out of reserved instances for certain instance types, and paid on-demand price.</p>
<p><strong><em>2. Why did the reserved instance utilization remain the same?</em></strong></p>
<p>Probably because some teams switched instance types.</p>
<p><strong><em>3. What are the most expensive instance types in the month?</em></strong></p>
<p>r4.2xlarge, …</p>
<p><strong><em>4. What is the reservation coverage and utilization of the most expensive instance type</em>?</strong></p>
<p>39% coverage, and 100% utilization.</p>
<p><strong><em>5. Which teams use that instance type, when did they switch, and what were they using before?</em></strong></p>
<p>Team X switched from another instance type with 74% coverage with 100% utilization during the middle of the month.</p>
<p>… …</p>
<p><strong><em>6. Why did we not observe this sooner to take corrective action?</em></strong></p>
<p>Due to billing delays, our weekly review cycle did not spot the increase. Since the purchasing cycle is also time consuming, we could not have the corrective actions in time to influence the current month.</p>
<p><strong>7. Why did those teams change from instance types that have more coverage to instance types that have less coverage?</strong></p>
<p>They didn’t know. One of the teams thought that they were saving money by switching instance types while getting better CPU to memory ratio that they needed. They didn’t have access to the reservation pool, and even those with access to data could not tell if/how their usage has an impact on the overall reservation pool.</p>
</blockquote>
<p>We still had more questions and some hypothesis to validate, but we also found some smoking guns that could explain the change. What did we learn from this?</p>
<ol>
<li>On any cloud, as a team using cloud services, you are still responsible to design for, forecast, and optimize for cost.</li>
<li>The shorter the feedback loop between spend and the teams creating and running software, the better. Our current feedback loops are not short enough.</li>
<li>Savings through reserved instance purchase is a complex game, and you can only play it for a while. There are not enough tools in the world to play this game efficiently and forever.</li>
<li>Regardless of reserved instances, the portfolio of services on public clouds is still evolving. The pricing models have room to evolve.</li>
<li>As we see in phone and cable bills, price complexity helps the providers, and not the consumer. Whenever you look at these bills, you would always ask, am I paying more than I should, and am I subscribing to services that I don’t need. Definitely not a good feeling.</li>
<li>Stringent measures like governance committees and capacity approval boards are not an option. They spoil the culture.</li>
<li>Simplicity, where are you?</li>
</ol>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[DevOps is not DevOps]]></title>
            <link href="https://www.subbu.org/articles/2017/devops-is-not-devops/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/devops-is-not-devops/</id>
            
            
            <published>2017-06-21T14:05:05+00:00</published>
            <updated>2017-06-21T14:05:05+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I learned DevOps the hard way about five years ago when I inherited some infrastructure and software that had zero automation and…</blockquote><p>I learned DevOps the hard way about five years ago when I inherited some infrastructure and software that had zero automation and monitoring. Since then, I’ve run into many teams that called themselves as “DevOps team”. My most recent encounter was with a team that wanted me to review their “DevOps” org structure and portfolio. By the end of that conversation, that team thankfully changed their name into something more appropriate. They were just building a set of automation tools for other teams to use.</p>
<p>During this time, I’ve also run into some really good engineering teams that simply didn’t want to have anything to do with DevOps. Their rationale was that operations work is menial, and they didn’t want to waste their precious team deploying, upgrading, monitoring and performing other upkeep tasks. Let someone else deal with those was their answer. They just wanted to keep coding.</p>
<p>I’ve also come across another kind of engineering teams that originally embraced the DevOps mindset, built some automation, practiced some level of CI and CD tasks, but failed to keep the automation up to date with their software architecture. I recently met someone from one such team, who was hoping that another team would take over some of their core components and their operational responsibilities. His team was not able to keep up with those responsibilities. The other team in his case was a centralized team that manages an odd assortment of tools and systems that nobody else wants to manage.</p>
<p>Another team that started with a similar DevOps mindset ended up hiring a “DevOps” manager and creating a “DevOps team” to take care of operations as they could not improve their automation and operational processes to meet the increased scale.</p>
<p>I feel sorry for such teams. They were all missing an important element called feedback, and potentially paying a price. However, lecturing such teams that they must own and take care of their software themselves may not be effective.</p>
<h2 id="think-feedback">Think Feedback</h2>
<p>A better approach may be to probe about how they intend to maintain feedback between all aspects of software lifecycle such as architecting, coding, shipping, running, and operating their software so that they can be agile. Ask about how long any existing feedback processes take.</p>
<p>Here is why. DevOps is nothing but a culture of maintaining short and healthy feedback loops between all lifecycle activities related to creating and running software and systems.</p>
<p><img src="/img/1__Ld40__dXZz9RzvIlS9fqfLA__2x.jpeg" alt=""></p>
<p>The shorter the feedback loop between these activities is, the more agile the team can be. Agile teams have a better chance to learn quickly from mistakes. Their architectures can evolve fast. They are less likely to pick architectures or processes that do not support reasonably quick feedback.</p>
<p>When feedback loops through these activities are long, mistakes take longer to observe. Corrective actions take even longer to yield results. More important, hypotheses remain untested for months. Ground can shift in the interim.</p>
<p>Below is an example that shows potential interdependendencies between architecture and code, automated delivery, monitoring and SLA management, chaos experiments, and cost forecasting and optimization.</p>
<p><img src="/img/1__6PqP__N8LgP7zhqAQM2bGbQ__2x.jpeg" alt=""></p>
<p>Each of these functions impact one or more of the others. For instance, analysis of the architecture tells how to test for failures, while a chaos experiment may reveal some inherent weaknesses in the architecture or the absence of some resiliency patterns in the code. Similarly, the architecture chosen may be prohibitively expensive to run when fully adopted, and thus may require changes to the architecture itself.</p>
<p>You therefore want the arrows between various functions take as little time as possible, so that you can apply lessons learned and be able to iterate. A team that practices all these feedback loops is more likely to succeed than a team that does not. Org structures and team names don’t matter as long as there are healthy and short feedback loops between various functions.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[How do We Manage Cloud Spend at Expedia]]></title>
            <link href="https://www.subbu.org/articles/2017/how-do-we-manage-cloud-spend-at-expedia/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/how-do-we-manage-cloud-spend-at-expedia/</id>
            
            
            <published>2017-05-20T16:18:03+00:00</published>
            <updated>2017-05-20T16:18:03+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Since writing State of AWS Compute Pricing, several people asked me how we manage the cloud spend at Expedia. My colleague Abiade Adedoyin…</blockquote><p>Since writing <a href="https://m.subbu.org/state-of-aws-compute-pricing-600abe1a3ff6">State of AWS Compute Pricing</a>, several people asked me how we manage the cloud spend at Expedia. My colleague <a href="https://www.linkedin.com/in/abiadeadedoyin/">Abiade Adedoyin</a> and I just published a detailed article on our tech blog, titled “<a href="https://medium.com/expedia-engineering/cloud-and-finance-lessons-learned-d54d626d4bc7">Cloud and Finance — Lessons learned</a>”. Not so surprisingly, the central theme of our cloud cost management is to make cost awareness as a part of our DevOps culture. Read the article to find more.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[There is No Pendulum]]></title>
            <link href="https://www.subbu.org/articles/2017/there-is-no-pendulum/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/there-is-no-pendulum/</id>
            
            
            <published>2017-04-13T23:29:27+00:00</published>
            <updated>2017-04-13T23:29:27+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As public cloud spend goes up, will the pendulum swing back to enterprise data centers? Sorry, but there is no pendulum to swing back.</blockquote><p>As public cloud spend goes up, will the pendulum swing back to enterprise data centers? Sorry, but there is no pendulum to swing back.</p>
<p><img src="/img/1__SM__GcWN____TLQ5nJEE2dSGg__2x.jpeg" alt=""></p>
<p>A pendulum exists only when you treat a public cloud as a compute center and not as a platform.</p>
<p>The top three clouds offer 60–100 services each today. These are well integrated to help get a lot of work done. Each of these have ecosystem of services built around them, and are growing strong as platforms. The fact that each of these platforms run in compute centers is just a necessary detail. Once you start building businesses on top of these platforms and are generating value, there is no going back.</p>
<p>Here is an analogy. Smart phones are certainly more expensive than feature phones. But feature phones are not coming back. Today’s smart phones are build around platforms.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[How to Think About Multi-Cloud]]></title>
            <link href="https://www.subbu.org/articles/2017/how-to-think-about-multi-cloud/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/how-to-think-about-multi-cloud/</id>
            
            
            <published>2017-03-12T15:32:45+00:00</published>
            <updated>2017-03-12T15:32:45+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Public clouds are no longer equivalent. These are platforms with some overlapping basic capabilities and yet different in many respects…</blockquote><p>Public clouds are no longer equivalent. These are platforms with some overlapping basic capabilities and yet different in many respects. Here are a few factors I would consider when thinking of multiple clouds.</p>
<ol>
<li>Multi-cloud is not a resiliency play. It’s not necessarily going to shield you from any particular provider having a bad day. Any tech company undergoing rapid rate of change is going to have bad days. Recent <a href="https://aws.amazon.com/message/41926/">s3 outage</a> did prompt some questions in some online and offline conversations, and multi-cloud is not the answer to survive such incidents. Design for <a href="https://m.subbu.org/fault-domains-and-the-vegas-rule-923fc037119#.8elf5puwa">fault domains and fault isolation</a>, and practice <a href="http://principlesofchaos.org/">chaos engineering</a> instead.</li>
<li>Don’t worry too much about <a href="https://m.subbu.org/cloud-lock-in-and-change-agility-78d63978ddfd?source=linkShare-6774b15f8e80-1489331043">lock-in</a> at this time. The differences between public clouds are significant. The value of any public cloud is in the platform aspects and not the basic primitives. Abstractions to prevent lock-in introduce operational complexity and limit you to common denominator primitives like virtual machines.</li>
<li>A better strategy may be to use different providers for different types of workloads based on suitability of the provider’s platform capabilities for that workload. I would also keep any cross-provider data exchange asynchronous.</li>
<li>Above all, maintain <a href="https://m.subbu.org/fault-domains-and-the-vegas-rule-923fc037119#.8elf5puwa">fault domain boundaries</a>. When you scatter your critical workloads across multiple providers’ regions, you might end up with large fault domains across those regions. This can make reasoning about resiliency hard and lead to longer times to recover. For instance, I would not put the front-end in one provider’s region, and the back-end in another provider’s region except when availability of that application is not critical.</li>
</ol>
<p>The same considerations apply for hybrid-cloud too.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[State of AWS Compute Pricing]]></title>
            <link href="https://www.subbu.org/articles/2017/state-of-aws-compute-pricing/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/state-of-aws-compute-pricing/</id>
            
            
            <published>2017-02-25T23:17:09+00:00</published>
            <updated>2017-02-25T23:17:09+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>As flexible as it is, compute in AWS is optimized for the old capex world. It is a world where demands are predictable, consumption can be…</blockquote><p>As flexible as it is, compute in AWS is optimized for the old capex world. It is a world where demands are predictable, consumption can be planned upfront, and things don’t change often. A culture of centralization for forecasting and budgeting, and approvals to determine who can use what and for how long, helps remain optimal in this world. In other words, you have to think and act like an efficient enterprise data center operator, and not as a cloud user to get the most bang for the buck. On the other hand, if you have bought into elasticity, on-demand consumption patterns, seasonal highs and lows, a culture of choice, and incremental test-and-learn development, you have to brace yourself for some complexity.</p>
<p><img src="/img/1__Tl3rth8oPOYaas__yaJO1PA.png" alt=""></p>
<h2 id="instance-reservation-is-an-anti-pattern">Instance Reservation is an Anti-Pattern</h2>
<p>I’m not the first one to say this. Reserving compute instance hours for a year or three years with or without capacity guarantees for a given instance family and type is just like buying servers in data centers. It is a cloud anti-pattern, as it requires you plan your capacity needs upfront. You need to think in terms capex and not opex to use instance reservations efficiently.</p>
<p>Below is an example of what happens when you try to use instance reservations with an opex mindset (aka the cloud mindset).</p>
<p><img src="/img/1____EUcBt2TkeNm1__rKeXEj__w.jpeg" alt=""></p>
<p>Each bar in the above diagram represents number of instance hours for a given instance family/type in a given region. The number of bars grows as you consume more instance types in various regions.</p>
<p>Imagine you purchase reserved instances for certain types on a given day. A month later you look at the invoice and notice two patterns.</p>
<ol>
<li>For some instance types in certain regions, you’ve run out of reservations and are paying on-demand prices for additional instance hours. These are the bars above the line.</li>
<li>For other instance types in certain regions, you’ve not used the all the reserved hours for that month. These are under-utilized reservations shown with bars below the line.</li>
</ol>
<p>Both the types of these bars represent inefficiency. <strong>Above the line, you’re paying on-demand prices. Below the line, you’re leaving money on the table.</strong></p>
<p>The only way to reduce the sizes of these bars is by upfront planning. However, in a dynamic and elastic world, as teams figure out the right computing needs, these bars will always go up and down, and it takes continual tweaking to minimize the spread. The following are the options.</p>
<ol>
<li>Monitor reservations on a monthly basis, and purchase new reservations to avoid on-demand pricing. This helps lower the lines above the bar.</li>
<li>Create an internal spot market as once shared by <a href="http://techblog.netflix.com/2015/09/creating-your-own-ec2-spot-market.html">Netflix</a> to increase utilization of unused reservations.</li>
<li>Sell unused reservations in the spot market. However, as <a href="http://janwiersma.nl/">Jan Wiersma</a> shows, the spot market to sell reservations is a <a href="http://janwiersma.nl/?p=1640">ghost town</a>.</li>
</ol>
<p>All these options take engineering effort and involve some operational complexity. This is a result of forcing capex mindset into an opex centric cloud world.</p>
<h2 id="spot-instances-are-poor-abstractions">Spot Instances are Poor Abstractions</h2>
<p>An often suggested answer to reduce compute costs is spot instances (or Google’s <a href="https://cloud.google.com/preemptible-vms/">preemptible virtual machines</a>).</p>
<p>Spot instances shift the complexity of dynamic placement, task preemption, rescheduling, etc. from the cloud provider to the user. Spot instances work best when your workloads are idempotent, and you’ve a scheduler (like Mesos and Yarn) that can place workloads on instances, and move them around when instances go away due to changing demands in the spot market. Spot instances are not the best choice as general purpose compute.</p>
<h2 id="its-time-forchange">It’s Time for Change</h2>
<p>Capacity guarantees may be relevant for certain critical workloads for certain users. But reservations and spot Instances for cost savings don’t make sense. These are optimized for the seller and not the typical buyer. It’s time for these to die.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Fault Domains and the Vegas Rule]]></title>
            <link href="https://www.subbu.org/articles/2017/fault-domains-and-the-vegas-rule/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2017/fault-domains-and-the-vegas-rule/</id>
            
            
            <published>2017-02-17T03:50:26+00:00</published>
            <updated>2017-02-17T03:50:26+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>(Cross posted at <a href="https://techblog.expedia.com/2017/02/16/fault-domains-and-the-vegas-rule/">https://techblog.expedia.com/2017/02/16/fault-domains-and-the-vegas-rule/</a>)</blockquote><p>(Cross posted at <a href="https://techblog.expedia.com/2017/02/16/fault-domains-and-the-vegas-rule/">https://techblog.expedia.com/2017/02/16/fault-domains-and-the-vegas-rule/</a>)</p>
<p>Our teams at Expedia are active public cloud users. We use a simple design principle called the “Vegas Rule”, and a complimentary concept called “fault domain” to make resiliency-related decisions.</p>
<h2 id="fault-domain">Fault Domain</h2>
<p>A fault domain is a coarse-grained enclosure of apps, data and all the dependent infrastructure. The primary property of a fault domain is that any fault inside the fault domain does not cascade outside. All components inside the fault domain share the same fate. Below is an example. The outer circle represents a fault domain.</p>
<p><img src="/img/1__FtQQALeHedSS__ZhedKHiMA.png" alt=""></p>
<p>Any external dependency is soft, and the the services in the fault domain may, in the worst case, run in a degraded mode when that external dependency fails.</p>
<p>In order for a fault domain to be effective, a rule of thumb to apply is the Vegas Rule.</p>
<h2 id="vegas-rule">Vegas Rule</h2>
<p>Our version of the Vegas rule states that “<strong>any request that enters a fault domain is fully served inside the fault domain</strong>”. When a fault domain does not honor this rule and the request goes through services outside the fault domain, those external services automatically become part of the fault domain thus extending its size. Potential exclusions for this rule include asynchronous communication (say, for database replication) between two fault domains or with an external service.</p>
<p>Below is an example. The red arrows violate the Vegas rule thus merging two fault domains into one large fault domain.</p>
<p><img src="/img/1__yD7Ri3PLREkntWIYhT7JpQ.png" alt=""></p>
<h2 id="all-about-time-torecovery">All About Time to Recovery</h2>
<p>The real resiliency benefit of fault domains and the Vegas rule comes from having two or more fault domains. Vegas rule simplifies incident recovery procedures. Instead of identifying and fixing failing services, you can shift traffic away from a failing fault domain to other healthy fault domains.</p>
<p><img src="/img/1__il6YgJV778AdYiPSSihHzQ.png" alt=""></p>
<p>Vegas rule works for services that use active-passive databases too.</p>
<p><img src="/img/1__FbIDjsHARrtfClXcoMPnYA.png" alt=""></p>
<p>When you don’t consciously identify fault domains for apps, services and databases, or break the Vegas rule, traffic shifting may not help reduce MTTR. You may have to identify and fix failing services which increases time to recover.</p>
<p>I learned about this concept when working on provisioning and scheduling in an IaaS layer. You will find references to this concept in <a href="https://blogs.msdn.microsoft.com/plankytronixx/2015/05/01/azure-exam-prep-fault-domains-and-update-domains/">Azure</a> and <a href="https://pubs.vmware.com/vsphere-65/index.jsp?topic=%2Fcom.vmware.vsphere.virtualsan.doc%2FGUID-8491C4B0-6F94-4023-8C7A-FD7B40D0368D.html">VMWare</a> documents. The same concept works for applications and services too.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Taking the Time]]></title>
            <link href="https://www.subbu.org/articles/2016/taking-the-time/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2016/taking-the-time/</id>
            
            
            <published>2016-12-27T15:31:01+00:00</published>
            <updated>2016-12-27T15:31:01+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Linear thinking is effortless and easy. All it takes is processing events as they occur as a sequence of actions and reactions with no…</blockquote><p>Linear thinking is effortless and easy. All it takes is processing events as they occur as a sequence of actions and reactions with no regard to any interrelationships. Systems thinking, on the other hand is a “discipline for seeing wholes”. As <a href="https://en.wikipedia.org/wiki/Peter_Senge">Peter Senge</a> describes in his <a href="https://en.wikipedia.org/wiki/The_Fifth_Discipline">Fifth Discipline</a>, systems thinking “is a framework for seeing interrelationships rather than things, for seeing patterns of change rather than static snapshots” and “starts with understanding a simple concept called feedback that shows how actions can reinforce or counteract (balance) each other.” Systems thinking relies on observing existing mental models of reality, constructing new mental models, feedback loops that exist between events, and learning organizations.</p>
<p><img src="/img/1__dkZs6fg1dVkLf5K4ac97RA.png" alt=""></p>
<p>A related framework is John Boyd’s <a href="https://en.wikipedia.org/wiki/OODA_loop">Observe-Orient-Decide-Act</a> (OODA) loop, which is a feedback decision loop to continually observe, orient and decide <em>before</em> acting.</p>
<p><img src="/img/1__KCMz__yJN__igE6m4XRseKmA.png" alt=""></p>
<p>These frameworks are not new. Similar patterns exist in <a href="https://en.wikipedia.org/wiki/Control_theory">control theory</a>, <a href="https://www.infoq.com/news/2011/03/agile-feedback-loops">agile development</a>, and even in <a href="https://en.wikipedia.org/wiki/Kubernetes#Controllers">cluster managers</a>.</p>
<p>What is implicit in all these is <strong><em>taking the time</em></strong> to deal with models, feedback loops; and observations, orientation and decisions <strong><em>before taking actions.</em></strong></p>
<h3 id="busyness">Busyness</h3>
<p>While computers are good at executing feedback loops once those are implemented, it turns out that most of us are really poor at <em>taking the time</em> to deal with feedback loops at work. As email threads grow, and as meetings fill up working hours, our work lives force us to jump from event to event. Decisions happen on the fly sometimes ignoring their side effects, feedback processes, and any natural and essential delays between actions and consequences.</p>
<p>When you short-circuit the time for the feedback path, the closed loop collapses to a sequence of events in the feed-forward path, which is nothing but linear thinking. This style of working creates an illusion of increased productivity and busyness. It can simultaneously make you feel that your time is consumed by things outside your control.</p>
<p>What suffers most when you don’t take the time? Casualties include curation, narration, summarization, development of mental models, observing patterns, learning, dialog and sharing. These are all behaviors necessary for a <a href="https://en.wikipedia.org/wiki/Learning_organization">learning organization</a>.</p>
<h3 id="taking-the-time-is-notslacking">Taking the Time is not Slacking</h3>
<p>Systems thinking is a developmental activity. Development starts with taking the time. But taking the time is not slacking. It is not relaxing. It is not taking time off from work. It is about carving out the time for slow cycles that include curation, summarization, dialog, and sharing. Being fast really depends on spending some slow cycles with such activities.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Cloud Lock-in and Change Agility]]></title>
            <link href="https://www.subbu.org/articles/2016/cloud-lock-in-and-change-agility/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2016/cloud-lock-in-and-change-agility/</id>
            
            
            <published>2016-12-12T04:33:02+00:00</published>
            <updated>2016-12-12T04:33:02+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>We are entering into a future of lock-in. Public clouds are no longer someone else’s computers or hosted services. These are fast becoming…</blockquote><p>We are entering into a future of lock-in. Public clouds are no longer someone else’s computers or hosted services. These are fast becoming <em>proprietary platforms</em> with a bit of open source sprinkled in here and there. Almost everything you need to run an enterprise is now available as a pay-as-you-go platform on AWS, and Azure and GCP are not staying put.</p>
<p>As difficult as it may be to swallow and accept this trend, it is important to recognize that, anything that needs to be procured or downloaded, built, run, operated and maintained is up for lock-in. In this future, all the infrastructure primitives, software lifecycle automation services (including containers and cluster managers), what was once known as <a href="https://en.wikipedia.org/wiki/Middleware">middleware</a>, data processing platforms, the mechanics used for security and operations, as well as the all the enterprise data will be locked into to a few public clouds.</p>
<p><strong>I don’t expect any enterprise to successfully operate on, or migrate to a public cloud and yet remain insulated from the cloud provider’s platform lock-in.</strong> Sure, there are several open-source and closed solutions (for instance, those in the container, cluster management and PaaS area, big data processing engines etc, various relational and non-relational databases etc.) that aim to help you stay agnostic. But such platforms insulate you at-best from just the <em>mature</em> aspects of these cloud platforms, such as, say the IaaS layer. But none of these help you participate in the massive platform shift happening in public clouds. When you consider this shift, lock-in insulation is like having the cake and eating it too. You can’t take advantage of all the new capabilities to innovate for your business while staying agnostic to the platform.</p>
<p>In this lock-in future, techniques of the past decade and half, such as open source and abstraction layers, won’t insulate us from lock-in. This does not mean that open source, open interfaces and open protocols don’t matter. They do, and will continue to matter to drive a culture of open coding, sharing, learning, collaboration, and interoperability. But not necessarily for lock-in insulation.</p>
<p>So, what’s the answer then?</p>
<p>The answer, in my view, is <strong>practicing change agility</strong>. Change agility is an organization’s culture of continually practicing significant changes.</p>
<p>During the last fifteen years, most enterprises reacted to lock-in concerns by over-investing in abstractions such as programing frameworks, parsers, databases, communication protocols, application servers, cloud providers, you name it. At the end of it all, what’s left were past regrets and large difficult to change monoliths. <strong>Those abstractions, in effect, did nothing other than contributing to a culture of change resistance.</strong></p>
<p>A culture of change agility on the other-hand deals with changes as a matter of course and not as impediments. It embraces techniques like service orientation, asynchronous and decoupled communication patterns, micro-architectures, experimentation, failing fast, tolerance for mistakes, chaos engineering, constant feedback and continuous learning.</p>
<p>An organization adept at change agility does not see lock-in as an obstacle. It sees it as an opportunity to learn, experiment, and partake in creating its own future thus moving up the value chain. Not just once, but continually.</p>
<p>(Cross posted at <a href="https://techblog.expedia.com/2016/12/11/cloud-lock-in-and-change-agility/">https://techblog.expedia.com/2016/12/11/cloud-lock-in-and-change-agility/</a>.)</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Don’t Build Private Clouds]]></title>
            <link href="https://www.subbu.org/articles/2016/dont-build-private-clouds/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2016/dont-build-private-clouds/</id>
            
            
            <published>2016-11-24T23:54:38+00:00</published>
            <updated>2016-11-24T23:54:38+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>I’ve been noodling on this post for over a year. I discussed, debated and explained parts of what I write below with several folks during…</blockquote><p>I’ve been noodling on this post for over a year. I discussed, debated and explained parts of what I write below with several folks during this time. I also changed my jobs this year. From mid 2012 to early this year, I lead a team that built one of the largest mid-sized fairly successful private clouds. I now lead an effort to migrate several large-scale mission critical systems from on-prem enterprise data centers to a public cloud. This transition gave me the time and opportunity to refine and expand the scope of my thinking. So, here is my appeal. <strong><em>Slow down on your private cloud projects</em></strong>, <strong><em>and</em></strong> <strong><em>get out of enterprise data centers as fast you can.</em></strong> You may be shooting for a local optimum with your private cloud strategy, and not the global maximum for the business.</p>
<h2 id="you-dont-need-to-own-data-centers-unless-yourespecial"><strong>You don’t need to own data centers unless you’re special</strong></h2>
<p>There are very few enterprises in the planet right now that need to own, operate and automate data centers. Unless you’ve at least 200,000 servers in multiple locations, or you’re in specific technology industries like communications, networking, media delivery, power, etc, you shouldn’t be in the data center and private cloud business. If you’re below this threshold, you should be spending most of your time and effort in getting out of the data center and not on automating and improving your on-prem data center footprint.</p>
<p><img src="/img/1__Qb6QODEkTAYdt49qJRnWDQ.png" alt=""></p>
<p>While the overall demand for compute footprint grew across the board in the industry, the number of enterprises that <em>need to</em> build and operate data centers to host that compute has been steadily shrinking. There are multiple factors at play behind this trend.</p>
<ul>
<li>The scale, quality and the breadth of cloud services has increased manifold in the last few years. There are very few use cases that the big three public clouds can’t deal with today.</li>
<li>You no longer go to a public cloud because you needed virtual machines on demand. You go to a public cloud to consume a large buffet of services.</li>
<li>Physical compute, storage and network infrastructure is brittle, prone to failure and is not malleable. Automating these infrastructure primitives and making them ready to host apps and data is an as-a-service exercise. These services are large distributed systems that require talent, focus, trial-and-error and years of learning and operational experience. Typical enterprise IT departments are not setup to attack such problems. Trying to emulate the same within your data centers takes years, and most likely shifts your focus away from your core business. More about that below.</li>
<li>Despite what infrastructure vendors claim in their brochureware, there is no single vendor that can provide you with a full stack of capabilities that meet or exceed what a public cloud can provide.</li>
<li>There are fewer snowflake workloads that require special purpose-built hardware today than there were a decade ago. In most cases, the choice you get with designing servers is illusionary and likely backwards looking. With each passing year, it is getting cheaper and less time-consuming to solve problems using commodity software building blocks running on commodity compute.</li>
<li>Despite hundreds of millions of dollars of capex investments, most private clouds are not resilient to common infrastructure or software failures. Services to enable modern resiliency patterns rarely exist in private clouds. Consequently resiliency remains a pipe dream.</li>
</ul>
<h2 id="private-cloud-makes-you-procrastinate-doing-the-rightthings">Private cloud makes you procrastinate doing the right things</h2>
<p>When executed to its completion, a typical private cloud journey involves four key phases:</p>
<ul>
<li>Phase 1: Build private cloud, starting with compute, and then storage and network, then scale out to several independent fault domains (like public cloud regions), automate the network to make it possible to implement load balancing, DNS, and various failover patterns.</li>
<li>Phase 2: Move your stateless monoliths to the private cloud. Most enterprise have at least one generation of such monoliths.</li>
<li>Phase 3: Then deal with the stateful monoliths. These are your large monolithic databases running on handcrafted hardware. This is usually where private cloud journey hits the wall due to the risk and complexity in making such monoliths cloud native.</li>
<li>Phase 4: Then transform your culture to operate as a cloud native organization.</li>
</ul>
<p><img src="/img/1__6rkj6frEx5Bf8__s6sIi__9A.png" alt=""></p>
<p>This is a multi-year journey with each phase involving several hurdles and taking years to execute.</p>
<p>Would you start with Phase 1 in an on-prem data center, or go directly to Phases 2 on a public cloud?</p>
<h2 id="private-cloud-cost-models-are-misleading">Private cloud cost models are misleading</h2>
<p>A typical server with modern specs can cost between $5000 and $10,000 and can last for 4 years. A public cloud virtual machine with comparable specs can cost between $1000 and $1500 per month. Such comparisons make private cloud strategies compelling. However, there are additional costs to add.</p>
<ol>
<li>Engineering costs to build and operate cloud services</li>
<li>Cost of automating the network (note that no network vendor wants you to automate with open APIs)</li>
<li>Cost of lost agility due to long planning, procurement and on-boarding cycles</li>
<li>Cost of lost business opportunity due to time spend building a private cloud</li>
</ol>
<h2 id="dont-underestimate-on-prem-data-center-influence-on-your-organizations-culture">Don’t underestimate on-prem data center influence on your organization’s culture</h2>
<p>The state of infrastructure influences your organizational culture. A modern enterprise running on programmable cloud contributes to autonomous teams, rapid learning, and faster iterations of ideas. Brittle, time-consuming, human-operator driven, ticket based on-premises infrastructure on the other-hand brews a culture of mistrust, centralization, dependency and control.</p>
<p><img src="/img/1____EO____NEbQGFp4hJ1naGKqg.png" alt=""></p>
<p>Say, for instance, a team wants to enable TLS all the way from load balancers to their app servers. Such a team will likely have to deal with networking teams, security teams, and potentially several middle managers to execute the change over a period of several weeks if not months. The same team could execute this change on a public cloud in under a week and move on to the next thing. There are numerous examples like this.</p>
<p>These difference between on-premises data centers and public clouds influence how teams think, plan and execute. These are nothing but attributes of culture.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[On Influencing]]></title>
            <link href="https://www.subbu.org/articles/2016/on-influencing/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2016/on-influencing/</id>
            
            
            <published>2016-08-07T18:04:02+00:00</published>
            <updated>2016-08-07T18:04:02+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>“You need to be visible and influence more to grow in your career” was the gist of feedback that I had received and ignored a few times during my career as an individual contributor. I didn’t find such feedback useful the first few times, as I didn’t really understand what it means to influence, why it matters, or how to influence.</blockquote><p>“You need to be visible and influence more to grow in your career” was the gist of feedback that I had received and ignored a few times during my career as an individual contributor. I didn’t find such feedback useful the first few times, as I didn’t really understand what it means to influence, why it matters, or how to influence.</p>
<p>I was also not really open and willing to understand why influence matters at that time. For all I cared, influence was a jargon word. My attitude was that I just had to work hard and try to excel as much as I could, and everything else would follow. I couldn’t be more wrong.</p>
<p>Two things have had to happen to change my perspective. First, I was entrusted with opportunities to lead efforts that required formation of large teams, and collaboration with several talented individuals. Second, I also got a chance to work with and closely observe a few influential leaders lead through conflict and change. Both meant a personal struggle to understand how to work with others, how to seek collaboration and support, how to make compromises, and more importantly, how to make a positive dent on initiatives that no single individual can do alone.</p>
<p>Individual contributor roles in tech organizations share a few common expectations like (a) being able to create, such as coding, (b) being able to architect and lead, and (c) ability to make a positive impact for the business. Other than the ability to create, these expectations demand influencing and leadership. However, sadly, individual contributors neither get the coaching nor the mentoring to help them lead others.</p>
<p>Most individual contributors consequently end up making some mistakes:</p>
<ul>
<li>Assume that only managerial roles are influential to let them command collaboration and alignment</li>
<li>Focus a lot on ideas to solve technical problems, but struggle to get the support they need to execute on those ideas</li>
<li>Take a passive advisory attitude towards outcomes thinking that outcomes are so-called management’s problems</li>
</ul>
<p>Here are a few that helped me unravel this puzzle of influencing.</p>
<p>First, <strong>realize that leadership is not a title, but is a role others permit you to play</strong>. It does not matter whether you are an individual contributor or whether your title at work includes “manager” or a “director”. You are at the mercy of your team to give you the permission to lead them. Your success as a leader depends on getting and keeping that permission. If you’re unsure about this, read John Maxwell’s <a href="https://www.amazon.com/Levels-Leadership-Proven-Maximize-Potential/dp/1599953633/">The Five Levels of Leadership</a>.</p>
<p>Second, <strong>as important as sound technical ideas are, you can’t always be the fastest horse to generate the best ideas and execute on them</strong>. Many others are potentially looking at the same set of problems as you are, and will very likely come to similar conclusions. You don’t have monopoly on ideas. Period.</p>
<p>Third, <strong>empathize with the business and develop the context</strong>. I’ve heard some very senior individual contributors proclaim that it is the management’s problem to implement their ideas, or to adopt their creation. However, you can’t influence change unless you empathize with the things you want to change.</p>
<p>On the subject of empathy, I’ve an experience to share. Years ago, I wrote a piece of software called <a href="https://github.com/ql-io/ql.io">ql.io</a>. I was extremely passionate about the ideas, and executed hard and fast. I orphaned the project about a year later as it failed to gain adoption. In retrospect, though my ideas were valid and the problems my ideas were addressing were real, I failed to develop the context under which teams were facing those problems. I was furious at the problems I was trying to solve, but failed to empathize with the people dealing with those problems. Teams that looked at ql.io liked what they saw, but could not quite figure out how to incorportate it into their apps. Consequently, I could not get the adoption that I depended on. The lesson I learned from that experience was that I need to understand the context, and empathize with the people and their current technical environment. No matter how great the ideas are, you can’t balloon-drop solutions.</p>
<p>Fourth, <strong>instead of trying to mint solutions to solve problems, help others develop better mental models to solve problems on their own</strong>. As Peter Senge says in his <a href="https://www.amazon.com/Fifth-Discipline-Practice-Learning-Organization/dp/0385260954">The Fifth Discipline</a>, teams and organizations trap themselves in defensive routines that insulate their mental models from examination. It is often the established mental models, including your own, that prevent change from happening. Inquire into those mental models first.</p>
<p>Finally, <strong>resist the temptation to intervene into everything</strong>. As you grow up in the hierarchy and stay long enough in any organization, you will get an opportunity to see most things as they happen. This gives you a chance to jump into every conversation and voice your opinions. Resist that urge to intervene, let things pass, take an observer role, and intervene only when absolutely necessary. <strong>Inquiry into mental models starts with observation and not intervention</strong>.</p>
<p>As John Maxwell says in his book, “Leadership is much less about what you do, and much more about who you are”.</p>
<p><em>Originally published at</em> <a href="https://www.subbu.org/blog/2016/08/on-influencing">https://www.subbu.org/blog/2016/08/on-influencing</a>.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Turning Containers into Cattle]]></title>
            <link href="https://www.subbu.org/articles/2016/turning-containers-into-cattle/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2016/turning-containers-into-cattle/</id>
            
            
            <published>2016-02-21T17:23:56+00:00</published>
            <updated>2016-02-21T17:23:56+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Below are slides from my talk at Container World on Feb 17 2016 at the Santa Clara Convention Center.</blockquote><p>Below are slides from my talk at Container World on Feb 17 2016 at the Santa Clara Convention Center.</p>
<p><a href="https://docs.google.com/presentation/d/15GsScR4q8pKOxRyVzFiowKHDoW8Kgtr7cJgQe_0C9pg/embed?start=false&amp;loop=false&amp;delayms=3000" title="https://docs.google.com/presentation/d/15GsScR4q8pKOxRyVzFiowKHDoW8Kgtr7cJgQe_0C9pg/embed?start=false&amp;loop=false&amp;delayms=3000"><strong>Turning Containers into Cattle</strong><br>
_Turning Containers into Cattle Subbu Allamaraju Container World Feb 2016_docs.google.com</a><a href="https://docs.google.com/presentation/d/15GsScR4q8pKOxRyVzFiowKHDoW8Kgtr7cJgQe_0C9pg/embed?start=false&amp;loop=false&amp;delayms=3000"></a></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[It’s the Manageability Stupid]]></title>
            <link href="https://www.subbu.org/articles/2015/its-the-manageability-stupid/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2015/its-the-manageability-stupid/</id>
            
            
            <published>2015-11-10T06:29:23+00:00</published>
            <updated>2015-11-10T06:29:23+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>We’re living in interesting times. Till 4–5 years ago, infrastructure used to be locked by review boards and tickets. Open source has been slowly changing this world. Take OpenStack, Docker, Mesos, Kubernetes, you name it. &hellip;</blockquote><p>We’re living in interesting times. Till 4–5 years ago, infrastructure used to be locked by review boards and tickets. Open source has been slowly changing this world. Take OpenStack, Docker, Mesos, Kubernetes, you name it.</p>
<p>But here is a message for everyone jumping into these. If you don’t understand manageability you will fail. Failure won’t happen immediately, but you will go through some phases over a period of time.</p>
<p><img src="/img/1__dfTJ__8DvdcEhVNHMpgdIxg.png" alt=""></p>
<p>I’ll give a few simple reasons:</p>
<ul>
<li>Infrastructure is brittle. It takes a lot of automation to make it malleable.</li>
<li>Most infrastructure software is distributed. Understanding their failure modes and designing for failure are non-trivial exercises.</li>
<li>It takes a lot of software to manage these systems at scale, and you need to apply software engineering to operational tasks.</li>
<li>There is no free lunch.</li>
</ul>
<p>Don’t pick X, where X is any of the above tech, just because some name brand company picked it or event built it. Pick X only if you’re prepared for the long haul and ready to build a ton of software to manage X.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Lessons from the Cloud Bunker]]></title>
            <link href="https://www.subbu.org/articles/2015/lessons-from-the-cloud-bunker/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2015/lessons-from-the-cloud-bunker/</id>
            
            
            <published>2015-08-16T21:35:30+00:00</published>
            <updated>2015-08-16T21:35:30+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>It’s been just over three years since I started working on building a fairly large cloud infrastructure at eBay. Our initial focus was to make infrastructure programmable and to enable agility through self-service APIs with some checks and balances for efficiency, security and availability. &hellip;</blockquote><p>It’s been just over three years since I started working on building a fairly large cloud infrastructure at eBay. Our initial focus was to make infrastructure programmable and to enable agility through self-service APIs with some checks and balances for efficiency, security and availability. This model put infrastructure basics like compute, network and block/object storage in front of every developer at eBay. Though this allowed adoption of a wide variety workloads in our data centers, this journey also taught me a couple of very valuable lessons.</p>
<h4 id="dont-bet-on-ephemeral-cloud-abstractions">Don’t bet on ephemeral cloud abstractions</h4>
<p>Ephemeral abstractions are things that fail. These may not recover from failures. The best example is a compute (e.g. a VM) with a local disk, an IP address and a hostname.</p>
<p>At the bottom of every public or private cloud stack diagram is the IaaS layer consisting of such ephemeral abstractions. Almost all IaaS layers implement a decade-old playbook from AWS. This playbook has three steps:</p>
<ol>
<li>Automate infrastructure abstractions like compute, block storage, and various network functions and offer APIs to manipulate those abstractions.</li>
<li>Provide additional services for metrics, monitoring, orchestration etc.</li>
<li>Expect users to put together a closed-loop automation layer using (1) and (2) to make their apps resilient to infrastructure failures.</li>
</ol>
<p>As important and hard as steps (1) and (2) are, the basic flaw with this approach is that the amount of engineering it takes to implement step (3) is non-trivial. Very few get it right. Consequently, most users of these abstractions subject their apps to infrastructure failures and remain concerned about cloud not meeting their expectations.</p>
<p>Here is why.</p>
<p>In order to make apps resilient to failures at the bottom of the stack (which includes ephemeral abstractions), the user is expected to monitor and detect failures, and bring each app back to its desired state as quickly as possible. This is not an operational or even a dev-ops problem. This is a software engineering problem consisting of what we call at work as the closed-loop P-D-M-R cycle.</p>
<p><img src="/img/1__5cHWuk6qk67egYUPBhW__3w.png" alt=""></p>
<p>The steps in this closed loop are self-explanatory. Without the “monitor and detect”, and “remediate” phases, as infrastructure failures happen, apps drift from their desired state.</p>
<p>This playbook worked out well for those in the industry that understood this ephemeral nature, and then have invested engineering efforts to build software for step (3) above. For the rest, this playbook is a breeding ground for pets. Consumers of pets of course will want pet-friendly solutions like live-migration, VMs that run on shared storage, IP mobility, or their own “highly-available racks” (pun intended). This is a slippery slope.</p>
<p>Moreover, most cloud providers, including open-source cloud controller software like OpenStack, don’t even offer all the building blocks necessary to implement a closed loop P-D-M-R cycle. In those environments, remediation exercises tend to be human/ticket driven.</p>
<p>Here is the net lesson. Having things that fail as the primary interface to cloud may have been an acceptable cloud strategy in 2005, but not anymore.</p>
<h4 id="the-future-is-durable-and-declarative-abstractions">The future is durable and declarative abstractions</h4>
<p>It is time to think of cloud as a provider of durable cloud native abstractions that are resilient to failures. The term “cloud native” is fairly new with no clear definition. I would describe a cloud native abstraction as one with two fundamental characteristics:</p>
<ul>
<li><em>Durable:</em> The abstraction may be built using ephemeral parts, but the abstraction itself is durable in the sense that it survives failure of its parts.</li>
<li><em>Declarative:</em> The user of the abstraction declares the desired state, and the service providing that abstraction attempts to maintain the abstraction in that desired state.</li>
</ul>
<p>A virtual or a physical machine is neither durable nor cloud-native. Neither is a container. But a cluster of Kubernetes pods is a durable and declarative abstraction. To a lesser extent, a Marathon managed cluster of containers is also durable and declarative.</p>
<p>In the world of cloud native abstractions, you wouldn’t put together the P-D-M-R closed loop using the IaaS primitives. You would instead create durable abstractions that automate and shield you from having to deal with the complexities of the P-D-M-R cycle. You set a desired state when creating that abstraction, and the provider will try to maintain the desired state. The desired state could be as simple as the size of the cluster, or as sophisticated as some application KPIs.</p>
<p>Having closely dealt with infrastructure failures and the complexities of making applications resilient to such failures, I’m confident to say that the end of the era of ephemeral abstractions has finally begun. Durable and declarative cloud native abstractions are the future of cloud.</p>
<p>Does it mean that IaaS is dead? I don’t think so. You still need the ability to create parts (e.g. a VM or a network port or a block of storage) when creating durable abstractions, but most users of cloud shouldn’t have to deal with such operations. That layer will eventually become a pure provider-side internal layer.</p>
<p><em>Originally published at</em> <a href="https://www.subbu.org/blog/2015/08/lessons-from-the-cloud-bunker">https://www.subbu.org/blog/2015/08/lessons-from-the-cloud-bunker</a>.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[OpenStack Summit Keynote Video and Slides]]></title>
            <link href="https://www.subbu.org/articles/2015/openstack-summit-keynote-video-and-slides/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2015/openstack-summit-keynote-video-and-slides/</id>
            
            
            <published>2015-06-01T01:35:57+00:00</published>
            <updated>2015-06-01T01:35:57+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>At eBay and PayPal, we been a power user of OpenStack to provide infrastructure building blocks via OpenStack services. I had the opportunity to share details of our OpenStack journey during a keynote at the OpenStack Summit in Vancouver on May 19, 2015. Here is the video and the slides.</blockquote><p>At eBay and PayPal, we been a power user of OpenStack to provide infrastructure building blocks via OpenStack services. I had the opportunity to share details of our OpenStack journey during a keynote at the OpenStack Summit in Vancouver on May 19, 2015. Here is the video and the slides.</p>
<p><a href="//www.slideshare.net/sallamar/journey-and-future-of-openstack-ebay-and-paypal" title="Journey and future of OpenStack eBay and PayPal"><strong>Journey and future of OpenStack eBay and PayPal</strong></a> from <a href="//www.slideshare.net/sallamar"><strong>Subbu Allamaraju</strong></a></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Give Me Bare-Metal]]></title>
            <link href="https://www.subbu.org/articles/2014/give-me-bare-metal/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2014/give-me-bare-metal/</id>
            
            
            <published>2014-11-10T21:43:40+00:00</published>
            <updated>2014-11-10T21:43:40+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>“Give me bare-metal. I can put together what I need myself. I don’t need a cloud” — this is the gist of some comments I came across in recent months.</blockquote><p>“Give me bare-metal. I can put together what I need myself. I don’t need a cloud” — this is the gist of some comments I came across in recent months. One of the commenters just experienced <a href="https://www.docker.com/">Docker</a>. Another managed to spin a cluster of front end apps in a few minutes using the <a href="https://github.com/mesosphere/marathon">Marathon framework</a> on <a href="http://mesos.apache.org/">Mesos</a>. I even heard a similar comment from a someone from the <a href="http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html">Yarn</a> community; see <a href="http://hortonworks.com/blog/docker-kubernetes-apache-hadoop-yarn/">Docker &amp; Kubernetes on Apache Hadoop YARN</a> for an example. However naive such a comment sounds like, I could not ignore the underlying sense of empowerment from using talk-of-the-day tech like Docker, Mesos, and <a href="https://github.com/GoogleCloudPlatform/kubernetes">Kubernetes</a>.</p>
<p>While it is easy to take sides in debates about Docker, containers vs VMs, Mesos vs Kubernetes vs cloud platforms like <a href="http://www.openstack.org">OpenStack</a>, take note that there are extremely important reasons why some of these are exciting to use. These are driving immense amounts of simplification for the user. What used to take large amount of code and operational procedures to implement commonly sought after ilities like availability, agility and efficiency is now getting simplified to some declarative assertions. Getting a VM is now considered boring. Dockerizing apps and deployments is new and exciting.</p>
<p><img src="/img/1__4XijB9zl8404pvOxzcZUkg.png" alt=""></p>
<p>Underneath all this, some of the fundamental assumptions that the industry has made about Infrastructure as a Service, and Platform as a Service are getting disrupted.</p>
<p><strong>Cloud platforms that offer nothing but VMs have been under threat for a while, but Docker has made that threat practicable.</strong> If I’m a front-end app developer, it’s much more convenient for me to use a container-based cluster management solution on bare-metal without dealing with VMs. After all why bother about provisioning and putting VMs together into a cluster when there is framework that does it for me, in addition to solving some of my app packaging needs?</p>
<p>Most private cloud programs, and even some smaller public clouds still start with compute as the primary offering. This is because compute is usually the first one impeding developer agility and it makes sense to solve it first. However, Docker is now making it easy to question the existence of compute-only clouds.</p>
<p><strong>Platforms that require isolated and dedicated compute and storage clusters for each type of workload too are up for question.</strong> Such platforms aren’t able to run heterogeneous workloads on shared infrastructure to improve resource utilization. Though most CIOs love to talk about flexing down online workloads at off-peak hours to flex up batch workloads, the reality in most data centers is painted racks, i.e., dedicated servers/racks of compute and storage for different types of workloads. In these types of environments, cluster sizes are relatively fixed, utilization remains low, and moving capacity across environments usually requires manual changes. Scheduler frameworks like <a href="http://cs.brown.edu/courses/csci2950-u/f10/papers/mesos_tech_report.pdf">Mesos</a> are set to solve resource sharing across heterogeneous workload types thus eliminating the need for separate environments. Note that true sharing still requires compute and storage with predictable performance characteristics with little or no interference, and a multi-tenant infrastructure layer to isolate workloads from one another for security reasons.</p>
<p><strong>What is getting disrupted here is not the core building blocks that advanced cloud platforms provide, but how we’re putting together infrastructure building blocks for agility, efficiency, availability, heterogeneity etc.</strong> The patterns we’ve been using to arrive at these ilities are now becoming commodities. The likes of Kubernetes and Mesos are abstracting out the complexity involved in designing for these ilities. <strong>The era of commoditization of infrastructure patterns is finally here.</strong> The rewriting exercises that both <a href="http://www.activestate.com/blog/2014/09/cloud-foundry-diego-explained-onsi-fakhouri">CloudFoundry</a> and <a href="https://blog.openshift.com/openshift-v3-platform-combines-docker-kubernetes-atomic-and-more/">OpenShift</a> are going through in 2014 reflect this shift.</p>
<p>Let me start with one of the most basic patterns used to deploy stateless front end apps for scalability and availability. Here is an example topology.</p>
<p><img src="/img/1__z7fswDyC__qYSZq70Z__CKLA.png" alt=""></p>
<p>This topology consists of several compute resources in a cluster behind a VIP attached to a load balancer or a proxy server deployed in two or more availability zones (coarse grained fault domains), and some kind of DNS based routing to send traffic to nodes in these clusters. You can scale this pattern by adding more nodes behind the VIP, and increase availability by spreading the resources across several availability zones. The larger the number of availability zones you use the less amount of spare capacity you would need to survive loss of any availability zone.</p>
<p>Most home-grown PaaS layers start by automating ways to provision and manage apps across such a topology. The pattern usually maximizes developer agility, availability and scalability. This pattern requires a service to provision compute resources, one to manage clusters of nodes behind VIPs, and another to manage DNS. You can automate the implementation of this pattern by making these three services extremely efficient. An orchestration service would help simplify the implementation.</p>
<p><img src="/img/1__uQNfB5gKzzV3Ew5BlsMyng.png" alt=""></p>
<p>The bottom layer here consists of the building blocks needed to implement the pattern shown in middle layer. In fact, the first generation of cloud at eBay looked exactly like the above. The infrastructure layer in that cloud was built to suite the implementation of the above pattern.</p>
<p>Services like <a href="http://aws.amazon.com/cloudformation/">AWS CloudFormation</a> and <a href="http://aws.amazon.com/cloudwatch/">AWS CloudWatch</a> make this topology resilient to failures and workload changes with auto-scaling. With the addition of such services to our build blocks layer, we can refine our pattern for resiliency.</p>
<p><img src="/img/1__vtm__PQ__DS5MmNecwRc7alA.png" alt=""></p>
<p>Kubernetes arrives at a similar outcome for containerized applications, with <a href="https://github.com/google/cadvisor">cAdvisor</a> providing for monitoring. CloudFoundry’s Diego is treading along the <a href="https://github.com/cloudfoundry-incubator/diego-design-notes">same lines</a>.</p>
<p>Consider Mesos for another example. It can help get the most work done out of a given fixed pool of compute resources by finely slicing and dicing compute and allocating to different types of workloads. You can, for instance, run front-end, batch, and Yarn with the help of Marathon, <a href="https://github.com/apache/incubator-aurora">Aurora</a>, and <a href="https://github.com/mesos/myriad">Myriad</a> frameworks respectively on a single pool of compute resources. Depending on your security and data classification needs, you may need an underlying layer provide multi-tenancy with compute, network and storage isolation.</p>
<p>The general theme to notice here is a layered cake consisting of a layer of platforms enforcing certain patterns, utilizing a layer of foundational building blocks to implement those patterns.</p>
<p><img src="/img/1__lUYuQAgYqumuQsoGE5R4mw.png" alt=""></p>
<p>In essence, the complexity of dealing with raw infrastructure services, and that of implementing various patterns, is getting restructured for the better. As Mårten Mickos puts it in a recent <a href="http://thenewstack.io/marten-mickos-docker-containers-are-analogous-to-mopeds-in-a-big-city">Newstack article</a>, “it may seem like you are removing the complexity but really it is just is pushing it somewhere else.” Layers help shuffle complexity better. By keeping the lower layers generic, we can let new patterns emerge.</p>
<p><strong>An effective cloud platform needs both a strong layer of infrastructure building blocks, and platforms enforcing certain patterns. It is not a question of one versus the other.</strong> I’m not attempting to list the basic building blocks here, but a quick scan of <a href="http://aws.amazon.com/">AWS</a> should give a hint of what the most common ones are. In fact without the core building blocks offered as services with 4 nines of availability, your infrastructure may remain as pets and not cattle. More about that latter.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[OpenStack on Diet]]></title>
            <link href="https://www.subbu.org/articles/2014/openstack-on-diet/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2014/openstack-on-diet/</id>
            
            
            <published>2014-11-04T06:45:13+00:00</published>
            <updated>2014-11-04T06:45:13+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Scanning the list of OpenStack projectson github, here is my pick of projects in alphabetical order that don’t need to be there at present in their current location.</blockquote><p>Scanning the list of <a href="https://github.com/OpenStack">OpenStack projects</a> on github, here is my pick of projects in alphabetical order that don’t need to be there <em>at present</em> in their current location. This is not a reflection on their quality or utility. This list is purely based their relevance as the foundational building blocks for offering infrastructure services.</p>
<ul>
<li><a href="https://github.com/OpenStack/barbican">Barbican</a></li>
<li><a href="https://github.com/OpenStack/designate">Designate</a></li>
<li><a href="https://github.com/OpenStack/kite">Kite</a></li>
<li><a href="https://github.com/OpenStack/manila">Manila</a></li>
<li><a href="https://github.com/OpenStack/sahara">Sahara</a></li>
<li><a href="https://github.com/openstack/tripleo-incubator">TriplO</a></li>
<li><a href="https://github.com/openstack/trove">Trove</a></li>
<li><a href="https://github.com/openstack/tuskar">Tuskar</a></li>
<li><a href="https://github.com/openstack/zaqar">Zaqar</a></li>
</ul>
<p>This leaves the following essentials</p>
<ul>
<li><a href="https://github.com/openstack/cinder">Cinder</a></li>
<li><a href="https://github.com/openstack/ceilometer">Ceilometer</a></li>
<li><a href="https://github.com/openstack/glance">Glance</a></li>
<li><a href="https://github.com/openstack/heat">Heat</a></li>
<li><a href="https://github.com/openstack/horizon">Horizon</a></li>
<li><a href="https://github.com/openstack/ironic">Ironic</a></li>
<li><a href="https://github.com/openstack/keystone">Keystone</a></li>
<li><a href="https://github.com/openstack/neutron">Neutron</a></li>
<li><a href="https://github.com/openstack/nova">Nova</a></li>
<li><a href="https://github.com/openstack/swift">Swift</a></li>
</ul>
<p>Relevance of projects like OpenStack has been, and shall always be based on their merit and depth, but not on the length of their portfolios. To give an analogy, Linux is relevant because of its strong core, and not because of KDE and OpenOffice.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Automate Everything — But Don’t Ignore Drift]]></title>
            <link href="https://www.subbu.org/articles/2014/automate-everything-but-dont-ignore-drift/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2014/automate-everything-but-dont-ignore-drift/</id>
            
            
            <published>2014-10-06T13:38:49+00:00</published>
            <updated>2014-10-06T13:38:49+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Treat infra as code. This is one of the key maxims told in the devops circles. This principle advocates to treat infrastructure as code, to automate everything and to apply the same engineering processes and principles as you would apply to software development. &hellip;</blockquote><p>Treat infra as code. This is one of the key maxims told in the devops circles. This principle advocates to treat infrastructure as code, to automate everything and to apply the same engineering processes and principles as you would apply to software development. While it is extremely important to practice this principle, drift is bound to catch you by surprise when operating at scale. That’s what I learned while building and operating the cloud at work.</p>
<p>Here is the most ideal outcome of automating everything. Every node in the system is automated, has the right configuration, gets updated in synchrony with others, and everything is as it supposed to be, right from day one. But this a naive view.</p>
<p>Treating infrastructure as code, and automating everything does not mean that everything agrees with that desire and behaves as told in practice. Though it is less difficult to control drift at small scale, when you’re operating thousands of nodes of different types in multiple locations, the chances for configuration drift are high, and it requires conscious effort to be aware of, to manage, and to mitigate drift.</p>
<p>To give an example, the system I deal with is a private cloud deployed across several geographically distributed availability zones. Overall, there are over 30 types of nodes that are managed through automation. While some of these nodes are stateless running in clusters behind VIPs, a few are stateful nodes with active/active or active/passive configurations. A large subset of nodes are hypervisors with some variations in their configuration to support different types of workloads. As the hypervisors are long-lived, they go through more number of changes during their lifetime than other types of nodes. A few nodes are software appliances.</p>
<p>All these nodes go through different rates of change made by different teams. Moreover, not all nodes manage their configuration state the same way. Though most load configuration from configuration files, some types of nodes are initialized through databases, and some through API calls.</p>
<h2 id="why-bother">Why bother</h2>
<p>Your experience may vary, but in the systems that I deal with, drift is a bigger deal than originally imagined. Here are some of the consequences of drift.</p>
<ul>
<li>Bad user experience: For instance, a few badly configured nodes out of hundreds or thousands may only impact a few customer interactions. Such silent bugs are hard to detect as they may not show up in overall system metrics and KPIs.</li>
<li>Incidents waiting to happen: Incompletely or inconsistently applied changes can mask problems and eventually lead to incidents. The specifics vary from system to system, but I’ve my stories to tell.</li>
<li>Impact on time to recovery: Even worse, drift can impact time to detect failures and time to recovery from those. Most unplanned drift discovery also happens during incidents.</li>
</ul>
<h2 id="where-does-drift-come-from">Where does drift come from</h2>
<p>There are four key contributors to drift.</p>
<p><em>Automation gaps and bugs</em></p>
<p>This is the most natural source of drift. Every automation gap is a potential source of drift. Like regular software development, automation too goes through an iterative development process, and gaps are natural consequence of that iterative process.</p>
<p>More over, the act of mutating a node’s configuration in place may leave cruft behind eventually leading to drift. Immutability can help mitigate such drift in some cases, but immutability is not an answer for everything. It is also expensive to implement in certain cases.</p>
<p><em>Human error and (bad) habits</em></p>
<p>This is largely an issue of culture and past habits. The causes in this category include debugging on live systems, and people making ad hoc changes that bypass configuration management and change control. Such drift is likely to remain uncaught until it leads to a noticeable issue or an incident.</p>
<p><em>Incidents</em></p>
<p>During incident management, the focus is on time to recovery and not automation and change control. The act of recovery is likely to introduce drift.</p>
<p><em>Transitional</em></p>
<p>When operating at scale, not every node and not every service is likely to be updated at the same time. You may also need to stagger certain changes over weeks or months to leave room to observe, tweak or even rollback.</p>
<h2 id="how-to-manage-drift">How to manage drift</h2>
<p>First, don’t deny drift. Acknowledge that drift is a possibility and that automation may be incomplete or buggy.</p>
<p>Second, build tools to regularly audit for drift. Automation is expected to reduce drift, but like most things, automation too may be work in progress and shall have bugs. Use audits to discover the state of drift. Awareness is a prerequisite for mitigation.</p>
<p>Third, extend the “measure everything” maxim to include drift. At any given point in time, be able to know what nodes/systems are in drift, and assign severity based on their potential impact. Wire up these metrics to your alerting systems so that the team gets alerted when drift is discovered.</p>
<p>Fourth, make drift mitigation a planned activity, sprint after sprint. Use drift metrics to track the mitigation progress.</p>
<p>Finally, reward right habits.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Monitoring and Alerting for OpenStack]]></title>
            <link href="https://www.subbu.org/articles/2013/monitoring-and-alerting-for-openstack/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2013/monitoring-and-alerting-for-openstack/</id>
            
            
            <published>2013-10-17T08:06:39+00:00</published>
            <updated>2013-10-17T08:06:39+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>OpenStack is a loosely coupled distributed system. Given the number of moving parts in OpenStack, the particular configuration of an OpenStack deployment, and the underlying layers in the data plane, &hellip;</blockquote><p>OpenStack is a loosely coupled distributed system. Given the number of moving parts in OpenStack, the particular configuration of an OpenStack deployment, and the underlying layers in the data plane, failure detection and debugging can get non-trivial. In particular, some components like DHCP agents, Quantum/Neutron APIs, their drivers, Nova metadata API, volume backend devices, Swift etc. have higher availability bar due to their involvement in certain flows in the cloud data plane. OpenStack deployments need significant investments in log aggregation, metrics collection, monitoring and alerting for early problem detection and recovery. In this post, I would like to show some of the practices and open source tools that you can use for problem detection and trouble shooting.</p>
<p>To set the context, take a common task like creating a new virtual machine instance. The diagram below shows all the components that must cooperate to bring up the virtual machine into a state that a tenant is able to use. The flow starts from a tenant request for a new virtual machine and ends with the successful completion of the cloud-init process. Boxes with thin borders show the control plane, while boxes with bold borders show components that participate during the boot process and later. In this example, quantum is backed by the NVP plugin, and keystone is set to use PKI for tokens. I’ve ignored the database in this diagram.</p>
<p><img src="/img/1__V7Nza2XAlXGeD7RhHxaRPw.png" alt=""></p>
<p>The best possible outcome for the requesting tenant is a virtual machine ready to use in a couple of minutes or less. Other possible outcomes include performance degradation of APIs like nova, glance, or keystone, or nova scheduler failures due to hypervisor or network capacity, timeouts due to performance degradation of any request along the flow, or partial failures such as a virtual machine that could not get its network interfaces up or a virtual machine that the tenant can not access due to metadata API failures.</p>
<p>In this flow, a 202 response code from nova API or even a virtual machine with the power state ACTIVE does not actually mean that the tenant got what it asked for. This is true for several other common flows as well.</p>
<p>Fortunately, most of the OpenStack components generate raw signals to debug failures. But it is up to the operator to build a system to collect those raw signals, and process them into metrics to monitor and alert upon.</p>
<p>Below is a diagram that shows common signals and a schematic of how to collect, process and generate useful metrics and events for tracking and monitoring.</p>
<p><img src="/img/1__V5zkZtelJVnNF90uckayxQ.png" alt=""></p>
<p>The key signals to look for include the following:</p>
<p><strong>Basics:</strong> These include usual signals like process health, restarts, CPU, memory etc across all nodes. In the diagram above, this is done via <a href="https://www.zabbix.com/">Zabbix</a>, an open source solution for monitoring and alerting.</p>
<p><strong>Log files:</strong> This is one of first sources to look at for most problem resolutions. In addition to detailed trace of warnings and errors, log files in OpenStack include useful information to know how various OpenStack APIs are behaving. For instance, here is a message from the nova-api log.</p>
<p>2013-10-13 18:56:11 INFO nova.osapi_compute.wsgi.server [req-69b8fce4-b18c-4a52-8c6f-4256d4e45db2 991a8f5572cdeb7fb04a91aca1c4cb7b 991a8f5572ca4b7fb04a91aca1c4cb7b] xx.xx.xx.xx,xx.xx.xx.xx - - [13/Oct/2013 18:56:11] &ldquo;POST /v2/991a8f5572cdeb7fb04a91aca1c4cb7b/servers/c4ba5bba-228d-4997-b077-92507238c37a/action HTTP/1.1&rdquo; 202 121 0.109871</p>
<p>This message tells you many things:</p>
<ol>
<li>The component label nova.osapi_compute.wsgi.server tells that this message is due to an API request with a request ID, project ID and user ID. By aggregating all log files into a central store that can index those and provide a search interface, you can determine which of the components and hosts that the request went through and the outcome at each stage.</li>
<li>This message also tells that it was a POST request to create a virtual machine instance, the response code was 202, client IP addresses (masked in this example) and that it took 0.109871 seconds. By extracting these bits of data, you can trend traffic, failures, and response latencies over time, and use those metrics for KPI tracking as well as generating alerts when those metrics deviate from the guarantees you provide as a cloud operator.</li>
</ol>
<p>Having used <a href="http://logstash.net/">logstash</a>, <a href="http://www.elasticsearch.org/">ElasticSearch</a>, and <a href="http://www.elasticsearch.org/overview/kibana/">Kibana</a> for nearly a year in production in our cloud at eBay, I would not run an OpenStack cloud without this trio for log collection and processing. logstash is quite flexible for log collection and processing. For OpenStack deployments, logstash is particularly useful since not all components follow the same format for log messages. logstash’s <a href="http://logstash.net/docs/1.2.1/filters/grok">grok filter</a> helps normalize various log messages into a format that can be indexed and searched.</p>
<p>Once collected and parsed, you can send logs to ElasticSearch for indexing using the <a href="http://logstash.net/docs/1.2.1/outputs/elasticsearch">ElasticSearch output</a>. With Kibana, which is now an ElasticSearch plugin, as a front-end to ElasticSearch, you can search logs in near realtime. Input/output plugins like <a href="http://logstash.net/docs/1.2.1/inputs/zeromq">zeromq</a> help transport logs from their source to an ElasticSearch cluster.</p>
<p>Log searching is useful for debugging, but how to mine health indicators like request rates, error rates, latencies etc? This is where Etsy’s <a href="https://github.com/etsy/statsd/">statsd</a> comes in. By funneling parsed logs into statsd via logstash’s <a href="http://logstash.net/docs/1.2.1/outputs/statsd">statsd plugin</a>, you can extract timing metrics, counters and rates from logs. Once extracted, you can send them to a system like Graphite for metrics tracking and graphing, and a system like Zabbix for alerting.</p>
<p><strong>Database tables:</strong> OpenStack database tables have a ton of useful data that an operator must look at periodically. In addition to showing usage growth and impending capacity issues, tables like nova.instance_faults and nova.instances tables include some key performance indicators. For instance, nova.instance_faults table keeps track of scheduling failures, which is an important indicator of system health. Similarly, instances with non-NULL task_state in the nova.instances table beyond a reasonable time after a task show potential health issues.</p>
<p>How to extract this information for monitoring and alerting? All it takes is some code to periodically poll those tables, count various indicators, and then write to systems like Graphite and Zabbix.</p>
<p><strong>Synthetic Flows:</strong> What we found during a year+ of operating an OpenStack private cloud at work is that the above are not sufficient to help us proactively find issues before our users see them, and to reduce time to recovery. Here is why.</p>
<ol>
<li>The signals above do not reflect all potential failures. For instance, none of the above sources may reveal that, though the virtual machine creation succeeded, the tenant was unable to use the instance due to a failure during cloud-init. Such a failure may have happened due to a failure in the DHCP agent, metadata API, Quantum or even just a slow database query.</li>
<li>Some failures may be due to bad user input such as a broken user-data script, or a bad image. Though we can filter out some bad user inputs for all API requests by ignoring responses with 4xx response codes, bad user inputs that get used during the boot process are hard to filter out.</li>
<li>Finally, no errors in logs, database tables, or other sources may not mean that all components are functioning as expected. It may just be due to no user exercising certain critical components of the cloud at the moment.</li>
</ol>
<p>One way to account for these blind spots is to select a few key flows like the ones below that count towards the operator’s SLA, and synthesize those flows with controlled inputs such that you can programmatically assert the outcomes against expected.</p>
<ol>
<li>Launch a virtual machine instance and verify that it is usable by the tenant.</li>
<li>Delete an instance and see that the instance is gone and tenant’s quota is back.</li>
<li>Attach a volume and write to it.</li>
<li>Take instance and volume snapshots.</li>
<li>Publish a new image, and repeat (1) with that instance.</li>
</ol>
<p>Any deviations show health issues. In the schematic above, there is a synthetic test bot that is continually exercising the cloud and writing signals to Graphite and Zabbix.</p>
<p>There it is. Since OpenStack is not a closed system, you can use open-source tools like logstash, ElasticSearch, StatsD, Graphite, Zabbix etc to tame OpenStack into an operable cloud. Remember, <a href="/blog/2013/07/openstack-is-not-cloud">OpenStack is not cloud</a>.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Private Cloud Operating Principles]]></title>
            <link href="https://www.subbu.org/articles/2013/private-cloud-operating-principles/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2013/private-cloud-operating-principles/</id>
            
            
            <published>2013-09-16T19:28:30+00:00</published>
            <updated>2013-09-16T19:28:30+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Given the modular architecture of OpenStack as a cloud controller software, operators of OpenStack based private clouds have many choices on how to shape cloud as a service. &hellip;</blockquote><p>Given the modular architecture of OpenStack as a cloud controller software, operators of OpenStack based private clouds have many choices on how to shape cloud as a service. For public cloud operators the answer is clear — emulate AWS. The answer can be difficult for companies building private clouds, particularly if those companies have been around for a while. What operating principles would you choose in such cases and why?</p>
<p>When we faced the same question at <a href="http://www.ebay.com">eBay</a> last year, we chose a simple operating principle that we continue to practice every day.</p>
<blockquote>
<p>Think and act like a public cloud provider to provide unfettered self-service access to native OpenStack capabilities.</p>
</blockquote>
<p>Why should a private cloud operator choose such an operating principle? Isn’t it constraining? Yes, it can be constraining in the short-term, but in the long run, this simple principle allows for more innovation, agility, as well increased operational efficiency. Here is why.</p>
<p><strong>Self-service:</strong> A public cloud mindset forces to care for self-service. No capability exists in a public cloud without an API that is integrated with all other cloud capabilities and works the same for every user. Users get access to those capabilities on their own with no tickets and approvals. For instance, in our cloud, users not only get compute, network and storage on their own, they can also bring in their own images and customize those to meet their needs unbeknownst to us. We in fact chose to put a lightly customized version of the <a href="https://github.com/OpenStack/horizon">Horizon</a> dashboard along with all the public APIs in front of users and let them figure out what to do with those. This turned out to be infectious.</p>
<p>In the private cloud context, self-service brings in some challenges the biggest of which is compliance to various policies and processes in place. Most hurdles that users in large enterprises face do start with processes designed to enforce those policies. But policy enforcement is solvable. In stead of putting a person or committee in charge of approving and verifying compliance, you will need to build and put some software in-charge of compliance.</p>
<p>In addition to productivity gains due to agility, self-service helps democratize capacity planning and increase efficiency. I once worked in a company where teams used go in front of a committee a few months in-advance to get their capacity. When you’re faced with such a process, you tend to over-estimate capacity needs with the worry that you may not get the capacity you need when you need it. This is capacity hoarding. Self-service on the other-hand improves data center utilization and reduces waste since users know they will get the capacity that they need when they need it.</p>
<p><strong>Abstractions:</strong> Self-service also forces a well-defined API layer abstracting the infrastructure from applications above. In the case of OpenStack, users don’t need to ask how to use those APIs since they can <a href="http://lmgtfy.com/">google</a> for help on their own. Consequently, we get to focus on building and operationalizing the cloud while our users get to take charge of their use cases on top of the APIs. The challenge for the operator is to ensure compatibility with documented public APIs. For the opportunist, this challenge helps improve quality of OpenStack customizations needed to suite the business.</p>
<p><strong>Unified Control Plane:</strong> One of the tempting patterns for private cloud operators is to spin up a separate instance of the cloud for each use case — such as a cloud for developers, a different cloud for QA, and an entirely different and isolated cloud for production use cases. In this model, cloud is treated as a software and tenants go to different places for different needs. Each cloud will have a different user experience, a different set of capabilities, and a different set of rules to play by. Such a model is less attractive for a public cloud operator due to user confusion, increased cost of operations and reduced flexibility to move capacity around. When you think and act like a public cloud provider, users don’t see multiple clouds. They see multiple regions and availability zones behind a unified control plane and can pick regions and availability zones to meet performance and availability constraints.</p>
<p>In the end it turns out that what’s good for business is not different for what is good for cloud users even when the cloud is private with the control plane behind a firewall.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[OpenStack is not Cloud]]></title>
            <link href="https://www.subbu.org/articles/2013/openstack-is-not-cloud/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2013/openstack-is-not-cloud/</id>
            
            
            <published>2013-07-25T19:37:31+00:00</published>
            <updated>2013-07-25T19:37:31+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>In recent weeks, I’ve heard a number of opinions about OpenStack. Some want OpenStack to get compatible with AWS while others don’t care. Some say that you need vendor-built</blockquote><p>In recent weeks, I’ve heard a number of opinions about OpenStack. Some want OpenStack to get <a href="http://www.cloudscaling.com/blog/cloud-computing/openstack-aws/">compatible</a> <a href="http://gigaom.com/2013/07/24/is-rackspaces-amazon-api-stance-holding-openstack-back/">with AWS</a> while others <a href="http://gregdekspeaks.wordpress.com/2013/07/17/who-cares-about-aws-compatibility/">don’t care</a>. Some say that you need vendor-built <a href="http://www.mirantis.com/company/press-release/red-hat-and-mirantis-partner-across-products-and-services-to-accelerate-adoption-of-red-hat-openstack/">production-grade</a> OpenStack distributions to succeed while others want you to buy solutions — with software and people — to help you build and operate an OpenStack cloud. Some others want you to buy racks of OpenStack. But here is the crux. OpenStack is not cloud. AWS is cloud. The difference is extremely significant.</p>
<p>My team at eBay builds and operates an OpenStack based private cloud. Note that the opinions I express here are my own and do not represent eBay. Except for the <a href="http://nicira.com/en/ebay-deploys-openstack-cloud-for-rd">network virtualization layer</a>, we use publicly available OpenStack and other open-source software. We offer cloud-primitives such as virtual compute, network and storage on demand directly to anyone that wants. Like any OpenStack power-user, we’ve got our cuts and bruises amidst happy user testimonials, but this post is not about those experiences.</p>
<p>A cloud is a service, and not just software. As far as the users of the service are concerned, a cloud is a set of APIs and tools backed by an elastic infrastructure that offers what the APIs and tools promise. Users care about availability of the cloud, elasticity of infrastructure, and on-demand self-service access to maintain business agility. APIs and dashboards are critical components of user experience, but that’s just a small part of a Cloud.</p>
<p>AWS is certainly a cloud. It includes things that drive user experience such as APIs, dashboards, and an ecosystem around those. Behind the scenes it includes an elastic infrastructure. Users remain agnostic of how that infrastructure is built and managed except for certain qualities like availability, performance, scalability, elasticity, and efficiency.</p>
<p>However, OpenStack is a cloud controller software. Though the community did a nice job at putting together this software, an instance of an OpenStack installation does not make a cloud. As an operator you will be dealing with many additional activities not all of which users see. These include infra on-boarding, bootstrapping, remediation, config management, patching, packaging, upgrades, high availability, monitoring, metrics, user support, capacity forecasting and management, billing or chargeback, reclamation, security, firewalls, DNS, integration with other internal infrastructure and tools, and on and on and on. These activities are bound to consume a significant amount of time and effort. OpenStack gives some very key ingredients to build a cloud, but it is not cloud in a box.</p>
<p>Since a cloud is a service, you can’t approach it like it is boxed software like some pundits want us to believe. When you run a service, stuff happens. For instance, your hypervisors clog up disk space late in the night due to an obscure bug in the version of the OpenStack distribution you’re using. Or RabbitMQ gets into a split brain problem and the control plane freezes over. These are not OpenStack problems, but operational incidents that are bound to happen.</p>
<p><a href="http://www.cloudscaling.com/blog/cloud-computing/openstack-aws/">AWS API compatibility</a> is what an operator should worry about above all these? Nah. You can fix API incompatibility with glue code.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[ClickOps]]></title>
            <link href="https://www.subbu.org/articles/2013/clickops/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2013/clickops/</id>
            
            
            <published>2013-06-23T15:37:47+00:00</published>
            <updated>2013-06-23T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>The act of performing systems administration and configuration by pointing and clicking on proprietary tools. ClickOps engineers usually receive requests to perform operations via ticketing systems, queue them for hours to days, and perform those operations in sequence. &hellip;</blockquote><p><em>n</em> (klɪk**.**ops)</p>
<p>The act of performing systems administration and configuration by pointing and clicking on proprietary tools. ClickOps engineers usually receive requests to perform operations via ticketing systems, queue them for hours to days, and perform those operations in sequence.</p>
<p>ClickOps engineers often confuse their role with DevOps although their intended responsibility is to increase work-in-progress by queuing up automatable tasks.</p>
<p>Thanks to <a href="https://twitter.com/bsletten">@bsletten</a> for suggesting this term in a <a href="https://twitter.com/sallamar/status/341712015506690048">conversation</a> on twitter.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Code the Infra]]></title>
            <link href="https://www.subbu.org/articles/2013/code-the-infra/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2013/code-the-infra/</id>
            
            
            <published>2013-04-13T23:31:55+00:00</published>
            <updated>2013-04-13T23:31:55+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Code the infra. There is no other way to make operations predictable and repeatable. The opposite of coding the infra is what I call as “box hugging”. If you log into boxes to configure, install packages, start/stop services, or do any maintenance, you are a box hugger. &hellip;</blockquote><p>Code the infra. There is no other way to make operations predictable and repeatable. The opposite of coding the infra is what I call as “box hugging”. If you log into boxes to configure, install packages, start/stop services, or do any maintenance, you are a box hugger. Coding the infra requires that you treat automation artifacts (shell scripts, puppet manifests, fabric scripts etc) and configuration as code. If you’ve no repeatable code to bring up bare infra into a desirable operational state, then you are a box hugger. Box hugging is a bad habit, and is bad for the business. It makes recovery from failures time-consuming. It does not scale with needs. Most fat-finger and <a href="http://www.infoq.com/presentations/Event-Sourced-Architectures-for-High-Availability">admin cockup</a> related outages start with box hugging. Sure, it may have worked 100 times, but just one fat-finger mistake is enough to make your team’s life miserable.</p>
<p>Two steps to cure box hugging — first, internalize the idea that the box you’ve just finished setting up meticulously is going to burst into flames the very next minute, second treat operations the same way as you would treat software development.</p>
<p>Coding the infra is not hard.</p>
<p><strong>1. Treat infra as ephemeral</strong></p>
<p>Infra is not permanent. It will fail. You can estimate <a href="http://en.wikipedia.org/wiki/Mean_time_between_failures">MTBF</a> with some assumptions, but failures won’t follow estimates. <a href="http://www.kitchensoap.com/2010/11/07/mttr-mtbf-for-most-types-of-f/">MTTR is more important that MTBF</a>. When you treat infra as ephemeral, the act of bringing up new infra to a desired operational state becomes a normal and known practice. You ignore the dead nodes, and focus on bringing up new nodes as quickly as possible.</p>
<p><strong>2. Think of system setup as a series of state changes</strong></p>
<p>Start with the basic infra, and apply a sequence of steps to change the state of the infra to bring it to a desired state. The steps could be installing packages, configuring them, starting servers, setting cron jobs and so on. This is no different from most coding exercises — start from a known state, apply some computations, and arrive at a new state.</p>
<p><strong>3. Make the steps repeatable</strong></p>
<p>This is like coding any math problem. You first solve it on paper to arrive at an algorithm. Then you would code the algorithm so that you can repeat it every time you need to solve the same math problem again. It is the same with operational changes. It might seem time-consuming to treat operations this way, but unless you make the steps repetable through automation, you can’t recover from failures easily. Repeatability is a way of rehearsing recovery. Node died? Cool — just run the automation to bring up a new node. You’re back in business.</p>
<p><strong>4. Implement idempotency</strong></p>
<p>Repeatability alone is not sufficient when the state changes are numerous. You need to make each state change idemotent. Apply the same change again — the system should not burn up. Practicing idempotency makes the outcome certain. If something breaks in the middle you can replay the whole sequence of changes when you know that each step is idempotent.</p>
<p><strong>5. Review, test and version control</strong></p>
<p>Finally, apply the same engineering rigor to automation artifacts as you would apply to software development — that is, ensure that the automation scripts are peer-reviewed, tested and maintained in source control. There should be no difference.</p>
<p>DevOps is not just about integrating dev and ops, but is about treating operations as development, and development as operations.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Nodejs vs Play for Front-End Apps]]></title>
            <link href="https://www.subbu.org/articles/2011/nodejs-vs-play-for-front-end-apps/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2011/nodejs-vs-play-for-front-end-apps/</id>
            
            
            <published>2011-03-25T15:37:47+00:00</published>
            <updated>2011-03-25T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>We often see “hello world” style apps used for benchmarking servers. A “hello world” app can produce low-latency responses under several thousands of concurrent connections, but such tests do not help make choices for building real world apps. Here is a test I did at eBay recently comparing a front-end app built using two different stacks</blockquote><blockquote>
<p>I&rsquo;m resuccitating this old artile to support some inbound traffic.</p>
</blockquote>
<p><em>Mar 29, 2011: The source used for these tests is now available at</em> <a href="https://github.com/s3u/ebay-srp-nodejs"><em>https://github.com/s3u/ebay-srp-nodejs</em></a> <em>and</em> <a href="https://github.com/s3u/ebay-srp-play"><em>https://github.com/s3u/ebay-srp-play</em></a><em>.</em></p>
<p><em>Mar 27, 2011: I updated the charts based on new runs and some feedback. If you have any tips for improving numbers for either Nodejs or Play, please leave a comment, and I will rerun the tests.</em></p>
<p>We often see “hello world” style apps used for benchmarking servers. A “hello world” app can produce low-latency responses under several thousands of concurrent connections, but such tests do not help make choices for building real world apps. Here is a test I did at <a href="http://www.ebay.com">eBay</a> recently comparing a front-end app built using two different stacks:</p>
<ol>
<li><a href="http://nodejs.org">nodejs</a> (version 0.4.3) as the HTTP server, using <a href="http://expressjs.com">Express</a> (with NODE_ENV=production) as the web framework with <a href="https://github.com/visionmedia/ejs">EJS templates</a> and <a href="https://github.com/learnboost/cluster">cluster</a> for launching node instances (cluster launches 8 instances of nodejs for the machine I used for testing)</li>
<li><a href="http://www.playframework.org/">Play framework</a> (version 1.1.1) as the web framework in production mode on Java 1.6.0_20.</li>
</ol>
<p>The intent behind my choice of the Play framework is to pick up a stack that uses rails-style controller and view templates for front-end apps, but runs on the JVM. The Java-land is littered with a large number of complex legacy frameworks that don’t even get HTTP right, but I found Play easy to work with. I spent nearly equal amounts of time (under two hours) to build the same app on nodejs and Play.</p>
<p>The test app is purpose built. It includes a single search results page that renders search results fetched from a backend source. The flow is simple — the user submits some text, the front-end fires off a request to the backend, the backend responds with JSON, the front end parses it, and renders the results using a set of HTML templates. The idea of this app is to represent front-end apps that produce markup with/without backend IO.</p>
<p>In my test setup, the average result from backend is about 150k — it is JSON formatted and not compressed. The results page consists of 8 templates — each for different parts of the page like header, footer, sidebar etc. The sizes of the template files range from 250 bytes to under 2k. In order to ensure that backend latency does not influence testing, search requests are proxied through <a href="http://trafficserver.apache.org/">Apache Traffic Server</a> acting as a forward proxy. The cache is tuned to always generate a hit. Such a high cache hit is not realistic, but it helped me isolate the cost of having to go through uncontrolled public Internet to get search results for my testing.</p>
<p>Note that the test environment is not the most ideal — the test client, the server, and the cache<br>
were all running on the same box. The box is a quad-core Xeon with 12GB of RAM running Fedora 14 (2.6.35.6–45.fc14.x86_64 kernel).</p>
<p>I ran the tests using <a href="http://httpd.apache.org/docs/2.0/programs/ab.html">ab</a>.</p>
<p>ab -k -c 300 -n 200000 {URI}</p>
<p>The tests include the following configurations</p>
<ul>
<li><strong>Render — No IO:</strong> Render the page without any IO — this configuration generates HTML from the templates with empty results.</li>
<li><strong>IO + Render:</strong> Render the page with results.</li>
<li><strong>IO — No Render:</strong> Fetch results but don’t render — this is an unrealistic case, but it helps highlight the cost of IO vs cost of template processing.</li>
</ul>
<p>The charts below show requests per second and mean response time.</p>
<p><img src="/img/0__d3dG0oc6QQ84iGjF." alt="">
<img src="/img/0__sEcWWFP__ey8Lw7HG." alt="">
<img src="/img/0__jhWwVqbR7lU1Oym3." alt="">
<img src="/img/0__4n2LPYWy0fn8rrlP." alt="">
<img src="/img/0__HVBqICR__D4__yfK7I." alt="">
<img src="/img/0__v__FJbmss9KX5qD7I." alt=""></p>
<p><strong>From these, you can see that Nodejs beats Play on performance as well as throughput. However, in the pure IO case, I would not discount non-blocking IO on the JVM. I plan to post more results dealing with IO + computation scenarios.</strong></p>
<p>The charts below show the percentage of requests completed within a certain amount of time in msec. The shorter the bars the better. Also less variance as you read from left to right on each chart is better — I would ignore the last set of bars on the right (time to complete 100% of the requests) as they may contain outliers.</p>
<p><img src="/img/0__ajw9MfFR2bCD5Rig." alt="">
<img src="/img/0__SeHbYjr1fr6KKbNa." alt="">
<img src="/img/0__8XpyyQvXqnwnbROH." alt=""></p>
<p>When the workload involves generating HTML from templates off the file system without performing any other IO, nodejs does twice better than JVM based Play. As we introduce IO, performance across the board suffers, but more so with blocking IO on Play. But Play is able to catchup with non-blocking IO (via continuations).</p>
<p><em>I’m unable to make the source code for the test apps available publicly at this time. But I plan to create and post some new tests on github soon.</em></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Performance of RESTful Apps]]></title>
            <link href="https://www.subbu.org/articles/2011/performance-of-restful-apps/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2011/performance-of-restful-apps/</id>
            
            
            <published>2011-03-01T15:37:47+00:00</published>
            <updated>2011-03-01T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>A while ago I showed how chatty some well-known apps are on my iPhone. But this issue is neither new nor unique to apps on phones and similar devices. Efficient data retrieval from distributed/decentralized servers is a well-recognized problem in distributed computing.</blockquote><blockquote>
<p>I&rsquo;m resuccitating this old artile to support some inbound traffic.</p>
</blockquote>
<p>A while ago I <a href="/articles/2011/chatty-apps">showed</a> how chatty some well-known apps are on my iPhone. But this issue is neither new nor unique to apps on phones and similar devices. Efficient data retrieval from distributed/decentralized servers is a well-recognized problem in distributed computing. For instance, in the abstract of his November 1994 paper <a href="http://labs.oracle.com/techrep/1994/abstract-29.html">A Note on Distributed Computing</a>, <a href="http://www.eecs.harvard.edu/~waldo/">Jim Waldo</a> notes the following (emphasis mine).</p>
<blockquote>
<p>We argue that objects that interact in a distributed system need to be dealt with in ways that are intrinsically different from objects that interact in a single address space. These differences are required because distributed systems require that the programmer be aware of <strong>latency</strong>, have a different model of <strong>memory access</strong>, and take into account issues of <strong>concurrency</strong> and <strong>partial failure</strong>.</p>
</blockquote>
<p>Most front-end developers by now know and follow the <a href="http://developer.yahoo.com/performance/rules.html">best practices</a> that Yahoo!’s <a href="http://developer.yahoo.com/performance/">Exceptional Performance</a> team documented a few years ago. However, the REST community may have missed the bus and has some catching up to do. Performance of RESTful Apps is not one of the most frequently talked about topics online or in print. From talking to various teams, it often seems that a great deal of time is spent on <a href="http://my.safaribooksonline.com/9780596809140/75">URI</a>/<a href="http://my.safaribooksonline.com/9780596809140/45">representation</a> design, schemas, use of the <a href="http://my.safaribooksonline.com/9780596809140/1">uniform interface</a> for CRUD, using the <a href="http://my.safaribooksonline.com/9780596809140/87">hypertext constraint</a> etc. No doubt — these topics are all very important, but understanding and accounting for the performance characteristics in the design and implementation of server and client apps is no less crucial.</p>
<p>Here are some techniques to help build high-performance RESTful apps.</p>
<h4 id="composites-for-performance">Composites for Performance</h4>
<p>The best of all web performance techniques is to <a href="http://developer.yahoo.com/performance/rules.html#num_http">minimize the number of HTTP requests</a>. However, RESTful Apps rarely follow this practice. This difference stems from how each side sees resources.</p>
<p>On one side, front-end folks optimize their servers to serve bulk representations for CSS, JavaScript or image sprites, or even <a href="http://googlecode.blogspot.com/2010/11/instant-previews-under-hood.html">data URIs for images</a> to reduce the number of HTTP requests and thereby latency. On the front-end, most resources are in fact composites.</p>
<p>On the other side, API/service developers prefer <em>clean looking</em> resources and URIs (shown on the right side above). Though this can lead to chatty network usage, there is one specific advantage in offering a set of resources that are independent and less coupled with other resources — <strong>it leaves room for clients to innovate</strong>. It lets them combine data from multiple resources in numerous ways that the resource developers could not possibly think of.</p>
<p>Loose coupling is another benefit of this approach, as clients can evolve rapidly on their own.</p>
<p>The expense is of course latency, particularly when those client apps are not very close to the servers. Each client may need to submit several requests to the server in order get its job done. So, how do we go about fixing this without sacrificing the flexibility of less-coupled resources? One answer is to use composite resources. See my <a href="http://my.safaribooksonline.com/book/web-development/web-services/9780596809140/identifying-resources/34">RESTful Web Services Cookbook</a> for details.</p>
<p>With a composite, in stead of sending n-number of HTTP requests over 1-n connections, the client can open just one TCP connection to send an HTTP request to retrieve the data it needs — just like a browser getting CSS or Javascript bundles in the front-end. A composite changes a pattern like</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /something HTTP/1.1  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>GET /something-else?params HTTP/1.1  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>GET /some-other-thing-related-to-something?params HTTP/1.1  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span></code></pre></div><p>to</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /get-all-things-i-need-about-something?params HTTP/1.1  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span></code></pre></div><p>Each composite can generate a projection of state required for one or more clients. These composites can be more specialized than the resources they aggregate - as each composite can cater to particular client needs.</p>
<p>(P.S.: My usage of the term &ldquo;resource&rdquo; is not precise here as a &ldquo;composite&rdquo; is also a resource.)</p>
<p>This approach also shifts issues related to concurrency (such as ordering of requests based on success or failure), CPU (for generating projections, correlating related data from across representations etc.) and I/O (to fetch back-end resource representations in a serial/parrallel fashion depending on dependencies) workloads from the client to the server.</p>
<p>On the server side, the server hosting composites can also optimize its connection handling to resource servers to reduce TCP handshake and slowstart overhead. For instance, it can maintain pools of persistent/long-lasting connections (e.g., with keep-alive) between servers hosting composites and the resources (shown by bold arrows above).</p>
<p>In this post, I&rsquo;m not going to discuss software choices to serve composites, but you may need to account for several features:</p>
<ul>
<li>multi-tenancy or isolation of code execution, configuration and deployment so that different teams can build composites</li>
<li>data or control flow for fetching representations in parallel or sequentially based on inter-dependencies</li>
<li>query languages (such as <a href="http://developer.yahoo.com/yql/console/">YQL</a>) to normalize data formats and to easily create projections</li>
<li>non-blocking or asynchronous I/O to better tackle I/O workloads</li>
</ul>
<p>I&rsquo;m personally excited about <a href="http://nodejs.org/">nodejs</a> and async I/O support in Java 7 as both would let us build small and nimble broker apps to serve composites.</p>
<p>Of course - the idea of a composite is to add an extra layer of indirection on the server side to offset network overhead when performance is at stake. It is not meant to replace loosely coupled resources that can be manipulated using HTTP and linked using hypertext controls like links in representations.</p>
<p>Better Connection Reuse</p>
<p>Long-lasting TCP connections help reduce connection-establishment overhead as well as help the TCP stack settle to appropriate congestion window size. Reusing connections is usually trivial, and pooling is often part of client libraries. But there are a few precautions to take at the application level.</p>
<p>Avoid Explicit Connection Closing</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>\# Don&#39;t do this  
</span></span><span style="display:flex;"><span>HTTP/1.1 200 OK  
</span></span><span style="display:flex;"><span>Content-Type: application/json  
</span></span><span style="display:flex;"><span>Content-Length: 1234  
</span></span><span style="display:flex;"><span>Connection: close
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{ ... body ... }
</span></span></code></pre></div><p>The first precaution to take is not to add Connection: close to requests or responses by default. Carelessly adding this header to requests or responses will prevent connection reuse. There better be a good reason to add this header such as a server that can&rsquo;t handle too many open connections, or to prevent abuse.</p>
<p>Avoid Close Delimited Messages</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>\# Avoid this  
</span></span><span style="display:flex;"><span>HTTP/1.1 200 OK  
</span></span><span style="display:flex;"><span>Content-Type: application/json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{ ... body ... }
</span></span></code></pre></div><p>Make sure to include Content-Length or use Transfer-Encoding: chunked so that the recipient of a HTTP message can know when one HTTP request/response message ends and when the next one starts. If a response has neither of these two, then the recipient will need to read the stream till the connection is closed, which means that the connection cannot be reused. Close-delimited HTTP request/response messages are bad for performance.</p>
<p>Read Messages Completely</p>
<p>Incomplete reads will also prevent reuse of the connection. Incomplete reads usually happen when a client receives an error or a redirect response. These kinds of responses can have a body but clients can determine what to do by just looking at the response line and headers. For instance, a 409 response may have a body that explains why.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>HTTP/1.1 409 Conflict  
</span></span><span style="display:flex;"><span>Content-Type: text/html  
</span></span><span style="display:flex;"><span>Content-Length: 1234
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;html&gt; ... &lt;/html&gt;
</span></span></code></pre></div><p>But not reading the body from the connection my prevent reuse in some frameworks - Java is <a href="http://download.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html">known</a> for this. Also be wary of libraries that translate 4xx and 5xx response code into exceptions - in this case, in addition to catching the exception, the client will need to read the body.</p>
<p>Tune Idle Connection Timeouts</p>
<p>Servers and clients usually close idle connections upon a timeout to conserve resources. Settings for idle connection timeout may be hard to find or even not exposed in client/server frameworks. When tuning is possible, ensure that the defaults are reasonable.</p>
<p>Try Proxies for Long-Haul Traffic</p>
<p>In some cases a configuration like the following can help:</p>
<ul>
<li>Client apps that are short-living (like an app on a mobile/tablet or even on desktops), and hence connections can’t be persistent. Instead, the proxy can keep connections persistent which limits connection establishment cost to the first leg from client app to the nearest proxy.</li>
<li>Client apps that can’t maintain too many persistent connections — which is still the case for browsers today — though it is slowly changing.</li>
</ul>
<p>Of course, this approach also lets the server <a href="http://www.mnot.net/blog/2006/05/16/web_2_caching">distribute</a> responses to caches on those proxies to further reduce network cost. Many variations of this approach are possible depending on how your servers are distributed and how far are client apps from servers. If you&rsquo;re new to the idea of REST and are still wondering why HTTP&rsquo;s uniform interface is such a big deal, here is why - once you implement HTTP reasonably correctly, you can reconfigure servers, proxies and caches as necessary without code changes.</p>
<p>Progressive Serving of Representations</p>
<p>Sometimes it is not the network, but generating a response is the bottleneck. This is particularly true for composite resources or resources that rely on a number of data sources to generate a response to the client. The typical flow in such cases is as follows:</p>
<ul>
<li>read the request data such as the path and query string</li>
<li>decide what to fetch</li>
<li>fetch data from each dependent source in sequence or concurrently to the extent possible (which depends on dependencies)</li>
<li>prepare data for the response</li>
<li>write the data to the response</li>
</ul>
<p>Of these steps, when I/O for dependent sources is done sequentially, the server takes at least n*t time to generate a response. If all the I/O can be done in parallel, it takes max(t) amount of time, i.e, it performs at least as slow as the slowest source.</p>
<p>On the front-end side, when it takes time to generate a page, a common practice is to turn to XMLHttpRequest or iframes to split the page into fragments and defer loading of slower parts of the page. Both these techniques potentially use additional connections. In a multi-tiered setup, this causes a flood of new requests from the browser to front-end servers, and from there to backend servers and so on. This also introduces new state management and security problems as the server may need to push state first to the browser only to get it back via XMLHttpRequest immediately.</p>
<p>An alternative is to progressively render the page over a single connection. In this case, the flow would be</p>
<ul>
<li>read the request data such as the path and query string</li>
<li>decide what to fetch</li>
<li><em>fetch data from fast sources</em></li>
<li><em>initiate requests for slow sources</em></li>
<li><em>serve partial page based on response from fast sources</em></li>
<li><em>as and when a slow source responds, prepare a partial response and write to the client</em></li>
<li><em>after all the sources respond (or after some timeout), write additional chunks and finally end the page</em></li>
</ul>
<p>Here, by &ldquo;chunk&rdquo; I mean &ldquo;part of a message&rdquo; and not an HTTP chunk.</p>
<p>The goal of this technique is to reduce user-perceived latency without using more network connections from the browser. In this flow, browser makes an HTTP request to the front-end server which writes snippets of markup and script over a period of time before ending the response. Since the server does not know the Content-Length of the page, it would use chunked transfer encoding where end of response is triggered by a zero-sized chunk.</p>
<p>This is called &ldquo;progressive rendering&rdquo;. This technique is well-known in front-end circles and Facebook calls this technique <a href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919">BigPipe</a>. Progressive rendering depends on two things:</p>
<ul>
<li>Server being able to write chunks over lasting connections — asynchronous I/O based servers like <a href="http://nodejs.org/">nodejs</a> are very attractive for this (see my nodejs <a href="/blog/2010/07/bigpipe-done-in-node-js">example</a> or <a href="http://www.olympum.com">Bruno</a>’s <a href="http://www.olympum.com/java/facebook-bigpipe-in-an-async-servlet/">example</a> using continuations).</li>
<li>Clients being able to process response as it arrives — in Javascript capable browsers, this capability is already present.</li>
</ul>
<p>We can apply this technique for non-front-end resources as well provided (a) it is possible to retrieve data from fast sources before slow resources, and (b) data from fast sources is meaningful to clients. For instance, think of a personalized product resource that includes data about a product plus IDs, links, and brief summaries of related products. In this case, product data can be looked up from storage under a near-constant time (say, about 20 milliseconds) while finding related products may involve performing some computations on the user profile, past purchase history and other derived data which can be time consuming - say, taking up to 500 milliseconds. Here is an example of a progressive representation of such a product resource.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>HTTP/1.1 200 OK  
</span></span><span style="display:flex;"><span>Content-Type: multipart/mixed; boundary=abcdef  
</span></span><span style="display:flex;"><span>Transfer-Encoding: chunked
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>\--abcdef  
</span></span><span style="display:flex;"><span>Content-Type: application/json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{ ... product data here ... }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>\--abcdef  
</span></span><span style="display:flex;"><span>Content-Type: application/json
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{ ... related products here ... }      
</span></span><span style="display:flex;"><span>\--abcdef--
</span></span></code></pre></div><p>In this example I used a multipart media type as it provides a visible boundary between different portions of the representations, and the client can read the representation part by part.</p>
<p>If the client is a front-end app that generates an HTML product page for browsers, it can progressively render the product page as soon as it receives the first part, and then render markup for list of related products when the second part arrives.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>HTTP/1.1 200 OK  
</span></span><span style="display:flex;"><span>Content-Type: text/html  
</span></span><span style="display:flex;"><span>Transfer-Encoding: chunked
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;html&gt;  
</span></span><span style="display:flex;"><span>  &lt;head&gt;...&lt;/head&gt;  
</span></span><span style="display:flex;"><span>  &lt;body&gt;  
</span></span><span style="display:flex;"><span>    ... HTML for the product data ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;div id=&#34;related&#34;&gt;&lt;/div&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;!-- script for related products (some milliseconds later) --&gt;  
</span></span><span style="display:flex;"><span>    &lt;script&gt; // update related div ...&lt;/script&gt;  
</span></span><span style="display:flex;"><span>  &lt;/body&gt;  
</span></span><span style="display:flex;"><span>&lt;/html&gt;
</span></span></code></pre></div><p>This shows how progressive generation of arbitrary representations can be combined with progressive serving of the front-end to reduce perceived latency.</p>
<p>Epilogue</p>
<p>One of the patterns to notice from this post is that design considerations between HTML serving front-end apps and JSON/XML/whatever-speaking RESTful apps are not entirely different. Both rely on the same set of core architectural principles such as the uniform interface, visibility, hypertext, and so on. Whatever lessons we learn on the front end are certainly applicable for the so-called API servers.</p>
<p>Finally, it goes without saying that premature optimization is evil. My goal of this post is to point out the techniques you may already have in your toolkit. Apply them based on the need and experimentation.</p>
<p><em>If you find this post useful, try my book:</em> <a href="http://www.amazon.com/gp/product/0596801688?ie=UTF8&amp;tag=cyclogzcom-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596801688"><em>RESTful Web Services Cookbook</em></a><em>.</em></p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Can Pipelining Help?]]></title>
            <link href="https://www.subbu.org/articles/2011/can-pipelining-help/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2011/can-pipelining-help/</id>
            
            
            <published>2011-02-05T15:37:47+00:00</published>
            <updated>2011-02-05T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>HTTP pipelining is often suggested as a way to dramatically improve page load times, or to solve multi-GET use cases for RESTful applications. Whether pipelining can achieve the intended effect or not truly depends on what gets pipelined and how the server implements pipelining.</blockquote><p>HTTP pipelining is often suggested as a way to <a href="http://en.wikipedia.org/wiki/HTTP_pipelining">dramatic</a>ally improve page load times, or to solve <a href="http://stackoverflow.com/questions/109343/batching-in-rest">multi-GET use cases</a> for RESTful applications. Whether pipelining can achieve the intended effect or not truly depends on what gets pipelined and how the server implements pipelining.</p>
<p>When using pipelining, a HTTP client sends idempotent HTTP requests (such as GET) without waiting for response of previous requests, and expects responses to arrive in the same order from the server. <a href="http://tools.ietf.org/html/rfc2616">HTTP 1.1</a> says nothing about order of processing of requests on the server side — servers can process each request in sequence or in parallel. All that matters is the order of responses. However, in the real-world, pipelining is not often used due to a number of interoperability issues. Mark Nottingham recently captured some of these issues in an <a href="http://tools.ietf.org/html/draft-nottingham-http-pipeline">internet draft</a>:</p>
<blockquote>
<p>Anecdotal evidence suggests there are a number of reasons why clients don’t use HTTP pipelining by default. Briefly, they are:</p>
<ul>
<li>Server implementations may stall pipelined requests, or close their connection. This is one of the most commonly cited problems.</li>
<li>Server implementations may pipeline responses in the wrong order. Some implementations mix up the order of pipelined responses; e.g., when they hit an error state but don’t “fill” the response pipeline with a corresponding representation.</li>
<li>A few server implementations may corrupt pipelined responses. It’s been said that a very small number of implementations actually interleave pipelined responses so that part of response A appears in response B, which is both a security and interoperability problem.</li>
<li>Clients don’t have enough information about what is useful to pipeline. A given response may take an inordinate amount of time to generate, and/or be large enough to block subsequent responses. Clients who pipeline may face worse performance if they stack requests behind such an expensive request.</li>
</ul>
</blockquote>
<p>Even if we fix all the interoperability issues (such as 1, 2, and 3 above), pipelining <a href="http://devcentral.f5.com/weblogs/macvittie/archive/2009/04/02/http-pipelining-a-security-risk-without-real-performance-benefits.aspx">will not</a> necessarily improve anything. Unlike non-pipelined requests, clients need to know a bit about the server’s implementation before deciding to pipeline requests. Here is why.</p>
<p>The key constraint in pipelining is that the server must send responses in order. This leads to the so-called <a href="http://en.wikipedia.org/wiki/Head-of-line_blocking">head-of-line blocking</a> problem.</p>
<p>Assume that the client opens a connection and sends three GET requests, g1, g2, and g3. Of these, let’s say that g1 takes longer to process than g2 and g3. But the server is still required to return responses in the sequence of g1, g2, and g3. Here is one possible implementation in a multi-threaded server.</p>
<ul>
<li>Server receives a connection, and it gives the associated channel/stream to a thread t0</li>
<li>Server starts parsing the data in t0</li>
<li>Server finds g1, and hands it off to an application handler h1 in thread t1</li>
<li>Server finds g2, and hands it off to an application handler h2in thread t2</li>
<li>Server finds g3, and hands it off to an application handler h3 in thread t3</li>
<li>h2 finishes first and wants to write response — server blocks it since h1 has not finished yet</li>
<li>h3 finishes next and wants to write response — server blocks it too since h1 has not finished yet</li>
<li>h1 wants to write response — since g1 is the first request, the server lets it</li>
<li>Server unblocks h2, and it writes response</li>
<li>Server unblocks h3, and it writes it to response</li>
</ul>
<p>In this model, the server explicitly blocks application handlers from writing response until it is their turn. Alternative implementations are possible:</p>
<ol>
<li>The server can wait to read the next request (i.e., the request line, headers and any body) until the previous request is completely processed.</li>
<li>The server can buffer responses of application handlers (at least of those that finish earlier than previous requests) and write them in order to the client.</li>
</ol>
<p>Over some limited tests during the weekend, I found that both <a href="http://www.jboss.org/netty">Netty</a> and <a href="http://tomcat.apache.org/">Tomcat</a> follow the first approach while <a href="http://nodejs.org/">Nodejs</a> follows the second approach. Both approaches have their limitations, in particular when one of the requests early in the pipeline takes time to complete. In such cases, the client is better off sending g1 over one connection, and pipeline g2 and g3 on a second connection. This will reduce the serialization window on the server. However, in order to make such a choice, the client needs to have some prior idea about workloads involved in processing each request. When such information is difficult to assert (e.g., for a browser sending requests to an arbitrary servers), connection reuse via keep-alive is safer bet than pipelining. In any case, it is better to test before enabling pipelining in clients.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Chatty Apps]]></title>
            <link href="https://www.subbu.org/articles/2011/chatty-apps/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2011/chatty-apps/</id>
            
            
            <published>2011-01-25T15:37:47+00:00</published>
            <updated>2011-01-25T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>We know that the first practice to speed up performance of a site is to minimize the number of HTTP requests. The same should be true for mobile apps too, but the results I find from some of the apps I commonly use on my iPhone show that the apps have not paid enough attention to this practice.</blockquote><blockquote>
<p>I&rsquo;m resuccitating this old artile to support some inbound traffic.</p>
</blockquote>
<p>We know that the first practice to speed up performance of a site is to minimize the number of HTTP requests. The same should be true for mobile apps too, but the results I find from some of the apps I commonly use on my iPhone show that the apps have not paid enough attention to this practice. I used <a href="http://www.charlesproxy.com/">Charles Proxy</a> for my tests. I can not vouch for the correctness of some of the headers reported by this proxy, but the common pattern I noticed is the number of HTTP requests they fire up is not small. This pattern has obvious impact on the user-perceived latency and even battery life.</p>
<p>Here is a summary.</p>
<p><strong>Bing</strong></p>
<p><em>Task: Search</em></p>
<ul>
<li>1-n GET requests for auto-completing search string.</li>
<li>One POST with XML for fetching search results</li>
<li>A couple of POST requests for instrumentation — these are like beacon requests with zero length responses.</li>
</ul>
<p><strong>Google</strong></p>
<p><em>Task: Search</em></p>
<ul>
<li>Seven short POST requests exchanging some application/binary content — not sure what their purpose is</li>
<li>1-n GET requests for auto-completing search string. The response is application/json, but the resposne is actually Javascript (and so the Content-Type should be `application/javascript’.</li>
<li>Four GET requests to log suggestions. These are again like beacon requests with zero-length responses.</li>
<li>One GET for search results</li>
</ul>
<p><strong>Mint</strong></p>
<p><em>Task: Open the app</em></p>
<ul>
<li>26 requests over TLS — I suspect that the number of requests depends on the number of accounts — now I know why this app is so slow on my iPhone.</li>
</ul>
<p><strong>Netflix</strong></p>
<p><em>Task: Open the app</em></p>
<ul>
<li>One request over TLS, probably for some token exchange.</li>
<li>One GET to fetch some config data</li>
<li>One GET to fetch some policy related info</li>
<li>One GET to get date-time from server (why not Date from a previous response?)</li>
<li>One GET to get rental history, two GETs to get rental queue, two POSTs for ratings, one GET for account info, another GET config request, one GET for catalog, and a POST for some misc data</li>
<li>A number of unconditional GET requests for static assets with expires set to a day later</li>
</ul>
<p><strong>Amazon</strong></p>
<p><em>Task: Open the app</em></p>
<p>Just two POST requests with application/octet-stream encoded data.</p>
<p><strong>LinkedIn</strong></p>
<p><em>Task: Open the app</em></p>
<ul>
<li>One GET for the profile</li>
<li>One GET for messages</li>
<li>One GET for some alerts</li>
<li>One GET for favorites</li>
<li>One POST to report metrics</li>
</ul>
<p>The order and number of these requests depends on the UI state of the app.</p>
<p><strong>Facebook</strong></p>
<p><em>Task: Open the app</em></p>
<ul>
<li>Six pre-flight GET requests — not sure what the purpose is — there is not much that I could discern from responses</li>
<li>One request over TLS</li>
<li>A POST multipart/form-data request with an XML response (falsely advertised as text/html) with some profile data</li>
<li>One multipart/form-data POST request — the response is XML encoded within XML.</li>
<li>A number of unconditional GETs for static assets — expiry set for a few months</li>
</ul>
<p>Ignoring some funny use of HTTP, my key observation is that most apps are built on top of existing “APIs”. The APIs are providing access to different types of data, and the app is aggregating that data from the client (the phone) side. So, even simple actions like opening an app cause a number of requests from the client. All the apps I tested are branded and not built by third-parties and hence do have every chance to optimize the traffic.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[BigPipe Done in Node.js]]></title>
            <link href="https://www.subbu.org/articles/2010/bigpipe-done-in-node-js/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2010/bigpipe-done-in-node-js/</id>
            
            
            <published>2010-07-25T15:37:47+00:00</published>
            <updated>2010-07-25T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Here is a quick hack</blockquote><p><a href="http://codemonkeyism.com">Stephan Schmidt</a> says</p>
<blockquote>
<p>I’ve implemented a proof of concept of BigPipe in Java (should run as-is in every servlet container):</p>
</blockquote>
<p>See his <a href="http://codemonkeyism.com/facebook-bigpipe-java/">blog post</a> for the Java servlet class.</p>
<p>Here is the same (or more?) written in Node.js.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span><span style="color:#00f">var</span> http = require(<span style="color:#a31515">&#39;http&#39;</span>);  
</span></span><span style="display:flex;"><span><span style="color:#00f">var</span> sys = require(<span style="color:#a31515">&#39;sys&#39;</span>);  
</span></span><span style="display:flex;"><span><span style="color:#00f">var</span> url = require(<span style="color:#a31515">&#34;url&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>http.createServer(function(request, response) {  
</span></span><span style="display:flex;"><span>    // Write the document  
</span></span><span style="display:flex;"><span>    response.writeHead(200, {<span style="color:#a31515">&#34;Content-Type&#34;</span> : <span style="color:#a31515">&#34;text/html&#34;</span>});  
</span></span><span style="display:flex;"><span>    response.write(<span style="color:#a31515">&#34;&lt;!DOCTYPE html PUBLIC &#34;</span>-//W3C//DTD XHTML 1.0 Strict//EN<span style="color:#a31515">&#34;&#34;</span> +  
</span></span><span style="display:flex;"><span>            <span style="color:#a31515">&#34;   &#34;</span>http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd<span style="color:#a31515">&#34;&gt;&#34;</span>);  
</span></span><span style="display:flex;"><span>    response.write(<span style="color:#a31515">&#34;&lt;script type=&#34;</span>text/javascript<span style="color:#a31515">&#34;&gt;function arrived(id,text) { var b=document.getElementById(id); b.innerHTML = text; }&lt;/script&gt;&#34;</span>);  
</span></span><span style="display:flex;"><span>    response.write(<span style="color:#a31515">&#34;&lt;/head&gt;&lt;body&gt;&lt;div&gt;Progressive Loading&#34;</span>);  
</span></span><span style="display:flex;"><span>    <span style="color:#00f">for</span>(<span style="color:#00f">var</span> i = 0; i &lt; 6; i++) {  
</span></span><span style="display:flex;"><span>        response.write(<span style="color:#a31515">&#34;&lt;div id=&#39;&#34;</span> + i + <span style="color:#a31515">&#34;&#39;&gt;&amp;;lt;/div&gt;&#34;</span>);  
</span></span><span style="display:flex;"><span>    }  
</span></span><span style="display:flex;"><span>    response.write(<span style="color:#a31515">&#34;&lt;/div&gt;&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Now the snippets  
</span></span><span style="display:flex;"><span>    <span style="color:#00f">var</span> down = 6;  
</span></span><span style="display:flex;"><span>    <span style="color:#00f">for</span> (i = 0; i &lt; 6; i++) {  
</span></span><span style="display:flex;"><span>        <span style="color:#00f">var</span> proxy = http.createClient(2000, <span style="color:#a31515">&#34;localhost&#34;</span>);  
</span></span><span style="display:flex;"><span>        <span style="color:#00f">var</span> proxyRequest = proxy.request(<span style="color:#a31515">&#34;GET&#34;</span>, <span style="color:#a31515">&#34;/?id=&#34;</span> + i,  
</span></span><span style="display:flex;"><span>                                         {<span style="color:#a31515">&#34;host&#34;</span> : <span style="color:#a31515">&#34;localhost&#34;</span>});  
</span></span><span style="display:flex;"><span>        proxyRequest.addListener(<span style="color:#a31515">&#39;response&#39;</span>, function (proxyResponse) {  
</span></span><span style="display:flex;"><span>            --down;  
</span></span><span style="display:flex;"><span>            proxyResponse.addListener(<span style="color:#a31515">&#39;data&#39;</span>, function(chunk) {  
</span></span><span style="display:flex;"><span>                response.write(chunk, <span style="color:#a31515">&#39;binary&#39;</span>);                  
</span></span><span style="display:flex;"><span>            });  
</span></span><span style="display:flex;"><span>            proxyResponse.addListener(<span style="color:#a31515">&#39;end&#39;</span>, function() {  
</span></span><span style="display:flex;"><span>                <span style="color:#00f">if</span>(down == 0) {  
</span></span><span style="display:flex;"><span>                    response.end();  
</span></span><span style="display:flex;"><span>                }  
</span></span><span style="display:flex;"><span>            });  
</span></span><span style="display:flex;"><span>        });  
</span></span><span style="display:flex;"><span>        proxyRequest.close();  
</span></span><span style="display:flex;"><span>    }  
</span></span><span style="display:flex;"><span>    response.write(<span style="color:#a31515">&#34;&lt;/body&gt;&lt;/html&gt;&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}).listen(8080);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>http.createServer(function(request, response) {  
</span></span><span style="display:flex;"><span>    // Some delay upto upto 2 seconds  
</span></span><span style="display:flex;"><span>    <span style="color:#00f">var</span> delay = Math.round(Math.random() \* 2000);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>setTimeout(function() {  
</span></span><span style="display:flex;"><span>        <span style="color:#00f">var</span> params = url.parse(request.url, true);  
</span></span><span style="display:flex;"><span>        <span style="color:#00f">var</span> id = params.query.id;  
</span></span><span style="display:flex;"><span>        response.writeHead(200, {<span style="color:#a31515">&#34;Content-Type&#34;</span> : <span style="color:#a31515">&#34;text/html&#34;</span>});  
</span></span><span style="display:flex;"><span>        <span style="color:#00f">var</span> content = <span style="color:#a31515">&#34;&lt;span&gt;Content of Module &#34;</span> + id + <span style="color:#a31515">&#34;&lt;/span&gt;&#34;</span>;  
</span></span><span style="display:flex;"><span>        response.write(<span style="color:#a31515">&#34;&lt;script&gt;&#34;</span> +  
</span></span><span style="display:flex;"><span>            <span style="color:#a31515">&#34;arrived(&#39;&#34;</span> + id + <span style="color:#a31515">&#34;&#39;, &#39;&#34;</span> + content + <span style="color:#a31515">&#34;&#39;);&#34;</span> +  
</span></span><span style="display:flex;"><span>             <span style="color:#a31515">&#34;&lt;/script&gt;&#34;</span>);  
</span></span><span style="display:flex;"><span>        response.close();  
</span></span><span style="display:flex;"><span>	}, delay);  
</span></span><span style="display:flex;"><span>}).listen(2000);
</span></span></code></pre></div><p>I&rsquo;ve no comments on the technique itself. The basic idea may have been implemented a number of times in different languages. The mileage varies based on the language/environment used.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[POST Caching Example]]></title>
            <link href="https://www.subbu.org/articles/2008/post-caching-example/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2008/post-caching-example/</id>
            
            
            <published>2008-11-15T15:37:47+00:00</published>
            <updated>2008-11-15T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Here is a good example of caching of POST responses by Henrik Nordström in the HTTP WG</blockquote><p>Here is a good example of caching of POST responses by <a href="http://www.henriknordstrom.net/">Henrik Nordström</a> in the HTTP WG.</p>
<blockquote>
<p>The classic example of where a cacheable response to POST makes sense is the guestbook example (or unmoderated blog comments for those needing a more modern example, basically the same thing in a different era) where the visitor POSTs an addition to the page currently viewed, or “separate entity that accepts annotations” as it’s expressed in the RFC. The response given to the POST is the new representation of the page. Both<br>
GET and POST uses the same URL in this example.</p>
</blockquote>
<p>followed by</p>
<blockquote>
<p>Note that the POST request as such can never be satisfied from cache. A repeated POST with the same form content will not yield the same result even if the response is cacheable.</p>
</blockquote>
<p>The context of this thread was whether the HTTP method should be included in the cache key. See <a href="http://lists.w3.org/Archives/Public/ietf-http-wg/2008OctDec/0200.html">this thread</a> for a complete summary.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Resource Identity and Cool URIs]]></title>
            <link href="https://www.subbu.org/articles/2008/resource-identity-and-cool-uris/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2008/resource-identity-and-cool-uris/</id>
            
            
            <published>2008-10-28T15:37:47+00:00</published>
            <updated>2008-10-28T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>In response my InfoQ article on Describing RESTful Applications, some of the comments I received so far dealt with resource identity.</blockquote><p>In response my <a href="http://www.infoq.com">InfoQ</a> article on <a href="http://www.infoq.com/articles/subbu-allamaraju-rest">Describing RESTful Applications</a>, some of the comments I received so far dealt with resource identity. When I sent a draft to <a href="http://www.innoq.com/blog/st/">Stefan</a> in late October, he was curious to see why I used ID elements to capture a unique identifier of each resource.</p>
<p>Here is a snippet from one of the examples I used in that article.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&lt;accounts xmlns=&#34;urn:org:bank:accounts&#34;&gt;  
</span></span><span style="display:flex;"><span>  &lt;account&gt;  
</span></span><span style="display:flex;"><span>      &lt;id&gt;AZA12093&lt;/id&gt;  
</span></span><span style="display:flex;"><span>      &lt;link href=&#34;http://bank.org/account/AZA12093&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>      ...  
</span></span><span style="display:flex;"><span>  &lt;/account&gt;  
</span></span><span style="display:flex;"><span>  &lt;account&gt;  
</span></span><span style="display:flex;"><span>      &lt;id&gt;ADK31242&lt;/id&gt;  
</span></span><span style="display:flex;"><span>      &lt;link href=&#34;http://bank.org/account/ADK31242&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>      ...  
</span></span><span style="display:flex;"><span>  &lt;/account&gt;  
</span></span><span style="display:flex;"><span>&lt;/accounts&gt;
</span></span></code></pre></div><p><a href="http://www.ebpml.org/ebpml_radio.htm">JJ</a>, in his <a href="http://www.ebpml.org/blog/152.htm">latest</a> post on the same article makes a similar comment.</p>
<blockquote>
<p>Interestingly Subbu also defined a proprietary ID mechanism reinforcing the idea that a URI is not generally used for identity purposes. I would have preferred a “link” to a unique resource identifier.</p>
</blockquote>
<p>A similar thought was expressed by <a href="http://ironick.typepad.com/">Nick Gall</a> in a thread on <a href="http://tech.groups.yahoo.com/group/rest-discuss/message/11699">rest-discuss</a> where he says</p>
<blockquote>
<p>So ultimately, I’d prefer to see all identifiers as URLs (not just URIs) and have such URLs be permanent.</p>
</blockquote>
<p>Since URIs are supposed to be permanent, i.e., since <a href="http://www.w3.org/Provider/Style/URI">cool URIs don’t change</a>, we should be able to use URIs to identify a given resource, and ideally there should be no need for <em>proprietary</em> identifiers. However, in reality, URIs are unreliable substitutes for identifiers for client applications to rely upon. Allow me to elaborate.</p>
<p>Look at the following HTTP GET requests.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /person/abc  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>200 OK  
</span></span><span style="display:flex;"><span>Content-Type: ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;person&gt;  
</span></span><span style="display:flex;"><span>  &lt;link href=&#34;http://www.example.org/person/abc&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>  &lt;link href=&#34;http://www.example.org/person/abc?include=addressbook&#34;  
</span></span><span style="display:flex;"><span>    rel=&#34;http://www.example.org/rels/person-with-addressbook&#34;/&gt;  
</span></span><span style="display:flex;"><span>  &lt;first-name&gt;Subbu&lt;/first-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;last-name&gt;Allamaraju&lt;/last-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;email&gt;subbu@nospam.com&lt;/email&gt;  
</span></span><span style="display:flex;"><span>  ...  
</span></span><span style="display:flex;"><span>&lt;person&gt;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /myapp/person/abc?include=addressbook  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>200 OK  
</span></span><span style="display:flex;"><span>Content-Type: ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;person&gt;  
</span></span><span style="display:flex;"><span>  &lt;link href=&#34;http://www.example.org/person/abc?include=addressBook&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>  &lt;first-name&gt;Subbu&lt;/first-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;last-name&gt;Allamaraju&lt;/last-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;addresses&gt;  
</span></span><span style="display:flex;"><span>    &lt;address&gt;  
</span></span><span style="display:flex;"><span>      ...  
</span></span><span style="display:flex;"><span>    &lt;/address&gt;  
</span></span><span style="display:flex;"><span>    ...  
</span></span><span style="display:flex;"><span>  &lt;/addresses&gt;      
</span></span><span style="display:flex;"><span>&lt;person&gt;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /myapp/people?like=subbu  
</span></span><span style="display:flex;"><span>Host: [www.example.org](http://www.example.org)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>200 OK  
</span></span><span style="display:flex;"><span>Content-Type: ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>&lt;people&gt;      
</span></span><span style="display:flex;"><span>  &lt;link href=&#34;http://www.example.org/people?like=subbu&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>  &lt;person&gt;  
</span></span><span style="display:flex;"><span>    &lt;link href=&#34;http://www.example.org/person/abc?view=mini&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>    &lt;first-name&gt;Subbu&lt;/first-name&gt;  
</span></span><span style="display:flex;"><span>    &lt;last-name&gt;Allamaraju&lt;/last-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;person&gt;  
</span></span><span style="display:flex;"><span>  &lt;person&gt;  
</span></span><span style="display:flex;"><span>    &lt;link href=&#34;http://www.example.org/person/def?view=mini&#34; rel=&#34;self&#34;/&gt;  
</span></span><span style="display:flex;"><span>    &lt;first-name&gt;Subbu&lt;/first-name&gt;  
</span></span><span style="display:flex;"><span>    &lt;last-name&gt;Somebody&lt;/last-name&gt;  
</span></span><span style="display:flex;"><span>  &lt;person&gt;      
</span></span><span style="display:flex;"><span>&lt;/people&gt;
</span></span></code></pre></div><p>In each response, the client is receiving information about the same person. In the first case, it is receiving the first name and last name, in the second case, it is receiving first name, last name, and the person&rsquo;s address book, and in the third case, it is finding the same person through a search.</p>
<p>Now, let us think of an on-line game review site that uses the server at <a href="http://www.example.org">http://www.example.org</a> for all user data.</p>
<p>Here are some possible user scenarios.</p>
<ul>
<li>I log into the game review site, and upon login, it greets me with my first name and last name.</li>
<li>I click on a link to view my address book.</li>
<li>One of my friends logs into this site, types in “subbu” in some search box, finds my name in the search results, and then clicks on a link to view reviews posted by me and all the contacts in my address book.</li>
</ul>
<p>To implement these scenarios, the client needs to be able to (a) relate that all responses are referring to the same user, and (b) store additional data in its databases using the user&rsquo;s identity as a foreign key in its database. What can the client rely upon?</p>
<p>Let me start with the &ldquo;self&rdquo; links. The person has a self link in each case, but they are all different. The client can not determine that the person with name Subbu Allamaraju found in the search results is the same as the one in the first or the second response. So, self links are useless to implement these scenarios.</p>
<p>There are three possible solutions to fix this problem.</p>
<ul>
<li>Let the client <em>guess</em> that they all refer to the same person by trying to parse the URI.</li>
<li>Introduce another link with a relation value of, say, <a href="http://www.exampple.org/rels/identity">http://www.exampple.org/rels/identity</a> and a URI that uniquely identify the entity in question.</li>
<li>Introduce an identifier in each representation that uniquely identifies the thing in question.</li>
</ul>
<p>The first is an obvious no-no since it breaks <a href="http://www.subbu.org/blog/2008/07/restful-uris">URI opacity</a>.</p>
<p>Of the remaining two options, I prefer the third one since what the client application needs is an identifier that uniquely identifies the entity, although the second option will work as well.</p>
<p>The key point is this. URIs uniquely identify resources but a URI used to fetch something is not always a good candidate to serve as a unique identifier in client applications. As I showed in the above example, there can be several URIs to fetch different kinds of information about the same entity. As far as HTTP is concerned, for the above example, there are three resources, each with a different URI. But as far as the client and server applications are concerned, we are talking about the same entity, which is a person. The URI that can be used to fetch these does not tell the client that they are the same. We need identifiers for that.</p>
<p>My design choice therefore is to include an identifier in every representation to uniquely identify the entity in question. I prefer using a URN as the value of these identifiers, since <a href="http://tools.ietf.org/html/rfc2141">URN</a>s are intended to serve as &ldquo;persistent, location-independent, resource identifiers&rdquo;.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Explaining State in HATEOAS]]></title>
            <link href="https://www.subbu.org/articles/2008/explaining-state-in-hateoas/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2008/explaining-state-in-hateoas/</id>
            
            
            <published>2008-10-15T15:37:47+00:00</published>
            <updated>2008-10-15T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Explaining “state” in “Hypermedia as the Engine of Application State” (HATEOAS) is a bit tricky, particularly when you have to do it under two minutes.</blockquote><blockquote>
<p>I&rsquo;m resuccitating this old artile to support some inbound traffic.</p>
</blockquote>
<p>Explaining “state” in “Hypermedia as the Engine of Application State” (HATEOAS) is a bit tricky, particularly when you have to do it under two minutes.</p>
<p>The problem is that, the word “state” means different things to different people. For most of us coming from some background in web development, state usually involves numbers, strings, booleans, and other objects stored in some place, say, in an in-memory session. For instance, every beginner-level book on web development includes a shopping cart style sample that stores the cart in an in-memory session. If we extend that notion to understand or explain HATEOAS, it would make us jump to the conclusion that, to make hypermedia as the engine of application state, the server will have to encode similar objects into some XML or such form of representation in response to each request. This line of thinking is a trap.</p>
<p>Here is why. Once the server includes such state in a representation, the next step for the client is to replay the state in future requests to the server. Then we are talking about exchanging those objects back and forth, and not every HTTP verb has enough room to carry that state. This line of thinking will then start to shoot holes into the notion of a uniform interface because, to fit the state in a request, the client may have to resort to POST. I can almost see message passing over POST as the next logical step. At this stage, whoever is trying to explain HATEOAS may have make some lame excuses and move on. Whoever is listening will then conclude that “yeah, this won’t work for my apps”.</p>
<p>Here is an example that I find most useful to explain the “state” in HATEOAS.</p>
<blockquote>
<p>There are three pages in a UI. The first page has a link to go to the second page. The second page has a link to go to the previous page as well as the third page. The third has a link to the second page and another link to the first page.</p>
</blockquote>
<blockquote>
<p>A client starts from the first page, and then through the link on that page, goes to the second page. The fact that this page has one link to the first page and another to the third page implies that the current state of the application (i.e. the interactions) is that “the client is viewing the second page”. That is what it means by hypermedia as the engine of application state. It does not necessarily mean serializing application state, such as “<page>2</page>” into representations.</p>
</blockquote>
<p>I admit that I am simplifying this a bit. The point is that state does not necessarily mean some data stored in representations. HATEOAS means that representations reflect the current state of the app through <a href="http://www.subbu.org/blog/2008/10/generalized-linking">links</a> with known relations. Those links may contain opaque references to some persistent state on the server.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Location vs. Content-Location]]></title>
            <link href="https://www.subbu.org/articles/2008/location-vs-content-location/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://www.subbu.org/articles/2008/location-vs-content-location/</id>
            
            
            <published>2008-10-10T15:37:47+00:00</published>
            <updated>2008-10-10T15:37:47+00:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Here is a quick note on the purposes of and differences between Location and Content-Location response headers.</blockquote><p>Here is a quick note on the purposes of and differences between Location and Content-Location response headers. The question came up several times, and more recently in Bill Burke’s post on <a href="http://bill.burkecentral.com/2008/10/06/atom-too-soapy-for-me/">Atom too SOAPy for me</a>.</p>
<p>Here is how HTTP 1.1 defines the Location header.</p>
<blockquote>
<p>Location:</p>
<p>The Location response-header field is used to redirect the recipient to a Location other than the Request-URI for completion of the request or identification of a new resource.</p>
</blockquote>
<p>The use of the Location header is straight-forward. The server can use this header when it creates new resource in response to a POST request, i.e. while returning response code 201. Or, it is can use this header to redirect the client to a different Location with one of the 3xx codes. The use of the Location header otherwise is unspecified. In particular, its use is not defined for GET.</p>
<p>Content-Location, on the other hand, has a much narrower usage.</p>
<blockquote>
<p>Content-Location:</p>
<p>The Content-Location entity-header field MAY be used to supply the resource Location for the entity enclosed in the message when that entity is accessible from a Location separate from the requested resource’s URI.</p>
</blockquote>
<p>The name of this header could be a bit confusing. One way to understand this is to relate it to other Content-xxx headers such as Content-Type, Content-Language, and Content-Encoding. Just like the way Content-Type header declares the media type of the entity in the response, the Content-Location header declares a URI for the entity in the response. Also note that the Content-Location header is not defined for PUT and POST.</p>
<p>Content-Location header is useful for content-negotiated responses when both server-driven and agent-driven negotiations are in use by the server. Here is an example.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>GET /myResource  
</span></span><span style="display:flex;"><span>Accept: application/xml
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>200 OK  
</span></span><span style="display:flex;"><span>Content-Type: application/xml  
</span></span><span style="display:flex;"><span>Content-Location: [http://example.org/myResource?format=xml](http://example.org/myResource?format=xml)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><p>Here the server is telling the client that the same content (i.e. a variant of media type application/xml) is also available at <a href="http://example.org/myResource?format=xml">http://example.org/myResource?format=xml</a> at the time of the request. The client can use that URI in future to directly fetch the negotiated response. Caches can use this URI to associate the requested URI (i.e. <a href="http://example.org/myResource%29">http://example.org/myResource)</a> to URIs of variants (such as <a href="http://example.org/myResource?format=xml%29,">http://example.org/myResource?format=xml),</a> and flush those variants while flushing the resource, or to flush previously cached representation at the variant URI if that representation is stale.</p>
<p>Finally, neither header is meant for general-purpose linking.</p>
<p>Thanks to my colleague, <a href="http://www.mnot.net">Mark Nottingham</a> for clarifying some of the finer points over several emails a few months ago.</p>
]]></content>
            
                 
                    
                
            
        </entry>
    
</feed>

