<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhammad Adnan R</title>
    <description>The latest articles on DEV Community by Muhammad Adnan R (@madnanrizqu).</description>
    <link>https://dev.to/madnanrizqu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2914450%2F6e98647a-a248-4a16-b9b0-8274a88edc8c.jpg</url>
      <title>DEV Community: Muhammad Adnan R</title>
      <link>https://dev.to/madnanrizqu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madnanrizqu"/>
    <language>en</language>
    <item>
      <title>Navigating Complex Decisions: Criteria &amp; Evaluation Table</title>
      <dc:creator>Muhammad Adnan R</dc:creator>
      <pubDate>Sat, 28 Jun 2025 10:44:58 +0000</pubDate>
      <link>https://dev.to/madnanrizqu/navigating-complex-decisions-criteria-evaluation-table-2d5e</link>
      <guid>https://dev.to/madnanrizqu/navigating-complex-decisions-criteria-evaluation-table-2d5e</guid>
      <description>&lt;h2&gt;
  
  
  Complex Decisions are Hard 🧠
&lt;/h2&gt;

&lt;p&gt;Making complex decisions without clear-cut answers is challenging for all of us. When facing multiple options with competing priorities, it's easy to get overwhelmed by analysis paralysis. I wanted to share a practical approach that's helped me tremendously in these situations.&lt;/p&gt;

&lt;p&gt;That approach is the Criteria and Evaluation Table, as described in Ken Watanabe's book "Problem Solving 101." Rather than relying on gut feelings alone, this method brings clarity through structured comparison of options against weighted criteria that matter most to your specific situation. I've found this framework transforms seemingly subjective decisions into objective analyses with clear rationales.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Software Engineer Example 🧑‍💻
&lt;/h2&gt;

&lt;p&gt;Let's say we're picking a database for an e-commerce project. From the Complete Intro to Databases course by Brian Holt, the key factors to consider are:&lt;/p&gt;

&lt;p&gt;1) Data model alignment&lt;br&gt;
2) Read/write patterns&lt;br&gt;
3) Developer familiarity&lt;br&gt;
4) Driver quality&lt;br&gt;
5) Total operational costs&lt;br&gt;
6) Proven technology ("boring factor")&lt;/p&gt;

