<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Ninad Naik</title>
        <link>https://paragraph.com/@ninad-naik</link>
        <description>I'm deeply passionate about technology. I'm a budding investor and a current builder. </description>
        <lastBuildDate>Mon, 13 Jul 2026 10:38:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Ninad Naik</title>
            <url>https://storage.googleapis.com/papyrus_images/fd1ea19136f59e7db312d6d33bc96b28e56e77b186c3103f0835e3a3bd6675e0.png</url>
            <link>https://paragraph.com/@ninad-naik</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Coding with AI - Tips]]></title>
            <link>https://paragraph.com/@ninad-naik/coding-with-ai-tips</link>
            <guid>oZekZPuKt2bjgBe3tdMD</guid>
            <pubDate>Thu, 05 Sep 2024 16:19:48 GMT</pubDate>
            <description><![CDATA[Last week, I talked about our experience at @Mira_Network with coding with Claude and other programming tools, and several of you asked me for tips on using Claude more effectively. Here are a few approaches that have worked well for me. 👇🏽 Ask the model to propose a detailed plan before proceeding. Specifically, ask it to explain why the code (new or edits) is necessary, why it won’t cause regression to existing functionality, and to list all assumptions. This helps prevent the model from ...]]></description>
            <content:encoded><![CDATA[<p>Last week, I talked about our experience at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/Mira_Network">@Mira_Network</a> with coding with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://claude.ai/">Claude</a> and other programming tools, and several of you asked me for tips on using Claude more effectively. Here are a few approaches that have worked well for me. 👇🏽</p><p>Ask the model to propose a detailed plan before proceeding. Specifically, ask it to explain why the code (new or edits) is necessary, why it won’t cause regression to existing functionality, and to list all assumptions. This helps prevent the model from building on incorrect assumptions and helps you reduce the probability space of errors.</p><p>Remind it to constantly check its proposals against the Project Knowledge and to validate that the code it’s proposing won’t cause regressions. Keep Project Knowledge updated with the latest version of all files to ensure the model knows the current state of the program. This is less of an issue with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/cursor_ai">@cursor_ai</a> and such, but still worth keeping in mind.</p><p>To help maintain state on the program, create a plan.md file and a structure.md file. plan.md should contain a detailed plan for the program (as much as you can foresee) -- I co-develop this plan with the LLM. Ideally, this is a mix of functionality and hygiene. structure.md captures the file structure. Keep these updated in Project Knowledge and routinely remind the model to refer to these files.</p><p>Modularize early and often. Break the program into individual modules with clean interfaces. This helps minimize context length and ensures that regressions and bugs are easier to isolate and remedy.</p><p>Regularly ask the model to critique the code, and reflect on what’s going well and what isn’t. This helps identify and correct issues faster.</p><p>Always ask for the full code of the method that needs to change, rather than just delta snippets, to reduce the risk of unnecessary regressions from copy-paste errors (less of an issue with @cursor_ai). This eats up more context and you&apos;ll run out of the chats faster, but it will save you a LOT of time debugging later.</p><p>When fixing bugs, ask the model for its hypothesis and what additional information it needs to validate the hypothesis. Ask whether it needs to clarify anything and help it acquire that information. Often, the model will proceed with incomplete information and take you down the wrong path so your number one job is to help it eliminate bad paths.</p><p>Focus on building a stable program rather than passing test cases. Sometimes the model might pass a test case but introduce regressions in the process. You must actively remind it that passing a test case is not the ultimate goal (unless that is the case for you). AI will always chase some objective function -- you have to define the objective function.</p><p>Frequently update doc strings and documentation, even though this can be tedious. It is crucial for maintaining clarity. Speaking of documentation, it is helpful to maintain a robust README file; this helps you and the model get grounded on the program faster. Alternatively, instruct the model to add documentation every time.</p><pre data-type="codeBlock" text="Include documentation such as doc strings. 
"><code>Include documentation such <span class="hljs-keyword">as</span> doc strings. 
</code></pre><p>A simple heuristic that has worked well for me is to compare the length of the updated file with the length of the previous version of the line. *Usually* if the file&apos;s length changes by more than 5-7 lines, it is because the model inadvertently removed a method or some functionality. Here’s the specific instruction that works for me; it results in the model comparing file length and explaining why the the length differs; resulting in fewer regressions.</p><pre data-type="codeBlock" text="After writing the code, do a check on file length (lines) and compare it to the current length of the file in Project Knowledge. If the file length varies by more than 5 lines, then check to make sure that you have not caused a regression.
"><code>After writing the code, <span class="hljs-keyword">do</span> a check <span class="hljs-keyword">on</span> file length (lines) <span class="hljs-built_in">and</span> <span class="hljs-keyword">compare</span> it <span class="hljs-keyword">to</span> the current length <span class="hljs-keyword">of</span> the file <span class="hljs-keyword">in</span> Project Knowledge. <span class="hljs-keyword">If</span> the file length varies <span class="hljs-keyword">by</span> more than <span class="hljs-number">5</span> lines, <span class="hljs-keyword">then</span> check <span class="hljs-keyword">to</span> make sure that you have <span class="hljs-built_in">not</span> caused a regression.
</code></pre><p>Lastly, regularly back up your code. LLMs can build on top of mistakes, so having the ability to revert to previous versions is essential.</p><p>Happy coding!</p>]]></content:encoded>
            <author>ninad-naik@newsletter.paragraph.com (Ninad Naik)</author>
        </item>
        <item>
            <title><![CDATA[Coding with AI]]></title>
            <link>https://paragraph.com/@ninad-naik/coding-with-ai</link>
            <guid>AxbAC9Eb3SlUS3uoeox2</guid>
            <pubDate>Fri, 30 Aug 2024 17:16:58 GMT</pubDate>
            <description><![CDATA[Claude 3.5 Sonnet has been quite transformative for me as someone who deeply understands software systems and concepts but has always struggled with the actual coding. For years, I’ve managed large engineering teams and worked across various tech domains, but my limited coding ability has been a constant frustration. Relying on others to execute my ideas has often felt like a bottleneck. When GPT-3.5 and GPT-4 were introduced, I was hopeful that these models would bridge the gap. They did hel...]]></description>
            <content:encoded><![CDATA[<p>Claude 3.5 Sonnet has been quite transformative for me as someone who deeply understands software systems and concepts but has always struggled with the actual coding. For years, I’ve managed large engineering teams and worked across various tech domains, but my limited coding ability has been a constant frustration. Relying on others to execute my ideas has often felt like a bottleneck. When GPT-3.5 and GPT-4 were introduced, I was hopeful that these models would bridge the gap. They did help me build some interesting programs, like fetching stock prices and calculating moving averages, but I quickly encountered limitations. The models often focused too narrowly on the current file without considering the broader impact on other files, leading to a frustrating cycle of fixing one thing and breaking another.</p><p>Enter Claude Sonnet 3.5, and with it, Project Knowledge, which together have been a game changer. With Claude 3.5, the model now maintains much better state information across a project. By leveraging a chain-of-thought approach, I can ask the model to map out the best path forward on complex changes before it even touches the code. This has been revolutionary. I’ve been able to write the core components of a key new business idea using just Claude, and I’ve done it in a matter of days. The competence level of Claude now feels like working with a college senior—a huge leap forward.</p><p>However, Claude isn’t perfect (i.e. not yet a Principal Engineer), and it’s clear what’s missing: real-time, updated state information. When you upload files to Project Knowledge and start making changes, Claude doesn’t always account for the evolving state of the program within a session, even if you prompt it to. For example, say you need to make changes that require updates to multiple scripts. By the time you’ve modified two of them, the overall state of the program has changed, and you might need to consider recursion or other complexities.</p><p>My workaround has been to constantly upload newly updated scripts to the chat, but this is tedious and far from an ideal solution. The excitement around tools such as Cursor or Github Copilot appears to be around the integrations with models and “comfort features” such as identifying diffs and inserting code into the right places (a huge win, by the way), but I don’t think these are the killer feature. The killer feature, in my view, is maintaining real-time state and a built-in virtual environment that allows the model to auto-test multiple possible solutions and find the most performant one.</p><p>This is where the industry is headed, but it won’t be easy; there are significant challenges ahead. One of the biggest challenges is that the user needs to be extremely prescriptive with what s/he wants. Fun demos are relatively easy to code, but anything that needs to make money is necessarily complex or nuanced. Describing these needs in detail will become a must-have skill, a leg up for product managers (hello, PRDs!).</p><p>Another challenge is that LLMs struggle with second-order effects. I’ve noticed that even the best models tend to play Jenga with the code, and simplicity is usually not the name of the game. They are often in “apply bandaid” mode, and as a result, a lot of the code ends up working, but it’s unnecessarily complicated. This is somewhat akin to what you’d expect from a recent college graduate—functional but not elegant.</p><p>Despite these challenges, this future is becoming more realistic, and it’s going to be worth a lot of money. This technology makes everyone a programmer. It enables people with ideas to bring those ideas to life without needing deep technical expertise, unlocking tremendous value. The path forward for Claude, OpenAI, and others is clear, and I suspect we’re about to enter an arms race among companies like Anthrophic, OpenAI, Cursor, Microsoft/Github and others to build the FSD equivalent of coding.</p><p>These are exciting times!</p>]]></content:encoded>
            <author>ninad-naik@newsletter.paragraph.com (Ninad Naik)</author>
        </item>
    </channel>
</rss>