<?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[Eric's Data Science Newsletter]]></title><description><![CDATA[Subscribe to learn how effectively to use AI, Bayes, Computation, and Data Science in Biotech.]]></description><link>https://dspn.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!rGJj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fdspn.substack.com%2Fimg%2Fsubstack.png</url><title>Eric&apos;s Data Science Newsletter</title><link>https://dspn.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 30 May 2026 05:02:56 GMT</lastBuildDate><atom:link href="https://dspn.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Eric J. Ma]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dspn@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dspn@substack.com]]></itunes:email><itunes:name><![CDATA[Eric J. Ma]]></itunes:name></itunes:owner><itunes:author><![CDATA[Eric J. Ma]]></itunes:author><googleplay:owner><![CDATA[dspn@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dspn@substack.com]]></googleplay:email><googleplay:author><![CDATA[Eric J. Ma]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Standardization Is Worth the Effort: Reflections from BioIT World 2026]]></title><description><![CDATA[Alternatively titled: The people work behind making standards stick (and why it&#8217;s worth it)]]></description><link>https://dspn.substack.com/p/standardization-is-worth-the-effort</link><guid isPermaLink="false">https://dspn.substack.com/p/standardization-is-worth-the-effort</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 28 May 2026 11:02:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3GjS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3GjS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3GjS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3GjS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3GjS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3GjS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b9ed40e-ae3a-45ac-8d4d-a060578c8ea5_1536x1024.webp 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>Hello fellow datanistas!</p><p><a href="https://ericmjl.github.io/blog/2026/5/27/reflections-from-bioit-world-workshop-standardization-is-worth-the-effort/">This post</a> is my reflection on why standardizing data science ways of working is worth the investment, what actually works in practice, and the people work that makes change stick. I&#8217;ll share stories from my time at Moderna, lessons learned, and practical steps for teams who want to start (or restart) their own standardization journey.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Let&#8217;s be real: most teams only believe in standards after they&#8217;ve felt the pain of not having them. Early in my time at Moderna, I saw firsthand how messy codebases and inconsistent project structures made onboarding and migrations a slog. But when we finally standardized&#8212;on folder layouts, onboarding commands, and documentation&#8212;everything changed. Migrations (like moving from Bitbucket to GitHub, or Conda to Pixi) became predictable and fast. The upfront cost paid off in confidence and speed.</p><p>But it&#8217;s not just about picking any standard. The trick is to work backwards from what you actually ship. For us, that meant naming our deliverables (compute tasks, Python packages) and then figuring out which standards would remove friction on the path to shipping them. Standardize where divergence creates friction&#8212;like project templates or documentation publishing&#8212;not everywhere. Let science stay flexible where it matters.</p><p>The hardest part? People. Making the ROI case gets you in the door, but adoption is a people problem. Training, hand-holding, and building a culture of learning agility are what make standards stick. And as the stack evolves (hello, Marimo notebooks!), the playbook stays the same: demo, review, socialize, train, and repeat.</p><p>AI is lowering the cost of tooling and migrations, but it also amplifies whatever patterns already exist&#8212;good or bad. That&#8217;s why investing in standards pays off twice: it makes migrations easier and ensures AI tools reinforce the right patterns.</p><p>If you&#8217;re leading a team, hiring for curiosity and learning agility is just as important as picking the right tools. And if you&#8217;re already on a team, start with the one standard that removes the most daily friction. One small win beats a grand plan that never ships.</p><p>For the full story, including practical resources and more personal vignettes, check out the full blog post: <a href="https://ericmjl.github.io/blog/2026/5/27/reflections-from-bioit-world-workshop-standardization-is-worth-the-effort/">Reflections from BioIT World Workshop: Standardization Is Worth the Effort</a>.</p><p>Standardization is a people-first investment that pays off in speed, confidence, and adaptability&#8212;especially as your stack evolves. Start small, focus on where friction is highest, and remember: adoption is a milestone, not a finish line.</p><p>What&#8217;s one thing you wish your team would standardize first? Folder structure, CI/CD, documentation, or something else? I&#8217;d love to hear your stories and what&#8217;s worked (or not) for you.</p><p><em>If this resonates, read the full post for more stories and resources, or share it with a teammate who&#8217;s wrestling with the same challenges. And if you want more reflections like this, consider subscribing.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Measurement, Not Full-Stack: The Real Mission of Data Science in the Age of AI]]></title><description><![CDATA[Alternatively titled: Why measurement&#8212;not building&#8212;remains the heart of data science, even as AI changes the game.]]></description><link>https://dspn.substack.com/p/measurement-not-full-stack-the-real</link><guid isPermaLink="false">https://dspn.substack.com/p/measurement-not-full-stack-the-real</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 21 May 2026 11:03:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!msGw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!msGw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!msGw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!msGw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!msGw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!msGw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!msGw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!msGw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!msGw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!msGw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!msGw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee7ddea4-bc20-4e7b-9efb-6ff3ae6519f9_1536x1024.webp 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>Hello fellow datanistas!</p><p>What if the most important job for data scientists in 2026 isn&#8217;t building apps or writing code, but defining what actually matters? I keep coming back to one word: measurement.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/5/20/what-data-science-is-actually-about-in-the-age-of-ai/">This post</a> is about why measurement&#8212;rigorous, scientifically grounded, and defined by those closest to the problem&#8212;remains the core mission of data science, even as AI and LLMs transform how we work. I want to share why I think the industry&#8217;s push to make data scientists into full-stack developers is a mistake, and what we should focus on instead.</p><p>Let&#8217;s be honest: the buzz around AI coding assistants and LLM-powered apps is relentless. It&#8217;s tempting to believe that, since coding is easier than ever, data scientists should just become full-stack developers. I see this everywhere&#8212;managers expecting data scientists to own front-ends, databases, and deployment pipelines, while the measurement work that makes us valuable gets squeezed into the margins.</p><p>But here&#8217;s the thing: LLMs and AI tools are just new instruments. They don&#8217;t decide what to measure. That&#8217;s still our job, and it&#8217;s a job that requires domain knowledge, scientific reasoning, and a relentless focus on reliability. The industry is zigging toward building, but the real gap is in making sure these systems actually work&#8212;at scale, over time, in the real world. That&#8217;s where data scientists create massive value.</p><p>When we get pulled into full-stack work, we trade years of scientific expertise for mediocre engineering. The cost is real: cognitive switching degrades both measurement and engineering, and the measurement work itself gets displaced. Every hour spent debugging a UI is an hour not spent designing evaluation frameworks or defining metrics that matter.</p><p>So what should we focus on? LLM evaluation is the clearest answer. Every company building with LLMs needs to know if their system works, and that requires exactly the kind of rigorous measurement data scientists are trained for. The tools are immature, which is an opportunity: build single-purpose utilities for your own measurement work, but don&#8217;t cross into full-blown product development&#8212;that&#8217;s for software engineers.</p><p>The line is nuanced: scope, audience, and production boundary matter. Build tools for yourself and your team, but let engineers own the production systems. And always, always co-define measurement frameworks with the people closest to the problem&#8212;whether it&#8217;s document parsing or ML for drug discovery, the right metrics come from collaboration between data scientists and domain experts.</p><p>For managers, this means reframing the conversation: start with measurement, not building. Staff teams based on measurement needs, go for quick wins to build credibility, and prioritize by expected ROI. The trade-off is simple: every hour spent on engineering is an hour lost to measurement, and that&#8217;s where the real value lies.</p><p>Measurement is the heart of data science&#8212;AI tools change how we work, but not what matters. Stay close to the problem, focus on rigorous evaluation, and don&#8217;t trade scientific expertise for mediocre engineering.</p><p>How are you balancing measurement work with engineering tasks in your own team? Have you felt the pull toward full-stack, and what trade-offs have you seen?</p><p><em>If this resonates, I invite you to read the full post for concrete examples and practical advice: <a href="https://ericmjl.github.io/blog/2026/5/20/what-data-science-is-actually-about-in-the-age-of-ai/">What data science is actually about in the age of AI</a>. Share your thoughts or subscribe for more honest takes on data science in the AI era.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[ODSC East 2026: Mapping the Conference Zeitgeist with AI]]></title><description><![CDATA[Alternatively titled: What happens when you let AI agents read every conference abstract for you?]]></description><link>https://dspn.substack.com/p/odsc-east-2026-mapping-the-conference</link><guid isPermaLink="false">https://dspn.substack.com/p/odsc-east-2026-mapping-the-conference</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 14 May 2026 23:01:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y6Mc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y6Mc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Y6Mc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04dbd20c-7443-4a4b-af9a-3084f7d5dd2a_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever wondered what really drives the conversation at a massive AI conference&#8212;beyond the buzzwords and hallway chatter? This year at ODSC East 2026, I ran a small experiment to find out, using a mix of agentic AI and a bit of old-fashioned curiosity.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In <a href="https://ericmjl.github.io/blog/2026/5/10/odsc-east-2026-zeitgeist/">this post</a>, I share how I mapped the true &#8216;center of gravity&#8217; of ODSC East 2026 by scraping and analyzing every talk abstract, then letting a multi-agent pipeline surface the five big patterns shaping our field. Plus, a candid field note from my own workshop and what I learned from the experience.</p><p>I&#8217;ll be honest: at big conferences, it&#8217;s impossible to catch every session, no matter how much you try. This year, instead of chasing every talk, I wondered&#8212;could I use the abstracts themselves to reveal the conference&#8217;s real themes? So I scraped the ODSC East 2026 schedule, pulled 237 session abstracts, and ran them through a multi-agent categorization pipeline. Each agent proposed its own taxonomy, then cross-reviewed and arbitrated until five clear zones emerged:</p><ol><li><p><strong>Agentic AI Systems</strong>: The biggest zone, reflecting the shift from prompt engineering to robust agent architectures, orchestration, and production deployment. Teams are wrestling with reliability, control planes, and long-running agent workflows.</p></li><li><p><strong>LLM &amp; Foundation Model Engineering</strong>: Focused on model training, quantization, inference, and the economics of deploying LLMs at scale. The pressure is on for latency, cost, and stability.</p></li><li><p><strong>Data Engineering &amp; ML Infrastructure</strong>: Where context, data quality, and operational pipelines determine whether agents succeed in the real world. The message: fix your data substrate before blaming the model.</p></li><li><p><strong>Applied AI &amp; Domain Solutions</strong>: Covering both intro skills and domain-specific applications, with a recurring question&#8212;how do we redesign human roles as agents take on more work?</p></li><li><p><strong>AI Strategy, Governance &amp; Workforce</strong>: Where technical capability meets organizational reality. The challenge: translating trust, policy, and risk into actionable, testable engineering practices.</p></li></ol><p>To visualize these patterns, I embedded and clustered the abstracts, comparing agent-based zones to unsupervised clusters. The overlap (and divergence) between the two was instructive&#8212;sometimes the language splits a zone, sometimes it merges them. The upshot? ODSC East 2026 felt like the year AI builder culture became systems culture, with the practical energy shifting from models to the joints between architecture, data, evaluation, and governance.</p><p>On a personal note, I pivoted my own workshop last-minute to use Marimo Pair for a more modern, inspectable workflow. The response floored me&#8212;standing room only, hallway feedback, and a clear signal that hands-on, reproducible workflows resonate with practitioners.</p><p>For the full breakdown, including the interactive notebook and all the gritty details, check out the original post: <a href="https://ericmjl.github.io/blog/2026/5/10/odsc-east-2026-zeitgeist/">ODSC East 2026 Zeitgeist</a>.</p><p>The real story at ODSC East 2026: AI is moving from isolated demos to robust, accountable systems&#8212;where architecture, data, and governance matter as much as models.</p><p>What patterns or shifts have you noticed in your own AI or data science communities lately? Do you see the same move toward systems thinking?</p><p><em>Curious about the full taxonomy, the clustering visuals, or my workshop lessons? Read the full post and let me know what resonates&#8212;or what you&#8217;d do differently: <a href="https://ericmjl.github.io/blog/2026/5/10/odsc-east-2026-zeitgeist/">ODSC East 2026 Zeitgeist</a>.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How I Recognized and Handled AI Burnout]]></title><description><![CDATA[Alternatively titled: How a week in London, ancient relics, and a capybara spirit animal helped me reset my relationship with AI.]]></description><link>https://dspn.substack.com/p/how-i-recognized-and-handled-ai-burnout</link><guid isPermaLink="false">https://dspn.substack.com/p/how-i-recognized-and-handled-ai-burnout</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 07 May 2026 11:02:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fo7q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fo7q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fo7q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 424w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 848w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fo7q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fo7q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 424w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 848w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!fo7q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F222b7bee-6ea1-4607-b1ec-ccefe15c89d7_1408x768.webp 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>Hello fellow datanistas!</p><p>Ever felt like AI is moving faster than you can keep up? For two weeks this spring, I found myself in a place I never expected: anxious, unmotivated, and completely burned out&#8212;decidedly un-capybara-like. If you&#8217;ve ever felt the same, you&#8217;re not alone.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/5/2/how-i-recognized-and-handled-ai-burnout/">This post</a> is a candid reflection on my own experience with AI-related burnout&#8212;what it looked like, how I recognized it, and the small but meaningful changes that helped me reset. My hope is that by sharing my story, you&#8217;ll find something useful for your own journey, whether you&#8217;re deep in the AI trenches or just feeling overwhelmed by the pace of change.</p><p>Let me be honest: I&#8217;m usually the calm, steady type&#8212;my work profile pic is literally a capybara. But for a couple of weeks in April, I was anything but. Anxiety crept in, and with it came a host of symptoms: racing heart, decision paralysis, and a total lack of motivation to tinker with AI or even get out of bed. Work was a blur of triple-booked meetings and operational headaches, while spring allergies made everything worse.</p><p>What finally helped? A week in London, planned by my wife, where I let go of decision-making and just followed along. Wandering through the British Museum and Science Museum, I was struck by the vastness of time&#8212;ancient relics and cosmic timelines put my own stress in perspective. I realized how compressed and frantic my work life had become, and how easy it is to lose sight of what really matters.</p><p>I also noticed how the pace of life in the UK was different&#8212;people actually take time to enjoy themselves. Walking everywhere, unplugging from work, and reconnecting with my family reminded me of the importance of presence. Watching my kids play, catching up with my brother, and even just playing retro games at a museum&#8212;all of it helped me reset.</p><p>Most importantly, I remembered that AI is just a tool. It&#8217;s tempting to squeeze every ounce of productivity from it, but at what cost? We&#8217;re human beings, not human doings. The real magic is in the mundane: daily walks, board games with family, and genuine connection with others. If you&#8217;re feeling burned out, maybe it&#8217;s time to slow down, touch grass, and remember what makes us human.</p><p>AI is a powerful tool, but it&#8217;s not worth sacrificing your well-being or relationships for. Slow down, reconnect with what matters, and remember: you&#8217;re indispensable because you&#8217;re human.</p><p>Have you ever experienced burnout&#8212;AI-related or otherwise? What helped you reset, or what are you still struggling with? I&#8217;d love to hear your story.</p><p><em>If this resonates, I invite you to read the full post for more details and practical tips: <a href="https://ericmjl.github.io/blog/2026/5/2/how-i-recognized-and-handled-ai-burnout/">How I Recognized and Handled AI Burnout</a>. Feel free to share with anyone who might need it.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Benchmarking LLMs with Marimo Pair: Lessons from a Real-World Data Science Experiment]]></title><description><![CDATA[Alternatively titled: How a hands-on benchmarking session with Marimo Pair revealed what really matters in LLM-powered data science.]]></description><link>https://dspn.substack.com/p/benchmarking-llms-with-marimo-pair</link><guid isPermaLink="false">https://dspn.substack.com/p/benchmarking-llms-with-marimo-pair</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 30 Apr 2026 11:01:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s4yM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s4yM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s4yM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s4yM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s4yM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!s4yM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a2b829e-1f8c-4857-8045-a9fa98f5cd07_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever wondered how different large language models (LLMs) actually perform when thrown into a real-world data science workflow? I recently put seven of them to the test using Marimo Pair, and the results were both enlightening and, at times, a little surprising.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I&#8217;ll walk you through my hands-on benchmarking experiment with Marimo Pair, where I evaluated seven LLMs on a practical data analysis task. My goal: to see which models could actually deliver usable, reproducible results&#8212;and what we can learn to improve our workflows (and our agents) going forward.</p><p>I&#8217;ve been following Marimo Pair since Trevor Manz demoed it to me back in March, and I was excited to finally put it through its paces. As someone who prefers to stay vendor-agnostic (I&#8217;m an OpenCode user, while Trevor codes almost exclusively with Claude Code), I wanted to see how Marimo Pair&#8217;s agent skill would fare across a range of LLMs.</p><p>To keep things fair, I set up a benchmarking repo, stripped out any potentially interfering skills, and crafted a single superprompt to guide each model through the same data analysis task: loading a real dataset from my Novartis days, plotting a heatmap, generating an UpSet plot, and writing a recommendation&#8212;all while following strict cell structure and markdown documentation requirements.</p><p>The models I tested:</p><ul><li><p>Claude Opus 4.6</p></li><li><p>Claude Sonnet 4.6</p></li><li><p>GLM-5.1</p></li><li><p>Kimi K2.5</p></li><li><p>Qwen 3 Coder Next</p></li><li><p>MiniMax M2.7</p></li><li><p>Gemma 4 31B</p></li></ul><p>I automated the whole process with OpenCode scripting, ran each model in parallel, and logged everything for later analysis. The results? Some models (Opus, Sonnet, GLM) sailed through, producing valid, well-documented notebooks. Others struggled with markdown, import handling, or even basic execution. Cost varied wildly&#8212;from $0.03 to $2.00 per run.</p><p>What stood out most was how small tweaks in instructions or skill design could dramatically improve outcomes. For example, adding explicit import isolation examples or a post-edit validation loop could help budget models like Kimi K2.5 close the gap with premium ones like Opus. And, as always, defining and measuring the right KPIs (not just generic metrics) was key to actionable insights.</p><p>If you&#8217;re interested in the nitty-gritty&#8212;cost breakdowns, error modes, and what each model got right (or hilariously wrong)&#8212;I&#8217;ve shared the full logs, chat transcripts, and notebooks in the <a href="https://ericmjl.github.io/blog/2026/4/8/benchmarking-llms-with-marimo-pair/">marimo-pair-benchmark repo</a>.</p><p>Systematic measurement and thoughtful experiment design are essential for evaluating LLMs in real-world data science tasks&#8212;vibe-based experimentation just won&#8217;t cut it.</p><p>Have you tried benchmarking LLMs or agents in your own workflows? What KPIs or metrics have you found most useful (or surprising)? I&#8217;d love to hear your stories and lessons learned.</p><p><em>Curious about the full experiment, including all the data and artifacts? Check out the detailed write-up and repo here: <a href="https://ericmjl.github.io/blog/2026/4/8/benchmarking-llms-with-marimo-pair/">Benchmarking LLMs with Marimo Pair</a>. If you found this helpful, consider sharing or subscribing for more hands-on data science experiments.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Calibration: Synchronizing Feedback Loops with Neural Throughput]]></title><description><![CDATA[Alternatively titled: The hidden cost of running faster than your brain can process.]]></description><link>https://dspn.substack.com/p/calibration-synchronizing-feedback</link><guid isPermaLink="false">https://dspn.substack.com/p/calibration-synchronizing-feedback</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 23 Apr 2026 11:03:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w6ZP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w6ZP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w6ZP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w6ZP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a416c639-eb23-4534-a142-6010de2be270_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w6ZP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!w6ZP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa416c639-eb23-4534-a142-6010de2be270_1792x1024.webp 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>Hello fellow datanistas!</p><p>Since the start of this year, I&#8217;ve been deep in the trenches of agentic coding&#8212;juggling multiple AI sessions, chasing breakthroughs, and, honestly, feeling more exhausted than ever. The tools are faster, the possibilities are wider, but something fundamental has shifted: my attention span is collapsing under the weight of parallel work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This post is about the subtle but critical shift in how AI tools have changed our productivity curve&#8212;and why calibrating our feedback loops to match our brain&#8217;s processing speed is now essential for sustainable work (and sanity).</p><p>I&#8217;ve noticed a pattern: as AI tools accelerate, the temptation to parallelize work grows. I find myself with five or six open pull requests, bouncing between Claude Code sessions, and feeling like I&#8217;m always one step behind. It&#8217;s not just me&#8212;recent discussions online (like the Reddit thread on &#8220;AI psychosis&#8221;) show a whole community wrestling with the same thing: the sense that if you stop, you&#8217;ll miss out, but if you keep going, you burn out.</p><p>The core issue? AI has steepened the productivity curve. Pre-AI, more effort meant more output, but at a manageable, sustainable pace. Now, the curve is taller and narrower: you get more output for less effort&#8212;until you hit a sharp drop-off, where exhaustion sets in fast.</p><p>The real bottleneck isn&#8217;t the tools; it&#8217;s our brains. AI can process and generate code at lightning speed, but our neural throughput&#8212;the rate at which we can actually process, reason, and act on feedback&#8212;remains stubbornly biological. When the loop cadence (the speed at which you open, process, and close tasks) exceeds what your brain can handle, attention bleeds out and exhaustion takes over.</p><p>So what do we do? Calibration. Not optimization&#8212;calibration. The goal is to synchronize your feedback loops with your neural throughput. That means:</p><ul><li><p>Closing the loop on one task before opening another (no more juggling endless sessions)</p></li><li><p>Using external systems (like Kanban boards) to manage context when multitasking is unavoidable</p></li><li><p>Recognizing the signal: when you start scanning multiple threads for &#8220;what was done,&#8221; you&#8217;ve exceeded your bandwidth</p></li></ul><p>It&#8217;s a daily discipline, not a one-time fix. The aim is to stay on the left slope of the productivity curve, where effort yields sustainable returns, rather than chasing the peak and tumbling off the edge.</p><p>AI tools have made it easier to do more, faster&#8212;but our brains are still the bottleneck. Sustainable productivity now depends on calibrating our work pace to match our neural capacity, not just pushing harder or faster.</p><p>Have you noticed your own attention span or energy shifting as you use more AI tools? What strategies (if any) have helped you avoid burnout or overwhelm?</p><p><em>If this resonates, I invite you to read the full post for a deeper dive&#8212;and let me know how you&#8217;re calibrating your own workflow. Here&#8217;s the link: <a href="https://ericmjl.github.io/blog/2026/4/4/calibration-is-synchronizing-feedback-loops-with-neural-throughput/">Calibration is Synchronizing Feedback Loops with Neural Throughput</a></em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Undoing AI Vibe-Coded Slop (With AI): Lessons from Refactoring canvas-chat]]></title><description><![CDATA[Alternatively titled: How battle-tested convictions (not just AI) saved my codebase.]]></description><link>https://dspn.substack.com/p/undoing-ai-vibe-coded-slop-with-ai</link><guid isPermaLink="false">https://dspn.substack.com/p/undoing-ai-vibe-coded-slop-with-ai</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 16 Apr 2026 11:01:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Uzu0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uzu0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uzu0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uzu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Uzu0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uzu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9354b3f-f881-423c-b297-41f8dfb81498_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever found yourself staring at a sprawling, AI-generated codebase and wondering, &#8220;How did it get this messy, this fast?&#8221; I have. And I want to share what it took to turn that chaos into something maintainable.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/29/undoing-ai-vibe-coded-slop-with-ai/">This post</a> is the story of how I built canvas-chat&#8212;a visual, non-linear chat interface&#8212;with heavy AI assistance, and how I wrangled an 8,500-line monolith into a clean, modular plugin system. More importantly, it&#8217;s about why AI can execute, but not architect, and why your own hard-won convictions matter more than ever.</p><p>Let me take you back to December 2025. I started canvas-chat with a flurry of AI-powered commits: sessions, matrix evaluation tables, web search, node tagging, BM25 keyword search. Features stacked up like Tetris blocks. The result? A functional, but tangled, 8,500-line app.js monolith. </p><p>The AI could add features, fix bugs, and split files when prompted. But it couldn&#8217;t see the latent architecture&#8212;the system that would make the whole thing maintainable. That vision had to come from me, shaped by years of seeing architectures both fail and succeed.</p><p>The first wave of refactoring was straightforward: extract pure functions, isolate feature modules, split out infrastructure. The AI handled these tasks well when directed. But the real leap came when I asked for a plugin system. Suddenly, we had a three-level architecture: custom node types, feature plugins, and extension hooks. The codebase became modular, testable, and ready for future changes&#8212;like swapping out the rendering layer for Svelte Flow.</p><p>But here&#8217;s the kicker: the AI didn&#8217;t suggest this architecture. It could implement, but not envision. The plugin system, the event hooks, the dependency injection&#8212;these came from my own battle-tested convictions, not from the AI&#8217;s suggestions. And when the AI started dropping curly braces and introducing regressions, it was the plugin architecture and a solid suite of E2E tests that kept things sane.</p><p>The numbers tell the story: from 8,500 lines in 5 files to 4,700 lines in 35+ modules. But the real lesson is about the limits of AI and the irreplaceable value of human experience.</p><p>AI can execute your vision, but it can&#8217;t create it. Battle-tested convictions&#8212;earned through experience&#8212;are what turn AI-generated chaos into maintainable systems.</p><p>Have you ever had to rescue a codebase (AI-generated or not) from architectural chaos? What hard-won lessons shaped your approach? I&#8217;d love to hear your stories.</p><p><em>If you&#8217;re curious about the full journey&#8212;including the technical details and architectural patterns&#8212;I invite you to read the full post here: <a href="https://ericmjl.github.io/blog/2026/3/29/undoing-ai-vibe-coded-slop-with-ai/">Undoing AI Vibe-Coded Slop (With AI)</a>. If you found this helpful, consider sharing or subscribing for more stories from the trenches.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Creative Mentorship: Growing as a Leader When Budgets Are Tight]]></title><description><![CDATA[Alternatively titled: How to keep growing as a mentor and leader&#8212;even when the budget is frozen.]]></description><link>https://dspn.substack.com/p/creative-mentorship-growing-as-a</link><guid isPermaLink="false">https://dspn.substack.com/p/creative-mentorship-growing-as-a</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 09 Apr 2026 11:02:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ISjf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ISjf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ISjf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ISjf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 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>Hello fellow datanistas!</p><p>Have you ever noticed that when the economy tightens, the first thing to go is often the budget for professional development? Co-ops get paused, training dries up, and suddenly, opportunities to grow as a mentor or leader seem out of reach. But what if the best opportunities are already within your grasp?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/25/creative-mentorship-strategies-for-career-growth-in-challenging-times/">This post</a> is about finding creative, practical ways to develop mentorship and leadership skills&#8212;even when formal programs and budgets disappear. I want to share what&#8217;s worked for me, and hopefully spark some ideas for you to keep growing and helping others, no matter the circumstances.</p><p>When budgets freeze, it&#8217;s easy to feel stuck. But I&#8217;ve learned that you don&#8217;t need a formal program or extra funding to make a real impact as a mentor or leader. In fact, some of the most meaningful growth happens when we get creative with what we already have.</p><p>Here&#8217;s what I&#8217;ve found: you always have three things to offer&#8212;your judgment, your skills, and your network. Judgment is the wisdom you&#8217;ve built up over time, knowing which tradeoffs matter and when to push or hold back. Your skills are the technical foundation you can share with others, helping them onboard or level up. And your network is a powerful tool for connecting people to opportunities, even if it&#8217;s just inviting someone to a meeting or making an introduction.</p><p>I&#8217;ve tried a handful of strategies at Novartis and Moderna that don&#8217;t require a budget, just a bit of initiative:</p><ul><li><p><strong>One-on-one coaching:</strong> Teaching others not only helps them, but also builds your reputation and value within the organization.</p></li><li><p><strong>Presenting at internal guilds or events:</strong> Sharing your knowledge in a group setting creates mentorship moments and helps you reach a wider audience.</p></li><li><p><strong>Organizing communities of practice:</strong> Even a simple group chat can become a hub for learning and leadership.</p></li><li><p><strong>Hosting informal coffee hours:</strong> These relaxed gatherings are great for authentic connection and sharing.</p></li><li><p><strong>Supporting external meetups:</strong> Sometimes, just offering a space or making an introduction can open doors for others.</p></li></ul><p>If you&#8217;re a manager, it&#8217;s worth recognizing and supporting these grassroots efforts. Growth isn&#8217;t just about climbing the ladder or chasing titles&#8212;it&#8217;s about helping others, sharing what you know, and building a culture of learning wherever you are.</p><p>You don&#8217;t need an internal university to foster growth. Sometimes, the best learning happens right in your own environment, with the people around you.</p><p>You don&#8217;t need a big budget or formal program to grow as a mentor or leader&#8212;your judgment, skills, and network are powerful tools for helping others and developing yourself, even in lean times.</p><p>What creative ways have you found to mentor or lead when resources are tight? I&#8217;d love to hear your stories or strategies.</p><p><em>If you found this helpful, check out the full blog post for more details and examples: <a href="https://ericmjl.github.io/blog/2026/3/25/creative-mentorship-strategies-for-career-growth-in-challenging-times/">Creative Mentorship Strategies for Career Growth in Challenging Times</a>. Feel free to share your own experiences or forward this to someone who might need a little inspiration.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Closing Air Gaps]]></title><description><![CDATA[Alternatively titled: Give unto robots what belongs to robots.]]></description><link>https://dspn.substack.com/p/closing-air-gaps</link><guid isPermaLink="false">https://dspn.substack.com/p/closing-air-gaps</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 02 Apr 2026 11:03:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ACLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ACLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ACLm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ACLm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever find yourself copying files, pasting data, or doing the same manual task over and over? I used to think these were just part of the job&#8212;until I learned to spot the &#8216;air gaps&#8217; that slow everything down.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/15/closing-air-gaps/">This post</a> is about recognizing and closing the manual bottlenecks&#8212;air gaps&#8212;in our workflows. By mapping out where humans are doing rote work that computers could handle, we can reclaim time, reduce errors, and free up our minds for more creative problems.</p><p>I first heard the term &#8216;air gap&#8217; from my colleague <a href="https://www.linkedin.com/in/wenhao-liu-1b85177/">Wenhao Liu</a>, and it immediately clicked. An air gap is any point in a process where a human has to step in and do something a computer could (and probably should) do. Think of it as a bubble in your workflow pipe&#8212;slowing things down, introducing errors, and taxing your attention.</p><p>Air gaps are everywhere: copying files from a lab machine to cloud storage, manually tracking your GitHub activity, or physically moving plates in a lab. Each one is a tiny tax on your time and focus. The real cost isn&#8217;t just the minutes lost, but the mental overhead of remembering and repeating these tasks.</p><p>The first step to closing air gaps is mapping your process. Walk through each step and ask: where am I copying, pasting, or following a fixed rule? Where am I waiting for someone else? Each answer points to a potential air gap. Once you see them, you can prioritize which ones to automate away.</p><p>I&#8217;ve closed air gaps in my own work&#8212;like automating GitHub activity tracking and file transfers in the lab. Sometimes the fix is a simple script; sometimes it&#8217;s a coding agent that can handle more complex tasks. The key is imagination (can you picture a better way?) and just enough technical skill to get started. And if your tools don&#8217;t have APIs, browser agents can often fill the gap.</p><p>The goal isn&#8217;t to eliminate humans from the loop, but to let us focus on creative, judgment-heavy work. Let robots handle the dull, dirty, and repetitive. The compounding effect of closing even small air gaps is huge&#8212;what feels like a minor efficiency today can transform your workflow tomorrow.</p><p>Map your processes, spot the air gaps, and close them one by one. The small wins add up to big changes over time.</p><p>What&#8217;s the most annoying manual task you still do at work? Have you tried mapping your process to find air gaps?</p><p><em>If you&#8217;re curious about how to spot and close air gaps in your own workflows, check out the full post for practical examples and steps: <a href="https://ericmjl.github.io/blog/2026/3/15/closing-air-gaps/">Read the full blog post</a>.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent Skills Are Also Human Skills]]></title><description><![CDATA[Alternatively titled: Why your agent skills are really documentation for humans, too.]]></description><link>https://dspn.substack.com/p/agent-skills-are-also-human-skills</link><guid isPermaLink="false">https://dspn.substack.com/p/agent-skills-are-also-human-skills</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 26 Mar 2026 11:01:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rMmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rMmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rMmD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rMmD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 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>Hello fellow datanistas!</p><p>Have you ever built an agent skill and realized it&#8217;s not just about the code? I&#8217;ve been thinking a lot about this as I tinker with agent skills at home and at work. There&#8217;s a subtle but important distinction between skills that just use tools, and skills that actually capture how we work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/14/agent-skills-are-also-human-skills/">This post</a> is about why workflow-specific agent skills are more than just automation&#8212;they&#8217;re a form of documentation for humans, too. I want to share how our personal systems and assumptions get baked into these skills, and why making those explicit matters for anyone who wants to use or share them.</p><p>Let me give you a concrete example. I have a daily sign-off skill that helps me wrap up my workday. It pulls my GitHub activity and formats it into my daily bullet journal in Obsidian. But here&#8217;s the thing: this skill assumes you have the GitHub CLI installed, that you do PRs as part of your work, and that you organize your notes in a monthly file&#8212;not a daily one. That last bit is pretty opinionated, but it&#8217;s how I work. </p><p>If you wanted to use my sign-off skill, you&#8217;d be adopting more than just the code. You&#8217;d be stepping into my way of working&#8212;my file structure, my tool preferences, my mental model for organizing information. The skill comes with all these implicit assumptions, and unless they&#8217;re documented, someone else might find it half-useful at best.</p><p>I call this the procedural context. Workflow-specific agent skills encode not just what to do, but how and why. They&#8217;re not just for the agent&#8212;they&#8217;re for the next human who wants to understand or reuse your workflow. Without documenting the dependencies, environment, and what success looks like, it&#8217;s hard for anyone (or any agent) to verify if the skill is working as intended.</p><p>At the end of the day, agent skills are automation and documentation rolled into one. But if you want your skills to be truly useful for others, you have to teach the next person how to use them, not just what buttons to press.</p><p>Agent skills are also human skills&#8212;they document not just what to automate, but how we work. If you want your skills to be useful for others, make the assumptions and context explicit.</p><p>Have you ever tried to use someone else&#8217;s workflow or automation and run into hidden assumptions? How do you document your own workflows for others (or your future self)?</p><p><em>If this resonates, check out the full post for more details and examples: <a href="https://ericmjl.github.io/blog/2026/3/14/agent-skills-are-also-human-skills/">Agent Skills Are Also Human Skills</a>. If you found it helpful, feel free to share or subscribe for more thoughts like this.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Two quick off-cycle announcements...]]></title><description><![CDATA[Data Driven Pharma East, and a very, very exciting job posting at Moderna]]></description><link>https://dspn.substack.com/p/two-quick-off-cycle-announcements</link><guid isPermaLink="false">https://dspn.substack.com/p/two-quick-off-cycle-announcements</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Mar 2026 12:18:33 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;d usually send these as P.S.-es at the end of my newsletter entries, but missed this morning&#8217;s by a hair. Sending it slightly off-cycle!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>#1: I&#8217;ll be at <a href="https://luma.com/ddpeast_2026?tk=PRmB2y">Data Driven Pharma East</a> giving an Inside the Stack talk in the morning where I&#8217;ll talk about &#8220;how to do agentic data science.&#8221; And later I&#8217;m moderating a discussion titled: Same Models, Different Stakes: GenAI in Discovery vs Development, along with <a href="https://www.linkedin.com/in/elizabethchoe/">Elizabeth Choe</a>. If you&#8217;re working hands-on in AI, data, or computational science in this space, this is a thoughtful, practitioner-heavy room. Hope to see some of you there!</p><p>#2: Exciting developments at Moderna in the AI space, we&#8217;re looking for someone at the Senior Principal level (same level as my current role, but non-managerial) to do AI Solutions Engineering. Role is <a href="https://modernatx.wd1.myworkdayjobs.com/en-US/M_tx/job/Senior-Principal-Enterprise-AI-Solution-Engineer_R18885-1">here</a>. This is an individual contributor role, expectation is to be hands-on, savvy with AI, great with people, processes, and technology, and to be a product-minded builder. If you&#8217;re selected, we&#8217;ll probably work very closely together!</p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[My Weekend Experiment: Bringing PyMC to the Browser (and Hitting the NUTS Wall)]]></title><description><![CDATA[Alternatively titled: How I tried (and almost succeeded) to run PyMC in the browser, and what I learned along the way.]]></description><link>https://dspn.substack.com/p/my-weekend-experiment-bringing-pymc</link><guid isPermaLink="false">https://dspn.substack.com/p/my-weekend-experiment-bringing-pymc</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Mar 2026 11:00:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8-5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8-5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8-5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8-5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 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>Hello fellow datanistas!</p><p>Have you ever tried to revive a magical demo from a few years ago, only to find that the tech landscape has quietly shifted beneath your feet? That was me this weekend, chasing the dream of running full Bayesian inference with PyMC&#8212;right in the browser, no servers, no installs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">This post</a> is about my hands-on journey to get PyMC running in the browser using Pyodide and WebAssembly. I&#8217;ll walk you through the technical hurdles, the code changes I made, and the lessons I learned about open-source contribution and the current limits of browser-based Bayesian inference.</p><p>It all started with a sense of nostalgia: I revisited PyMC Labs&#8217; 2022 blog post showing PyMC running entirely in the browser. The promise was huge&#8212;define models, run NUTS sampling, and visualize posteriors, all client-side. But when I tried the examples, nothing worked. The Python ecosystem had moved on, dependencies had shifted, and the Pyodide environment had changed.</p><p>So, I rolled up my sleeves and dove in. The main challenge? PyTensor, PyMC&#8217;s computational backend, needed to build for WebAssembly. That meant wrangling C and Cython extensions, Emscripten, and Pyodide&#8217;s build system. My key breakthrough was making Numba (PyTensor&#8217;s JIT compiler) an optional dependency for WASM builds&#8212;since Numba simply doesn&#8217;t exist for WebAssembly. This let PyTensor install, but at the cost of losing JIT compilation (and, heartbreakingly, the NUTS sampler).</p><p>I also experimented with a new Pixi-based dev environment for reproducible WASM builds, but ultimately, I realized that open-source contribution is about meeting maintainers where they are. My actual PR respected PyTensor&#8217;s existing mamba-based workflow, keeping changes minimal and maintainable.</p><p>The big letdown: NUTS (the gold-standard sampler) doesn&#8217;t work in WASM, and none of the modern MCMC backends (JAX, nutpie) have WASM support yet. It&#8217;s like getting a Ferrari with no keys&#8212;you can admire it, but you&#8217;re not going anywhere fast. Still, PyTensor now installs in WASM, PyMC can be imported, and simpler samplers might work for small models. The roadmap for full browser-based Bayesian inference is clearer, even if we&#8217;re not there yet.</p><p>If you want the nitty-gritty details, including code snippets and the full story, check out the original blog post: <a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">My Weekend Experiment: PyMC, WASM, and the Browser</a>.</p><p>Sometimes, the most valuable outcome of a technical experiment isn&#8217;t a working demo, but a deeper understanding of the ecosystem&#8212;and a clearer path for the next person to follow.</p><p>Have you ever tried to port a Python package to WebAssembly or run complex scientific code in the browser? What roadblocks did you hit, and how did you work around them?</p><p><em>If you&#8217;re curious about the technical details or want to see the code changes, read the full blog post <a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">here</a>. If you&#8217;ve tackled similar challenges, I&#8217;d love to hear your stories&#8212;reply or leave a comment!</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How I Built a Personal Knowledge System with Obsidian, AI, and Plain Text]]></title><description><![CDATA[Alternatively titled: How plain text, coding agents, and a little imagination transformed my work life.]]></description><link>https://dspn.substack.com/p/how-i-built-a-personal-knowledge</link><guid isPermaLink="false">https://dspn.substack.com/p/how-i-built-a-personal-knowledge</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 12 Mar 2026 11:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0s30!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0s30!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0s30!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!0s30!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0s30!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!0s30!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever feel like you&#8217;re drowning in meetings, projects, and random documents&#8212;and your brain just can&#8217;t keep up? I&#8217;ve been there. Managing twelve people across two teams, each juggling multiple projects, forced me to rethink how I handle information. What started as a simple experiment with Obsidian and plain text turned into a system that changed how I work (and think).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/6/mastering-personal-knowledge-management-with-obsidian-and-ai/">This post</a> is my honest, behind-the-scenes look at how I built a personal knowledge management (PKM) system using Obsidian, plain text, and AI coding agents. My hope is that sharing my process&#8212;warts and all&#8212;will inspire you to experiment with your own workflow, no matter your technical background.</p><p>When I first set out to improve my PKM at work, I faced a familiar dilemma: stick with the usual suspects (Confluence, OneNote), or try something new. I chose Obsidian and, more importantly, I chose plain text. At the time, it felt like a nerdy preference for graphs and open formats. In hindsight, it was a lucky break&#8212;plain text turned out to be the perfect foundation for integrating AI agents down the line.</p><p>My system revolves around a few core note types: monthly bullet journals, structured meeting notes, dossiers for people I work with, and project control towers. Everything is linked, everything is searchable, and&#8212;crucially&#8212;everything is in a format that both humans and AI can process.</p><p>Ingesting information used to be a slog. Now, AI skills handle the heavy lifting: parsing meeting transcripts, summarizing documents, and even extracting structure from messy Excel files. I&#8217;ve written Python scripts for everything from converting Word docs to plain text, to generating PowerPoint decks from Markdown. Each script declares its dependencies inline, so I never have to worry about environment issues or &#8216;works on my machine&#8217; headaches.</p><p>The real magic is in maintenance. When I hit a context block&#8212;forgetting a detail about a person or project&#8212;I trigger a sweep. My coding agent updates notes based on source material, always quoting the original. I stay in the loop for verification, but the system does most of the grunt work. Retrieval practice and periodic reviews keep the vault trustworthy.</p><p>Sharing is intentional. I curate what gets published, whether it&#8217;s to Confluence, GitHub, or Google Docs. The agent creates publishable versions, and I review before sharing. The workflow isn&#8217;t perfect (I still wish I could ingest cloud docs by URL), but it&#8217;s reduced my knowledge management overhead from 30-40% of my time to less than 10%.</p><p>If you&#8217;re curious about the technical details or want to try some of my agent skills, I&#8217;ve published a few (like html-presentations and gh-activity-summary). The bigger picture: this system lets me offload repetitive work to AI, freeing up time for deeper thinking and more meaningful interactions. It&#8217;s not a prescription&#8212;just an invitation to experiment and find what works for you.</p><p>For the full technical breakdown and scripts, check out the original blog post: <a href="https://ericmjl.github.io/blog/2026/3/6/mastering-personal-knowledge-management-with-obsidian-and-ai/">Mastering Personal Knowledge Management with Obsidian and AI</a>.</p><p>Plain text plus coding agents is a powerful, future-proof combo for managing knowledge at work. The best system is the one you actually use&#8212;and document.</p><p>How do you keep track of everything at work? Have you tried building your own PKM system, or are you still searching for something that fits? I&#8217;d love to hear what&#8217;s worked (or not) for you.</p><p><em>If you found this helpful, check out the full blog post for scripts, technical details, and more stories. And if you&#8217;re experimenting with your own PKM setup, hit reply&#8212;I&#8217;d love to swap notes!</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Speed With Control: How to Stay the Scientist with Coding Agents]]></title><description><![CDATA[Alternatively titled: How slowing down with coding agents actually speeds up your science.]]></description><link>https://dspn.substack.com/p/speed-with-control-how-to-stay-the</link><guid isPermaLink="false">https://dspn.substack.com/p/speed-with-control-how-to-stay-the</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 05 Mar 2026 12:02:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1bV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1bV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1bV_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1bV_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 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>Hello fellow datanistas!</p><p>Speed without control is just chaos. I&#8217;ve watched teammates compress weeks of analysis into hours with coding agents&#8212;only to end up with a pile of plots and no clear answers. The real unlock isn&#8217;t speed. It&#8217;s staying in the driver&#8217;s seat.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/2/13/agentic-eda/">This post</a> is about how I use structure and intentional slow-downs to keep coding agents from running wild, so I can actually do better science&#8212;not just generate artifacts faster. I&#8217;ll share the design patterns and session structures that keep me (and my team) in control, and why that matters more than ever.</p><p>Let&#8217;s be honest: coding agents are eager. Hand them a CSV and they&#8217;ll spit out a dozen plots before you&#8217;ve finished your coffee. It feels productive, but it&#8217;s easy to lose the thread. I&#8217;ve been there&#8212;reacting to whatever the agent produced, rather than steering toward an answer.</p><p>So I started doing things differently. I built two skills for my agents: one for exploratory data analysis (scientific-eda), one for machine learning experiments (ml-experimentation). The pattern is the same: slow down first, gate on plots, and structure the session so both human and agent can follow what happened.</p><p><strong>Slow down first: the Socratic opening</strong></p><p>Instead of jumping into code, the agent asks questions. What&#8217;s the problem context? What are you hoping to learn? Any constraints? There&#8217;s even a guardrail: &#8220;ask &#8216;why&#8217; before executing.&#8221; It feels slower, but it prevents wasted effort and rabbit holes.</p><p><strong>Gate everything on plots</strong></p><p>One plot at a time. If I can&#8217;t describe the x-axis, y-axis, and what I&#8217;m looking for, we don&#8217;t run the code. This forces clarity. The tradeoff? A bit of upfront thinking for a huge execution speedup&#8212;and far less wasted work.</p><p><strong>Session structure: traceable by design</strong></p><p>Each session lives in a timestamped folder: a journal.md for actions and findings, a plots/ directory for figures, and scripts/ for disposable code. The journal is the memory&#8212;timestamped, tagged, and scannable. Anyone (including future me) can follow the analysis without reading the code.</p><p><strong>What changed for my teammates and I</strong></p><p>The conversations shifted. We stopped defending code and started critiquing the analysis. The agent writes the code; we focus on the questions. It&#8217;s more collaborative, less ego-driven, and way more productive.</p><p>The key insight: design for the human, and the agent follows. Structure keeps you in control, and the agent becomes a force multiplier&#8212;not a loose cannon.</p><p>If you want to see the skills or the full breakdown, I&#8217;ve linked everything in the full post.</p><p>Speed is only valuable if you stay in control. Structure your agentic analysis to keep yourself in the driver&#8217;s seat&#8212;slow down, gate on plots, and leave a clear trace.</p><p>How do you keep your analysis focused when using coding agents? Have you found ways to stay in control, or do you sometimes feel like you&#8217;re just reacting to what the agent produces?</p><p><em>Curious about the full approach, including the skills and session templates? Read the full post here: <a href="https://ericmjl.github.io/blog/2026/2/13/agentic-eda/">Speed Without Control: How to Stay the Scientist with Coding Agents</a>. If you find it useful, feel free to share or subscribe for more practical data science insights.</em></p><p>Happy coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>Two P.S.-es :)</em></p><p><em>#1: quick plug for an open position with my wonderful colleague Mihir Metkar in the mRNA Design Team at Moderna, and that position will be in tight collaboration with my teammates in the DSAI Research team:</em></p><p><em>We&#8217;re hiring a Scientist, Platform &amp; Therapeutic Area Bioinformatics at Moderna (Cambridge, MA).</em></p><p><em>This role sits at the intersection of RNA biology, algorithm development, and machine learning. You&#8217;ll develop new optimization algorithms and ML approaches for therapeutic mRNA design, working closely with RNA biologists, NGS, and high-throughput screening teams.</em></p><p><em><strong><a href="https://lnkd.in/ev9P5SeE">https://lnkd.in/ev9P5SeE</a></strong></em></p><p><em>#2: my friend Hugo Bowne-Anderson is doing another cohort of his course, <a href="https://maven.com/hugo-stefan/building-ai-apps-ds-and-swe-from-first-principles?promoCode=friendsoferic">Building AI Applications for Data Scientists and Software Engineers</a>, on Maven. It&#8217;s a useful course if you&#8217;re interested in learning how to build the new wave of AI-native software for the future. 25% off with the code </em><code>friendsoferic</code><em>. While he&#8217;s offered a referral fee, I&#8217;ve asked for it to be donated to the SciPy Financial Aid fund instead.</em> </p>]]></content:encoded></item><item><title><![CDATA[Ten Lessons Learned from Agentic Data Science Experiments]]></title><description><![CDATA[Alternatively titled: How I learned to stop worrying and let the agent run my experiments.]]></description><link>https://dspn.substack.com/p/ten-lessons-learned-from-agentic</link><guid isPermaLink="false">https://dspn.substack.com/p/ten-lessons-learned-from-agentic</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 26 Feb 2026 12:01:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F4F2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F4F2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F4F2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F4F2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever wondered what happens when you let a coding agent loose on your data science workflow? I did too. After seeing the promise of agentic coding in software, I couldn&#8217;t help but ask: what if we applied the same principles to training machine learning models and answering scientific questions?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I share ten lessons I&#8217;ve learned from hands-on experiments with coding agents in data science&#8212;both at work and at home. My goal is to help you avoid my mistakes, leverage agents more effectively, and maybe even have a little more fun along the way.</p><p>Agentic coding isn&#8217;t just for software development. When I started experimenting with coding agents for data science, I quickly realized the parallels&#8212;and the pitfalls. Here are a few of the most important lessons I picked up:</p><ol><li><p><strong>Be prescriptive in your prompting.</strong> You need to know what you want and how you&#8217;ll evaluate it. In data science, that means framing hypotheses and iterating your way to answers, not just building features.</p></li><li><p><strong>Strong patterns in the file system.</strong> Agents (like humans) need predictable places for experiments. A clear folder structure helps the agent know where to put things and where to look.</p></li><li><p><strong>Put logging instructions in AGENTS.md.</strong> Logging is your agent&#8217;s window into what&#8217;s happening. Make sure your agent can introspect logs and learn from them.</p></li><li><p><strong>Give it report-writing skills.</strong> Ask your agent to summarize what it observed, flag anything weird, and help you triage without reading every log line.</p></li><li><p><strong>Keep an append-only journal.</strong> Both you and the agent should jot down observations. This running log becomes invaluable for understanding what happened and why.</p></li><li><p><strong>Have the agent generate diagnostic plots.</strong> Plots are for you, logs are for the agent. Both are needed to build intuition and catch issues.</p></li><li><p><strong>Instruct the agent to write the minimalist version first.</strong> Start small, debug fast, then scale up. The agent doesn&#8217;t get impatient&#8212;use that to your advantage.</p></li><li><p><strong>Ask the agent to guide you step by step.</strong> Let it walk you through what it&#8217;s done, especially when you&#8217;re context-switching or running low on energy.</p></li><li><p><strong>Learn the agent&#8217;s vocabulary.</strong> Pay attention to the terms it uses&#8212;you can reuse them for more precise prompts in the future.</p></li><li><p><strong>Treat the agent as an executor of your curiosity.</strong> You lead, it follows. Don&#8217;t let it run ahead; use it as a jazz partner for your exploration.</p></li></ol><p>These practices have helped me turn coding agents into true research partners, not just code generators. The full post dives into each lesson with stories and practical tips.</p><p>Treat coding agents as partners in your data science journey&#8212;set clear goals, structure your work, and use their strengths to amplify your own curiosity and expertise.</p><p>Have you tried using coding agents in your data science work? What lessons or surprises have you encountered along the way?</p><p><em>If you&#8217;re curious about the details (and want to see some real-world examples), check out the full post here: <a href="https://ericmjl.github.io/blog/2026/2/1/how-to-do-agentic-data-science/">How to do agentic data science</a>. If you found this helpful, please share it with a fellow datanista or subscribe for more hands-on insights.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Model Feel, Fast Tests, and Staying in Flow with AI Coding Agents]]></title><description><![CDATA[Alternatively titled: Why &#8216;feel&#8217; and feedback loops matter more than benchmarks when coding with AI.]]></description><link>https://dspn.substack.com/p/model-feel-fast-tests-and-staying</link><guid isPermaLink="false">https://dspn.substack.com/p/model-feel-fast-tests-and-staying</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Feb 2026 12:00:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J4ba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J4ba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J4ba!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J4ba!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 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>Hello fellow datanistas!</p><p>Most conversations about AI coding models obsess over benchmarks and pass rates. But if you spend real hours in the loop, you know: what actually shapes your day is the feel of working with the model, not just its numbers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">this post</a>, I dig into the qualitative side of using LLMs as coding agents&#8212;how their personality, feedback style, and the tools around them shape your flow, trust, and productivity. I&#8217;ll share what I&#8217;ve learned from bouncing between models, why the agentic harness matters as much as the model, and how I now pick my tools based on the phase of work, not just the leaderboard.</p><p>When you start using LLMs as coding agents, the experience quickly becomes about more than just accuracy or latency. It&#8217;s about how often you have to intervene, how much you trust the process, and whether you stay in flow or get derailed by weird breakage. </p><p>Two axes keep showing up for me: time horizon (long-horizon autonomy vs. short-horizon iteration) and personality/verbosity (how the model behaves when it&#8217;s wrong, how much it narrates, and whether it stays constructive or spirals into apology loops).</p><p>But there&#8217;s a third ingredient: the agentic harness. The tools and checks that let the agent verify its own work, and the feedback you get while it&#8217;s running. A good harness&#8212;one that gives you live traces and fast tests&#8212;often matters more than swapping models.</p><p>For example, when refactoring a big codebase, long-horizon models like Opus-4.5 or GPT-5.2 can generate plausible scaffolds, but they struggle with careful, incremental work. Short-horizon models (Sonnet, Minimax M 2.1, Composer-1) shine when you need to walk through changes step by step, watching traces and intervening early. </p><p>The real breakthrough for me wasn&#8217;t just picking the right model, but adding simple, fast tests (like Cypress reloads) to the harness. Suddenly, the agent could catch basic breakages immediately, and I could trust the loop again. </p><p>Personality matters too. Some models apologize endlessly when they mess up (looking at you, Gemini 2.5), while others stay upbeat and constructive. That <em>emotional texture</em> shapes the whole coding experience. Enthusiasm, it turns out, is a feature.</p><p>And don&#8217;t underestimate the illusion of speed: streaming feedback and live traces make the wait feel shorter and keep you in the loop. A spinner with no feedback? That&#8217;s a recipe for frustration, no matter how fast the model is on paper.</p><p>After enough hours, you start to build muscle memory for a model&#8217;s quirks. That comfort is sticky&#8212;and a subtle form of vendor lock-in. I try to stay fluent across models, so I don&#8217;t end up optimizing my workflow around one set of quirks and calling it productivity.</p><p>Now, I pick my tools based on the phase of work: long-horizon autonomy for scaffolding, short-horizon iteration for refactoring or debugging, and always, always improving the harness before blaming the model. Fast, agent-runnable tests have saved my sanity more than any leaderboard-topping model ever could.</p><p>If you want the full story, including concrete examples and code, check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">Model Feel, Fast Tests, and AI Coding That Stays in Flow</a>.</p><p>The feel of your AI coding agent&#8212;and the feedback harness around it&#8212;matters as much as raw model performance. Fast, agent-runnable tests and constructive feedback loops keep you in flow and make the whole system more trustworthy.</p><p>How do you choose between long-horizon autonomy and short-horizon iteration in your own coding workflows? Have you found a harness or feedback loop that changed the way you work with AI agents?</p><p><em>If this resonated, read <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">the full post</a> for more stories and code examples, and consider sharing your own experiences or subscribing for future deep dives.</em></p><p>Happy Coding,<br>Eric</p><p>P.S. My friend Zhaojie Zhang is hiring a Principal Scientist for Safety and Regulatory Data Insights! He&#8217;s an awesome guy to work with. Applications are <a href="https://beigene.wd5.myworkdayjobs.com/BeiGene/job/Remote-US/Principal-Scientist--Safety-and-Regulatory-Data-Insights_R33273">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent-Assisted Data Science Workshop]]></title><description><![CDATA[I am teaching a course to raise funds for the SciPy Financial Aid program. If you'd like to learn something and while giving something back, please join in!]]></description><link>https://dspn.substack.com/p/agent-assisted-data-science-workshop</link><guid isPermaLink="false">https://dspn.substack.com/p/agent-assisted-data-science-workshop</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Wed, 18 Feb 2026 13:02:02 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;m teaching a workshop on agentic data science, and all proceeds go to SciPy 2026.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The workshop is about how to use coding agents like Cursor, Claude Code, and OpenCode to compress what used to take weeks of work into a single day.</p><p>I&#8217;ve been using these techniques in my projects and with my teammates for the past year to compress experimental timelines from days to minutes.</p><p><strong>What you&#8217;ll learn:</strong></p><ul><li><p>Prescriptive prompting for experiments</p></li><li><p>Project structure for agents</p></li><li><p>Logging and verification strategies</p></li><li><p>Report writing with AI</p></li><li><p>Staying in control during EDA</p></li><li><p>The minimalist version first</p></li></ul><p>The techniques work across platforms. Whether you use Cursor, Claude Code, OpenCode, or something else, the patterns transfer.</p><p><strong>The details:</strong></p><ul><li><p>Date: March 27 and April 3, 2026</p></li><li><p>Time: 2:00-4:00 PM EST</p></li><li><p>Venue: Google Meet (calendar invite will be provided)</p></li><li><p>$1,000 minimum donation, paid directly to NumFOCUS (tax-deductible)</p></li><li><p>Spots: 40 available</p></li></ul><p>If you can&#8217;t attend live, video recordings will be available to all confirmed participants.</p><p>Basic Python and data science experience is assumed. No prior AI or LLM experience is required.</p><p><strong>How to sign up:</strong></p><ol><li><p>Reserve your spot at the workshop website</p></li><li><p>Donate at least $1,000</p></li><li><p>Submit your receipt to confirm</p></li></ol><p>Sign up: <a href="https://agent-assisted-data-science.vercel.app/">https://agent-assisted-data-science.vercel.app/</a> </p><p>(In case you were curious, I built that sign-up app with agent-assistance!)</p><p>SciPy has been a big part of my professional life. I&#8217;ve taught tutorials there, contributed to open-source packages in the ecosystem, and learned an enormous amount from the community. This workshop is my way of giving back.</p><p>If you&#8217;ve been curious about agentic data science but didn&#8217;t know where to start, this will give you techniques you can use the very next day.</p><p>Happy coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build Self-Improving Coding Agents, Part 3: Turning Memory and Skills into Practice]]></title><description><![CDATA[Alternatively titled: How Markdown, skills, and repo memory combine to make agents feel like teammates.]]></description><link>https://dspn.substack.com/p/how-to-build-self-improving-coding-c10</link><guid isPermaLink="false">https://dspn.substack.com/p/how-to-build-self-improving-coding-c10</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 12 Feb 2026 12:00:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fZLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fZLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fZLm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fZLm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever find yourself explaining the same thing to your coding agent over and over? I&#8217;ve been there. It&#8217;s a sign that something in your workflow wants to be systematized&#8212;and that&#8217;s where the real compounding value starts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I&#8217;m sharing how to move beyond ad hoc prompting and start building self-improving coding agents&#8212;by combining repository memory and reusable skills into a practice that actually evolves with you.</p><p>Let&#8217;s be honest: most of us start with agents by just typing prompts in chat, hoping for magic. But if you want your agent to become more than a chat box&#8212;if you want it to feel like a teammate&#8212;you need a system for memory and skills that grows over time.</p><p>Here&#8217;s the maturity model I&#8217;ve been using:</p><ul><li><p><strong>Stage 0: Ad hoc prompting</strong> &#8212; You keep re-explaining things. It works, but it doesn&#8217;t compound.</p></li><li><p><strong>Stage 1: Repo-local memory</strong> &#8212; Add AGENTS.md to capture repo-specific rules, navigation, and guardrails. Now your agent knows the lay of the land.</p></li><li><p><strong>Stage 2: Global personal skills</strong> &#8212; When a workflow repeats, promote it to a global skill. Tools like `skill-creator`, `openskills`, and `agents-md-improver` help you bootstrap this.</p></li><li><p><strong>Stage 3: Shared skills</strong> &#8212; If your team keeps repeating a workflow, promote it to a shared skill. But don&#8217;t start here&#8212;let pain guide your promotions.</p></li></ul><p>The trick is to watch what your agent does in practice. When it takes a weird path or misses something obvious, ask: is this a repo rule (AGENTS.md) or a repeatable procedure (skill)?</p><p>What&#8217;s wild is that Markdown is becoming executable. When your agent can run tool calls, a SKILL.md isn&#8217;t just documentation&#8212;it&#8217;s a playbook the agent can run: searches, edits, tests, you name it. The agent loads skills on demand, so you can write instructions at the level you actually think about them, and let the agent handle the clerical work.</p><p>The real meta skill here is metacognition: noticing what you do repeatedly, and deciding what should be systematized. That&#8217;s how you build a compounding loop&#8212;your agent handles more of the grunt work, and you get to focus on judgment and design.</p><p>This isn&#8217;t just about coding. Once your agent can run commands and manipulate files, the surface area expands to almost anything intellectual&#8212;writing, release notes, even structuring messy notes. The label &#8220;coding tool&#8221; is starting to feel more like marketing than reality.</p><p>The combination of repository memory and reusable skills turns your agent from a chat box into a true teammate&#8212;one that learns from your workflow and grows with you.</p><p>How are you currently using agents in your workflow? What&#8217;s the biggest pain point you wish you could automate or systematize?</p><p><em>If you want the full breakdown (including concrete tools and decision criteria), check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/19/how-to-build-self-improving-coding-agents-part-3/">How to Build Self-Improving Coding Agents: Part 3</a>. If you found this useful, feel free to share or subscribe for more.</em></p><p>Happy Coding,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build Self-Improving Coding Agents, Part 2: Skills as Playbooks]]></title><description><![CDATA[Alternatively titled: How I stopped re-explaining workflows and started building reusable playbooks for my coding agents]]></description><link>https://dspn.substack.com/p/how-to-build-self-improving-coding-53b</link><guid isPermaLink="false">https://dspn.substack.com/p/how-to-build-self-improving-coding-53b</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 05 Feb 2026 12:01:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hDMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hDMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hDMS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hDMS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 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>Hello fellow datanistas!</p><p>Ever find yourself explaining the same workflow to your coding agent over and over? I did, and it was draining my energy. So I started building skills&#8212;reusable playbooks that let my agents handle repetitive tasks without me having to spell things out every time.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I dig into the concept of &#8216;skills&#8217; for coding agents: what they are, how I use them, and why they&#8217;ve become essential in my workflow. If you&#8217;re tired of repeating yourself and want your agents to actually learn, this is for you.</p><p>Skills are the other half of the self-improving agent system&#8212;prompt compression in action. Instead of re-explaining a workflow, I want a playbook I can invoke. For me, a skill is just a folder with a SKILL.md file (the prompt) and any scripts or assets needed. A good skill makes three things explicit: when to use it, what steps to take, and what good output looks like.</p><p>Some examples from my own work:</p><ul><li><p>A GitHub debugging skill for CI failures, so the agent follows a repeatable process.</p></li><li><p>A release announcement skill, so I don&#8217;t spend half an hour composing messages for Teams every time.</p></li><li><p>A report-writing skill for ML model training sessions, using real logs and artifacts.</p></li><li><p>A domain expertise skill, where a teammate encoded her chromatography debugging process&#8212;making tacit knowledge explicit and reusable.</p></li></ul><p>What I like about skills is how easy they are to iterate on. I can feed my agent examples of what &#8220;good&#8221; looks like, and as my taste evolves, I update the skill. It&#8217;s a feedback loop: edit, improve, repeat. Skills are also reviewable and shareable&#8212;open a PR, get feedback, and everyone benefits.</p><p>Distribution is still a work in progress. Tools like OpenSkills are making it easier to install and update skills across machines and repos, but discovery isn&#8217;t standardized yet. Still, the direction is promising, and I expect things to converge soon.</p><p>With both memory (AGENTS.md) and skills (playbooks), the next question is: what do you invest in next? That&#8217;s what I&#8217;ll cover in Part 3.</p><p>Skills turn repetitive workflows into reusable playbooks for your coding agents, making them smarter and saving you time.</p><p>What&#8217;s one workflow you wish your coding agent could handle without you having to explain it every time? Have you tried building a skill for it?</p><p><em>If you want to see concrete examples and my full process, check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/18/how-to-build-self-improving-coding-agents-part-2/">How to build self-improving coding agents - Part 2</a>. If you find it useful, feel free to share or subscribe for updates.</em></p><p>Happy Coding,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building Tools for Thinking with AI]]></title><description><![CDATA[In which I go on a podcast!]]></description><link>https://dspn.substack.com/p/building-tools-for-thinking-with</link><guid isPermaLink="false">https://dspn.substack.com/p/building-tools-for-thinking-with</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Fri, 30 Jan 2026 03:09:07 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;ll be live streaming agentic coding with my friend Hugo Bowne-Anderson! Tuesday, 10 February, 8:00 pm-9:30 pm EST.</p><p>Link is <a href="https://luma.com/8m9yi31f?tk=K1eFBM">here</a>, would love to have everyone join in!</p><p>Cheers,<br>Eric</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>