&lt;p&gt;Now, let's consider our specific requirements for a hypothetical e-commerce application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High volume of product catalog data&lt;/li&gt;
&lt;li&gt;Complex customer order history&lt;/li&gt;
&lt;li&gt;Needs good search capabilities&lt;/li&gt;
&lt;li&gt;Development team with primarily SQL background&lt;/li&gt;
&lt;li&gt;Limited DevOps resources&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ DISCLAIMER&lt;/strong&gt;&lt;br&gt;
This example is generated with help of Claude Sonnet 3.7 Thinking, please double check the correctness of it. The focus on this article is to show how to use Criteria and Evaluation Table, not to teach how to pick databases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Afterwords, let's the weights for each decision factor based on the specific e-commerce requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Paradigm (0.25)&lt;/strong&gt; - Highest weight because the data model fundamentally determines how well we can handle high-volume product catalogs, complex order histories, and search capabilities required by our e-commerce application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer Familiarity (0.20)&lt;/strong&gt; - Significant weight as our team's SQL background makes technology alignment crucial for productivity, faster development cycles, and minimizing strain on limited DevOps resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read/Write Patterns (0.20)&lt;/strong&gt; - Equal importance to familiarity as e-commerce applications need optimized read performance for browsing/searching while maintaining reliable write operations for order processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational Costs (0.15)&lt;/strong&gt; - Moderate weight because our limited DevOps resources necessitate operational simplicity, though this factor ranks below core technical fit considerations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Boring Factor (0.15)&lt;/strong&gt; - Equal to driver quality because proven technology reduces unexpected issues and ensures stability with our limited DevOps resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Driver Quality (0.05)&lt;/strong&gt; - Lower weight as most established databases offer acceptable integration options with minimal day-to-day operational impact after initial implementation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Database Type&lt;/th&gt;
&lt;th&gt;Data Paradigm (0.25)&lt;/th&gt;
&lt;th&gt;Read/Write (0.20)&lt;/th&gt;
&lt;th&gt;Dev Familiarity (0.20)&lt;/th&gt;
&lt;th&gt;Driver Quality (0.05)&lt;/th&gt;
&lt;th&gt;Ops Cost (0.15)&lt;/th&gt;
&lt;th&gt;Boring Factor (0.15)&lt;/th&gt;
&lt;th&gt;Total Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;4 (1.0)&lt;/td&gt;
&lt;td&gt;3 (0.6)&lt;/td&gt;
&lt;td&gt;5 (1.0)&lt;/td&gt;
&lt;td&gt;5 (0.25)&lt;/td&gt;
&lt;td&gt;3 (0.45)&lt;/td&gt;
&lt;td&gt;5 (0.75)&lt;/td&gt;
&lt;td&gt;4.05/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;3 (0.75)&lt;/td&gt;
&lt;td&gt;4 (0.8)&lt;/td&gt;
&lt;td&gt;2 (0.4)&lt;/td&gt;
&lt;td&gt;4 (0.2)&lt;/td&gt;
&lt;td&gt;3 (0.45)&lt;/td&gt;
&lt;td&gt;4 (0.6)&lt;/td&gt;
&lt;td&gt;3.20/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;4 (1.0)&lt;/td&gt;
&lt;td&gt;3 (0.6)&lt;/td&gt;
&lt;td&gt;5 (1.0)&lt;/td&gt;
&lt;td&gt;5 (0.25)&lt;/td&gt;
&lt;td&gt;4 (0.6)&lt;/td&gt;
&lt;td&gt;5 (0.75)&lt;/td&gt;
&lt;td&gt;4.20/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;2 (0.5)&lt;/td&gt;
&lt;td&gt;5 (1.0)&lt;/td&gt;
&lt;td&gt;1 (0.2)&lt;/td&gt;
&lt;td&gt;3 (0.15)&lt;/td&gt;
&lt;td&gt;2 (0.3)&lt;/td&gt;
&lt;td&gt;3 (0.45)&lt;/td&gt;
&lt;td&gt;2.60/5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lets breakdown the table:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;MySQL scores highest overall (4.20/5):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong in the data paradigm (relational data fits well)&lt;/li&gt;
&lt;li&gt;Excellent developer familiarity (team knows SQL)&lt;/li&gt;
&lt;li&gt;Lower operational costs than PostgreSQL&lt;/li&gt;
&lt;li&gt;Very "boring" (stable, proven technology)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PostgreSQL comes in second (4.05/5):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nearly identical strengths to MySQL&lt;/li&gt;
&lt;li&gt;Slightly higher operational costs&lt;/li&gt;
&lt;li&gt;Better for complex queries and advanced features&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MongoDB scores moderately (3.20/5):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better for write-heavy operations&lt;/li&gt;
&lt;li&gt;Lower developer familiarity (team would need training)&lt;/li&gt;
&lt;li&gt;Document model is less optimal for the relational aspects&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DynamoDB scores lowest (2.60/5):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent for write-heavy operations&lt;/li&gt;
&lt;li&gt;Very poor developer familiarity&lt;/li&gt;
&lt;li&gt;Higher operational complexity&lt;/li&gt;
&lt;li&gt;Less suitable for the complex relational data needs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Based on this analysis, MySQL would be the recommended choice for this specific project, with PostgreSQL as a close alternative if advanced features become more important.&lt;/p&gt;

&lt;p&gt;As you can see using a Criteria and Evaluation Table really helps on making a hard decision more navigable, it helps us decide based on factors that are important for us. &lt;/p&gt;

&lt;p&gt;Furthermore, the table can be used to explain &amp;amp; justify your decision to others. Making everybody more willing to agree and support the decision. &lt;/p&gt;

&lt;p&gt;What complex decisions have you faced recently? Have you tried a structured approach like this? Let me know in the comments below&lt;/p&gt;

&lt;p&gt;See you in the next one 👋&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>database</category>
    </item>
    <item>
      <title>How to Get Free Unlimited Premium LLM Access?</title>
      <dc:creator>Muhammad Adnan R</dc:creator>
      <pubDate>Sat, 21 Jun 2025 13:12:32 +0000</pubDate>
      <link>https://dev.to/madnanrizqu/how-to-get-free-unlimited-llm-access-5bom</link>
      <guid>https://dev.to/madnanrizqu/how-to-get-free-unlimited-llm-access-5bom</guid>
      <description>&lt;p&gt;What if I told you there's a way to get free unlimited access to a powerful LLM? All you need is an active university email indicating a student status.&lt;/p&gt;

&lt;p&gt;I've been using this for a while now, and it has been a game-changer for my productivity. I can use it in the UI, in my IDE, and even in the terminal!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benefit: UI + IDE + Terminal
&lt;/h2&gt;

