<?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[Nik Malykhin: Side Quests]]></title><description><![CDATA[Applying an engineering mindset to analog life. Observations on MTB, snowboarding, vintage hardware, and the "human in the loop"]]></description><link>https://www.nikmalykhin.com/s/side-quests</link><image><url>https://substackcdn.com/image/fetch/$s_!-Ojx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8d27381-c618-42b7-a15f-62e1d625e22d_1280x1280.png</url><title>Nik Malykhin: Side Quests</title><link>https://www.nikmalykhin.com/s/side-quests</link></image><generator>Substack</generator><lastBuildDate>Mon, 20 Apr 2026 03:17:31 GMT</lastBuildDate><atom:link href="https://www.nikmalykhin.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Nik Malykhin]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[nik1379616@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[nik1379616@substack.com]]></itunes:email><itunes:name><![CDATA[Nik]]></itunes:name></itunes:owner><itunes:author><![CDATA[Nik]]></itunes:author><googleplay:owner><![CDATA[nik1379616@substack.com]]></googleplay:owner><googleplay:email><![CDATA[nik1379616@substack.com]]></googleplay:email><googleplay:author><![CDATA[Nik]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The 24-Inch Migration: Onboarding a 5-Year-Old to New Hardware]]></title><description><![CDATA[Learn how to apply software engineering principles&#8212;like look-ahead buffers and integration testing&#8212;to manage complex hardware migrations. Discover how to transition a junior rider to a new platform while protecting the Developer Experience (DX) and fostering long-term system ownership.]]></description><link>https://www.nikmalykhin.com/p/the-24-inch-migration-onboarding</link><guid isPermaLink="false">https://www.nikmalykhin.com/p/the-24-inch-migration-onboarding</guid><pubDate>Tue, 17 Mar 2026 11:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h0kn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the world of software, we often talk about &#8220;breaking changes.&#8221; You upgrade a core library, and suddenly the interfaces you relied on are deprecated, the latency spikes, and the system becomes unpredictable. Last week, I attempted a major version upgrade on my 5-year-old son&#8217;s primary transport layer: we moved from a 16-inch &#8220;legacy&#8221; bike to a <strong>Specialized Hotrock 24</strong>.</p><p>Physically, he was ready. He&#8217;s tall for his age, and the metrics suggested he could handle the 24-inch wheels. But as any Tech Lead knows, just because the hardware supports the requirements doesn&#8217;t mean the operator is ready to push to production.</p><h2>The System Architecture: Specialized Hotrock 24</h2><p>In this migration, the hardware selection was about finding the right <strong>Long Term Support (LTS)</strong> release. We skipped the 20-inch version entirely; in our roadmap, a 20-inch bike was a short-term patch that would only serve us for a year or two before hitting its end-of-life.</p><p>We went straight for the 24-inch platform as our LTS. To make this high-performance hardware compatible with a 5-year-old&#8217;s geometry, I chose the Hotrock for its low-slung frame&#8212;think of it as a <strong>compatibility layer</strong> or a &#8220;shim&#8221; that allows a smaller user to interface with a much larger system architecture.</p><h2>The Debugging Phase: Staging Environment (Weekend 1)</h2><p>We didn&#8217;t head straight for the trails. That would be like deploying a refactored monolith to 100% of users without a staging environment. We set up a 3x3 meter &#8220;Sandbox&#8221; in a parking lot to run our first integration tests.</p><h3>1. The Look-Ahead Buffer (The Square)</h3><p>The first bug we encountered was <strong>Visual Latency</strong>. He was looking at his front wheel&#8212;the equivalent of a system only processing the data packet currently in the buffer.</p><p><strong>The Fix:</strong> I implemented a new algorithm. <em>Start at Cone 1, look at Cone 2. When the front wheel enters the zone between 1 and 2, immediately point the sensors (eyes) toward Cone 3.</em> We were teaching him to process future state while executing current operations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h0kn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h0kn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h0kn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg" width="1456" height="1096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1096,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5694022,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.nikmalykhin.com/i/191237160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.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_!h0kn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h0kn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d9ca56-b3b9-4b46-8a6c-4a109979f92a_4080x3072.jpeg 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>2. The I/O Interrupt v1.0 (Stop-on-Line)</h2><p>We tested the &#8220;Stop&#8221; command with a simple line. At this stage, we kept the requirements low: just execute a <code>HALT</code> command exactly on the line. He passed this test without issues&#8212;the braking interface was working, even if it was still a bit binary.</p><h2>Scaling the System (Weekend 2)</h2><p>Once the basic &#8220;Look-Ahead&#8221; logic was cached, we increased the complexity of our tests.</p><h3>2.1 The I/O Interrupt v1.1 (The &#8220;No-Touch&#8221; Constraint)</h3><p>We refactored the stop-and-go drill. Now, he had to stop on the line and then resume driving <em>without</em> touching the floor. This was about refining balance and power delivery&#8212;moving from a simple halt to a complex state transition.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hCuS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hCuS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hCuS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg" width="1456" height="1934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4512976,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.nikmalykhin.com/i/191237160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.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_!hCuS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hCuS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e744fb6-a17b-4f74-99d6-acd5107c51b1_3072x4080.jpeg 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><h3>3. The Slalom (Logic Branching)</h3><p>Finally, we introduced the Slalom. This was a true logic-branching exercise: navigating a sequence of four cones. It required high-frequency adjustments to his trajectory based on the &#8220;Look-Ahead&#8221; data he was now successfully processing.</p><h2>The &#8220;Merged PR&#8221;: Managing the Developer Experience (DX)</h2><p>The first weekend wasn&#8217;t a &#8220;success&#8221; by pure performance metrics. He failed several drills, the &#8220;build&#8221; felt shaky, and the cones remained largely un-navigated.</p><p>But here is the most important log entry: <strong>He didn&#8217;t get frustrated.</strong> In my day job, when a Junior Developer (or an AI agent like Jules) struggles with a new stack, the worst thing a Tech Lead can do is demand they stay until midnight to &#8220;fix the build.&#8221; That is how you accrue <strong>Human Technical Debt</strong>&#8212;you might get the code merged today, but you&#8217;ve poisoned the developer&#8217;s relationship with the codebase for tomorrow.</p><p>By applying a &#8220;Freedom of Decision&#8221; protocol and capping sessions at 15 minutes, we prioritized the <strong>Developer Experience</strong>. Because I didn&#8217;t push, he didn&#8217;t associate the new hardware with stress. We maintained a high &#8220;morale-to-output&#8221; ratio, ensuring he was excited to &#8220;reboot&#8221; the training the following weekend.</p><p><strong>The Feature:</strong> By the end of the second weekend, something clicked. It wasn&#8217;t about completing the drills perfectly&#8212;it was about the <em>feel</em>. The &#8220;Look-Ahead&#8221; algorithm was finally running in the background, and he started to feel comfortable on the new hardware.</p><h2>The Post-Deployment Cleanup: Ownership</h2><p>The real sign that the migration was a success came after the training was over. Without being asked, he started cleaning the bike himself.</p><p>In engineering, we call this <strong>Full-Cycle Ownership</strong>. It&#8217;s the moment a developer stops just writing code and starts caring about the health of the system they operate. Seeing a 5-year-old wipe down his own &#8220;hardware&#8221; after a successful sprint in the sandbox is the ultimate proof of engagement. He wasn&#8217;t just using the tool; he was owning it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!940b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!940b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!940b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!940b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!940b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!940b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg" width="1456" height="1934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3369257,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.nikmalykhin.com/i/191237160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.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_!940b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!940b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!940b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!940b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374b8953-b0fb-43b7-8456-6d931c84eb32_3072x4080.jpeg 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></p><h3>The Log:</h3><ul><li><p><strong>Hardware:</strong> Specialized Hotrock 24 (LTS Migration).</p></li><li><p><strong>Total Training Time:</strong> Two 15-minute sprints.</p></li><li><p><strong>Bugs Fixed:</strong> Visual Latency (Front-wheel staring).</p></li><li><p><strong>Post-Deployment:</strong> Automatic system maintenance (he cleaned the bike).</p></li><li><p><strong>Emotional ROI:</strong> High. The goal isn't to go fast on day one&#8212;it's to make sure that when we finally hit the trails, the pilot feels like the system belongs to him.</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nikmalykhin.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">Refactoring life, one Side Quest at a time.</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>]]></content:encoded></item><item><title><![CDATA[Refactoring the Workshop]]></title><description><![CDATA[Rebuilding a bike maintenance stack from scratch&#8212;from professional roots to family essentials in Spain.]]></description><link>https://www.nikmalykhin.com/p/refactoring-the-workshop</link><guid isPermaLink="false">https://www.nikmalykhin.com/p/refactoring-the-workshop</guid><dc:creator><![CDATA[Nik]]></dc:creator><pubDate>Thu, 05 Mar 2026 16:29:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-Ojx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8d27381-c618-42b7-a15f-62e1d625e22d_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>The Migration Headache</h3><p>Ever tried to migrate a massive, stateful legacy system to a new cloud region with zero downtime? That was my life in 2024. But here&#8217;s the thing about technical debt: it follows you.</p><p>My &#8220;Legacy System&#8221; wasn&#8217;t the physical tools&#8212;I&#8217;d sold those off before leaving Israel. The debt was in my head. My experience as a consultant in a small local MTB shop in Saint-Petersburg fifteen years ago had programmed me with a &#8220;pro-shop&#8221; bias. When we lived in Israel, I acted on that bias and built a monolith: a massive toolset, a wheel balancing stand, the works. It was classic <strong>Over-engineering</strong>.</p><p>Now, standing in my garage in Spain with two <strong>Merida Big Nine 60s</strong> and my son&#8217;s <strong>Specialized Hotrock 24</strong>, I realized I didn&#8217;t need to rebuild the data center. I needed to refactor for efficiency. I needed a <strong>modular set of microservices</strong>.</p><h3>The &#8220;System Architecture&#8221;: A Modular Toolchain</h3><p>Instead of a &#8220;buy-it-all&#8221; approach, I&#8217;ve decoupled the maintenance into three high-performance modules.</p><h4>1. Edge Computing: The &#8220;On-The-Trail&#8221; Kit</h4><p>This is for high-availability fixes. If this service fails, the &#8220;user&#8221; (my oldest son) has a total system crash 5km from the trailhead. I&#8217;ve packed this &#8220;payload&#8221; into a <strong>SKYSPER 20L</strong> backpack, organized in <strong>Zip-lock bags</strong> for modular access:</p><ul><li><p><strong>The Processor</strong>: Crankbrothers M17 multi-tool.</p></li><li><p><strong>Error Handling</strong>: KMC Missing Links (9 and 7-speed) + 2x Pedro&#8217;s or Park Tool tire levers.</p></li><li><p><strong>Redundancy</strong>: Kenda tubes (29x2.2 and 24x1.95) + Park Tool GP-2 pre-glued patches.</p></li><li><p><strong>Hardware Peripherals</strong>: hand pump with manometer + 2x small microfiber towels (Dirty/Clean).</p></li><li><p><strong>On-the-fly Patches</strong>: Small 60ml Finish Line Dry Lube + a travel-size Teflon spray (MO-94/GT85).</p></li></ul><h4>2. Maintenance Scripts: The &#8220;Dry-Clean&#8221; Routine</h4><p>Think of this as your <code>cron</code> jobs. It runs weekly to prevent system degradation. Here is the <strong>deployment logic</strong>:</p><ol><li><p><strong>Mechanical Cleaning</strong>: Back-pedal the chain through a dry rag to remove &#8220;big&#8221; grit.</p></li><li><p><strong>Rinse (Optional)</strong>: If you hear &#8220;sand grinding&#8221; in the gears, flush it with water.</p></li><li><p><strong>Stanchion Wipe</strong>: Clean the shiny bits of the fork with a dedicated rag.</p></li><li><p><strong>The Teflon Interface (Conditional Logic)</strong>:</p><ul><li><p><code>if (no_rinse)</code>: Spray Teflon onto a rag (not the bike) to wipe the chain/bolts.</p></li><li><p><code>else if (rinse_performed)</code>: Protect the brakes and spray Teflon <strong>directly</strong> onto the chain for water displacement.</p></li></ul></li><li><p><strong>The Wipe-Down</strong>: Use that Teflon-soaked rag to wipe the chain and bolt heads. This microscopic film stops the Spanish salt air from &#8220;bit-rotting&#8221; your hardware.</p></li><li><p><strong>Re-Lube</strong>: Apply Finish Line Dry Lube to the rollers.</p></li><li><p><strong>Final Wipe</strong>: Wait 60 seconds for penetration, then wipe off excess.</p></li></ol><h4>3. Core Infrastructure: The &#8220;Yearly Service&#8221;</h4><p>This is the &#8220;bare metal&#8221; hardware needed for the deep dives.</p><ul><li><p><strong>Health Monitoring</strong>: A <strong>Chain Wear Indicator</strong>. If it hits 0.75, the chain is &#8220;deprecated&#8221; and needs replacement.</p></li><li><p><strong>The Interface</strong>: A thin-profile <strong>15mm Pedal Wrench</strong>. You can&#8217;t hack this with a standard DIY wrench.</p></li><li><p><strong>Environment Setup</strong>: A <strong>Floor-to-Frame Stand</strong>. I found one for &#8364;30 on Vinted&#8212;a small investment for a massive increase in &#8220;developer comfort.&#8221;</p></li><li><p><strong>JIT (Just-In-Time) Dependencies</strong>: Specialized tools like the Cassette Lockring Tool and Cable Cutters are in the &#8220;backlog.&#8221; I won&#8217;t buy them until the specific part needs a &#8220;version upgrade.&#8221;</p></li></ul><h3>The Bonus: &#8220;Season Deep Clean&#8221; (System Integrity Audit)</h3><p>Once a season, we need more than a script; we need a full <strong>System Audit</strong>. This is where we check for &#8220;memory leaks&#8221; and hardware degradation.</p><h4>The Audit Kit</h4><ul><li><p><strong>Garbage Collector</strong>: Bio-Degreaser (Finish Line EcoTech).</p></li><li><p><strong>The &#8220;Gherkin&#8221; Brush</strong>: A drivetrain detail brush with a &#8220;claw&#8221; for digging out grit.</p></li><li><p><strong>Linter Tool</strong>: Chain Wear Indicator.</p></li></ul><h4>The Protocol</h4><ol><li><p><strong>Pre-Wash &amp; Degrease</strong>: Remove the mud, then spray degreaser on the gears. Let the &#8220;Garbage Collector&#8221; run for 3 minutes.</p></li><li><p><strong>Scrub &amp; Rinse</strong>: Use the &#8220;Gherkin&#8221; claw to dig out grit. Rinse with low-pressure water.</p></li><li><p><strong>Water Displacement</strong>: While wet, spray Teflon on the chain, bolts, and derailleur springs to prevent oxidation.</p></li><li><p><strong>Dry</strong>: Use a microfiber towel. <strong>Crucial</strong>: If the chain isn&#8217;t dry, your lube won&#8217;t &#8220;deploy&#8221; correctly into the metal.</p></li><li><p><strong>Re-Lubrication</strong>: Apply one drop of Line Dry Lube to each roller on the <strong>inside</strong> of the chain while back-pedaling.</p></li><li><p><strong>The Wipe-Down</strong>: Wait 60 seconds for the lube to soak into the &#8220;inner pins.&#8221; Then, use a clean rag to wipe off the excess. The chain should be lubricated on the inside, but dry to the touch on the outside to prevent sand from sticking to the surface.</p></li></ol><h4>The Health Check (Static Analysis)</h4><ul><li><p><strong>Dependency Check</strong>: Use the Chain Wear Indicator. If it hits 0.75, the chain is <strong>deprecated</strong>&#8212;replace it.</p></li><li><p><strong>Brake Validation</strong>: Check for 1mm thickness. Safety is a non-negotiable fail-safe.</p></li><li><p><strong>Indexing</strong>: Shift through all gears. If it &#8220;clicks,&#8221; adjust the barrel adjuster by 0.5 turns (like fine-tuning a config file).</p></li><li><p><strong>Cable Integrity</strong>: Look for &#8220;blooming&#8221; silver wires. If a cable is untwisting, it&#8217;s about to <strong>crash</strong>. If shifting is &#8220;crunchy,&#8221; the cable is &#8220;dragging&#8221; in the housing&#8212;likely a rust/dirt bottleneck.</p></li><li><p><strong>Load Balancing</strong>: Spin the wheels. If they wobble &gt;3mm, they need balancing (truing).</p></li></ul><h3>The Debugging Phase: Ego vs. Reality</h3><p>The biggest &#8220;bug&#8221; I encountered was my own <strong>Professional Ego</strong>. Because I worked in that shop in Saint-Petersburg and maintained a &#8220;perfect&#8221; setup in Israel, I felt like a &#8220;junior&#8221; by not having every professional tool immediately.</p><p>I had to debug that thought process. In software, we call this <strong>YAGNI</strong> (You Ain&#8217;t Gonna Need It). For a Merida Big Nine 60, I can &#8220;debug&#8221; a wobbly wheel by watching it against the frame. I don&#8217;t need a $300 truing stand to verify a fix.</p><p>The real challenge is <strong>Onboarding the Junior Dev</strong> (my son). When his Hotrock 24 starts &#8220;clicking,&#8221; the <strong>latency</strong> between my coaching cue and his execution is high. Keeping his bike &#8220;clean&#8221; via these scripts reduces the &#8220;noise&#8221; in his learning process. A smooth drivetrain is just a better UI for a kid.</p><h3>The &#8220;Merged PR&#8221;: Log Summary</h3><p>The &#8220;monolith&#8221; workshop is officially decommissioned. It&#8217;s been replaced by a streamlined, purpose-built kit, neatly &#8220;containerized&#8221; in Zip-lock bags within a single backpack.</p><ul><li><p><strong>Status</strong>: Healthy.</p></li><li><p><strong>Packaging</strong>: All trail tools isolated in Zip-locks for weatherproofing.</p></li><li><p><strong>Uptime</strong>: All family bikes are 100% operational.</p></li><li><p><strong>Backlog</strong>: Need to keep an eye on the brake pads; we&#8217;re approaching a &#8220;major version&#8221; update there.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nikmalykhin.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">Refactoring life, one Side Quest at a time.</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>]]></content:encoded></item></channel></rss>