<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Incrementalism]]></title><description><![CDATA[Better software engineering, step by tiny step.]]></description><link>https://www.incrementalism.tech</link><image><url>https://substackcdn.com/image/fetch/$s_!o30f!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86390855-9abf-4d2a-af80-9a0c599b6244_600x600.png</url><title>Incrementalism</title><link>https://www.incrementalism.tech</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 11:58:02 GMT</lastBuildDate><atom:link href="https://www.incrementalism.tech/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Tobias Peciva]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[incrementalism@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[incrementalism@substack.com]]></itunes:email><itunes:name><![CDATA[Tobias Peciva]]></itunes:name></itunes:owner><itunes:author><![CDATA[Tobias Peciva]]></itunes:author><googleplay:owner><![CDATA[incrementalism@substack.com]]></googleplay:owner><googleplay:email><![CDATA[incrementalism@substack.com]]></googleplay:email><googleplay:author><![CDATA[Tobias Peciva]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Establishing a Documentation Culture]]></title><description><![CDATA[Build a culture of documentation to improve collaboration in your distributed team.]]></description><link>https://www.incrementalism.tech/p/establishing-a-documentation-culture</link><guid isPermaLink="false">https://www.incrementalism.tech/p/establishing-a-documentation-culture</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Sun, 02 Jul 2023 06:23:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o30f!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86390855-9abf-4d2a-af80-9a0c599b6244_600x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Successful distributed teams make documentation a priority. Documentation works 24/7, in every region and time zone. It supports asynchronous collaboration, creates a historical record of important decisions, and helps team members quickly get answers to common questions.</p><p>In my previous <a href="https://www.incrementalism.tech/p/remote-work-experiments">post</a> about remote and flexible work practices, I wrote about my own experience with documentation-centric collaboration. But how do you establish a documentation culture? How do you convince your team to embrace documentation in their daily work?</p><p>For this post, I thought I&#8217;d do something a bit different, and share some bite-sized suggestions for how to bootstrap and nurture a culture of documentation in your organization. These are all things I&#8217;ve tried with my teams, and found to be effective.</p><p>Here we go&#8230;</p><p><strong>Create an employee manual and onboarding guide in your documentation system.</strong> This helps new employees get in the habit of looking at the documentation. And it creates a place that people will visit regularly to look up benefits, policies, and other employment-related content.</p><p><strong>When someone asks you a question, document the answer, then respond with a link.</strong> This ensures it&#8217;s the last time you have to answer that question, and establishes a habit of looking at the documentation first. If you ask your team to follow the same principle, you quickly build up a library of fresh and relevant Q&amp;A content.</p><p><strong>Default to open.</strong> Whenever possible, make content available to anyone in the organization. You can&#8217;t predict who will discover your documentation and benefit from it &#8212; so why restrict your audience to just your own team or department? Plus, keeping things open creates an environment of transparency, accountability, and trust.</p><p><strong>Highlight and celebrate examples of good documentation.</strong> You can show off great content in review meetings, weekly updates, or group chat channels. This shows you take documentation seriously, and creates a positive feedback loop for contributors.</p><p><strong>Assume readers lack context.</strong> Don&#8217;t use jargon and acronyms without explaining them. Link to prerequisites, prior art, and other relevant documents. This makes your documentation friendlier and more accessible. It also makes it less daunting for new team members to contribute.</p><p><strong>Include documentation in your career progression framework.</strong> As people move into more senior roles, it&#8217;s increasingly important they can clearly express ideas to their teams and leaders. By calling this out in the career progression framework, you create both an incentive and an expectation for everyone to actively improve their written communication skills.</p><p><strong>Share your personal notes, unless they&#8217;re truly private.</strong> Most of us write things down to remember them for ourselves. But if you put in the extra effort to organize your notes and publish them, your whole team benefits. Plus, chances are this extra step helps you clarify your own thoughts, and retain the information better.</p><p><strong>Create a public list of things that need to be documented.</strong> When you&#8217;re bootstrapping a documentation effort, people don&#8217;t always know where to start. If you share a wish list with the team, you may get help building out the content &#8212; and you quickly find out who likes to write.</p><p><strong>Regularly delete out-of-date content.</strong> Stale content makes it harder to identify relevant information, and sends a message that the documentation isn&#8217;t actively maintained. This undermines your efforts to build a healthy documentation culture. One exception to this rule is any documentation you maintain for historical purposes, such as decision records.</p><p><strong>Cover topics you want your team to care about.</strong> If you&#8217;re committed to improving something like diversity, make sure there&#8217;s documentation around it &#8212; such as guidelines for inclusive hiring practices. This is especially important if you&#8217;re a leader in your organization, because people consciously and subconsciously optimize for the things you focus on.</p><p><strong>Document tactical and operational things, like project plans or coverage over holidays.</strong> This brings people into your documentation daily, and makes the content feel current and relevant. If possible, surface project status in your documentation as well, so stakeholders don&#8217;t have to dive into your task tracking tool to keep tabs on progress.</p><p><strong>Create templates for interview notes, onboarding checklists, decision records, and other recurring content that should follow a specific format.</strong> Better still, create a quick link that generates a new document of the selected type, and populates the author, tags, and other metadata. This lowers the barrier of entry for creating structured documents, and encourages consistency.</p><p><strong>Add a list of popular or recently edited pages to your documentation landing page.</strong> This gives new arrivals a way to sample the documentation contents, and helps everyone find documents the team is actively collaborating on. If you want to gamify your documentation with a bit of friendly competition, some documentation tools also let you add a list of the most prolific contributors.</p><p><strong>Appoint an information architect to keep things clean and well organized.</strong> Low quality and poorly structured documentation turns people off. If you have the budget to hire a trained information architect, that&#8217;s amazing. But for everyone else, find someone in your team who cares deeply about documentation. You can ask them to spend a portion of their time organizing and maintaining your content. Perhaps they can also help evangelize your documentation culture, educate contributors, or create a house style guide. If you run a team and you have no takers, then congratulations, you&#8217;re it!</p><p>Good documentation is a superpower for distributed teams. Hopefully these ideas get you thinking about new ways to support the documentation culture in your organization. And if you had success with other approaches, I&#8217;d love to hear what worked for you.</p>]]></content:encoded></item><item><title><![CDATA[Remote Work Experiments]]></title><description><![CDATA[Experiment with remote and flexible work practices to improve collaboration and open up new lifestyle options for your team.]]></description><link>https://www.incrementalism.tech/p/remote-work-experiments</link><guid isPermaLink="false">https://www.incrementalism.tech/p/remote-work-experiments</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Tue, 23 May 2023 00:33:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8b925fba-51b4-43c1-aaa7-f9ed9e0b9f84_700x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Among the many personal and societal tragedies caused by COVID-19, the global pandemic also triggered a giant global experiment in remote work. This gave us a once-in-a-generation opportunity to reconsider &#8212; at scale &#8212; how office jobs get done.</p><p>My team at Cornerstone OnDemand went all in on remote work in the early days of the pandemic. But we didn&#8217;t have much prior experience working remotely, so we had to trial new ways to collaborate and get things done.</p><p>Here, I&#8217;ll share some of our successful remote work experiments &#8230; and a couple of failed ones, too.</p><h2>Experiments That Worked</h2><h4>Full Schedule Flexibility</h4><p>When we first switched to remote work, we kicked off another experiment at the same time: Total schedule flexibility. We asked people to work 40 hours a week, on whatever schedule suited them best, and to coordinate as necessary with their teams. This was not a stretch for us, as Cornerstone was already a global organization, with engineers collaborating across North America, Europe, the Middle East, Asia, and the Pacific.</p><p>We ended up with a surprising diversity of work schedules. Engineers started work as early as 5am, or as late as 11am. Some preferred to work a &#8220;4x10&#8221; schedule, with four long days a week. And a few came up with more fragmented schedules, working in shorter chunks of time over five or six days. We weren&#8217;t surprised to learn this, but it was clear the typical 9-to-5 office hours are not a good fit for most people.</p><p>Allowing people to organize their work around their personal lives and daily energy levels was a big win for the team. I loved that we could support people who preferred to take an afternoon nap, or go mountain biking during daylight hours, or maybe offset a production incident on the weekend by spending Monday with the kids.</p><p>But for me, the most positive impact was something we didn&#8217;t really expect: Some parents with childcare responsibilities were able to go back to full time work, when a regular work week would have been impossible to manage. They designed their schedules around their children&#8217;s needs, getting their work in at odd times of day and night. This seemed like an amazing win from a diversity, equity, and inclusion perspective.</p><p>The team also embraced global time zone differences. With most of my team in New Zealand, and collaborating closely with teams in the US, our work week only had a four day overlap. This created natural quiet periods on Monday in New Zealand, and Friday in the US. We committed to making these meeting free days, to give teams at least one day a week for uninterrupted, deep work. And for engineers that preferred to work four long days a week, this created a full day where they could be absent without missing any meetings or social gatherings.</p><h4>Focus on Documentation</h4><p>Remote and flexible work calls for a more asynchronous approach to communication. You don&#8217;t always have others available to answer questions or give feedback, and it&#8217;s awkward to depend on meetings for decision making.</p><p>To combat these challenges, we trialled a more documentation-based approach to collaboration. One of the most successful experiments was to use &#8220;architecture decision record&#8221; (ADR) and &#8220;product decision record&#8221; (PDR) documents to help us make decisions.</p><p>For any significant decision, an engineer or product manager would document the problem statement, any context or constraints, a list of possible solutions, and a recommendation for what to do next. The document owner would then ask for feedback from their peers and other stakeholders, iterate on the proposal, and ultimately commit to a course of action. These documents enabled asynchronous decision making, helped us prep effectively for any discussion meetings, and recorded each decision for future reference.</p><p>In parallel, we built up a library of &#8220;how to&#8221; content. Whenever someone asked or answered a question, they would document the answer in our internal wiki. Over a few months, this built up a large library of knowledge for new or existing engineers to tap into, at any time of day or night.</p><p>We also used the wiki to share project status, team priorities, key metrics, wins and challenges, and video demos of new product features. Team members would update the content regularly, and interested parties would then consume the information when and where it was convenient for them. This was a great way to inform the team and leadership about current events, without the need for all-hands meetings or expensive leadership syncs.</p><h4>Fewer, Better Meetings</h4><p>With our shift to flexible work schedules and improved internal documentation, we cut down drastically on meetings. We eliminated many tactical update meetings, group decision making sessions, and other meetings that could be handled through asynchronous collaboration. Some teams experimented with moving daily standups to group chat. They would then organize a follow-up meeting when there were interesting topics to discuss.</p><p>This shift created much larger blocks of uninterrupted focus time for engineers. It also increased engagement in the few meetings we did have, because we only organized one when we really needed to, and participants weren&#8217;t fatigued from consecutive meetings.</p><p>Perhaps more importantly, we shifted the focus of our few large meetings from work discussions to social get-togethers. With the money we saved on office-based perks, we set up a regular schedule of team catchups for food and chill-out time, or team activities like bowling, escape rooms, and paintball. This helped offset the lack of daily face-to-face contact in our remote work environment. It turns out face-to-face meetings are better when you just meet for fun.</p><h2>Experiments That Didn&#8217;t Work</h2><h4>Hybrid Work</h4><p>For the first couple of years of remote work, we continued to maintain an office. We wanted to enable in-person collaboration, have our own space for social catchups, and support people who couldn&#8217;t easily work from home. Although we didn&#8217;t mandate time in the office for anyone, a couple of my engineering managers bribed their teams with food for a bi-weekly catchup.</p><p>In practice, we found that only a handful of people used the office on any given day. As our remote work practices improved, almost everyone preferred to work from home, or occasionally from overseas. We rarely had a critical mass of people in the office for in-person collaboration, so the benefits of coming in were outweighed by the drawbacks &#8212; such as lengthy commutes or childcare difficulties.</p><p>We briefly considered mandating one or two days in the office each week. But when you do this, you negate the biggest benefits of remote work, such as location-independent hiring.</p><p>Ultimately, we canceled our office lease, and offered teams the use of a shared office space instead.</p><h4>No Official Commitment to Remote Work</h4><p>Although we embraced the remote and flexible work experiment, we didn&#8217;t commit to support these work practices indefinitely. We wanted to give ourselves the option to go back to office-based work in the future.</p><p>In retrospect, this was a mistake. A huge benefit of remote and flexible work is that people can make major life changes, like moving to lifestyle or low-cost locations, or cancelling daycare to work flexibly around childcare responsibilities. But buying a property in another location is risky if your organization doesn&#8217;t have an official remote work policy.</p><p>We found the full value of remote and flexible work was only realized a couple of years in, when we finally made a firm commitment to support it indefinitely. I wish we hadn&#8217;t kept the team on tenterhooks for so long.</p><h2>How We Measured</h2><p>When you perform these sorts of organizational experiments, how do you measure what works and what doesn&#8217;t?</p><p>My best suggestion is to continuously monitor the metrics that matter most in your organization. You you can plot these over time to see how each experiment affects them.</p><p>In our case, we tracked our internal performance metrics across application delivery, process flow, operations, and customer experience. This included things like deployment frequency, cycle time, incoming defects, and product usage metrics. You can read more about these in my previous <a href="https://www.incrementalism.tech/p/monthly-report-card">post</a> about monthly report cards.</p><p>To our surprise, we saw very little change to any of these metrics as we transitioned to remote work. We would have loved to see a clear improvement in some areas, but we were still happy with this result: It showed that the team quickly adapted to our new ways of working.</p><p>We also measured our internal <a href="https://en.wikipedia.org/wiki/Net_promoter_score">NPS</a>, through a regular anonymous survey. And wow, did we see a change there. Six weeks into our fully remote work experiment, our internal NPS was up by over 30 points. Even though it eased back a few points once the novelty wore off, this is the largest increase I&#8217;ve seen in my career.</p><p>This sentiment was backed up by informal feedback from the team, and regular check-ins with managers and engineers. People really appreciated the freedom and flexibility of remote work, and many made meaningful lifestyle changes in response. It&#8217;s hard to imagine any other organizational change that could result in such a big quality of life improvement for the team.</p>]]></content:encoded></item><item><title><![CDATA[A Continuous Deployment Maturity Model]]></title><description><![CDATA[Use a capability maturity model to guide your migration to continuous deployment.]]></description><link>https://www.incrementalism.tech/p/continuous-deployment-maturity-model</link><guid isPermaLink="false">https://www.incrementalism.tech/p/continuous-deployment-maturity-model</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Thu, 20 Apr 2023 23:14:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Continuous deployment has a profound impact on engineering performance. It allows you to quickly and safely iterate on software in production, while gaining realtime insights about your operations and your customer needs. As a result, it supports a culture of high ownership and cross-functional collaboration.</p><p>But what does the path to continuous deployment look like, and how do you make the transition happen? This post is my attempt to answer those questions.</p><p>My team at Cornerstone OnDemand went from a handful of production deployments annually to more than 2,000. We automatically deployed code changes to production as soon as they were merged to trunk, often in under 20 minutes.</p><p>But switching to continuous deployment was not an overnight change for us. The team spent over a year building tools, adjusting processes, and establishing the culture required for successful continuous deployment. In the years since then, we continued to develop and refine our practices.</p><p>As with any large change, you don&#8217;t have to do everything at once. If you break down the process into a series of incremental steps, it&#8217;s easier to make progress, and you&#8217;ll start to see the benefit of these changes long before you reach the end goal.</p><p>So rather than describe what a continuous deployment environment looks like when you&#8217;re already doing it, I wanted to share the incremental changes you&#8217;ll likely need to implement, across several different areas. There&#8217;s a handy tool for just this sort of thing, and it&#8217;s called a &#8220;<a href="https://en.wikipedia.org/wiki/Capability_Maturity_Model">capability maturity model</a>&#8221;.</p><h2>Maturity Models</h2><p>In a nutshell, a maturity model helps you evaluate your current performance in a specific area, and suggests what capabilities you should pick up next to improve.</p><p>You traditionally measure performance in five levels: Initial, Repeatable, Defined, Capable, and Optimized. Although if you prefer, you could simply think of them as Level 1 to Level 5. The key thing is that once you&#8217;ve identified what level you&#8217;re at, you should strive to reach the next level before you attempt to add capabilities from the higher levels. This gives you a blueprint for how to incrementally improve, until you achieve mastery in a specific area:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QAMd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QAMd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 424w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 848w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 1272w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QAMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png" width="1456" height="165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:165,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65659,&quot;alt&quot;:&quot;Simple maturity model, with five levels, and capabilities associated with each level.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Simple maturity model, with five levels, and capabilities associated with each level." title="Simple maturity model, with five levels, and capabilities associated with each level." srcset="https://substackcdn.com/image/fetch/$s_!QAMd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 424w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 848w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 1272w, https://substackcdn.com/image/fetch/$s_!QAMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd477c6f5-c468-41da-9a08-61ebcb51368c_1918x218.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When it comes to complex initiatives &#8212; such as introducing continuous deployment &#8212; it&#8217;s rarely enough to measure your maturity in a single area. In these situations, you can evaluate maturity across multiple dimensions. It&#8217;s helpful to represent this information in a grid, where each row shows a dimension, and the columns indicate levels and the associated capabilities. Here&#8217;s an abstract representation of what this might look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HK_C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HK_C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HK_C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:186746,&quot;alt&quot;:&quot;Complex maturity model, with several dimensions and levels, represented as a grid.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Complex maturity model, with several dimensions and levels, represented as a grid." title="Complex maturity model, with several dimensions and levels, represented as a grid." srcset="https://substackcdn.com/image/fetch/$s_!HK_C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!HK_C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce76b89-53d4-49f0-bc35-60697ac3616f_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A maturity model is a tool, not gospel: The idea here is to offer guidance for teams that want to make the transition to continuous deployment, but don&#8217;t know what concrete steps to take, or in what order. Depending on your specific situation or organization, your journey may be different &#8212; and your destination as well.</p><h2>A Maturity Model for Continuous Deployment</h2><p>My team at Cornerstone identified six key areas that we considered crucial for continuous deployment:</p><ul><li><p><strong>Test automation</strong> is important because there is no latitude for manual deployment decisions with continuous deployment. Once you merge code it goes straight to production, and you need enough automated safeguards to ensure this will not break existing functionality, or introduce new issues. For more on this, see my previous <a href="https://www.incrementalism.tech/p/continuous-deployment-test-automation">post</a> on test automation for continuous deployment.</p></li><li><p><strong>Observability</strong> matters because you&#8217;re constantly shipping code changes to production, and you need to find out immediately if something went wrong. With good observability tools, you can pick up anomalies in production as they happen, and link them directly to the corresponding code change. This allows you to quickly implement and ship a fix. You should also instrument internal tools to ensure you can measure and troubleshoot every part of the continuous deployment workflow.</p></li><li><p><strong>Deployment automation</strong> is at the core of the continuous deployment journey. Each engineer may be deploying to production several times a day, which means they use the deployment tooling a lot. The tools should be safe, robust, and automated to the point where engineers trust them, but don&#8217;t have to spend much time thinking about them.</p></li><li><p><strong>Engineering process</strong> changes allow you to safely deploy smaller increments of work. It&#8217;s particularly important to optimize for flow, to minimize the time between code change and production deployment. And much of the benefit of continuous deployment will only be realized when the team measures the customer impact of each change, and uses this information to guide further development.</p></li><li><p><strong>Release process</strong> is a cross-functional concern, in that you need to engage stakeholders across the organization to establish working agreements for continuous deployment. To facilitate this, you need a mechanism to separate code deployments from product releases. If you work in a large company, my earlier <a href="https://www.incrementalism.tech/p/enterprise-grade-continuous-deployment">post</a> on continuous deployment in the enterprise offers some ideas for how to do this.</p></li><li><p><strong>Cultural and organizational</strong> change is key, but often the hardest to implement. In my experience, the most important change is to develop a culture of ownership, where engineers take end-to-end responsibility for everything they work on. This will be easier in an organization with integrated product management, engineering, QA, and operations teams.</p></li></ul><p>Here&#8217;s my suggested continuous deployment maturity model, based on these dimensions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SDPZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SDPZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SDPZ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:570777,&quot;alt&quot;:&quot;Proposed maturity model for continuous deployment.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="Proposed maturity model for continuous deployment." title="Proposed maturity model for continuous deployment." srcset="https://substackcdn.com/image/fetch/$s_!SDPZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SDPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15b9bdd7-7bfb-4855-8dba-f98f744030ea_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you prefer to view or save this in PDF form, here&#8217;s a download:</p><div class="file-embed-wrapper" data-component-name="FileToDOM"><div class="file-embed-container-reader"><div class="file-embed-container-top"><image class="file-embed-thumbnail-default" src="https://substackcdn.com/image/fetch/$s_!0Cy0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fattachment_icon.svg"></image><div class="file-embed-details"><div class="file-embed-details-h1">Continuous Deployment Maturity Model</div><div class="file-embed-details-h2">62.4KB &#8729; PDF file</div></div><a class="file-embed-button wide" href="https://www.incrementalism.tech/api/v1/file/69973fe1-24eb-42f2-ac2c-ef845058e242.pdf"><span class="file-embed-button-text">Download</span></a></div><a class="file-embed-button narrow" href="https://www.incrementalism.tech/api/v1/file/69973fe1-24eb-42f2-ac2c-ef845058e242.pdf"><span class="file-embed-button-text">Download</span></a></div></div><h2>Applying the Model</h2><p>Whether you use this model or construct your own, there are a few things to keep in mind&#8230;</p><p>Ideally, you make progress on all these dimensions in parallel. But since this is not always practical, I&#8217;ve sorted the dimensions from top to bottom in the order that you should probably start. For example, you&#8217;ll benefit immediately from improved test automation and observability &#8212; but increased deployment automation will have limited impact if you don&#8217;t have the other two.</p><p>In this context, you may be surprised to see culture at the bottom. I&#8217;ve often heard objections to continuous deployment on the grounds that &#8220;we don&#8217;t have the right culture for it&#8221;. The assumption seems to be that you need to establish the right culture before you can start.</p><p>In my experience, this is entirely backwards: You can never build the right culture if your engineers don&#8217;t have the tools to safely do their job. Once you build out your automation capabilities, and ratchet up your processes to deploy more frequently, engineers will feel more empowered, and will naturally take on more ownership. Culture change will sprout from this, and you can help it along with some gentle nurturing.</p><p>Either way, it&#8217;s a good idea to at least achieve the &#8220;Initial&#8221; state in all dimensions before you start on continuous deployment. Without these fundamentals in place, increased deployment frequency will reduce safety and increase manual deployment work.</p><p>Here&#8217;s a quick animation of how we progressed through this framework with my team at Cornerstone OnDemand. As you can see, it was not a linear process &#8212; and we still had a few areas that needed work:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9eIO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9eIO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 424w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 848w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 1272w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9eIO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif" width="1080" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195765,&quot;alt&quot;:&quot;One possible progression through the continuous deployment maturity model.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="One possible progression through the continuous deployment maturity model." title="One possible progression through the continuous deployment maturity model." srcset="https://substackcdn.com/image/fetch/$s_!9eIO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 424w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 848w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 1272w, https://substackcdn.com/image/fetch/$s_!9eIO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cc7e57-078d-44b1-bf49-759e7cc9b1e1_1080x608.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Approaching Done</h2><p>Switching to continuous deployment is itself a continuous process. You build up the technical and cultural maturity over time, and continue to fine-tune it indefinitely. That makes it hard to pinpoint the moment when you&#8217;ve &#8220;arrived&#8221;.</p><p>For my team at Cornerstone OnDemand, the aha moment came when newly hired engineers were able to deploy a code change to production in their first day on the job. They would merge a change to trunk, watch the build tools automatically validate and deploy it, then test drive it in customer-facing environments just minutes later. This was an incredibly empowering experience for new hires, and brought home the level of automation and safety we had achieved in our deployment tooling.</p><p>The maturity model here is intended as a starting point and a guide. But the diversity of engineering organizations guarantees that every journey will be unique. So if you had a different experience introducing continuous deployment, or developed a different continuous deployment maturity model, I&#8217;d love to hear about it!</p>]]></content:encoded></item><item><title><![CDATA[Leadership for Engineering Enablement Teams]]></title><description><![CDATA[Support the unique needs of engineering enablement teams with a different brand of leadership.]]></description><link>https://www.incrementalism.tech/p/engineering-enablement-leadership</link><guid isPermaLink="false">https://www.incrementalism.tech/p/engineering-enablement-leadership</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Mon, 20 Mar 2023 03:02:13 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3eb48d73-6924-4270-b1b8-4fcece5b8277_700x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the last few years, I had the opportunity to run a mix of product engineering and engineering enablement teams. This included teams responsible for shared libraries and services, infrastructure, build tooling, and developer experience.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>In retrospect, the engineering enablement teams were quite successful, and had a lot of organizational impact. They helped introduce continuous deployment, adopt DevOps practices, migrate to the public cloud, and continuously improve the developer experience. But they also ran into unexpected challenges that were not shared by their product engineering counterparts. This made me realize engineering enablement teams have different needs from their leadership.</p><p>If you&#8217;re starting a new enablement team, or taking over leadership of an existing one, chances are good you&#8217;ll face similar challenges. Here, I&#8217;ll share some of the things I learned, and suggest what you can do about them.</p><h2>Spend Time on Marketing</h2><p>Product managers don&#8217;t just help engineering teams decide what problems to solve. They also work hard to market their products internally and externally. They create awareness, drive adoption, author documentation, and support product launches. But if you run an engineering enablement team, that person is probably you.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><p>This means you have to get your work in front of an internal audience, and convince them to adopt it. Even if you&#8217;ve built something that clearly improves the engineering experience, people will be busy, and wary of change. And it&#8217;ll be even harder to get traction if you&#8217;re introducing new technologies or ideas that are unfamiliar. Perhaps you&#8217;re launching the first component library in your organization, or implementing a new test automation framework, or integrating security tools with your build pipeline? It won&#8217;t be enough to show the work: You also have to explain the benefit &#8212; repeatedly, in different forums &#8212; and help teams get over any barriers to adoption.</p><p>If you don&#8217;t market a solution enough to get broad adoption, you may find product engineering teams muddling along with painful but familiar processes &#8212; at great cost to the organization. For example, if your front-end tools team can&#8217;t get adoption for their standardized library stack, product engineers may just continue to manually update third party dependencies sporadically, each on their own schedule. It&#8217;s hard for teams to quantify this wasted effort, and hard to justify an upfront investment to achieve some benefit later.</p><p>Worse still, teams may come up with their own solutions to problems you&#8217;ve already handled. This results in confusion, incoherence, or outright internal competition.</p><p>Here are some ways you and your team can market your work internally:</p><ul><li><p>Show your work in all-hands meetings, weekly demos, communities of practice, and other forums. It&#8217;s rarely enough to show something once, so you need to keep reminding people of the products and services you provide.</p></li><li><p>Regularly share internal blog posts, how-to videos, and other content to help engineers get started. Create great documentation, and make sure it can be found. Run hands-on workshops and Q&amp;A sessions, and offer proactive support in Slack. All of this creates visibility, lowers the barrier of entry, and demonstrates long-term commitment to your work.</p></li><li><p>Update internal self service tools to ensure new projects adopt your work by default, and existing ones get automatically migrated. You&#8217;ll have an easier time creating awareness and achieving adoption if you integrate directly with the tools engineers already use.</p></li><li><p>Share success stories, and publicly celebrate teams that have achieved benefits from using your work. This creates a sense of excitement and pride around improving engineering practices, and helps build strong relationships with your internal customers.</p></li><li><p>Find influential engineers and keen early adopters in the organization, and work with them on new capabilities. If you can identify a handful of <a href="https://kk.org/thetechnium/1000-true-fans/">true fans</a>, they&#8217;ll enjoy being consulted, help improve your product, and spread the word over time. When you&#8217;re working on something big &#8212; like a design system &#8212; consider creating an official community around it.</p></li></ul><p>As any startup founder will tell you, building a thing is only a small part of making it successful. You need to spend way more time than you think on marketing, education, and evangelism.</p><h2>Seek Leadership Buy-In</h2><p>Even if you&#8217;ve mastered the art of internal marketing, it&#8217;s hard to achieve broad adoption for things that require cultural change. Introducing DevOps practices is a great example, or adopting something like continuous deployment. These types of transitions require a long-term commitment, with ongoing investment in tooling, education, and support. To pull this off, you need to secure leadership buy-in for your vision.</p><p>When working with your leadership, you&#8217;ll need to explain what you&#8217;re doing, and why it&#8217;s important. You should also be clear about what help you&#8217;re asking for &#8212; whether it&#8217;s space in leadership presentations, a time commitment from product engineering teams, or something else. And ideally, you should make sure engineering incentives are lined up to support your work. For example, if you&#8217;re trying to improve operational maturity, you need to make sure the leadership team recognize and celebrate proactive, sustainable behaviors, rather than individual heroics when something falls over in production.</p><p>One thing you might not want to ask for is any sort of top-down directive to use your enablement services. This creates resentment among product engineers, and removes your incentive to build the best possible product for your internal customers. For better long-term outcomes, focus on securing investment and public support, and let your work stand on its own merits.</p><p>Also consider senior leaders in your product management and design groups. Many engineering enablement projects will be highly relevant to them &#8212; whether it&#8217;s developer tooling to build product features faster, component libraries to achieve a more consistent user experience, or instrumentation for better product analytics. If these stakeholders understand what you do, they can be amazing allies in the organization. Help them out by showing how your work has a positive impact, and by articulating how they can support you. In return, they&#8217;ll help you out by creating visibility and driving adoption.</p><p>Very few technical transitions happen successfully without leadership engagement. And leaders of all stripes will be less familiar with engineering enablement concerns than they are with the product your organization sells to customers. If you want to increase the success and impact of your engineering enablement teams, it&#8217;s your job to ensure the leadership team understand and agree with what you&#8217;re doing, and help you pull your projects forward.</p><h2>Show the Team Their Work Matters</h2><p>Engineering enablement teams can have amazing impact, especially in larger organizations. With hundreds of engineers, even small improvements in the developer workflow add up to meaningful gains. Also, like all craftspeople, engineers love their tools. They&#8217;re especially appreciative of automation, and robust platform services that abstract away concerns like consistent instrumentation, backup and restore, and management of security vulnerabilities in third-party dependencies.</p><p>Despite all of this, I&#8217;ve found engineering enablement teams often struggle with their sense of achievement. While product engineers get a regular dopamine hit every time they ship a new feature to customers, enablement teams create leverage &#8212; and leverage is hard to see or measure. As a result, enablement engineers fret about whether what they&#8217;re doing is really important, whether anyone values their contribution, or if they&#8217;ll become redundant when there&#8217;s &#8220;nothing left to improve&#8221;.</p><p>As an engineering enablement leader, you have to show the team how their work has value. Here are a few ways you can do this:</p><ul><li><p>Spend time on a clear vision and mission for the team. This will guide the team&#8217;s efforts in a manner that doesn&#8217;t have a specific end condition. It also helps generate and prioritize ideas for how to continuously improve the developer experience.</p></li><li><p>Measure engineering effectiveness and efficiency across all product engineering teams. This helps you identify areas that need work, evaluate the outcomes of experiments, and track the impact you&#8217;re having over time. Making this data public can be a powerful motivator for your team. One way to do this is through a monthly <a href="https://www.incrementalism.tech/p/monthly-report-card">report card</a>.</p></li><li><p>Measure and publicize usage of the tools you build. When you create tools to automate manual workflows, it&#8217;s often astonishing how much use they get &#8212; and hence how much time they save. Engineers and leaders love to see this kind of data.</p></li><li><p>Share regular demos and retrospectives with the wider organization, perhaps on a monthly basis. This is a good way to celebrate your achievements, and highlight how they benefitted other engineering teams. It&#8217;s also a great opportunity to call out where the pain points are now, and what you&#8217;re planning to do about them.</p></li><li><p>Offer interested engineers the opportunity to rotate between product engineering and engineering enablement teams, for a few months at a time. This builds empathy and appreciation between the different roles, and lets enablement engineers experience the impact of their work firsthand.</p></li></ul><p>It&#8217;s super fun to run engineering enablement teams, but they need a different brand of leadership: You&#8217;re no longer just an engineering manager, but also a product manager, product marketer, evangelist, educator, and cheerleader. You need to build leadership support for your team, get word out about the work you do, and show your engineers how their efforts matter. If you do this, your team can amplify the impact of all engineers across the organization.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>If you like to use <a href="https://teamtopologies.com">Team Topologies</a> terminology, what I refer to as engineering enablement covers both <em>platform teams</em> and <em>enabling teams</em>. When I talk about product engineering teams, I mean <em>stream-aligned teams</em>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Incidentally, this makes engineering enablement a good place for engineering leaders to learn some product management fundamentals.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Test Automation for Continuous Deployment]]></title><description><![CDATA[Ease the transition to continuous deployment with a modern approach to test automation.]]></description><link>https://www.incrementalism.tech/p/continuous-deployment-test-automation</link><guid isPermaLink="false">https://www.incrementalism.tech/p/continuous-deployment-test-automation</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Sat, 19 Nov 2022 09:36:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/90c5eabb-99a0-4db3-b1d8-e2b55403ad5f_700x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To adopt continuous deployment you face a big challenge: You need to build enough automated test coverage to make this safe.</p><p>If you automate an existing manual regression test suite, you&#8217;ll end up with a preponderance of end-to-end tests that are expensive to maintain and slow to run. At the same time, this approach doesn&#8217;t put enough emphasis on non-functional concerns, like security, accessibility, performance, and coding style. None of this is conducive to successful continuous deployment, where you need to deploy quickly and frequently, with a high degree of confidence in your overall product quality.</p><p>Modern deployment practices call for a modern approach to test automation. To do continuous deployment well, you need a test suite with:</p><ol><li><p>Broad test coverage&#8230;</p></li><li><p>&#8230;but not too deep</p></li><li><p>Zero tolerance for test failures</p></li></ol><p>Let&#8217;s find out how these guidelines ease the transition to continuous deployment.</p><h2>Broad Coverage</h2><p>In software engineering organizations that ship monthly or quarterly releases, engineers tend to focus on fast feedback tests they can run locally. This includes unit tests and light integration tests. Maybe they also integrate their changes regularly, with automated functional testing on a continuous integration server.</p><p>Thorough regression testing happens at release time, along with security testing, performance testing, accessibility testing, and any other tests that are costly to set up or run. Very often, a separate team execute these tests, in a dedicated environment they own and govern. Product quality becomes a focus at the end of each release cycle, and teams may allocate time for &#8220;hardening&#8221;, to focus exclusively on testing and fixing bugs.</p><p>With continuous deployment, this model is no longer possible. Engineers deploy to production many times a day, and every deployment must meet the quality bar for production code. This means all forms of testing must be combined into an automated test suite, and run continuously, on every deployment. And the test suite must be broad enough to cover all functional and non-functional validation.</p><p>A robust test suite for continuous deployment will include unit testing, integration testing, and end-to-end testing. These should all be integrated directly into the deployment pipeline, and run automatically on every code change. But on top of that, any other tests you run occasionally today must now be integrated into the pipeline. This may include static code analysis, configuration checks, linters to maintain your house coding style, API contract tests, fuzz tests, and a battery of static and dynamic security tests. If you perform regular tests for accessibility and performance, you can look for tools to automate these as well.</p><p>Building out your automated test suite with these additional forms of coverage means you can enjoy production-grade release safety for every individual code change. With broad and continuous coverage, you&#8217;ll also reduce the churn that comes from fixing large numbers of non-functional test failures at the same time, during infrequent integration windows.</p><h2>But Not Too Deep</h2><p>Building up this level of test coverage seems daunting, but here&#8217;s the thing&#8230; You need broad coverage, but it doesn&#8217;t have to be deep. If the purpose of your test suite is to let you safely deploy code to production, then the ideal amount of coverage is literally as little as possible, while still achieving that goal.</p><p>With continuous deployment, that&#8217;s not a very high bar &#8212; because every change you deploy is small, and hence inherently safe. You&#8217;re no longer integrating a lot of features at the same time, and looking for regression issues across the entire product. Instead, you&#8217;re making individual, highly targeted changes in one product area at a time. These changes are easy to test locally, easy to reason about, and easy to peer review. They don&#8217;t need the same level of regression coverage you&#8217;d apply for a big bang release.</p><p>What constitutes enough coverage depends on the type of test. Third party tools for linting and static security testing come with hundreds of built-in rules that execute in seconds. You may as well run all of these, because they&#8217;ll help maintain product quality for virtually no effort on your part. Unit tests are cheap to build and run, and you can go to town on contract tests, configuration checks, and other cheap tests.</p><p>Instead, you should focus your efforts on tuning coverage for expensive tests, such as end-to-end tests and automated performance tests. The goal here is not to achieve comprehensive test coverage, but to exercise your most important workflows. These tests act as a sanity check, to catch anything that&#8217;s fundamentally broken in the product. Engineers will still test the specific areas they worked on before merging a code change. And you can use cheaper tests &#8212; such as <a href="https://jestjs.io/docs/snapshot-testing">snapshot</a> tests &#8212; to catch any functional regressions in other product areas.</p><p>How do you know you&#8217;ve made the right tradeoff between test coverage, maintenance cost, and deployment speed? With some basic operational metrics, you can answer this question analytically. For example, if adding or removing tests doesn&#8217;t materially affect your rate of defects in production, you may have more tests than you need of that type. You can also set some high level goals around deployment speed and change failure rate. If you target a 15 minute lead time to production, and a change failure rate of less than 1%, your teams can tune their test suites to achieve those targets.</p><p>A less scientific approach is to measure your deployment confidence with the &#8220;Friday afternoon test&#8221;. If your engineers are comfortable deploying to production on Friday afternoon, that&#8217;s a good sign. They know the tests are fast enough and stable enough that they won&#8217;t waste their Friday evening getting the deployment into production. And they clearly feel the test coverage is good enough that they won&#8217;t get paged for regression issues over the weekend.</p><p>The concept of reducing test coverage seems alien at first. But to practice continuous deployment safely and sustainably, you need a good balance of broad test coverage, low maintenance costs, and fast execution times. That means you have to get comfortable trimming out tests that are not pulling their weight.</p><h2>Zero Tolerance for Failure</h2><p>Now that you&#8217;ve tuned your test coverage, there&#8217;s still the matter of making sure tests pass. With infrequent releases, much of the integration and testing work happens close to release time. This flurry of activity makes it inevitable that some tests fail. Humans need to review these test results, and make a judgement call on whether to fix the code, fix the test, or release regardless.</p><p>With continuous deployment, this is not practical. Even a small engineering team can deploy code to production a dozen times a day or more. When you deploy this often, there&#8217;s no room for human decision making. The tests have to pass every time &#8212; and if they don&#8217;t pass, you need to know it&#8217;s due to a legitimate defect. If you slow down to investigate a test failure manually, you&#8217;re not only holding up your own deployment, but your team will be piling up change sets behind you as well. There should be no manual decision points in a continuous deployment pipeline, which means you cannot accept test failures.</p><p>This is even more important if your organization is new to continuous deployment. You can expect some initial pushback around testing as people get used to the idea of fully automated deployments. Customers and <a href="https://www.incrementalism.tech/p/enterprise-grade-continuous-deployment">compliance teams</a> will feel more comfortable if you can guarantee that every deployment passed every test case.</p><p>It&#8217;s also easier culturally to enforce a 100% pass rate. Paraphrasing former Ikea Chief Sustainability Officer <a href="https://www.ted.com/talks/steve_howard_let_s_go_all_in_on_selling_sustainability">Steve Howard</a>, if your target is 95%, everyone will find a reason they should be in the 5%. Engineers will become desensitized to flaky tests, and will just restart failed builds, or wait for others to investigate. But if you set the target at 100%, you create total clarity for the team, and engineers just get on with fixing every failure.</p><p>Besides, if a test fails, and you still feel it&#8217;s ok to deploy to production, do you really need that test? In the spirit of reducing the depth of coverage, sometimes the correct response to a broken or flaky test is to simply delete it. Adopting a zero tolerance policy for test failures helps keep your test suite small, fast, and dependable.</p><h2>Get Started</h2><p>With all this in mind, what should you do next?</p><p>It&#8217;s always a good idea to start with an assessment of your current test suite. If you haven&#8217;t adapted your test strategy for continuous deployment, your test coverage and test maintenance effort are probably heavily skewed towards functional regression tests.</p><p>The end goal is a broad test suite that&#8217;s fast, dependable, and easy to maintain. Trim expensive end-to-end tests down to the most important workflows &#8212; or those tests that most often find legitimate defects. Eliminate slow and flaky tests. Then add broader coverage as needed, to cover configuration, coding style, security, accessibility, and other non-functional concerns. And implement a zero tolerance policy for test failures, to improve consistency and deployment confidence &#8212; for yourself and for your customers.</p><p>If you haven&#8217;t yet adopted continuous deployment because you don&#8217;t have enough test coverage &#8230; are you sure? Continuous deployment is inherently safer, because each change is small and self-contained. That means you can probably get started with what you have. You&#8217;ll quickly discover where the gaps are, and you can tune the coverage incrementally over time.</p>]]></content:encoded></item><item><title><![CDATA[Shaping Engineering Culture With a Monthly Report Card]]></title><description><![CDATA[Publish a monthly report card to spark better conversations around engineering performance, and support a culture of ownership and accountability.]]></description><link>https://www.incrementalism.tech/p/monthly-report-card</link><guid isPermaLink="false">https://www.incrementalism.tech/p/monthly-report-card</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Mon, 17 Oct 2022 19:39:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rPTP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Measuring engineering performance is hard. There&#8217;s no single metric that adequately captures what engineers do in modern software organizations. At the same time, engineers are notoriously adept at optimizing whatever metric you use to measure their work. Tracking the wrong metrics can lead to overinvestment in specific short-term outcomes, at the expense of building a healthy and sustainable product engineering culture.</p><p>In my most recent role, we muddled along for years with cascading goals that tied engineering performance to achieving top-level company objectives. Engineers had limited ability to influence these goals, and consequently didn&#8217;t show much interest in the goal setting process, or in measuring performance over time. This undermined our efforts to build a culture of ownership and accountability within the product engineering team.</p><p>This year, I got together with my product management counterpart <a href="https://henryvasquez.com">Henry Vasquez</a> to come up with a better framework for tracking our performance. What we landed on was a monthly report card with a broad spectrum of engineering and product metrics. We published the report card to our entire product engineering team, and made it publicly available to anyone in the business.</p><p>The report card ended up being more useful and relatable than our previous attempts at measuring performance. It created clarity for our cross-functional teams on what we considered important, and led the teams to independently tackle problem areas and advance our software delivery process. At the same time, the report card highlighted our successes and achievements, and gave us an effective tool to communicate with leaders and executives on our own terms.</p><p>Here, I&#8217;ll share how to create a monthly report card to spark a healthy conversation around product engineering performance, and build a culture of ownership and accountability within the team.</p><h2>Choosing Your Metrics</h2><p>The magic of a report card comes from including a broad spectrum of metrics. It&#8217;s difficult to define a single metric that aligns well with success for the organization as a whole. But by combining a range of product and engineering metrics, you can describe the kind of engineering environment you&#8217;re looking to establish.</p><p>The metrics you choose define how the rest of the organization view your performance, and send a strong message to the team of what behaviors and outcomes you value. If you want to focus the team on creating more value for customers, you need metrics to measure customer outcomes. If you care deeply about the wellbeing of your team, you should measure their happiness and their daily engineering experience. If you want to improve your operational maturity, you may want to measure your progress on infrastructure automation, or public cloud spend, or service reliability.</p><p>Ideally, some metrics will be thematically linked to your high-level company goals, and formulated in a way that&#8217;s relevant to product engineering teams. This creates clarity for engineers, while eliminating potential conflicts between engineering achievement and company goal achievement. At the same time, the report card should include metrics that you plan to track in perpetuity &#8212; such as deployment frequency and the rate of customer-reported defects. These evergreen metrics define what&#8217;s considered healthy in your daily work.</p><p>How many metrics you pick communicates whether you&#8217;re focused on achieving a small number of specific outcomes, or trying to build a well-rounded product engineering environment with fewer blind spots. If your startup is running out of money, it&#8217;s fine to focus on growing revenue, or reducing operational costs. But this sort of hyper-specialization will have unintended consequences over time. As your organization grows and matures, you&#8217;ll want to expand the scope of what you track. From our experience, 20&#8211;30 metrics from a wide range of areas gives you a good overview of your team&#8217;s health and performance.</p><p>With so many metrics in play, team members can easily succumb to metric fatigue. And tracking a large number of slow-moving metrics makes it difficult to get a quick read on whether you&#8217;re making progress towards your goals. So I suggest highlighting a subset of metrics that you&#8217;re actively trying to improve. You can do this by including targets for each metric. This shows which metrics you expect to move, and which ones you&#8217;re just keeping an eye on.</p><p>In our case, we assembled about 20 engineering metrics, and 10 product-centric metrics. These included:</p><ul><li><p><a href="https://www.devops-research.com/research.html">DORA</a> metrics for application delivery; deployment frequency, lead time for changes, change failure rate, and time to restore service</p></li><li><p>Flow metrics, like cycle time, pull request review time, and the average number of tasks in progress per engineer</p></li><li><p>Operational metrics, like API success rate, 95th percentile response time, and AWS spend</p></li><li><p>Incoming defects and product questions from customers</p></li><li><p>Customer and user engagement metrics for key product areas, and tracking towards expected product outcomes</p></li><li><p>Although not part of our report card, we also tracked employee and customer NPS scores on a different cadence</p></li></ul><p>Out of these, we were moving about five metrics aggressively forward. For the rest, we kept an eye on overall trends, and made opportunistic improvements throughout the year.</p><p>If you&#8217;re looking for more guidance on how to pick engineering performance metrics, <a href="https://nicolefv.com">Nicole Forsgren</a> et al. have you covered with <a href="https://queue.acm.org/detail.cfm?id=3454124">The SPACE of Developer Productivity</a>. The authors argue convincingly for using a selection of metrics from five dimensions:</p><ul><li><p>Satisfaction and well-being</p></li><li><p>Performance</p></li><li><p>Activity</p></li><li><p>Communication and collaboration</p></li><li><p>Efficiency and flow</p></li></ul><h2>Creating Visibility</h2><p>Now that you&#8217;ve assembled your metrics, you need to decide how to present them, to whom, and how often.</p><p>You can host the report card anywhere, so long as the data is easy to digest; it could be a wiki page, dashboard, or a shared document. If you collect internal metrics in a data platform &#8212; such as <a href="https://www.splunk.com">Splunk</a> &#8212; you can build a report that automatically pulls the latest information. My team used a simple tabular representation on a wiki page, with color coding to indicate the health of each metric. But graphs or sparklines to show changes over time may be helpful. Another suggestion is to use a rolling one-year window for the metrics, so you&#8217;re not looking at just a single data point at the start of the year. The trend is usually more interesting than the current value.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rPTP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rPTP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 424w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 848w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 1272w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rPTP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png" width="978" height="687" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:978,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109841,&quot;alt&quot;:&quot;Sample report card, with data in tabular form, and sparklines to indicate trends.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Sample report card, with data in tabular form, and sparklines to indicate trends." title="Sample report card, with data in tabular form, and sparklines to indicate trends." srcset="https://substackcdn.com/image/fetch/$s_!rPTP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 424w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 848w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 1272w, https://substackcdn.com/image/fetch/$s_!rPTP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6038ec12-b69f-4947-a54d-db91134a2b81_978x687.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Miniature report card with metrics from several dimensions, clear targets, and trends over time.</figcaption></figure></div><p>What does matter is that you make the data accessible to anyone in the organization. You should share the same report card with your team, and with leaders, executives, and other stakeholders in the wider company. Public visibility creates alignment and clear internal and external accountability. It also gives team members a sense of ownership &#8212; both of their goal achievement, and of how their work is represented.</p><p>It&#8217;s good to create clarity on how your metrics are collected. You could do this by linking each metric in the report card to the underlying data source. This allows people to analyze the data independently, to draw their own conclusions, or to explore new angles on the same information. It also reduces the risk of bias through cherrypicked data &#8212; or the perception of bias where none exists.</p><p>You may wonder why I&#8217;m specifically recommending a monthly cadence for updating the report card. Why not refresh it continuously, or align it with your company-wide goal setting cycle?</p><p>We arrived at the monthly frequency by a process of elimination. Although we used quarterly company-level goals, the report card needs to be more frequent. Otherwise, by the time you discover you&#8217;re off track, it&#8217;s too late to do something about it. Meanwhile, weekly updates exhaust the team, and are often unexciting. Very few metrics that really matter move this fast. For us, monthly updates was the goldilocks frequency to capture progress on product adoption and engineering improvement initiatives.</p><p>Once you&#8217;ve published your monthly update, invest in a burst of publicity. Share the results wherever your team hangs out: In Slack, email, internal wiki, all hands meetings, or reports to the executive leadership. Bring it up in 1:1s and career development conversations as well, and in any other context where you talk about engineering performance. Continuous reinforcement ensures your team and leadership take the report card seriously, and look at the metrics for guidance in their daily work.</p><p>Don&#8217;t shy away from communicating failures, or metrics that aren&#8217;t moving. The intent is to create full transparency, and spark a productive discussion about what to do next. Public failures are a great opportunity to create interest in the process, and bring people along on the journey of fixing the underlying problems.</p><h2>Putting the Report Card to Work</h2><p>The monthly report card was well received by my teams. It created a balanced view of our product engineering performance, guided our investments, and helped us represent our work to the wider organization.</p><p>One of my favorite benefits of the monthly report card is that it highlights continuous, incremental progress on slow-moving metrics. Engineers may strive to shorten cycle times, or increase deployment frequency, or reduce customer-reported defects. But it&#8217;s very hard to see the fruits of these labors in realtime, which makes it thankless work. With the report card, you can visualize month-over-month or year-over-year improvements on these metrics, and show the impact of incremental changes over time.</p><p>By carefully selecting your metrics, you can also use the report card to address specific practical or political challenges. For example:</p><ul><li><p>It&#8217;s a great tool for creating alignment between engineering and product management teams, because it creates joint ownership of a set of performance metrics. By picking more or less aggressive targets, you can indicate the relative priority of investment in each area.</p></li><li><p>If your organizational goals are too abstract for engineers to rally around, the report card can bridge the gap. By anchoring your metrics in the high-level goals, you create concrete and actionable ways for engineers to contribute to the organization&#8217;s strategic priorities.</p></li><li><p>You can use the report card to prioritize work for engineering enablement and platform teams. These teams can use application delivery, flow, and operational metrics to identify problem areas and create tools to improve the engineering experience.</p></li><li><p>If you&#8217;re held accountable externally for specific metrics &#8212; such as change failure rate, test coverage, or service level agreements &#8212; you can bake these into your report card. This meets the external reporting requirement, while shifting the conversation away from a small number of metrics to focus on a more holistic view of product engineering performance.</p></li></ul><p>This versatility means you can adapt the report card to meet the needs of your team, and to evolve along with your organization.</p><p>What kind of environment do you strive to establish for your team, and what are the behaviors you&#8217;d like to reinforce? How would you like to be measured by your leadership? What metrics would you like to move forward this year? If you can answer these questions, you can build a report card to help shape the culture of your team &#8212; and to take control of the narrative around product engineering performance.</p>]]></content:encoded></item><item><title><![CDATA[Enterprise-Grade Continuous Deployment]]></title><description><![CDATA[Improve security, compliance, and release management outcomes with continuous deployment in the enterprise.]]></description><link>https://www.incrementalism.tech/p/enterprise-grade-continuous-deployment</link><guid isPermaLink="false">https://www.incrementalism.tech/p/enterprise-grade-continuous-deployment</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Fri, 09 Sep 2022 05:09:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5821f216-6e69-43c9-9004-e2569da17d45_700x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I started out building software for small and medium-sized business customers. When I moved into enterprise software development over the last few years, I was taken aback by the resistance to modern engineering practices, and to continuous deployment in particular. It&#8217;s taken as gospel that continuous deployment won&#8217;t work for enterprise-grade software, or for compliance-heavy industries, like healthcare, aviation, or government.</p><p>I disagree. You can absolutely do continuous deployment in enterprise environments. And just like in smaller businesses, it will lead to better outcomes for you and your customers. In my most recent role, my teams built software for some of the largest organizations in the world. Collectively, these companies used our products to support millions of employees globally &#8212;&nbsp;many of them working in compliance-driven fields. Despite this, my teams deployed to production more than 2,500 times in 2021, with dozens of deployments on busy days. We delivered a steady cadence of product improvements, with consistently high quality and no disruption to service. And we were able to turn around defect fixes for customers in as little as 25 minutes.</p><p>So why the angst about using continuous deployment in enterprise environments? The objections I&#8217;ve heard generally focus on three things enterprise software customers expect from their vendors:</p><ul><li><p>You need to meet stringent safety and security requirements</p></li><li><p>You need <a href="https://en.wikipedia.org/wiki/System_and_Organization_Controls">SOC 2</a> and <a href="https://en.wikipedia.org/wiki/ISO/IEC_27001">ISO 27001</a> compliance</p></li><li><p>You need to communicate upcoming product changes well in advance, to avoid surprises</p></li></ul><p>I&#8217;m here to tell you that continuous deployment is not only compatible with these requirements, but it helps you achieve them. Let&#8217;s take a look at how.</p><h2>Safety &amp; Security</h2><p>Large companies have strict requirements for safety and security. And justifiably so: The legal, financial, and reputational impacts of security incidents can be <a href="https://www.businessinsider.com/solarwinds-hack-explained-government-agencies-cyber-security-2020-12">huge</a>. When these companies purchase software, they make sure their vendors have a robust and multi-layered security strategy in place, to protect against internal and external threats. Your software delivery process has a key part to play here, and this is where continuous deployment helps in several specific ways.</p><p>First, you can integrate many security tools directly into your development workflow. This includes tools for static security testing, application configuration checks, and software composition analysis to identify vulnerable third party dependencies. If you bake these tools into your continuous deployment pipeline, this ensures every single code change meets your security requirements, and you validate your security posture many times a day. Not only that, but any security finding will be linked directly to an individual code change, which makes it easy to identify an owner, and to troubleshoot and resolve. This is particularly helpful in an enterprise context, where security fixes will be subject to service-level agreements.</p><p>Second, because each code change is so small, you can take a zero tolerance approach to test failures. If any security test fails, you simply stop your continuous deployment pipeline, and the change never makes it into production. Teams can quickly roll back the offending code, or roll forward with a fix and another deployment. This is a luxury you could never indulge in when deploying monthly or quarterly releases in an enterprise context, because engineering and security teams will be under immense pressure to get releases shipped in a predetermined release window.</p><p>And of course, continuous deployment eliminates the risk of introducing defects or security issues from integrating multiple changes at once. Small, individual changes are easy to review and reason about, so engineers can accurately evaluate the security impact of each one. This is true regardless of organizational size, but it&#8217;s particularly impactful at enterprise scale, where infrequent releases may include thousand of changes, from dozens or even hundreds of teams.</p><p>None of these security benefits are specific to enterprise software vendors. But they&#8217;re often overlooked when evaluating continuous deployment in an enterprise context. That&#8217;s a shame, because enterprise software vendors face greater security threats, integrate more security tools, and make more code changes. As a result, they benefit more from continuous deployment practices.</p><h2>Compliance Frameworks</h2><p>Beyond the safety and security measures you implement, enterprise software customers often expect you to produce a SOC 2 report, or ISO 27001 certification. This means you need to document your engineering and information security practices, and pass an annual audit. Your software delivery process is in scope for both SOC 2 and ISO 27001 &#8212; so when you first introduce continuous deployment, you will need to work with your compliance team to accommodate the changes.</p><p>Helpfully, enterprise software vendors will have their software development workflow documented in detail in a set of standard operating procedures. These documents cover all processes related to software delivery, and can act as a template for your transition to continuous deployment. For each manual deployment activity covered in your standard operating procedures, you will need to design, implement, and document an automated process that offers equivalent or better safety. This is often surprisingly easy, because manual processes involve a tradeoff between safety and usability. When you automate these, you can build additional safeguards into the system that would be too onerous to handle manually. And by automating the workflow, you also reduce the training requirements and cognitive load for your team.</p><p>When reviewing SOC 2 and ISO 27001 compliance, auditors will look at whether your development process implements adequate security controls, and whether the process is actually being followed. Here, continuous deployment helps in two specific ways. First, by automating every aspect of the deployment process, you reduce the risk of human error &#8212; or malicious activity by insiders. Second, if your deployment tooling has comprehensive logging, this creates an excellent audit trail for your software delivery. You can use this in future audits to prove your compliance controls are working.</p><p>One specific compliance control auditors will pay close attention to with continuous deployment is &#8220;segregation of duties&#8221;. In a nutshell, no single person should be able to cause damage to the system &#8212; either inadvertently or maliciously. The traditional enterprise way to address this is to have a change control board or QA team review and approve every change before it goes to production. This gets the job done, but it&#8217;s also incredibly heavy-handed.</p><p>A much simpler solution for segregation of duties is something you already do today: Pull request reviews. If you configure your source control system to require at least one approval on each pull request to trunk, engineers can no longer make production changes unilaterally. Continuous deployment ensures each deployment is linked to a single pull request, which gives auditors total clarity on who authored and who approved each change. You can also add automated testing to the pull request process, to block merges until changes pass all tests. And in highly regulated industries, you can automatically identify sensitive pull requests &#8212; such as changes to access control configuration &#8212; and add mandatory reviewers from your security or compliance teams. These measures will satisfy the segregation of duties requirement in most environments.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>Ultimately, a high degree of deployment automation is better from a compliance perspective, because it provides a consistent process, strict enforcement, and an excellent audit trail that you can use to pass future process audits. And continuous deployment gives compliance teams and auditors full visibility of each individual code change, along with associated test results, code reviews, and approvals.</p><h2>Deployment vs Release</h2><p>With the security and compliance concerns out of the way, there&#8217;s still the matter of shipping product features continuously. Enterprise customers in compliance-driven industries are not fond of frequent product changes, because each update may trigger internal change management work. This is especially true in life sciences, where <a href="https://en.wikipedia.org/wiki/GxP">GxP</a> guidelines may require new product features to be captured in internal process documentation.</p><p>The notion here is that you can&#8217;t change enterprise software without letting customers know in advance, documenting the change, and giving everyone time to adjust. This is where feature toggles come in. Feature toggles allow you to control the visibility of new features until you&#8217;re ready to make them available. This in turn allows you to separate <em>deployment</em> from <em>release</em>: You can deploy your work on a new product feature to production in hundreds of small increments without making any part of it visible to end users. Product managers or other customer-facing functions can then decide when to release completed features.</p><p>The drawback with this approach is that you don&#8217;t get feedback on new features until someone enables them. And if you&#8217;re not getting continuous feedback, you erode the value of doing continuous deployment in the first place. So rather than toggling features globally, you may want to enable new features for individual customers, and for test accounts in production. With some tooling to manage this, you can launch a &#8220;pioneer&#8221; program to give progressive customers early access to new features. This is a fantastic opportunity to build closer relationships with your most engaged customers, and collect their feedback on features under development. At the same time, customers that operate hospitals or airports can hold off on adopting new functionality until it&#8217;s been thoroughly vetted by the early adopters.</p><p>It&#8217;s a good idea to establish an internal agreement on what changes can be made when. Even enterprise customers want critical bugs fixed immediately &#8212; and they&#8217;ll appreciate your ability to turn around these fixes in hours or minutes. No need to feature toggle these. You may also be able to continuously release minor bug fixes and incremental features, so long as they don&#8217;t impact existing workflows. This is especially true for features that are not visible to end users by default. That means you may only need to feature toggle major functional changes, or changes that cannot be controlled by your customers&#8217; administrators.</p><p>Whatever your approach, you need align on it with your compliance team, and with representatives from customer-facing functions. Having a clear written agreement on what&#8217;s acceptable helps engineers make good deployment decisions, and creates a predictable software release experience for customers.</p><h2>Next Steps</h2><p>Continuous deployment allows you to ship enterprise software in a manner that&#8217;s safe and secure, aligned with common compliance frameworks, and doesn&#8217;t disrupt customer activities. In many ways, continuous deployment is more impactful in enterprise settings, because it solves problems that don&#8217;t exist in smaller companies: Large organizations make more code changes, integrate more security tools, and submit to greater scrutiny of their delivery processes.</p><p>If you&#8217;re introducing continuous deployment in an enterprise environment for the first time, expect some initial skepticism from compliance and release management teams, and from customers. You&#8217;ll have to earn their trust by engaging them in the process, and building out automated tools to directly address their needs for safety, compliance, and consistency.</p><p>As with any technical and cultural transformation, it helps to tackle this incrementally. I recommend starting with processes in your delivery workflow that involve tedious manual labor, or that are hotspots for compliance audit findings. If you automate these, you achieve two immediate goals: You free up time that you can reinvest in making further changes, and you get some runs on the board, to prove the model leads to better outcomes.</p><p>Once you&#8217;ve established this foundation of trust, you will have an easier time building out the tooling and processes for fully automated continuous deployment. Happily, getting over these initial objections is the hardest part &#8212; because you build up a track record of safe deployments really fast when you deploy to production 20 times a day.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The Cybersecurity &amp; Infrastructure Security Agency agrees. In their <a href="https://www.cisa.gov/sites/default/files/publications/Cloud%20Security%20Technical%20Reference%20Architecture.pdf">Cloud Security Technical Reference Architecture</a>, the agency suggests code reviews &#8220;by another authorized team member&#8221; as an alternative to traditional segregation of duties controls.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Welcome to Incrementalism]]></title><description><![CDATA[Better software engineering, step by tiny step.]]></description><link>https://www.incrementalism.tech/p/welcome-to-incrementalism</link><guid isPermaLink="false">https://www.incrementalism.tech/p/welcome-to-incrementalism</guid><dc:creator><![CDATA[Tobias Peciva]]></dc:creator><pubDate>Wed, 07 Sep 2022 10:13:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fcf19dfa-bc8c-46e6-b1b7-d73ea00a101a_700x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently decided to take a short career break, to reflect on a quarter century in software engineering. In doing so, one of my goals is to get more ideas out of my head, and committed to writing. This is both to clarify my own tangled thinking, and to publish it for others to inspect.</p><p>Here, I&#8217;d like to share my views on building software products and software engineering organizations. Posts will be loosely themed around achieving worthwhile outcomes through incremental changes. Expect topics like continuous deployment, lean product engineering, remote work, professional development, and engineering culture.</p><p>In the spirit of incrementalism, I plan to start shipping, and learn along the way. So please feel free to share feedback or start a conversation in comments, on <a href="https://twitter.com/peciva">Twitter</a>, or via email.</p><p>I&#8217;m happy you&#8217;re here! Now let&#8217;s get to it.</p><p><a href="https://www.peciva.com">Tobias</a></p>]]></content:encoded></item></channel></rss>