&lt;p&gt;Having access to an LLM in all these environments is incredibly powerful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;UI:&lt;/strong&gt; The web interface is great for general-purpose questions and brainstorming. You can access it through the &lt;a href="https://github.com/copilot" rel="noopener noreferrer"&gt;website&lt;/a&gt; or Github mobile app.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;IDE:&lt;/strong&gt; In the IDE, it can help you write code, debug, and even write tests. I've used Github Copilot on VsCode and Zed Editor. It all is integrated nicely&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Terminal:&lt;/strong&gt; In the terminal, it can help you with shell commands and scripts. You can use the &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/using-github-copilot-in-the-command-line" rel="noopener noreferrer"&gt;Gihtub CLI with Copilot&lt;/a&gt; extensions to explain and suggest terminal commands. It really helps to reduce context switching when LLM is needed in the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This multi-faceted access has been a huge productivity booster for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The LLMs that is available
&lt;/h2&gt;

&lt;p&gt;With GitHub Copilot, you get access to a variety of powerful Large Language Models (LLMs). These models are constantly being updated as newer and more capable versions become available. Here are some of the models that you might have access to:&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast and cost-efficient
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  GPT-4.1&lt;/li&gt;
&lt;li&gt;  GPT-4o&lt;/li&gt;
&lt;li&gt;  o3-mini&lt;/li&gt;
&lt;li&gt;  Gemini 2.0 Flash&lt;/li&gt;
&lt;li&gt;  o4-mini (Preview)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Versatile and highly intelligent
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Claude Sonnet 3.5&lt;/li&gt;
&lt;li&gt;  Claude Sonnet 3.7&lt;/li&gt;
&lt;li&gt;  Claude Sonnet 4 (Preview)&lt;/li&gt;
&lt;li&gt;  Gemini 2.5 Pro (Preview)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Most powerful at complex tasks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  o1 (Preview)&lt;/li&gt;
&lt;li&gt;  Claude Sonnet 3.7 Thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's worth noting that the list of available models is subject to change as the platform evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GitHub Education?
&lt;/h2&gt;

&lt;p&gt;The magic behind this is the &lt;a href="https://education.github.com/pack" rel="noopener noreferrer"&gt;GitHub Student Developer Pack&lt;/a&gt;. It's a collection of free developer tools and resources for students. It includes a lot of great stuff, but the highlight for me is the free access to GitHub Copilot through the free Github Pro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9drasyscp1kswir04606.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9drasyscp1kswir04606.jpeg" alt="Github pro free plan for students" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see you get a lot with Github pro! Heres what i want to highlight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Unlimited code completions with any models&lt;/li&gt;
&lt;li&gt;✅ 300 request chat interactions with top-tier models from GPT,  Claude, and Gemini.&lt;/li&gt;
&lt;li&gt;✅ Unlimited chat interactions with other models from GPT,  Claude, and Gemini.&lt;/li&gt;
&lt;li&gt;✅ Access to the LLMs in all IDEs supporting Github Copilot, not only Vs Code.&lt;/li&gt;
&lt;li&gt;✅ Tons of other freebies like hosting credits and premium subscriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Access
&lt;/h2&gt;

&lt;p&gt;Getting access is pretty straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to the &lt;a href="https://education.github.com/" rel="noopener noreferrer"&gt;GitHub Education&lt;/a&gt; website.&lt;/li&gt;
&lt;li&gt; Click on "Sign up for Student Developer Pack".&lt;/li&gt;
&lt;li&gt; Verify your student status. You'll need to provide some proof, like a student ID or a school-issued email address.&lt;/li&gt;
&lt;li&gt; Once you're verified, you'll get access to the pack and all its benefits, including GitHub Copilot.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;That's it! I hope this was helpful. If you're a student, I highly recommend you take advantage of this offer. Besides the Github Copilot access, you can also get lots of other premium freebies like premium subscriptions, hosting credits, free IDE and others.&lt;/p&gt;

&lt;p&gt;My only regret on using free Github Copilot is thinking i'd need to pay subscription later when my student days are over 😅&lt;/p&gt;

&lt;p&gt;Have you used the GitHub Student Developer Pack before? Am I missing any other way to maximize productivity with Copilot? Let me know in the comments below!&lt;/p&gt;

&lt;p&gt;See you in the next one 👋&lt;/p&gt;

</description>
      <category>llm</category>
      <category>github</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Why How: 75% LLM Success Rate for Understanding Codebase</title>
      <dc:creator>Muhammad Adnan R</dc:creator>
      <pubDate>Sat, 15 Mar 2025 14:02:15 +0000</pubDate>
      <link>https://dev.to/madnanrizqu/why-how-75-llm-success-rate-for-understanding-codebase-1gl9</link>
      <guid>https://dev.to/madnanrizqu/why-how-75-llm-success-rate-for-understanding-codebase-1gl9</guid>
      <description>&lt;p&gt;How would latest reasoning LLM fare in understanding complex open source project? 🤔&lt;/p&gt;

