<?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[% moduloMoments %]]></title><description><![CDATA[Scoping down and scaling up in software engineering, leadership, and life.]]></description><link>https://blog.modulomoments.com</link><image><url>https://substackcdn.com/image/fetch/$s_!NtQk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05034cc4-5003-422b-a4b5-d0529c6f9b38_1280x1280.png</url><title>% moduloMoments %</title><link>https://blog.modulomoments.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 06 May 2026 11:18:35 GMT</lastBuildDate><atom:link href="https://blog.modulomoments.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Rob Bruhn]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[rob@modulomoments.com]]></webMaster><itunes:owner><itunes:email><![CDATA[rob@modulomoments.com]]></itunes:email><itunes:name><![CDATA[Rob Bruhn]]></itunes:name></itunes:owner><itunes:author><![CDATA[Rob Bruhn]]></itunes:author><googleplay:owner><![CDATA[rob@modulomoments.com]]></googleplay:owner><googleplay:email><![CDATA[rob@modulomoments.com]]></googleplay:email><googleplay:author><![CDATA[Rob Bruhn]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Technical Estate Planning]]></title><description><![CDATA[Are you ready for the eventual death of React.js?]]></description><link>https://blog.modulomoments.com/p/technical-estate-planning</link><guid isPermaLink="false">https://blog.modulomoments.com/p/technical-estate-planning</guid><dc:creator><![CDATA[Rob Bruhn]]></dc:creator><pubDate>Tue, 07 Mar 2023 05:50:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c5zQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c5zQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c5zQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c5zQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg" width="546" height="472" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:472,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64834,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.modulomoments.com/i/103856989?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f813d6-3335-4eac-a236-3e3ceb2cd97f_1024x535.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c5zQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5zQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e1da4fd-ecc9-45b9-9f7d-38c35d4b57a4_546x472.jpeg 1456w" sizes="100vw" fetchpriority="high"></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>Technology is not eternal, especially when it comes to the fleeting frontend frameworks of the javascript community. You can see below that even the most popular frontend tools have a rise and fall, some more dramatic than others.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hx4A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hx4A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 424w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 848w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 1272w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hx4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png" width="1218" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1218,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:171332,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hx4A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 424w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 848w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 1272w, https://substackcdn.com/image/fetch/$s_!Hx4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b2aa430-5ded-48f1-acbb-f7382e0f150f_1218x798.png 1456w" sizes="100vw"></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"><a href="https://insights.stackoverflow.com/trends?tags=jquery%2Cangularjs%2Cangular%2Creactjs%2Csvelte%2Cnext.js%2Cember.js%2Cbackbone.js%2Credux%2Cflutter&amp;_ga=2.184372704.712131472.1676813829-915554358.1676813829">from StackOverflow</a></figcaption></figure></div><p>Each generation builds on the foundations and work of previous generations. When this happens, no matter how time-tested a technology might be, it can and will reach the end of its life. If you work on web applications, have you ever been impacted by the death of significant dependency or the end of a framework&#8217;s life? React.js is still riding high in the chart above, though it may have begun to experience a downturn. Are you ready for the death of React.js?</p><blockquote><p>The stream will cease to flow;</p><p>The wind will cease to blow;</p><p>The clouds will cease to fleet;</p><p>The heart will cease to beat;</p><p>  For all things must die.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></blockquote><p>This poem may be too dramatic for the occasion, but it is meant to highlight a reality. Every dependency will eventually be deprecated. Regardless of the type of technology, the scope of its usage, and the benefits it has provided, there are limited options when a technology&#8217;s end-of-life is on the horizon. Let&#8217;s consider those below.</p><h2>What happens when a dependency dies?</h2><p>I have migrated multiple applications from one framework to another, and limited options are available when your dependency is no longer maintained. This is incredibly challenging when that dependency is as foundational as a frontend framework. You could do nothing, but this introduces a host of problems that are usually unacceptable such as:</p><ul><li><p>Security vulnerabilities will not be patched</p></li><li><p>Breaking changes may prevent future upgrades</p></li><li><p>Fewer developers will want to work using &#8220;dead&#8221; tools</p></li><li><p>Related dependencies may also die, creating even more issues</p></li></ul><p>These risks require a mitigation strategy. I&#8217;ve considered multiple as I&#8217;ve participated in and led migrations from older, less popular frameworks (e.g., backbone.js) and those that have officially lost all support. (eg. angular.js). There are four main options to consider though all come with costs.</p><h3>1. In-place migration</h3><p>While this might seem the most straightforward answer, most applications have been written over many years with very little planning for the end of a technology&#8217;s life, especially regarding a frontend framework. Usually, code is tightly coupled, leaving migration paths risky and prone to bugs. It can be done, but it is generally preferable to rewrite the application as the cost is unpredictable, and migrations are known to draw on and on if the plan is not coordinated, well-scoped, and controlled. Preventing interoperability between new and old code is essential. If normal development continues on the application, everyone must follow the plan, or a migration project may never end. Untangling the mess of code migration is often not worth the trouble or the cost.</p><h3>2. Rewrite on a new foundation</h3><p>A rewrite might seem just as expensive, and in some ways, it is a type of migration, but rebuilding a house is easier when people aren&#8217;t living in it. Like a migration, a rewrite can be iterative, but rewrites build new foundations. The best course of action with a rewrite is to ensure solid end-to-end testing is in place. Product audits are essential and an excellent opportunity to &#8220;clean house&#8221; if certain features are not worth maintaining. The rewritten scopes should pass the identical end-to-end test suites. While a migration tries to decouple and use existing code paths, a rewrite creates entirely new ones. You might copy some code from previous locations, but there is no chance of continuing to couple new code to old dependencies if they aren&#8217;t found or allowed in the new location.</p><h3>3. Fork &amp; Maintain</h3><p>Depending on the size and complexity of a dependency, you might consider forking the project and then maintaining and upgrading it as needed. This is usually not a good long-term option because of the developer cost required to understand and maintain an outdated tool. The end-of-life tool was also retired for a reason, and keeping it alive and working is asking for trouble in most scenarios, even if you can afford it. Most companies wouldn&#8217;t have the specialized engineers or headcount to keep something like a frontend framework alive.</p><h3>4. Outsource the Upkeep</h3><p>Lastly, while you might not be able to keep it alive, there are sometimes options to contract others to extend the life of a dependency. This is also usually prohibitively expensive and can be likened to COBRA insurance in healthcare. You may need it in an emergency while you find a better option, like migrating or rewriting, but this is not a long-term solution as the problems are just being delayed and at a tremendous financial cost. However, this is usually a better and safer temporary option than forking and trying to do it yourself.</p><h2>Planning for dependency end of life</h2><p>The reality of dependency death or deprecation is not often considered at the beginning of adoption. Usually, the most pressing problems win out, not those 10-15 years in the future, but tech companies can and have faced these scenarios already. For example, many web applications are still coping with the pain caused by the end-of-life of angular.js. This begs the question, what can be done to plan for the end? Just like planning for one&#8217;s own death, or the death of a loved one, the estate should be managed, and affairs should be put in order, but planning early can often prevent pain. Like any loss, pain is unavoidable, but there are some practical ways to ease the burden on those who follow, whether or not we are still around to see it. </p><h3>Write the will before the terminal diagnosis</h3><p>Writing a will is a good metaphor for understanding how to plan for the death of a dependency. A will outlines a plan for each scope of ownership. It spells out the scopes. It specifies the new owners. It tries to avoid ambiguity. As we choose to purchase or invest in new technology, future owners aren&#8217;t often on our minds. If we consider the scopes this new technology owns and possible new owners, this can make the handoff smoother in the future. A good first step is outlining each scope of ownership and any challenges that will occur when that ownership needs to be transferred. This may expose opportunities to transfer ownership early or reduce debt to avoid pain during the transfer. In the case of react.js, this could mean outlining the high-level scopes. Perhaps you only use react.js, as originally built, to render HTML views. You likely have introduced hooks (many relationships) and might even use React to manage significant amounts of application state with the Context API. You may also need to consider each peer dependency relationship like react-router, react-redux, etc. All these relationships make end-of-life even more challenging.</p><h3>Avoid unnecessary relationships</h3><p>The more relationships in a person&#8217;s life, the more difficult it is to write and execute their will. The same is true with any dependency we add to our applications. Each reference to that dependency and each peer dependency establishes a coupling that eventually needs to be removed or replaced. A few tips may help avoid the often massive work of decoupling that must happen at end-of-life.</p><h4>Keep references to a minimum</h4><p>While this may seem straightforward, when it comes to your code, you need to be ever-vigilant in reducing the number of dependencies and keeping references to those dependencies consolidated and controlled. The more you import or reference a dependency in your code, the more difficult it will be to remove it later. This means adding abstractions when possible so that you maintain the interface contracts instead of using a dependency directly. The less the dependency is directly invested in your code, the easier it will be to refactor and replace.</p><p>A diagnostic tool for understanding how much you may owe to various dependencies is easily found in your testing expectations. The more you mock a dependency in your unit tests, the more you can count on that dependency creating havoc at the end of its life. I tend to prefer patterns that follow functional patterns or dependency injection. Mocking in tests is a symptom of technical debt that eventually must be paid when a dependency dies.</p><p>I once took <a href="https://frontendmasters.com/courses/angular-components-es6/">a course on Frontend Masters on angular.js by Scott Moss</a>, but much of the code in the course was written so that it could be tested without angular and the traditional bloat of angular.js test runners. If your unit tests don&#8217;t require your frontend framework, you can bet it will be easier to reuse that logic in a future application when needed.</p><h4>Invest in tools that promote modular design</h4><p>Some tools promote modular design, and some do not. For example, <a href="https://reactjs.org/docs/hooks-intro.html">react hooks</a> will cause great pain when many apps eventually need to migrate away from React. This is because each imported hook introduces a side effect. This is true even in the most consolidated and well-written custom hooks. All hooks tightly couple those features and components to the react ecosystem. They will make it very difficult to remove.</p><p>An app that uses <a href="https://redux.js.org/">redux</a>, <a href="https://react-redux.js.org/">react-redux</a>, and its more dated <em><a href="https://react-redux.js.org/api/connect">connect</a></em> function is a good example of decoupled and modular code. (Using react-redux&#8217;s <em><a href="https://react-redux.js.org/api/hooks">useSelector</a></em><a href="https://react-redux.js.org/api/hooks"> and </a><em><a href="https://react-redux.js.org/api/hooks">useDispatch</a></em> does not promote modular decoupled code) When used correctly and not immediately invoked, the <em><a href="https://react-redux.js.org/api/connect">connect</a></em> function creates reusable higher-order components with shared application state and actions. It may feel like a pipe dream for most modern react apps, but react connected to redux following this pattern will be much easier to replace with another rendering tool when the time comes. It may be an unpopular opinion, but decoupled state management libraries like redux will endure longer than the state management of many current frontend tools because they are not coupled to the browser or its ever-changing API.  Most popular frontend frameworks and tools are written without an escape plan.</p><h3>Consult the heirs, even if they aren&#8217;t here yet</h3><p>Estate planning is not a solo project, and while we can and should plan for the death of our dependencies, we shouldn&#8217;t do it alone, and we shouldn&#8217;t expect to do it perfectly. I recommend starting a technology capabilities plan (TCP) at your company if one doesn&#8217;t exist. This outlines the current decisions and practices around current dependencies. It should also include estimates for future usage and plans to document best practices to limit those dependency touchpoints. This TCP will not cover or prevent all technical debt, but starting and continuing the conversation will leave everyone better prepared. Often, taking on technical debt is the best investment a company can make, but all debt needs to be paid, and when a death occurs, that payment becomes forced. Don&#8217;t be caught off guard when your dependency dies.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.modulomoments.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading % moduloMoments %! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3></h3><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>https://allpoetry.com/All-Things-will-Die</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Technical Trailblazers]]></title><description><![CDATA[Your impact scales up when you plan and lay the trail]]></description><link>https://blog.modulomoments.com/p/technical-trailblazers</link><guid isPermaLink="false">https://blog.modulomoments.com/p/technical-trailblazers</guid><dc:creator><![CDATA[Rob Bruhn]]></dc:creator><pubDate>Thu, 16 Feb 2023 04:32:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zG16!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zG16!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zG16!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zG16!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zG16!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zG16!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zG16!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg" width="1024" height="738" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159238,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.modulomoments.com/i/103190269?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zG16!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zG16!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zG16!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zG16!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37de8479-f28a-44d2-875d-4dc6c1d65e60_1024x738.jpeg 1456w" sizes="100vw" fetchpriority="high"></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>Are you a high-performing software engineer, or maybe you work with or manage one? We often hear high-performers labeled using terms like "10x developer" or "rockstar.&#8221; When thinking about your growth related to these labels, you may think, &#8220;if only I do 10x more than I&#8217;m doing now, then I&#8217;ll be successful.&#8221; You might think you need to solve more significant and complex problems and that being a high performer is doing things others can't.</p><p>While increasing your output or improving the quality of your work might seem like the best path to being a high performer, I&#8217;d like to suggest a better way that doesn&#8217;t focus on comparative output or highlight dramatic performances. A high-performing engineer may have significant output (10x) and solve complex problems with elegance and ease (rockstar). Still, if they only adopt these roles, their contributions will not scale as large and may not even endure.</p><h2>Technical Trailblazer</h2><p>The highest performers I have seen and learned from are those who don&#8217;t simply charge off into the wilderness on their own but know how to lay a trail. I like the metaphor of a trailblazing engineer because the parallels, though often neglected, are practical, simple, and straightforward. Like a real trailblazer, a trailblazing engineer is headed somewhere others will follow. So let&#8217;s consider practices that can make you a successful trailblazer.</p><h2>Plan their journey, not just yours</h2><p>Setting out to impact your team or add value to the product you work on is a great goal. However, when going somewhere new, you need to know where you hope to end up, how you plan to get there, and how others will follow. Documenting the high-level steps of that plan and outlining how you will get from where you are now to where you are going is the first step of trailblazing. If you skip this step, you leave yourself open to many risks, including not ending up where you wanted to be, leaving no trail, and possibly ending up at your destination alone.</p><p>I once attempted to blaze a new trail for migrating from a deprecated frontend framework to a new one. As I tackled the problem, I tried to make it easier for people to follow my work and contribute. However, this first attempt failed, and it did so because it needed to include a plan with well-scoped steps to reach the end. I had only provided a pattern and some tooling but had not spelled out the scopes, milestones, and steps required to do the work.</p><p>It is essential to consider your destination and route. Still, even more importantly, remember how those who follow you will get to the same place. This means considering all the required steps and the contexts and abilities of those coming after you.</p><h2>Prepare for the "dysentery.&#8221;</h2><p>If you are old enough to remember the computer game <a href="https://www.visitoregon.com/the-oregon-trail-game-online/">Oregon Trail,</a> you know that someone in your traveling party eventually gets dysentery. This means that trail-blazing work will have challenges outside your control. People change companies, get sick, tragedy strikes, team members get reallocated to other projects, and the list goes on. The reality is that trailblazing can get interrupted; no matter how great an engineer you might be, you cannot blaze the trail if you aren&#8217;t on it.</p><p>This brings me to some of the best advice I&#8217;ve received for maximizing my impact. Once, a manager recommended that I deliver work with the expectation that I might not be doing this tomorrow. The best technical trailblazers leave a clear enough path that even if they are pulled off the trail, someone can pick up the work and do so without much delay.</p><p>For example, I once had a co-worker who knew he would leave me in a difficult position by accepting a new role and leaving my team. However, instead of simply walking away, he spent his final weeks documenting a massive backlog of well-specified tickets and laid out a clear plan for his remaining work. This trailblazing and stewardship make him the kind of engineer for whom I&#8217;d always write a referral, and I would be glad to have him join my team again. If you are blazing a difficult trail, will it be successful if you are forced to be absent for a time? Would it be successful without you? Those who can answer yes are the kind of engineers I&#8217;d want on my team and at my company any day.</p><h2>Don't go too far ahead of your party</h2><p>It can be tempting to charge ahead and get stuff done, and sometimes, this type of work is required, but some projects require engagement and adoption from more than just a few engineers. Sometimes you need buy-in from the whole organization, including leadership and individual contributors. Even if you can blaze a new trail, it is essential to consider whether anyone will be able or want to follow, especially if they can&#8217;t see you or what you are doing.</p><p>I once spent the better part of a year developing and documenting a backend service layer written with a newer technology that was supposed to make everyone&#8217;s lives easier and speed up the process of delivering value to our customers. Unfortunately, as I developed this work with a few others, we made the mistake of getting too far ahead of everyone else. We had a plan, the steps, and we had it all laid out, but we lost our party. Those we needed to travel with us were not bought in and were not ready to invest in learning the new technology. As a result, the company wasn&#8217;t prepared to adopt the new layer into its product-development lifecycle. Had we considered the current company climate, the readiness for change, and the lack of resources needed to support the successful adoption of new patterns and practices, we may have planned an easier or more gradual route.</p><p>When thinking about blazing a trail or making an impact that is bigger than you can accomplish on your own, it is paramount that you know who will be following and that you aren&#8217;t blazing a trail that no one is willing to travel, no matter how well groomed it might be.</p><h2>Be ready to backtrack</h2><p>As I&#8217;ve referenced earlier, sometimes we blaze trails that others are not ready to travel. Other times we hit roadblocks that force us to take a different path. Especially when traveling into unfamiliar technical territory, we need to be ready to backtrack, pivot and chart a new course.</p><p>Earlier, I mentioned trying and failing to introduce a pattern for migrating a legacy application from one framework to another. When I realized this path was not gaining adoption or being followed, it forced me to backtrack, regroup and chart a new course. I didn&#8217;t do this alone because the key to backtracking is getting back to your traveling party and ensuring you aren&#8217;t blazing ahead alone.</p><p>I regrouped with others at my company and worked with them to formulate better plans, scopes, milestones, and patterns. This led to much more cooperative progress. While it isn&#8217;t always fun, trailblazing requires backtracking because even the best plans cannot account for everything.</p><h2>Know when to write the map</h2><p>When learning how to backpack and camp in the wilderness, I was taught to </p><p>&#8220;<a href="https://lnt.org/">Leave no trace</a>.&#8221; This principle is great for taking good care of natural resources and lands and allowing others to experience the beauty of untarnished nature. However, when blazing a technical trail, the opposite is true. We should leave lots of traces and even &#8220;prepare campsites,&#8221; &#8220;leave lots of pre-gathered firewood,&#8221; and give a clear indication of the next steps of the journey.</p><p>This metaphor is about documentation and isn&#8217;t always something most people are excited about writing. Leaving good traces can easily take the form of writing good, self-documenting code, and helpful code comments are needed in more complex solutions. We should leave clear trail markers that others can follow when the trail gets complicated or could be easily lost. More than that, we need to know when to write the map.</p><p>There is a certain point in blazing a trail where you must slow down and write out some documentation. This shouldn&#8217;t be a solo process, as writing documentation is almost always not for ourselves but for others. Good documentation should be requested and reviewed often, especially when it involves trailblazing. A good map can make or break a project, mainly because time is limited, and just because you&#8217;ve blazed a trail doesn&#8217;t mean you can go back and serve as a personal sherpa to everyone that follows. Good documentation and technical writing is a skill that helps technical trailblazers multiply their impact and save time for even more new trails. As I mentioned earlier, some of the most successful engineers I&#8217;ve seen can write well-specified technical tickets that they can hand to others. As a result, these &#8220;map-makers&#8221; multiply themselves by generating huge backlogs of tickets that help blaze new trails.</p><h2>Bring others with you</h2><p>This idea is simple and easy to understand; the more people take a trail, the easier it is to follow. Making a trail is easier with many feet, multiple guides, and extra map-makers. This can be seen in most companies around the concept of technical onboarding. These aren&#8217;t new trails for anyone; they are usually well-documented and well-trodden. Since everyone onboards, the path is generally well-defined. Numbers are a massive benefit to trailblazing. I have seen this clearly in roles where we have adopted processes around documenting technical decisions and initiatives. If a few people begin to use the process or &#8220;trail&#8221; and prove its worth, more engineers follow suit, and the trail gets easier to use. This means trailblazing is easier if you don&#8217;t do it alone.</p><p>When you set out on a new trail, look for traveling companions who can share the load. Some are better map-makers, and some are better at breaking through the brush. Trail-blazing is more manageable and sustainable when we network and work together to establish the route to our destination.</p><h2>Build trails that multiply</h2><p>Lastly, you may be a rockstar who can create a fantastic show. You may produce ten times more than your peers. However, as a technical trailblazer, you can deliver value that will scale well beyond yourself. Others will follow not only your footsteps but also your example and blaze new trails of their own.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.modulomoments.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading % moduloMoments %! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.modulomoments.com/p/technical-trailblazers?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.modulomoments.com/p/technical-trailblazers?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.modulomoments.com/p/technical-trailblazers?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item></channel></rss>