<?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>Thu, 04 Jun 2026 14:40: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[Project 2002: Curating a Practical Build for the Windows 98 Era]]></title><description><![CDATA[The foundation of any retro-computing project is a clear definition of its historical boundaries.]]></description><link>https://www.nikmalykhin.com/p/project-2002-curating-a-practical</link><guid isPermaLink="false">https://www.nikmalykhin.com/p/project-2002-curating-a-practical</guid><pubDate>Tue, 05 May 2026 07:01:45 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[<p>The foundation of any retro-computing project is a clear definition of its historical boundaries. My experience with personal computing began in late 1999 with a Pentium III 500MHz system. While that era provided significant exposure to the Windows 98 environment , much of my formative gaming history occurred during the Windows XP period. To capture the intersection of these two eras, I have focused my research on the late 2002 period.</p><p>The selection of Windows 98 SE as the primary operating system is a deliberate, pragmatic choice. While Windows XP offers stability, Windows 98 SE provides <em>native</em> MS-DOS support, which serves as a significant technical bonus for a gaming-centric build. This allows for a hardware configuration that can bridge the gap between late-nineties legacy software and the more demanding titles released at the turn of the millennium.</p><h2>The Core Architecture: Transitioning from Theory to Reality</h2><p>Identifying the ideal processor for 2002 requires a comparison between the AMD Athlon XP and the Intel Pentium 4. In early 2002, the AMD Athlon XP 1700+ was often viewed as the superior choice due to its performance-per-clock advantages over the Intel Pentium 4 Northwood. Furthermore, Windows 98 faces documented stability issues when running on processors exceeding 2.1GHz. This limitation makes the mid-range Athlon XP an <em>ideal</em> candidate for this specific operating system.</p><p>However, retro-computing often requires flexibility based on hardware availability. While my research initially favored a Socket A configuration, I acquired a ready-made system featuring an Intel Pentium 4 Northwood. This pivot highlights a core principle of the project: prioritizing functional, accessible hardware that matches the target era over an unattainable theoretical ideal.</p><h3>Motherboard and Maintenance</h3><p>The system is built around a QDI SuperB 4 motherboard. Positioned as a reliable middle-class component, it provides the necessary infrastructure for this era, though it presents a specific maintenance challenge common to hardware of this epoch.</p><blockquote><p>The longevity of early 2000s hardware is frequently compromised by failing capacitors. The QDI SuperB 4 requires a complete recapping to ensure future stability and prevent electrical failure.</p></blockquote><h2>System Stability and Memory Constraints</h2><p>While Windows 98 can be modified to address up to 1GB of memory, it is natively limited to 512MB. For a 2002 build, 512MB was considered a substantial amount and remains the most stable configuration for this operating system.</p><p>My selection for the memory module is a 512MB Kingston HyperX stick (KHX3200AK2/512). Although this specific module was released in July 2003, the HyperX line itself debuted in November 2002, making it a period-appropriate choice for a high-performance system of that time. I opted for a single 512MB module rather than a dual-channel configuration to ensure compatibility with the motherboard and to maintain a simpler, more stable signal path.</p><h2>Graphics and the Economics of Retro Hardware</h2><p>The video card is the most critical component for a gaming setup. While the Radeon 9700 Pro (August 2002) was the performance leader at the time, many users followed an upgrade path in subsequent years. In a modern context, the GeForce 6600 GT is often recommended as the fastest reliable solution for Windows 98 builds.</p><p>However, market dynamics dictate a different choice. The current price for a GeForce 6600 GT often reaches 100 euro, which is difficult to justify for a hobbyist project. By contrast, the ATI Radeon 9600 Pro (October 2003) can be acquired for approximately 10 euro. The 9600 Pro offers <em>excellent</em> driver support for Windows 98 and represents a logical "upper-mid" consumer upgrade that would have been common for a system originally purchased in late 2002.</p><h2>Storage, Audio, and Networking</h2><p>For storage, the system utilizes a 60GB Seagate Barracuda ATA IV. Released in late 2001, this drive is a period-correct selection that avoids the complexities and potential instability of using SATA-to-IDE adapters or industrial CompactFlash readers in a Windows 98 environment.</p><p>The audio configuration currently relies on a Creative Labs Sound Blaster PCI 128 (CT4750). While functional, the long-term goal is to source a Sound Blaster Audigy 1 or 2, which represented the pinnacle of consumer audio during the early 2000s.</p><p>The networking hardware is a standout artifact: the 3Com 3CSOHO100-TX.</p><ul><li><p>This card was released in September 1999.</p></li><li><p>It utilizes the Parallel Tasking II architecture.</p></li><li><p>It processes network traffic on its own silicon, reducing the load on the CPU.</p></li></ul><h2>Optical Drives and Media Artifacts</h2><p>The system includes two distinct optical drives that serve as markers of the epoch. The first is a Pioneer DVR-104 (April 2002), a reliable DVD-RW reader that requires the latest firmware for optimal performance. The second is the LG GDR-8161B. This drive is a unique historical artifact, as it is one of the few consumer drives capable of reading original GameCube and Wii discs.</p><p>To complement these, I have integrated a standard Samsung 3.5-inch floppy drive. The acquisition of new-old-stock floppy disks ensures that I can reliably write and load legacy DOS games using physical media.</p><h2>Conclusion</h2><p>Building a retro PC is a process where there is no single correct path, provided the researcher maintains a clear perspective on their goals. The transition from theoretical research to the physical assembly of hardware delivers a deep understanding of the technological transitions that defined the early 2000s. While maintenance tasks like recapping require time and patience, the result is a preserved piece of computing history that remains functional for modern exploration.</p><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[The ISO Wall and the CCD: Testing a €45 Film Alternative]]></title><description><![CDATA[The Parallel: Soul vs.]]></description><link>https://www.nikmalykhin.com/p/the-iso-wall-and-the-ccd-testing</link><guid isPermaLink="false">https://www.nikmalykhin.com/p/the-iso-wall-and-the-ccd-testing</guid><pubDate>Mon, 20 Apr 2026 07:01:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!guio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Parallel: Soul vs. Spec Sheets</h2><p>I recently moved the family to Spain, and in the process, I liquidated most of my camera gear. I told myself I&#8217;d be happy with the smartphone in my pocket, but after a few months of shooting the boys in the Mediterranean light, I realized the images felt sterile. They were too perfect, too computed. I found myself missing the unpredictability of film&#8212;the way a certain stock renders a sunset not as a collection of high-dynamic-range data points, but as a mood. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!guio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!guio!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!guio!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!guio!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!guio!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!guio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg" width="1358" height="2048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2048,&quot;width&quot;:1358,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1200366,&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://www.nikmalykhin.com/i/194607577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.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_!guio!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!guio!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!guio!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!guio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70600991-6a8b-40fc-bec3-49d86940f7dc_1358x2048.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 style="text-align: right;"><em>A 35mm film photograph</em></p><p>However, I didn&#8217;t want to deal with the rising cost of rolls or the lead times of lab processing while trying to settle into a new country. I started wondering if I could find a shortcut to that aesthetic by looking backward rather than forward.</p><h2>The Setup: The S45 System</h2><p>I decided to test a theory I&#8217;d seen floating around certain corners of the web: that early digital sensors possess a &#8220;soul&#8221; that modern ones have scrubbed away in the name of efficiency. I spent &#8364;45 on a Canon PowerShot S45, a brick-like device from 2002. It doesn&#8217;t have a modern CMOS sensor; instead, it uses a <em>CCD</em>, a type of light-gathering hardware that reads the entire sensor at once and, arguably, renders color with a more organic, film-like saturation.</p><p>Plaintext</p><pre><code><code>System: Canon PowerShot S45 (Circa 2002)
Sensor: 1/1.8" CCD (4.0 Megapixels)
Processor: DIGIC 1
Storage: CompactFlash (CF)
Interface: Tactical sliding lens cover, manual control dial
</code></code></pre><p>Holding the S45 feels like holding a piece of industrial equipment. It has weight, it makes mechanical noises, and it forces a specific cadence. You cannot &#8220;spray and pray&#8221; with this device. It demands that you wait for the buffer to clear.</p><h2>The Friction: The ISO Wall</h2><p>The experiment hit reality the moment the sun began to dip behind the hills. Modern sensors have spoiled us; we expect to shoot in near-darkness and let software sort out the mess. The DIGIC 1 processor inside the S45 has no such intelligence. I quickly discovered what I call the ISO Wall.</p><p>While the camera claims to go higher, anything above <em>ISO 100</em> introduces a level of electronic noise that doesn&#8217;t look like pleasant film grain&#8212;it looks like a broken television. The sensor &#8220;fatigues&#8221; almost immediately when the light isn&#8217;t optimal. This constraint changed my behavior. I stopped trying to capture everything and started looking for the light first, and the subject second. If the light wasn&#8217;t there, the camera stayed in my pocket. It is a fragile system that requires a high-light environment to maintain its integrity.</p><h2>The Signal and Load</h2><p>There is a significant difference in the cognitive load between shooting with an iPhone and the S45. With the phone, the signal is &#8220;everything is a photo.&#8221; The computational overhead is handled by the device, leaving me with a flat, predictable result. With the S45, the <strong>signal-to-noise ratio</strong> is much tighter. I have to think about the exposure compensation and the white balance because the early internal logic often gets it wrong.</p><blockquote><p>The friction of using old tech is actually a filter; it forces you to decide if a moment is actually worth the effort of capturing.</p></blockquote><p>Surprisingly, when I run the files through my PIXMA G650 printer at 13x18 size, the 4-megapixel files hold up beautifully. The &#8220;imperfections&#8221;&#8212;the slight softness and the specific way the CCD handles the blues and reds&#8212;provide a look that I would usually spend twenty minutes trying to emulate in post-processing software.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dooc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dooc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dooc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dooc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dooc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dooc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg" width="1456" height="1959" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1959,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:665441,&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/194607577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.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_!dooc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dooc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dooc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dooc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3a6a89-6022-415d-a968-5588e8486899_1522x2048.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 style="text-align: right;">A CCD-sensor shot from the S45</p><h2>What Stood the Test</h2><p>The experiment confirmed that I don&#8217;t need to chase a $700 Fujifilm X100 to feel inspired. The &#8220;Third Way&#8221; of photography is now my ground truth. It&#8217;s a space that sits between the mindless convenience of a smartphone and the high-maintenance ritual of film.</p><p>The S45 proved that character matters more than cost. The hardware is slow, the screen is tiny, and the battery life is questionable, but the output has an aesthetic &#8220;thickness&#8221; that modern gear lacks. It isn&#8217;t a 1:1 replacement for 35mm film, but it satisfies the same creative itch for a fraction of the price.</p><h2>Final Reflections</h2><p>I am merging the &#8220;vintage digital&#8221; approach into my permanent toolkit. The S45 will stay in my bag for those bright, coastal afternoons where I want the world to look a bit more like a memory and less like a data set. I&#8217;m backlogging the idea of buying a high-end mirrorless body for now; the &#8220;Side Quest&#8221; taught me that I was bored with the sensor, not the hobby.</p><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[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>