&lt;p&gt;Lets go back a bit with some motivation...&lt;/p&gt;

&lt;p&gt;I needed to learn Next.js 15 for an upcoming project at my company. Reading documentation plus learning the official course alone didn't seem sufficient, yet taking another full course felt like overkill for me at this stage.&lt;/p&gt;

&lt;p&gt;I thought, what better way to augment theory than with real-world application by studying an open source project? After some research, I discovered this codebase: &lt;a href="https://github.com/ethanniser/NextFaster" rel="noopener noreferrer"&gt;https://github.com/ethanniser/NextFaster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This codebase is particularly interesting because it's officially supported by Vercel and claims to implement all best practices for optimal web performance in Next.js 15. ⚡&lt;/p&gt;

&lt;p&gt;The codebase is deployed in the Vercel platform with some impressive stats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~1 million page views&lt;/li&gt;
&lt;li&gt;~1 million unique product pages&lt;/li&gt;
&lt;li&gt;45k unique users&lt;/li&gt;
&lt;li&gt;100 perfect Google Lighthouse scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It seemed perfect for learning how to properly utilize Next.js 15 features for enhanced performance. &lt;/p&gt;

&lt;p&gt;Then my lazy mind had an idea: Why not leverage LLMs for this task? 🧪&lt;/p&gt;

&lt;p&gt;Unsurprisingly, the LLM performed quite well! However, it did provide some surprising answers... The LLM answered 6 out of 8 questions correctly, while providing misleading or incomplete responses to the others. 📊&lt;/p&gt;

&lt;p&gt;I used both Claude 3.7 Reasoning in conjunction with GitHub Copilot Chat in my IDE. Copilot Chat acts as a tooling layer, providing the codebase to the chat's context. This allowed the LLM to get the context of the codebase more comprehensively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdevs2g1wnwih6projh3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdevs2g1wnwih6projh3d.png" alt="Copilot Chat + Claude 3.7 Reasoning" width="800" height="1164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It would be interesting to replicate this experiment with other AI tools and LLMs.&lt;/p&gt;

&lt;p&gt;Here are the questions I asked to understand the NextFaster:&lt;/p&gt;

&lt;h2&gt;
  
  
  What Next.js technologies is this codebase using? ✅
&lt;/h2&gt;

&lt;p&gt;The LLM provided a useful summary of the Next.js-specific features and technologies used in the codebase. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/1_next_js_technologies_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/1_next_js_technologies_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What project structure is this codebase using? ✅
&lt;/h2&gt;

&lt;p&gt;I feel it mostly hit the mark, explaining all directories within the project. However, it didn't delve deeply into each directory or attempt to understand the subdirectories. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/2_project_structure_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/2_project_structure_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What rendering strategy is this codebase using? ✅
&lt;/h2&gt;

&lt;p&gt;The response was quite good! I was surprised that it examined multiple sources where rendering strategy might be explained: the README file, Next.js config file, and page.tsx file. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/3_rendering_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/3_rendering_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What state management solution is this codebase using? ⚠️
&lt;/h2&gt;

&lt;p&gt;I think this answer was somewhat misleading. I wouldn't classify Next.js server actions as a state management solution. Looking at the codebase more closely, there's still some useState being used, which would have been worth mentioning. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/4_state_management_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/4_state_management_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What styling solution is this codebase using? ⚠️
&lt;/h2&gt;

&lt;p&gt;This response was a bit disappointing. While the LLM correctly identified Tailwind, it failed to mention Radix and Lucide, which are significant parts of the styling solution used in the codebase. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/5_styling_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/5_styling_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What data fetching approach is this codebase using? ✅
&lt;/h2&gt;

&lt;p&gt;I was impressed by the detail in this response! The answer seems correct, and the LLM even explained advanced techniques specific to this codebase. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/6_data_fetch_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/6_data_fetch_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What testing strategies is this codebase going to using? ✅
&lt;/h2&gt;

&lt;p&gt;The LLM correctly noted that there's currently no testing in place. This was actually a trick question! However, it failed to understand that there was never a plan for end-to-end testing in the codebase; @playwright/test was merely a peer dependency of another dependency. Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/7_testing_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/7_testing_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What input validation strategy is this codebase using? ✅
&lt;/h2&gt;

&lt;p&gt;The LLM answered correctly and thoroughly explained how validation is used throughout the codebase. Impressive! Here's the LLM's answer: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/8_input_validation_answer.md" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis/blob/main/claude_3_7_thinking/8_input_validation_answer.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaway 💡
&lt;/h2&gt;

