<?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[The Engineer's Digest: ML Feature stores]]></title><description><![CDATA[Writing about ML AI Feature stores that power the millions of revenue at workplaces]]></description><link>https://harshuljain.substack.com/s/ml-feature-stores</link><image><url>https://substackcdn.com/image/fetch/$s_!Tssn!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75a21435-8c5b-4975-9db7-20292a727543_1280x1280.png</url><title>The Engineer&apos;s Digest: ML Feature stores</title><link>https://harshuljain.substack.com/s/ml-feature-stores</link></image><generator>Substack</generator><lastBuildDate>Tue, 23 Jun 2026 02:10:27 GMT</lastBuildDate><atom:link href="https://harshuljain.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Harshul Jain & Tanya Sah]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[harshuljain@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[harshuljain@substack.com]]></itunes:email><itunes:name><![CDATA[Harshul Jain]]></itunes:name></itunes:owner><itunes:author><![CDATA[Harshul Jain]]></itunes:author><googleplay:owner><![CDATA[harshuljain@substack.com]]></googleplay:owner><googleplay:email><![CDATA[harshuljain@substack.com]]></googleplay:email><googleplay:author><![CDATA[Harshul Jain]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[7 Asks from ML Engineers That Define MLOps]]></title><description><![CDATA[What ML engineers actually need to keep models alive in production - from chapter 1 of Building Machine Learning Systems with a Feature Store]]></description><link>https://harshuljain.substack.com/p/7-asks-from-ml-engineers-that-define</link><guid isPermaLink="false">https://harshuljain.substack.com/p/7-asks-from-ml-engineers-that-define</guid><dc:creator><![CDATA[Harshul Jain]]></dc:creator><pubDate>Mon, 23 Mar 2026 00:10:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6CqQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p style="text-align: justify;">If you&#8217;ve ever shipped an ML model to production, you know the real work starts <em>after</em> the Jupyter notebook looks good.</p><p style="text-align: justify;">Training a model is one thing. Keeping it alive, reliable, and improving in production is a completely different game. That&#8217;s where MLOps comes in &#8212; and at its core, MLOps is really about answering the asks that ML engineers have been making for years.</p><p style="text-align: justify;">Jim Dowling, in Chapter 1 of his book <em>Building Machine Learning Systems with a Feature Store</em>, lays out these asks beautifully. I&#8217;m paraphrasing and expanding on them here because I think every ML and platform engineer should internalize these principles early.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6CqQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6CqQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6CqQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:768828,&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;:true,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6CqQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!6CqQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e3af1c-9c2f-4182-ab2d-f55f4521f754_1024x559.png 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><h2><br>1. Testing with Minimal Friction</h2><p style="text-align: justify;">MLOps folks believe that <strong>testing should have </strong><em><strong>minimal friction</strong></em><strong> on your development speed.</strong></p><p style="text-align: justify;">If running your tests is painful, you won&#8217;t run them. It&#8217;s that simple. The goal is to automate test execution so it becomes invisible &#8212; tests run every time you push code, and you only hear about them when something breaks. Popular CI platforms like <strong>GitHub Actions</strong>, <strong>Jenkins</strong>, and <strong>Azure DevOps</strong> make this straightforward. But here&#8217;s the thing &#8212; CI is <em>not</em> a prerequisite for starting to build ML systems. If you come from a data science background, comprehensive testing might be unfamiliar territory, and that&#8217;s completely fine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lSpm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lSpm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lSpm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:432962,&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;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lSpm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!lSpm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbda003e2-f4e4-4fc3-9644-bf9db33c43f1_1024x559.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></figure></div><p style="text-align: justify;">Start small:</p><ul><li><p><strong>Unit tests</strong> for your feature transformation functions</p></li><li><p><strong>Model performance and bias tests</strong> in your training pipelines</p></li><li><p><strong>Integration tests</strong> for your end-to-end ML pipelines</p></li></ul><p></p><p style="text-align: justify;">The key insight is this: you can add automated tests <em>after</em> you&#8217;ve validated that your MVP is worth maintaining. Don&#8217;t let perfect testing be the enemy of shipping.</p><p></p><h2>2. Continuous Deployment (CD)</h2><p style="text-align: justify;">MLOps folks love that feeling when you push changes in your source code and your ML artifact or system is <em>automatically deployed</em>.</p><p>Deployments typically flow through three environments:</p><ul><li><p><strong>Dev</strong> &#8212; where you build and experiment</p></li><li><p><strong>Preprod</strong> &#8212; where you test with realistic conditions</p></li><li><p><strong>Prod</strong> &#8212; where your model meets the real world</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WNp5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WNp5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WNp5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:645347,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WNp5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!WNp5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50b0c33-ed61-43c3-b8b4-ded2cad62617_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: justify;">Although a human may ultimately sign off on deploying an ML artifact to production, every step leading up to that decision should be automated. That&#8217;s continuous deployment.</p><p style="text-align: justify;">An important philosophy: your whole ML system &#8212; feature pipelines, training pipelines, inference pipelines &#8212; should be buildable, testable, and runnable in <em>any</em> of these environments. The only thing that changes is the data your system can access. Dev might not have production data, and that&#8217;s expected.</p><h2>3. Data Quality - &#8220;Garbage In, Garbage Out&#8221;</h2><p>This is the oldest maxim in the database community, and MLOps folks live by it.</p><p>Many ML systems ingest data that has few or no guarantees on its quality. And here&#8217;s the brutal truth: blindly ingesting garbage data leads to very well-trained models that still predict garbage. Your loss curves look great, your metrics pass, but your model is confidently wrong.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vqb3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vqb3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vqb3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:637571,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vqb3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Vqb3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb5153ae-4ac3-47aa-837d-663c9f9684aa_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p style="text-align: justify;">The fix is <strong>data validation</strong> &#8212; designing explicit tests for your feature pipelines that catch problems <em>before</em> they reach your model:</p><ul><li><p>Is the data in the expected schema?</p></li><li><p>Are there unexpected null values or outliers?</p></li><li><p>Has the distribution shifted in a way that signals something is wrong?</p></li></ul><p style="text-align: justify;">Just as importantly, you need to define <strong>mitigating actions</strong> &#8212; what do you do when data is identified as incorrect, missing, or corrupt? Do you halt the pipeline? Fall back to a cached version? Alert the data team?</p><h2>4. Versioning &amp; Rollback</h2><p>MLOps folks dream of a big green button for upgrading the system and a big red button for rolling back a problematic upgrade.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QYHe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QYHe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QYHe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:666492,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QYHe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!QYHe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1558ac64-3656-41f8-abba-9658ea0209ac_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This isn&#8217;t just a nice-to-have &#8212; it&#8217;s a prerequisite for doing anything safely in production. Versioning both <strong>features</strong> and <strong>models</strong> enables:</p><ul><li><p><strong>A/B testing</strong> &#8212; run two model versions side by side to measure impact</p></li><li><p><strong>Safe upgrades</strong> &#8212; deploy a new version with confidence</p></li><li><p><strong>Instant rollback</strong> &#8212; when something goes wrong, revert to the last known-good version of both the model <em>and</em> the features that feed it</p></li></ul><p>The key word here is <em>both</em>. Rolling back a model without rolling back the features it was trained on is a recipe for subtle, hard-to-debug failures. Your versioning strategy needs to treat the model and its feature dependencies as a unit.</p><h2>5. Evals for LLMs &amp; Agents</h2><p>MLOps folks don&#8217;t like surprises &#8212; especially the kind where a new version of your LLM or agent introduces unexpected behavior.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n823!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n823!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!n823!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!n823!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!n823!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n823!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:723961,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n823!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!n823!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!n823!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!n823!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabdcc9e0-32c4-4186-a953-03c9b4af9170_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is a newer ask, born from the era of large language models and AI agents. Traditional ML had model performance metrics. But LLMs and agents are different beasts &#8212; their failure modes are more open-ended, harder to predict, and potentially more dangerous.</p><p>Consider: a version of a coding agent that could wipe users&#8217; filesystems clean. That&#8217;s not a hypothetical &#8212; that&#8217;s the kind of risk that makes evals essential.</p><p>Before any LLM application or agent goes into production, you need to design and run <strong>evaluations</strong> that stress-test the changes. This means:</p><ul><li><p>Defining a suite of test cases that capture expected behavior</p></li><li><p>Measuring regression on known-good outputs</p></li><li><p>Testing edge cases and adversarial inputs</p></li></ul><p>Evals are to LLMs what unit tests are to traditional software &#8212; except the stakes are often higher and the behavior is less deterministic.</p><h2>6. Monitoring &amp; Observability</h2><p>MLOps folks love to know how their systems are performing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Df6P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Df6P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Df6P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:623745,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Df6P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Df6P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eec52f5-833d-4cec-81a0-5def88c66b4d_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A production AI system isn&#8217;t a &#8220;deploy and forget&#8221; artifact. It&#8217;s a living system that needs continuous observation. At minimum, you should be collecting metrics and building dashboards for:</p><ul><li><p><strong>Model prediction quality</strong> &#8212; How are your predictions tracking against business KPIs? A model can be technically accurate but commercially useless if it&#8217;s optimizing the wrong thing.</p></li><li><p><strong>Data drift</strong> &#8212; Is the incoming data still resembling what you trained on? Distribution shifts happen quietly and can degrade model performance without any code changes.</p></li><li><p><strong>Platform performance</strong> &#8212; What&#8217;s the throughput and latency of your model serving, feature store, vector index, and ML pipelines? A model that takes 2 seconds to respond in a system with a 200ms SLA is a broken model.</p></li></ul><p>The goal is simple: no surprises. When something degrades, you should know about it before your users do.</p><h2>7. Logging for Debugging</h2><p>MLOps folks need logs from operational services to debug and improve AI systems.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zAjw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zAjw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zAjw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:655322,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://harshuljain.substack.com/i/191807641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zAjw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!zAjw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc3d8b4-75d6-4f57-a4e0-4c78020fcaa4_1024x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This might sound basic compared to the other asks, but logging in ML systems is uniquely important. In traditional software, logs help you trace errors. In ML systems, logs help you <em>understand why your model is wrong</em>.</p><p>For LLMs specifically, <strong>eyeballing model logs</strong> is a surprisingly powerful technique for error analysis. Looking at actual inputs and outputs &#8212; not just aggregate metrics &#8212; often reveals patterns that no automated metric would catch.</p><p>For classical ML systems, logs are equally critical for debugging errors and understanding model performance in production conditions that your test environment couldn&#8217;t fully simulate.</p><h2>The Bottom Line</h2><p>These asks aren&#8217;t a checklist to implement on day one. They&#8217;re a north star &#8212; the set of capabilities that mature ML teams converge toward as their systems grow in complexity and criticality.</p><p>If you&#8217;re just starting out, pick the ones that hurt the most and address those first. If you&#8217;re already running ML in production, use this list to identify gaps.</p><p>The common thread across all seven asks? <strong>Reduce surprises in production.</strong> That&#8217;s really what MLOps is about.</p><div><hr></div><p><em>Inspired by Chapter 1 of Jim Dowling&#8217;s &#8220;Building Machine Learning Systems with a Feature Store&#8221; (O&#8217;Reilly, 2025).</em></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://harshuljain.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://harshuljain.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item></channel></rss>