<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>technical-debt on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/technical-debt/</link>
    <description>Recent content in technical-debt on S Anand</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 02 Aug 2025 06:32:33 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/technical-debt/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Vibe-coding is for unproduced, not production, code</title>
      <link>https://www.s-anand.net/blog/vibe-coding-is-for-unproduced-not-production-code/</link>
      <pubDate>Sat, 02 Aug 2025 06:26:18 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/vibe-coding-is-for-unproduced-not-production-code/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Vibe-coding is for unproduced, not production, code&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/Gemini_Generated_Image_klq1ckklq1ckklq1-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yesterday, I helped two people vibe-code solutions. Both were non-expert IT pros who can code but aren&amp;rsquo;t fluent.&lt;/p&gt;
&lt;p&gt;Person Alpha and I were on a call in the morning. Alpha needed to OCR PDF pages. I bragged, &amp;ldquo;Ten minutes. Let’s do it now!&amp;rdquo; But I was on a train with only my phone, so Alpha had to code. Vibe-coding was the only option.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Go to any chat engine and pick Claude Sonnet 4 as your model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: We have an internal chatbot that has Claude Sonnet 4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Type, &amp;ldquo;Write a Python program to accept a PDF filename and page number and extract it into output.pdf&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: Done. I&amp;rsquo;m not used to the CLI but can run it in PyCharm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: OK. Run it, but first, modify by saying, &amp;ldquo;Shorten code. Drop error handling.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: Done. (Runs the code, and it works!)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Great. Let&amp;rsquo;s do the next part. Paste the sample code for OCR from our team into the chatbot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: But our chatbot is limited to ~15K characters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: OK. Go to Claude.ai and paste the code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: Um… is that allowed? (Alpha&amp;rsquo;s colleague pitched in, saying &amp;ldquo;If it weren&amp;rsquo;t, it&amp;rsquo;ll be blocked. Also, the code isn&amp;rsquo;t sensitive, only data, so go ahead.&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Use this prompt: &amp;ldquo;Write a Python program to send output.pdf to an LLM for OCR. Use this code as reference.&amp;rdquo; Then &amp;ldquo;Shorten code. Drop error handling.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: (Runs the code, and it works!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All this happened during my commute plus a haloumi-cheese-wrap purchase. A very satisfying experience!&lt;/p&gt;
&lt;p&gt;That evening, Person Gamma and I were on a call. Gamma had a client meeting and needed an LLM image editing tool tailored. I tried the same approach.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Create a GitHub account, first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: I think I already have one. Let me log in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: I&amp;rsquo;ve given you maintainer access to the repo. You&amp;rsquo;ll get an email. Accept it. Then upload the images you want edited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: Done (with me guiding on what to click)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Now log into &lt;a href=&#34;https://jules.google.com/&#34;&gt;https://jules.google.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: Done&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: In Jules, select the repo and tell it what change you want.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: OK. &amp;ldquo;Use the JPG images uploaded as the samples&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;(Jules churns out it&amp;rsquo;s thinking)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Oh, wow! This is amazing! It&amp;rsquo;s actually thinking about the approach.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;(Jules is done in about 2 min)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;My god! This is going to make things so much easier!&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Now publish the branch, create a pull request on GitHub, and merge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: Done (with guidance).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me&lt;/strong&gt;: Now try something yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gamma&lt;/strong&gt;: OK. &amp;ldquo;Change the prompts to something more relevant that improves the brand image.&amp;rdquo; (merges the code, and it works!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yet another very satisfying experience. Gamma went on to make another change in my absence. Exactly the point: enable them to work without me.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;But isn&amp;rsquo;t &lt;a href=&#34;https://blog.val.town/vibe-code&#34;&gt;vibe code legacy code&lt;/a&gt;&lt;/strong&gt;? Reducing quality, increasing technical debt?&lt;/p&gt;
&lt;p&gt;Yes. Vibe-coding ships debt. But not all code is production code. Vibe coding can accelerate throw-away prototypes.&lt;/p&gt;
&lt;p&gt;More importantly, &lt;strong&gt;so many&lt;/strong&gt; ideas sit idle because devs lack time and non-devs lack skills. Vibe coding shrinks that effort. &lt;strong&gt;That&lt;/strong&gt; is what vibe-coding is &lt;strong&gt;really&lt;/strong&gt; for.&lt;/p&gt;
&lt;p&gt;Think Excel. Most Excel sheets are messy apps, yet Excel&amp;rsquo;s made more people productive than any language. In &lt;a href=&#34;https://www.cgl.ucsf.edu/Outreach/pc204/NoSilverBullet.html&#34;&gt;No Silver Bullet&lt;/a&gt;, Fred Brooks said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I believe the single most powerful software-productivity strategy for many organizations today is to equip the computer-naive intellectual workers who are on the firing line with personal computers and good generalized writing, drawing, file, and spreadsheet programs and then to turn them loose. The same strategy, carried out with generalized mathematical and statistical packages and some simple programming capabilities, will also work for hundreds of laboratory scientists.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is what vibe-coding enables. And more.&lt;/p&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/codex-jules-vibe-coding/</link>
      <pubDate>Sun, 22 Jun 2025 09:52:29 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/codex-jules-vibe-coding/</guid>
      <description>&lt;p&gt;I use Codex and Jules to code while I walk. I&amp;rsquo;ve merged several PRs without careful review. This added technical debt.&lt;/p&gt;
&lt;p&gt;This weekend, I spent four hours fixing the AI generated tests and code.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;What mistakes did it make?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inconsistency&lt;/strong&gt;. It flips between &lt;code&gt;execCommand(&amp;quot;copy&lt;/code&gt;&amp;quot;) and &lt;code&gt;clipboard.writeText&lt;/code&gt;(). It wavers on timeouts (50 ms vs 100 ms). It doesn&amp;rsquo;t always run/fix test cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Missed edge cases&lt;/strong&gt;. I switched &amp;lt;&lt;code&gt;div&lt;/code&gt;&amp;gt; to &amp;lt;&lt;code&gt;form&lt;/code&gt;&amp;gt;. My earlier code didn&amp;rsquo;t have a &lt;code&gt;type=&amp;quot;button&lt;/code&gt;&amp;quot;, so clicks reloaded the page. It missed that. It also left scripts as plain &amp;lt;&lt;code&gt;script&lt;/code&gt;&amp;gt; instead of &amp;lt;&lt;code&gt;script type=&amp;quot;module&lt;/code&gt;&amp;quot;&amp;gt; which was required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Limited experimentation&lt;/strong&gt;. My failed with a HTTP 404 because the &lt;code&gt;common&lt;/code&gt;/ directory wasn&amp;rsquo;t served. I added &lt;code&gt;console.log&lt;/code&gt;s to find this. Also, &lt;code&gt;happy-dom&lt;/code&gt; won&amp;rsquo;t handle multiple &lt;code&gt;export&lt;/code&gt;s instead of a single &lt;code&gt;export&lt;/code&gt; { &amp;hellip; }. I wrote code to verify this. Coding agents didn&amp;rsquo;t run such experiments.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;What can we do about it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Detailed coding rules&lt;/strong&gt;. E.g. &lt;em&gt;always&lt;/em&gt; run test cases and fix until they pass. Only use ESM. Always import from CDN via JSDelivr. That sort of thing.&lt;/p&gt;
&lt;p&gt;100% &lt;strong&gt;test coverage&lt;/strong&gt;. Ideally 100% of code and all usage scenarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Log everything&lt;/strong&gt;. My tests got a HTTP 404 because I was not serving the &lt;code&gt;common&lt;/code&gt;/ directory. LLMs couldn&amp;rsquo;t figure this out because it was not logged. Logging everything helps humans &lt;em&gt;and&lt;/em&gt; LLMs debug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wait&lt;/strong&gt;. LLMs and coding agents keep improving. A few months down the line, they&amp;rsquo;ll run more experiments themselves.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Was AI coding worth the effort&lt;/strong&gt;? Here, yes. The tools &lt;em&gt;worked&lt;/em&gt;. Codex saved me 90% effort. My code quality obsession reduced savings to ~70%. Still huge.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2025-06-22-codex-jules-vibe-coding-linkedin.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7342489647257632769&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/technical-debt-niyas-blog-post/</link>
      <pubDate>Thu, 22 Jul 2021 16:01:21 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/technical-debt-niyas-blog-post/</guid>
      <description>&lt;p&gt;Is your code built to last? Mohammed Niyas P shares a developer war story.&lt;/p&gt;
&lt;p&gt;His shortcut worked. It delivered working code. But 5 years later, when it failed, he didn&amp;rsquo;t expect he&amp;rsquo;d still be around to clean it up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gramener.com/developerwarstories/this-tech-debt-made-me-humble&#34;&gt;https://gramener.com/developerwarstories/this-tech-debt-made-me-humble&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Found this tale on technical debt interesting? Gramener is #hiring #developers for a technical lead role. See &lt;a href=&#34;https://gramener.com/job/?id=90520&#34;&gt;https://gramener.com/job/?id=90520&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nikhil Kabbin &amp;ndash; your story&amp;rsquo;s up next 😉&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A6824005443581485056&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