&lt;p&gt;LLMs definitely make the process of understanding codebases easier and faster. However, they still generate some incorrect answers, so we need to keep that in mind.&lt;/p&gt;

&lt;p&gt;I'll definitely continue using LLMs to bootstrap my understanding of new codebases going forward! Heres the complete experiment codebase: &lt;a href="https://github.com/madnanrizqu/nextfaster-llm-analysis" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/nextfaster-llm-analysis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you think about my Copilot Chat + Claude 3.7 Reasoning approach? Do you think there's a better way to use LLMs to explain codebases?&lt;/p&gt;

&lt;p&gt;See you in the next one 👋&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why How: Virtual DOM vs Direct DOM</title>
      <dc:creator>Muhammad Adnan R</dc:creator>
      <pubDate>Wed, 05 Mar 2025 15:15:48 +0000</pubDate>
      <link>https://dev.to/madnanrizqu/virtual-dom-vs-direct-dom-474f</link>
      <guid>https://dev.to/madnanrizqu/virtual-dom-vs-direct-dom-474f</guid>
      <description>&lt;p&gt;Why do JS Frameworks introduce the concept of Virtual DOM?&lt;/p&gt;

&lt;p&gt;While there are many reasons, let's focus on one reason: Separating application logic from DOM handling logic. Virtual DOM abstracts the concept of handling the DOM so that developers can focus on logic that matters for the end user.&lt;/p&gt;

&lt;p&gt;Let's compare the declarative method of interacting with the DOM versus the imperative approach. What better way to compare than by building a todo app? Link of github repo here: &lt;a href="https://github.com/madnanrizqu/virtual-dom-direct-dom" rel="noopener noreferrer"&gt;https://github.com/madnanrizqu/virtual-dom-direct-dom&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just your normal todo app with these features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add todo&lt;/li&gt;
&lt;li&gt;Render todo/empty state&lt;/li&gt;
&lt;li&gt;Mark done&lt;/li&gt;
&lt;li&gt;Delete todo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvc8zken7dhsrr1bvsx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvc8zken7dhsrr1bvsx8.png" alt="Image description" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference is theres a side by side comparison of how virtual DOM and a direct DOM would look like. Spoiler: it behaves the same!&lt;/p&gt;

&lt;p&gt;Here's how the declarative method using Virtual DOM works for the Add todo feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setTodos&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's an imperative way to achieve the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;addTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveAndRender&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// notice this method&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's this saveAndRender method below? It's a method that's responsible for interacting with the DOM directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;saveAndRender&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;todos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;todoDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`flex items-center justify-between p-4 rounded-lg &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
        &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-gray-50&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bg-white&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; border border-gray-200 shadow-sm transition-all duration-200`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leftSection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;leftSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex items-center gap-3 flex-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`focus:outline-none transition-colors duration-200 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
        &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-green-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-gray-400 hover:text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;toggleButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggleTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleSvg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElementNS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.w3.org/2000/svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;height&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viewBox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0 0 24 24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fill&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currentColor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke-width&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
          &amp;lt;circle cx="12" cy="12" r="10"/&amp;gt;
          &amp;lt;path d="M8 12l3 3 5-5"/&amp;gt;
        `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
          &amp;lt;circle cx="12" cy="12" r="10"/&amp;gt;
          &amp;lt;path d="M15 9l-6 6"/&amp;gt;
          &amp;lt;path d="M9 9l6 6"/&amp;gt;
        `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;toggleButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toggleSvg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textSpan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;span&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;textSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`flex-1 text-gray-800 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
        &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;line-through text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;textSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deleteButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-red-500 hover:text-red-600 focus:outline-none transition-colors duration-200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;deleteButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteTodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deleteSvg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElementNS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.w3.org/2000/svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;height&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viewBox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0 0 24 24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fill&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currentColor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke-width&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
        &amp;lt;path d="M3 6h18"/&amp;gt;
        &amp;lt;path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/&amp;gt;
        &amp;lt;path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/&amp;gt;
      `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;deleteButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deleteSvg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;leftSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toggleButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;leftSection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textSpan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;todoDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;leftSection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;todoDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deleteButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoDiv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emptyState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that in the imperative approach, there needs to be code that handles interacting with the DOM. With Virtual DOM, this burden is lifted from the developer, allowing them to focus on just writing application logic.&lt;/p&gt;

&lt;p&gt;Thats all! Back to you, what other ways to separate concern of writing application code with DOM manipulation code is done on other web frameworks?&lt;/p&gt;

&lt;p&gt;See you later on the next one 👋&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
