<?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>Forem: code plato</title>
    <description>The latest articles on Forem by code plato (@codeplato).</description>
    <link>https://forem.com/codeplato</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%2F477442%2F008f628e-ab69-4bd8-940b-682bc1932ce8.png</url>
      <title>Forem: code plato</title>
      <link>https://forem.com/codeplato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/codeplato"/>
    <language>en</language>
    <item>
      <title>Do We Still Need to Practice Programming in the AI Era?</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Mon, 25 May 2026 22:25:24 +0000</pubDate>
      <link>https://forem.com/codeplato/do-we-still-need-to-practice-programming-in-the-ai-era-4bif</link>
      <guid>https://forem.com/codeplato/do-we-still-need-to-practice-programming-in-the-ai-era-4bif</guid>
      <description>&lt;p&gt;"Vibe Coding" is having a moment. So — do we still need to practice programming?&lt;/p&gt;

&lt;p&gt;My answer is yes.&lt;/p&gt;

&lt;p&gt;I've written before about using AI to distill reading material and quickly grasp the structure of an article. But a few fundamental realities won't change just because AI showed up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The rate at which the human brain absorbs knowledge hasn't changed. No matter how fast AI technology advances, your personal learning speed doesn't automatically accelerate with it. There are no real shortcuts to learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI was trained on both good code and bad code. Bad code isn't always incorrect code — it can simply be code that smells, is hard to maintain, or has a chaotic architecture. If you can't spot the problem yourself, AI often won't spot it either.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example 1
&lt;/h2&gt;

&lt;p&gt;Experienced developers and beginners literally see different things when they look at the same code.&lt;/p&gt;

&lt;p&gt;Imagine you're working in React and you come across this:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iPhone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;payInFull&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;monthlyFin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&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;Your product manager asks you to add a "snapshot page" — a page that displays the product's current state frozen at a point in time, so that even if the product data changes later, the snapshot stays the same.&lt;/p&gt;

&lt;p&gt;AI quickly generates this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iPhone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;payInFull&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;monthlyFin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Snapshot&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You see &lt;code&gt;{...phone}&lt;/code&gt; and think: "Got it — that's an object copy."&lt;/p&gt;

&lt;p&gt;A short while later, customer support files a bug: after the price is updated in the parent component, the price on the snapshot page updates too.&lt;/p&gt;

&lt;p&gt;You're baffled. This shouldn't be happening.&lt;/p&gt;

&lt;p&gt;After digging in, you realize:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Snapshot&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not the same as:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The former is just React's props spread syntax sugar.&lt;/p&gt;

&lt;p&gt;So you update the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Snapshot&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still broken.&lt;/p&gt;

&lt;p&gt;Eventually you find the fix:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Someone who has been burned by this before — or who genuinely studied JavaScript's object reference model — would have spotted the problem immediately. Someone who hasn't would go down the same rabbit hole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 2
&lt;/h2&gt;

&lt;p&gt;Have you ever felt completely fluent while watching a tutorial, only to draw a total blank the moment you sit down to write the code yourself?&lt;/p&gt;

&lt;p&gt;I was working through a Data Science course recently. The material wasn't particularly complex for a software engineer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;top1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_data&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;top_movies_2017.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But when I sat down to do the assignment — which asked me to load &lt;code&gt;top_movies_2017.csv&lt;/code&gt; — my mind went completely empty.&lt;/p&gt;

&lt;p&gt;I tried things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;
&lt;span class="n"&gt;import_csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and various other guesses.&lt;/p&gt;

&lt;p&gt;Strangely, I had seen &lt;code&gt;Table.read_table&lt;/code&gt; multiple times in the course material.&lt;/p&gt;

&lt;p&gt;What I realized: the human brain doesn't learn purely through reading. Learning is a multi-sensory process — it involves sound, touch, the frustration of hitting a wall, the cycle of trying and failing. Those experiences are part of the memory itself.&lt;/p&gt;

&lt;p&gt;Knowing something intellectually is not the same as having actually learned it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AI can help you extract an outline, surface key points, and let you skip over sections that aren't relevant to you. In that sense it's a useful map.&lt;/p&gt;

&lt;p&gt;But be clear-eyed about what a map is and isn't.&lt;/p&gt;

&lt;p&gt;If your underlying ability to absorb knowledge hasn't actually gotten faster, don't be fooled by the optimistic claim that "anyone can code in the AI era."&lt;/p&gt;

&lt;p&gt;"Anyone can generate code" is not the same as "anyone can build a maintainable commercial product."&lt;/p&gt;

&lt;p&gt;AI can help you go faster.&lt;/p&gt;

&lt;p&gt;But it cannot replace the process of genuinely understanding systems, code, and engineering complexity. That part still takes you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
      <category>learning</category>
    </item>
    <item>
      <title>what-is-context-governance</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Tue, 19 May 2026 20:58:30 +0000</pubDate>
      <link>https://forem.com/codeplato/what-is-context-governance-nj</link>
      <guid>https://forem.com/codeplato/what-is-context-governance-nj</guid>
      <description>&lt;p&gt;Context Governance is a part of Context Engineering. In my opinion, it's the most interesting part.&lt;/p&gt;

&lt;p&gt;That might sound abstract at first — I felt the same way. But once you look at how a few mainstream AI agents handle their context governance, the concept becomes immediately intuitive.&lt;/p&gt;

&lt;p&gt;In this post, I'll compare four agents' approaches to context governance, walking from simple to complex, from basic to advanced.&lt;/p&gt;




&lt;h2&gt;
  
  
  Codex
&lt;/h2&gt;

&lt;p&gt;First up is OpenAI's Codex. Ironically, despite OpenAI being the first company to build a large language model, their agent product is the newest of the bunch.&lt;/p&gt;

&lt;p&gt;And fittingly, its context governance is also the simplest. Inside the &lt;code&gt;.codex/&lt;/code&gt; directory, there's a file called &lt;code&gt;AGENTS.md&lt;/code&gt;. Here's a minimal example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Repository Guidelines&lt;/span&gt;

&lt;span class="gu"&gt;## Project Structure&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`src/`&lt;/span&gt; — application code
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`tests/`&lt;/span&gt; — test code

&lt;span class="gu"&gt;## Common Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run tests: &lt;span class="sb"&gt;`npm test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run linter: &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt;

&lt;span class="gu"&gt;## Coding Conventions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Prefer TypeScript
&lt;span class="p"&gt;-&lt;/span&gt; Avoid default exports
&lt;span class="p"&gt;-&lt;/span&gt; Use async/await instead of raw Promises
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before starting any work, Codex reads this file. You maintain it manually, adding rules over time.&lt;/p&gt;

&lt;p&gt;Beyond this file, there's a folder: &lt;code&gt;~/.codex/memories/&lt;/code&gt; — as the name suggests, it's the "memory." Codex writes to it automatically.&lt;/p&gt;

&lt;p&gt;The rough structure looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;summaries&lt;/td&gt;
&lt;td&gt;Session summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;durable&lt;/td&gt;
&lt;td&gt;Long-term stable memories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;recent&lt;/td&gt;
&lt;td&gt;Recent context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;evidence&lt;/td&gt;
&lt;td&gt;Source evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As you can see, Codex's context governance is quite lightweight. At its core, it's just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One rules file&lt;/li&gt;
&lt;li&gt;One auto-managed memory directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude Code
&lt;/h2&gt;

&lt;p&gt;Claude Code takes a different approach.&lt;/p&gt;

&lt;p&gt;The officially supported mechanisms are similar to Codex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just these two. The names speak for themselves. But the Claude Code community has expanded this significantly over time, evolving into something like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Manual / Auto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Project rules, agent behavior&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Long-term memory, preferences, lessons&lt;/td&gt;
&lt;td&gt;Semi-auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NOTES.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Scratch notes, working scratchpad&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DECISIONS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Key architecture / tech decision history&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ARCHITECTURE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;System structure, module relationships, data flow&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LEARNINGS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Lessons learned, pitfall records&lt;/td&gt;
&lt;td&gt;Semi-auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TASKS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Current task list, TODOs&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SESSION.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Current session work log&lt;/td&gt;
&lt;td&gt;Semi-auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Folder&lt;/td&gt;
&lt;td&gt;Long-form context documents&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;memory/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Folder&lt;/td&gt;
&lt;td&gt;Categorized memory storage&lt;/td&gt;
&lt;td&gt;Semi-auto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompts/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Folder&lt;/td&gt;
&lt;td&gt;Prompt templates, workflow prompts&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.cursorrules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File&lt;/td&gt;
&lt;td&gt;Cursor-compatible rules&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is far more complex than Codex. But notice: a large number of these files require manual upkeep. And the whole structure looks a lot like the project wiki we'd write for a traditional software project.&lt;/p&gt;

&lt;p&gt;That's actually the key insight: for an agent to work well, it should browse the project wiki first — just like we would. People are now turning wiki documents into context Markdown files. With that framing, it all makes sense. Claude Code, grounded in these context documents, increasingly works like a real developer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Claw
&lt;/h2&gt;

&lt;p&gt;Open Claw is positioned differently from Claude Code — it leans more toward a life assistant than a coding tool. The community-extended Claude Code context system requires managing too many files. Unlike Claude Code's typical developer audience, Open Claw's users are more general. Many users never directly edit Open Claw's context files — some don't even know they need to.&lt;/p&gt;

&lt;p&gt;Yet Open Claw's context design is actually more "agent-native" than the community Claude Code setup. The latter still carries a strong human project-management mindset. But for an agent, you don't necessarily need that many separate documents.&lt;/p&gt;

&lt;p&gt;Open Claw's context governance centers on "persona" and "character." It organizes context into these files:&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Instruction Layer (static, manually maintained)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/strong&gt; — Personality, values, boundaries. Answers "who are you." Defines tone, character, hard constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/strong&gt; — Operational procedures and rules. Answers "what you do and how." The largest and most important file; holds complex workflows and step-by-step instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;USER.md&lt;/code&gt;&lt;/strong&gt; — User profile. Your name, timezone, preferences, work background. The personalization layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;IDENTITY.md&lt;/code&gt;&lt;/strong&gt; — Structured identity record (name, role, goals, tone). For consistently re-applying a known persona. (Personally, I find this slightly redundant.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;TOOLS.md&lt;/code&gt;&lt;/strong&gt; — Tool documentation. Doesn't control permissions (that's config's job) — it tells the agent how to use the tools it already has.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automation Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;HEARTBEAT.md&lt;/code&gt;&lt;/strong&gt; — Scheduled tasks, effectively a natural-language cron. E.g., "check every 30 minutes," "generate weekly report every Monday at 8am."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;BOOTSTRAP.md&lt;/code&gt;&lt;/strong&gt; — First-run initialization script. Automatically deletes itself after setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;BOOT.md&lt;/code&gt;&lt;/strong&gt; — Hook that runs on every startup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;&lt;/strong&gt; — Long-term memory. Persistent facts, preferences, decision summaries — effective across weeks and months.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt;&lt;/strong&gt; — Daily notes. Today's and yesterday's notes load automatically; older entries are retrieved via &lt;code&gt;memory_search&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;DREAMS.md&lt;/code&gt;&lt;/strong&gt; — Diary of the dreaming system, logging the "promotion" of short-term memories to long-term. An experimental feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open Claw is already significantly more sophisticated than the previous two systems. When you use it, you can noticeably feel that it's "smarter."&lt;/p&gt;




&lt;h2&gt;
  
  
  Hermes Agent
&lt;/h2&gt;

&lt;p&gt;Now for the main event. If you don't understand context governance, Hermes Agent might seem similar to Open Claw. But notice: Open Claw still has many files that need manual maintenance.&lt;/p&gt;

&lt;p&gt;Even I — after using Open Claw for a while — only recently realized those files need human upkeep. The result: many of the context structures Open Claw designed were never actually put to use.&lt;/p&gt;

&lt;p&gt;Hermes Agent's context governance differs from both Open Claw and Claude Code. Its core design philosophy is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Self-evolution" — the agent writes its own memories and skills.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The entire system lives under &lt;code&gt;~/.hermes/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Identity Layer (static)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/strong&gt; — The first slot in the system prompt. Defines personality, tone, values, behavioral boundaries. This is global, loaded from &lt;code&gt;HERMES_HOME&lt;/code&gt;. You can still manually edit this file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project Context Layer (priority-ordered, only the first match loads)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.hermes.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursorrules&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First match wins. This means Hermes is natively compatible with both Claude Code and Cursor project config files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Layer (three tiers, agent-maintained)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;MEMORY.md&lt;/code&gt;&lt;/strong&gt; — Long-term memory. Stores environment info, project conventions, tool usage experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;USER.md&lt;/code&gt;&lt;/strong&gt; — User profile. Stores your name, communication preferences, skill level. Note: this time &lt;code&gt;USER.md&lt;/code&gt; is automatically maintained by the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;state.db&lt;/code&gt;&lt;/strong&gt; — A SQLite database with FTS5 full-text indexing, storing all conversation history. The agent doesn't load everything by default — it retrieves on demand via &lt;code&gt;session_search&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory has entered the database era. Only a database can truly support long-horizon context retrieval.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill Layer (Hermes' most distinctive feature)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;skills/&lt;/code&gt; directory&lt;/strong&gt; — Each skill is its own folder containing a &lt;code&gt;SKILL.md&lt;/code&gt; (with YAML frontmatter) and optional templates and scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference: skills are not written by humans. After completing a non-trivial task, the agent creates skills on its own via the &lt;code&gt;skill_manage&lt;/code&gt; tool. Similarly, memory no longer relies primarily on human maintenance — the agent edits &lt;code&gt;MEMORY.md&lt;/code&gt; and &lt;code&gt;USER.md&lt;/code&gt; itself between conversations. And skills are loaded on demand: unused skills never enter the context.&lt;/p&gt;

&lt;p&gt;This is already approaching true "automated context governance."&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduling Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cron jobs&lt;/strong&gt; — Scheduled tasks, similar to Open Claw's &lt;code&gt;HEARTBEAT.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, context governance isn't just more complex — it's starting to run itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Whether an AI can actually get work done, and how well it does, is no longer just a question of which model you use. In many cases, better context governance improves agent productivity more than upgrading to a stronger model.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Electronic Brain
&lt;/h3&gt;

&lt;p&gt;This raises an interesting question: context is effectively the agent's "electronic brain." The longer you use an agent, the more that accumulated context becomes uniquely &lt;em&gt;it&lt;/em&gt;. As long as the context survives, even if you swap out the "shell," your assistant is still your assistant. If an agent crashes and needs to be reinstalled, or you want to migrate to a different platform, moving the context along should theoretically keep your assistant alive.&lt;/p&gt;

&lt;p&gt;This opens a new question: how do you safely migrate context?&lt;/p&gt;

&lt;p&gt;The problem today is that file names, structures, and formats vary wildly across platforms. Context migration is a mess. I believe a more unified, standardized context protocol will emerge. And "context governance" will gradually become one of the core capabilities of any AI agent worth using.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>contextengineering</category>
      <category>contextgovernance</category>
    </item>
    <item>
      <title>How to Read Technical Docs in the AI Era: Distilled Reading</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Sat, 16 May 2026 23:15:14 +0000</pubDate>
      <link>https://forem.com/codeplato/how-to-read-technical-docs-in-the-ai-era-distilled-reading-194p</link>
      <guid>https://forem.com/codeplato/how-to-read-technical-docs-in-the-ai-era-distilled-reading-194p</guid>
      <description>&lt;h2&gt;
  
  
  The Unfinished Docs Problem
&lt;/h2&gt;

&lt;p&gt;We're often told to read more technical documentation. But the reality I've encountered is: some docs are so long that reading them for too long leads to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drowsiness and declining efficiency&lt;/li&gt;
&lt;li&gt;Getting interrupted by something else midway&lt;/li&gt;
&lt;li&gt;Getting pulled into another article by an interesting reference — and that article is just as long. I've done the math: reading all of them is simply not feasible; the time cost is too high.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result? My browser perpetually has dozens of half-read technical article tabs open, and I can't bring myself to close them. Sometimes I save them to bookmarks. But that doesn't solve the root problem — it just makes the bookmarks folder grow and grow. The bookmarks folder becomes one enormous todo list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reading Bottleneck
&lt;/h2&gt;

&lt;p&gt;This pile of accumulated technical docs weighs on me. It makes me feel guilty, like a form of technical debt in my mind. I keep telling myself I'm not trying hard enough — that's why I haven't finished reading them.&lt;/p&gt;

&lt;p&gt;But today I realized: finishing all those technical docs is simply impossible. Because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Their length means reading them will inevitably consume far more time than I can reasonably afford.&lt;/li&gt;
&lt;li&gt;Docs spawn more docs. This process never stops.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Just as technical systems have bottlenecks, I call this the &lt;strong&gt;reading bottleneck&lt;/strong&gt;. It's a problem that requires a logical-level solution, not just brute-force effort.&lt;/p&gt;

&lt;p&gt;The essence of the bottleneck is that both time and attention are finite resources. Time, as a unit, is too abstract — it doesn't capture the variability in how fast we actually read. So I prefer to use &lt;strong&gt;attention&lt;/strong&gt; as the unit of measure. Think of human attention as a kind of token: your &lt;strong&gt;Attention Token&lt;/strong&gt;, or &lt;strong&gt;AT&lt;/strong&gt;. Strong focus generates an A.T. Field (LOL). Once it's depleted, sleep is the only way to recharge.&lt;/p&gt;

&lt;p&gt;This reading bottleneck is fundamentally:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Total time to read all docs &amp;gt; Your available attention&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Distilled Reading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Everything Can Be Distilled
&lt;/h3&gt;

&lt;p&gt;Here's something I realized: even though I've only skimmed most of those technical docs, I've still been doing solid technical work. Some docs were even obsolete before I got around to reading them. Most of the information in those docs doesn't need to be memorized — I just need to know it exists, like a dictionary I can look things up in.&lt;/p&gt;

&lt;p&gt;This even applies to docs that are already summaries or digests. They can be distilled further. A distilled piece of text can be distilled again — down to a single sentence, if needed. The distillation process loses information, but that loss is acceptable and expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM-Assisted Distillation
&lt;/h3&gt;

&lt;p&gt;In the age of AI-assisted programming, a developer's most valuable resource is attention.&lt;/p&gt;

&lt;p&gt;When my attention starts to fade, I can use an LLM to summarize the rest of an article. After the LLM reads and condenses it, I review the outline first, then ask follow-up questions on the parts I care about.&lt;/p&gt;

&lt;p&gt;Taking it further: why not have the LLM produce a short outline from the very beginning? I read the outline, then decide: do I continue reading, or do I move on? If I continue, I can choose between reading every line carefully or zooming in on the sections that matter most to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Wander Off
&lt;/h3&gt;

&lt;p&gt;When you come across an interesting concept while reading, resist the urge to Google it. Here's what that behavior chain looks like:&lt;/p&gt;

&lt;p&gt;Search keyword → See search results page → Click a result → Read that page&lt;/p&gt;

&lt;p&gt;Google's search result format per entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOGO: Site name
One-line page description (not necessarily the title)
2-3 lines of short preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You burn attention scanning each result. Then you open a new, visually busy page and burn more attention locating the thing you actually wanted. Other elements on that page may also consume your attention.&lt;/p&gt;

&lt;p&gt;So: when you encounter an interesting concept, don't immediately Google it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the AI directly — let it find what you're looking for&lt;/li&gt;
&lt;li&gt;Ask it to include links as supporting evidence&lt;/li&gt;
&lt;li&gt;You can click the links to verify. If a link is broken, tell the AI to check the links itself before responding, filtering out dead ones&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what I call &lt;strong&gt;Distilled Reading&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;We need a way to verify this method — otherwise it can't be falsified, and anything that can't be falsified is pseudoscience. If this is just me talking nonsense, that should be provable. If the method doesn't work, it's wasting your time.&lt;/p&gt;

&lt;p&gt;Verification dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The number of open technical doc tabs in your browser should decrease&lt;/li&gt;
&lt;li&gt;The number of unread articles in your bookmarks should decrease, or be archived&lt;/li&gt;
&lt;li&gt;At the end of the day, you should feel that you actually accomplished your planned reading — and that the guilt has eased (admittedly subjective, and a bit pseudoscientific, but that's fine)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use these same criteria to evaluate whether this method works for you — and decide whether to trust me and change your reading habits, or conclude that this is all bullshit. Either way, you've taken an important step: you've personally tested how AI can change how you live. That's valuable, regardless of the outcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>reading</category>
      <category>methodology</category>
    </item>
    <item>
      <title>How to Interview Candidates in the AI Era</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Fri, 15 May 2026 03:46:47 +0000</pubDate>
      <link>https://forem.com/codeplato/how-to-interview-candidates-in-the-ai-era-4cpn</link>
      <guid>https://forem.com/codeplato/how-to-interview-candidates-in-the-ai-era-4cpn</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;In the age of AI, how do we hire the right people? You don't want to end up with someone who's great at LeetCode but has never touched Claude Code and has zero interest in learning AI-assisted programming.&lt;/p&gt;

&lt;p&gt;But compared to LeetCode or traditional software knowledge, AI is still very young. So how do we gauge whether a candidate can stay productive at the company over the next few years?&lt;/p&gt;

&lt;h2&gt;
  
  
  A Note on Terminology
&lt;/h2&gt;

&lt;p&gt;"AI" is a broad term that works fine for general audiences. But as professionals, we should be precise.&lt;/p&gt;

&lt;p&gt;AI covers many subfields — deep learning, supervised learning, large language models, and more. This article focuses specifically on interview questions within the LLM space, so for simplicity I'll use "AI" to mean LLM throughout.&lt;/p&gt;

&lt;p&gt;This article also doesn't cover hiring for LLM training roles — that's outside my expertise, and frankly it's a more mature field with established interview practices. The focus here is on LLM application engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Framework
&lt;/h2&gt;

&lt;p&gt;We evaluate candidates across 4 dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Learning velocity:&lt;/strong&gt;
We're hiring engineers who code with AI. Whether they're building AI features or just using Claude Code day-to-day, they need to have a genuine hunger for staying current.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the LLM application space, there's no university course that can keep up. What you learned at the start of the year may already be obsolete by December. Self-directed learning is the only way.&lt;/p&gt;

&lt;p&gt;The best AI engineers are like dogs chasing a ball — they're always running &lt;em&gt;toward&lt;/em&gt; the technology, not waiting to be pushed by it.&lt;/p&gt;

&lt;p&gt;So our questions don't just test LLM knowledge; they also probe whether the candidate has that chasing instinct.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conceptual understanding:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
How well does the candidate understand LLMs at a systems level?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-on experience:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Have they actually used AI coding tools in practice?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain knowledge:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Knowledge of specific frameworks (e.g., LangGraph). This dimension is more relevant for candidates in AI integration roles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample Questions
&lt;/h2&gt;

&lt;p&gt;The following are example questions along with my own answers.&lt;/p&gt;

&lt;p&gt;These aren't "correct" answers — treat them as a reference point. And just like LLMs have a training cutoff, my answers here have a cutoff of June 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning Velocity
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What are the major phases in the evolution of LLM application development? Hint: the first phase is prompt engineering.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Answer: Prompt engineering → context engineering → Harness Engineering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What is Harness Engineering?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Harness Engineering is the practice of building the external execution framework around AI agents — including tools, memory, retrieval, validation, workflow, and feedback loops — to improve agent accuracy and controllability.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Put simply: modern agent architecture = model + harness.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name a few recent LLM applications you're aware of.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Examples: OpenClaw, Hermes Agent, Happy Codex, etc. (as of May 2026)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Name a few recent LLM models.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Examples: Opus, GPT-5.5, etc. (as of May 2026)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How do you keep up with developments in LLM technology?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Following news sites, specific media outlets, building personal LLM projects and learning as you go, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conceptual Understanding
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What's the difference between prompt engineering and context engineering?&lt;/strong&gt;
Prompt engineering is about &lt;em&gt;how to write a better prompt&lt;/em&gt;. Context engineering is about &lt;em&gt;how to dynamically construct the entire runtime context for an AI agent&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Modern agent performance depends primarily on whether the agent has the right context and tools — not just on how elegant the prompt is.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;How do you interpret the phrase "RAG is dead"?&lt;/strong&gt;
There are two levels to this:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;With the rise of context engineering, the focus has shifted from "better RAG" to "better context management" as the primary lever for improving agent effectiveness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More precisely: it's not RAG that's dead — it's Naive RAG. The early approach of chunk → embed → similarity search is what's been superseded.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What context engineering methodologies are you familiar with?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Context compression, structured note-taking, sub-agent architectures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What's the relationship between context engineering and Harness Engineering?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Harness Engineering focuses on the overall execution framework and runtime system for AI agents. Context engineering focuses on how to dynamically organize and deliver the right context to the agent.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Context engineering can be seen as one of the core components of Harness Engineering.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is Progressive Disclosure?&lt;/strong&gt;
Progressive Disclosure is a design principle where a system doesn't surface all information at once, but instead reveals relevant content incrementally as needed — reducing complexity and minimizing context noise.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Hands-on Experience
&lt;/h3&gt;

&lt;p&gt;The following questions don't have right or wrong answers — except the last one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Walk me through a real scenario where you used Claude Code to write production code.&lt;/li&gt;
&lt;li&gt;What's the dumbest thing you've seen an AI write?&lt;/li&gt;
&lt;li&gt;What do you do when the AI keeps failing to fix a bug?&lt;/li&gt;
&lt;li&gt;Have you compared multiple AI coding tools? Which do you prefer and why?&lt;/li&gt;
&lt;li&gt;As a developer, how should we think about writing code in the AI era?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have some thoughts on that last question, but I'll save them for a separate piece: &lt;em&gt;The AI-Era Engineer Should Steer, Not Type&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain Knowledge
&lt;/h3&gt;

&lt;p&gt;For this section, tailor the questions to whatever frameworks are relevant to the role — LangGraph, for example, if that's part of the stack.&lt;/p&gt;

&lt;p&gt;I'll leave the specifics to you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>interview</category>
    </item>
    <item>
      <title>Web4.0 Is Coming</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Fri, 08 May 2026 06:29:42 +0000</pubDate>
      <link>https://forem.com/codeplato/web40-is-coming-2and</link>
      <guid>https://forem.com/codeplato/web40-is-coming-2and</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AI isn't just a tool upgrade — it's a new computing platform revolution.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Part 1: The Cracks Are Already Showing
&lt;/h1&gt;

&lt;p&gt;I've been job hunting recently, and I noticed something interesting: genuine "LLM integration developer" roles are still surprisingly rare. What's more interesting is that even when companies do post them, most require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Agent experience&lt;/li&gt;
&lt;li&gt;LLM project experience&lt;/li&gt;
&lt;li&gt;RAG experience&lt;/li&gt;
&lt;li&gt;AI Workflow experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the problem: LLM development has only exploded in the past few years. How many engineers actually have complete AI development experience? Many engineers only started transitioning into LLM development a few months ago.&lt;/p&gt;

&lt;p&gt;If you keep the bar this rigid and can't hire anyone, those people will get picked up by other companies. In another year or two, you might not be able to hire them at all, even if you want to.&lt;/p&gt;

&lt;p&gt;(So if I'm job hunting right now — you could hire me today. Just don't make me do LeetCode.)&lt;/p&gt;

&lt;p&gt;But the really interesting part isn't the hiring market. It's that most companies, even now, have no idea how to make money with AI. The people who are actually using LLMs to build things are indie developers, small teams, hackers, and solo founders. They don't even know if it will be profitable — but they're running experiments anyway, because "this thing is just too cool."&lt;/p&gt;

&lt;p&gt;That hacker intuition is hard to explain with traditional business logic. Most great tech revolutions didn't start with a clear business model. They started because a group of people thought something was fascinating.&lt;/p&gt;

&lt;p&gt;That's how the internet started. Personal computers. Smartphones. And now AI.&lt;/p&gt;

&lt;p&gt;The real danger is that many large companies are still sitting comfortably in their existing lanes, asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can AI make money?&lt;/li&gt;
&lt;li&gt;How do we calculate AI ROI?&lt;/li&gt;
&lt;li&gt;Will AI disrupt our current business?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the question they should actually be asking is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Will our company still exist in ten years?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because history has already answered this. Kodak didn't die because its technology was weak. Nokia didn't die because its engineers weren't good enough. They died because when a new computing platform arrived, they were still living in the old era.&lt;/p&gt;

&lt;p&gt;And right now, the cracks are already showing.&lt;/p&gt;

&lt;p&gt;The way I see it, a Niagara Falls is being held back by a thin mud wall — and that wall has started to crack.&lt;/p&gt;

&lt;p&gt;Today, 90% of internet companies are already standing at the edge of a cliff. They just haven't realized it yet. Don't believe me? Let's run a social experiment starting now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build an AI Skill for Jira&lt;/li&gt;
&lt;li&gt;Build an AI Skill for productivity tools&lt;/li&gt;
&lt;li&gt;Build AI-native versions of various Web2.0 apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch what happens.&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 2: The Web4.0 Architecture
&lt;/h1&gt;

&lt;p&gt;"Web3.0" is a term that's been talked to death. Why? Because it never produced a computing paradigm genuinely capable of restructuring Web2.0.&lt;/p&gt;

&lt;p&gt;But AI is different.&lt;/p&gt;

&lt;p&gt;I'm calling this wave Web4.0, because AI is starting to deeply penetrate software itself. It's no longer just a search bar, a chatbot, or an assistant tool — it's gradually becoming part of the operating logic of software.&lt;/p&gt;

&lt;p&gt;I'd even argue this will be the fourth industrial revolution, because for the first time, machines are beginning to &lt;em&gt;participate in producing software themselves&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Software Interface
&lt;/h2&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%2F6wggv6ikrkdxiyb3zm08.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%2F6wggv6ikrkdxiyb3zm08.png" alt="Software Interface" width="654" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The software interface of Web4.0 will look very different from today's — but not completely unfamiliar.&lt;/p&gt;

&lt;p&gt;Future software will most likely split into: &lt;strong&gt;software on the left, AI on the right&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The left side will still be traditional GUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task lists&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Charts&lt;/li&gt;
&lt;li&gt;Dashboards&lt;/li&gt;
&lt;li&gt;Status bars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Humans still need to &lt;em&gt;see&lt;/em&gt; state, so GUI isn't going away.&lt;/p&gt;

&lt;p&gt;But the right side will become an AI operation layer. Users won't primarily interact through buttons anymore — they'll accomplish most tasks through natural language, conversation, and intent.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Move this issue to next week and notify the relevant team members."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update the issue&lt;/li&gt;
&lt;li&gt;Change the status&lt;/li&gt;
&lt;li&gt;Send notifications&lt;/li&gt;
&lt;li&gt;Adjust the timeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The left-side GUI's role shifts to: &lt;em&gt;showing the current state of the system&lt;/em&gt;. Users can even watch AI operate within the system and step in manually when needed.&lt;/p&gt;

&lt;p&gt;Software will shift from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Humans operate software"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI operates software. Humans supervise AI."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. System Architecture
&lt;/h2&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%2F3fp5d041rdm7q6v9exar.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%2F3fp5d041rdm7q6v9exar.png" alt="System Architecture" width="768" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core shift in Web4.0 is that every frontend will eventually connect to an AI engine.&lt;/p&gt;

&lt;p&gt;Whether it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App&lt;/li&gt;
&lt;li&gt;Web&lt;/li&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;li&gt;Skill&lt;/li&gt;
&lt;li&gt;Agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything will plug into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SLM + RAG&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many people assume the future will be dominated by ever-larger models, but I don't think so. LLMs are too expensive, enterprise-sensitive data can't leave the building, and no serious company wants its core technology dependent on someone else's API. A truly mature company will never build its core business permanently on external infrastructure.&lt;/p&gt;

&lt;p&gt;So Web4.0 will inevitably move toward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Each company's own SLM (Small Language Model) + proprietary RAG.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;LLMs will be more like early exploration tools, general reasoning engines, and product validation platforms. Mature products will eventually own their own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Engine&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Knowledge Base&lt;/li&gt;
&lt;li&gt;Workflow System&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The competitive moat for companies will gradually shift away from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend pages&lt;/li&gt;
&lt;li&gt;CRUD systems&lt;/li&gt;
&lt;li&gt;Database design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG architecture&lt;/li&gt;
&lt;li&gt;Workflow orchestration&lt;/li&gt;
&lt;li&gt;Enterprise knowledge organization&lt;/li&gt;
&lt;li&gt;Agent collaboration systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. The Product Lifecycle
&lt;/h2&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%2F6hkx3coajcz7d1h6hh6x.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%2F6hkx3coajcz7d1h6hh6x.png" alt="Product Lifecycle" width="768" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The lifecycle of Web4.0 products will also change.&lt;/p&gt;

&lt;p&gt;In the early stage, most teams will go straight to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP&lt;/li&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;Workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ship fast — because the cost of experimentation is low, and the product can "come alive" from day one.&lt;/p&gt;

&lt;p&gt;This is completely different from before. Products used to require massive amounts of custom logic before they were usable. Now AI already ships with enormous general-purpose capability.&lt;/p&gt;

&lt;p&gt;But at the mature stage, companies will gradually migrate to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SLM + proprietary RAG&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reasons are practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce costs&lt;/li&gt;
&lt;li&gt;Control data&lt;/li&gt;
&lt;li&gt;Reduce API dependency&lt;/li&gt;
&lt;li&gt;Ensure stability&lt;/li&gt;
&lt;li&gt;Establish technical sovereignty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the typical Web4.0 product evolution path will likely look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM API
    ↓
RAG
    ↓
Workflow
    ↓
SLM
    ↓
Enterprise AI Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Customer Support
&lt;/h2&gt;

&lt;p&gt;Customer service may be one of the first industries to be fully restructured.&lt;/p&gt;

&lt;p&gt;But this time, it's real AI support — not the "fake AI that makes everyone want to throw their phone" from before.&lt;/p&gt;

&lt;p&gt;Old AI customer service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Couldn't follow context&lt;/li&gt;
&lt;li&gt;Couldn't hold a continuous conversation&lt;/li&gt;
&lt;li&gt;Couldn't read emotions&lt;/li&gt;
&lt;li&gt;Only matched keywords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So users always ended up demanding a human.&lt;/p&gt;

&lt;p&gt;Web4.0 AI support is different. It will genuinely understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context&lt;/li&gt;
&lt;li&gt;Conversation history&lt;/li&gt;
&lt;li&gt;User sentiment&lt;/li&gt;
&lt;li&gt;User behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can even detect:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This user is getting frustrated."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And proactively say:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Let me connect you with a human agent."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most companies' support operations will become fully AI-manageable. The scenarios that still require humans will shrink to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-stakes decisions&lt;/li&gt;
&lt;li&gt;Emotional de-escalation&lt;/li&gt;
&lt;li&gt;Edge case handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another industry, restructured.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Version Iteration
&lt;/h2&gt;

&lt;p&gt;This is a more radical idea, but I think it's cool — and the kind of thing that could go viral.&lt;/p&gt;

&lt;p&gt;It's this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What goes into the next version is decided by user vote."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze user behavior&lt;/li&gt;
&lt;li&gt;Summarize user needs&lt;/li&gt;
&lt;li&gt;Auto-generate candidate features&lt;/li&gt;
&lt;li&gt;Let users vote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And eventually, AI will auto-implement some of those features too.&lt;/p&gt;

&lt;p&gt;The old software development flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product Manager
    ↓
Requirements
    ↓
Engineering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Web4.0 era, it may gradually become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Users
    ↓
AI Analysis
    ↓
AI Implementation
    ↓
User Feedback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Software will enter:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The era of high-velocity self-evolution."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Part 3: Web4.0 Is Not an Upgrade — It's a Replacement
&lt;/h1&gt;

&lt;p&gt;Many companies still think of AI as a plugin, a feature, a chat window, a productivity tool.&lt;/p&gt;

&lt;p&gt;But what AI is actually changing is the entire software architecture.&lt;/p&gt;

&lt;p&gt;Web4.0 is not "Web2.0 + AI." It's a new computing platform — just like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PCs replaced mainframes&lt;/li&gt;
&lt;li&gt;Smartphones replaced parts of the PC&lt;/li&gt;
&lt;li&gt;Cloud computing restructured enterprise systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI will redefine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software&lt;/li&gt;
&lt;li&gt;Workflows&lt;/li&gt;
&lt;li&gt;Organizational structures&lt;/li&gt;
&lt;li&gt;Development models&lt;/li&gt;
&lt;li&gt;User interaction&lt;/li&gt;
&lt;li&gt;Enterprise architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most companies think they're just waiting for AI to mature.&lt;/p&gt;

&lt;p&gt;But actually:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI is waiting to replace them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We may be standing at the single biggest technological inflection point since the invention of the computer. And many companies are already at the edge of the cliff — they just haven't looked down yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web40</category>
      <category>architecture</category>
    </item>
    <item>
      <title>LLM-Based AI Agent Architecture: A New Kind of Personal Computer on Your Device</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Fri, 08 May 2026 06:27:59 +0000</pubDate>
      <link>https://forem.com/codeplato/llm-based-ai-agent-architecture-a-new-kind-of-personal-computer-on-your-device-4hn8</link>
      <guid>https://forem.com/codeplato/llm-based-ai-agent-architecture-a-new-kind-of-personal-computer-on-your-device-4hn8</guid>
      <description>&lt;p&gt;For a long time, we've thought of AI as a "chatbot."&lt;/p&gt;

&lt;p&gt;But if you step back and look from a systems architecture perspective, you'll find that a truly mature AI agent looks more like a new kind of personal computer — one that lives on your device.&lt;/p&gt;

&lt;p&gt;It has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A compute core&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;A file system&lt;/li&gt;
&lt;li&gt;A software system&lt;/li&gt;
&lt;li&gt;Input/output devices&lt;/li&gt;
&lt;li&gt;Long-term storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is:&lt;/p&gt;

&lt;p&gt;Its core isn't a traditional CPU. It's an LLM.&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 1: The LLM Engine — A "CPU" Without Memory
&lt;/h1&gt;

&lt;p&gt;The LLM itself has no long-term memory.&lt;/p&gt;

&lt;p&gt;It's more like an inference engine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receives input&lt;/li&gt;
&lt;li&gt;Reads context&lt;/li&gt;
&lt;li&gt;Performs reasoning&lt;/li&gt;
&lt;li&gt;Produces output&lt;/li&gt;
&lt;li&gt;Then "forgets"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It cannot natively remember things that happened in the past.&lt;/p&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The LLM itself is more like a CPU than a complete agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It only handles computation.&lt;/p&gt;

&lt;p&gt;What makes AI "seem like it knows you" is the context provided externally.&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%2Fild38qbctgpnzd3p1hg0.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%2Fild38qbctgpnzd3p1hg0.png" alt="LLM CPU" width="375" height="325"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 2: Context — The AI Agent's Memory
&lt;/h1&gt;

&lt;p&gt;If the LLM is the CPU,&lt;br&gt;&lt;br&gt;
then Context is the AI's memory.&lt;/p&gt;

&lt;p&gt;And this memory should be split into two layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Global Context
&lt;/h2&gt;

&lt;p&gt;This layer belongs to the entire agent.&lt;/p&gt;

&lt;p&gt;It records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User preferences&lt;/li&gt;
&lt;li&gt;Long-term goals&lt;/li&gt;
&lt;li&gt;Habitual behaviors&lt;/li&gt;
&lt;li&gt;Persona settings&lt;/li&gt;
&lt;li&gt;Persistent rules&lt;/li&gt;
&lt;li&gt;Historical knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"User prefers Markdown"&lt;/li&gt;
&lt;li&gt;"User is learning AI Agents"&lt;/li&gt;
&lt;li&gt;"User habitually writes in Chinese"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This information shapes agent behavior over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Session Context
&lt;/h2&gt;

&lt;p&gt;This layer belongs only to the current conversation.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The current topic under discussion&lt;/li&gt;
&lt;li&gt;The current article structure&lt;/li&gt;
&lt;li&gt;The most recent rounds of dialogue&lt;/li&gt;
&lt;li&gt;Temporary reasoning results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's more like temporary memory during program execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Context Window Is Essentially a "Memory Limit"
&lt;/h2&gt;

&lt;p&gt;An LLM's Context Window isn't unlimited.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;History can't accumulate indefinitely&lt;/li&gt;
&lt;li&gt;Information gets more expensive as the window fills&lt;/li&gt;
&lt;li&gt;Past the limit, content must be compressed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;p&gt;An agent must manage memory like an operating system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress history&lt;/li&gt;
&lt;li&gt;Summarize&lt;/li&gt;
&lt;li&gt;Clear low-priority information&lt;/li&gt;
&lt;li&gt;Transfer long-term data&lt;/li&gt;
&lt;li&gt;Dynamically load needed data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Context Window is essentially the AI's memory capacity.&lt;/p&gt;
&lt;/blockquote&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%2F4npp9c0irslj70nmwztx.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%2F4npp9c0irslj70nmwztx.png" alt="Context Memory" width="399" height="365"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 3: Markdown Files — The Agent's Hard Drive
&lt;/h1&gt;

&lt;p&gt;Long-term data shouldn't stay in the context window.&lt;/p&gt;

&lt;p&gt;Otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Costs keep rising&lt;/li&gt;
&lt;li&gt;Inference slows down&lt;/li&gt;
&lt;li&gt;The context balloons rapidly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Long-term memory should live in a file system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And one very natural form is Markdown files.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notes&lt;/li&gt;
&lt;li&gt;Project materials&lt;/li&gt;
&lt;li&gt;Journals&lt;/li&gt;
&lt;li&gt;World-building&lt;/li&gt;
&lt;li&gt;User profiles&lt;/li&gt;
&lt;li&gt;Writing material&lt;/li&gt;
&lt;li&gt;Long-term knowledge bases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these can be stored as Markdown.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Computer&lt;/th&gt;
&lt;th&gt;AI Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hard Drive&lt;/td&gt;
&lt;td&gt;Markdown File System&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Markdown has one enormous advantage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It can be read by AI and directly by humans alike.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Humans can edit it&lt;/li&gt;
&lt;li&gt;AI can process it&lt;/li&gt;
&lt;li&gt;Git can version-control it&lt;/li&gt;
&lt;li&gt;Files can sync&lt;/li&gt;
&lt;li&gt;It persists even without AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A shared knowledge space between humans and AI."&lt;/p&gt;
&lt;/blockquote&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%2Foukjayt7amtx4cm9p9lt.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%2Foukjayt7amtx4cm9p9lt.png" alt="Markdown Storage" width="439" height="353"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 4: Skills — Software Installed on AI
&lt;/h1&gt;

&lt;p&gt;Future AI agents won't only have "knowledge."&lt;/p&gt;

&lt;p&gt;They'll also have "skills."&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing Skill&lt;/li&gt;
&lt;li&gt;Programming Skill&lt;/li&gt;
&lt;li&gt;Video Editing Skill&lt;/li&gt;
&lt;li&gt;Data Analysis Skill&lt;/li&gt;
&lt;li&gt;Project Management Skill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These Skills might be composed of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts&lt;/li&gt;
&lt;li&gt;Workflows&lt;/li&gt;
&lt;li&gt;Python code&lt;/li&gt;
&lt;li&gt;MCP configurations&lt;/li&gt;
&lt;li&gt;Tool invocation rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Software installed on the AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Computer&lt;/th&gt;
&lt;th&gt;AI Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Software / App&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Skills can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed&lt;/li&gt;
&lt;li&gt;Uninstalled&lt;/li&gt;
&lt;li&gt;Updated&lt;/li&gt;
&lt;li&gt;Shared&lt;/li&gt;
&lt;li&gt;Combined&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the future there may even be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skill Stores&lt;/li&gt;
&lt;li&gt;Skill Marketplaces&lt;/li&gt;
&lt;li&gt;Open-source Skill communities&lt;/li&gt;
&lt;/ul&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%2F91yavddt99leuhl1bl01.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%2F91yavddt99leuhl1bl01.png" alt="Skill Software" width="385" height="330"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 5: Input/Output — More Than Just Text
&lt;/h1&gt;

&lt;p&gt;One of the biggest misconceptions about traditional chatbots is that people think AI only communicates through text.&lt;/p&gt;

&lt;p&gt;In reality, future AI agents will have a complete multimodal I/O system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&gt;

&lt;p&gt;AI can read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;li&gt;Voice&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Video&lt;/li&gt;
&lt;li&gt;Camera feeds&lt;/li&gt;
&lt;li&gt;Files&lt;/li&gt;
&lt;li&gt;Screen content&lt;/li&gt;
&lt;li&gt;Device state&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Output
&lt;/h2&gt;

&lt;p&gt;AI can generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text&lt;/li&gt;
&lt;li&gt;Voice&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Video&lt;/li&gt;
&lt;li&gt;Automated actions&lt;/li&gt;
&lt;li&gt;Control commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An AI agent is fundamentally a new interaction layer.&lt;/p&gt;
&lt;/blockquote&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%2Fll7ci9420dt1807nagkx.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%2Fll7ci9420dt1807nagkx.png" alt="Multimodal IO" width="417" height="330"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Complete System: A "Von Neumann-style" AI Computer
&lt;/h1&gt;

&lt;p&gt;When you put the whole architecture together:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Computer&lt;/th&gt;
&lt;th&gt;AI Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;LLM Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard Drive&lt;/td&gt;
&lt;td&gt;Markdown File System&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input Device&lt;/td&gt;
&lt;td&gt;Multimodal Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output Device&lt;/td&gt;
&lt;td&gt;Multimodal Output&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You'll find:&lt;/p&gt;

&lt;p&gt;It increasingly resembles a real computer.&lt;/p&gt;

&lt;p&gt;Except:&lt;/p&gt;

&lt;p&gt;This computer isn't built around a GUI.&lt;/p&gt;

&lt;p&gt;It's built around:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Language comprehension and reasoning."&lt;/p&gt;
&lt;/blockquote&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%2Fh4xx6a75mho28opxcfka.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%2Fh4xx6a75mho28opxcfka.png" alt="AI Computer Architecture" width="400" height="355"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Operating System: A Personal AI OS
&lt;/h1&gt;

&lt;p&gt;In the future, every person's device may host a persistent AI Agent.&lt;/p&gt;

&lt;p&gt;One that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understands you&lt;/li&gt;
&lt;li&gt;Remembers you&lt;/li&gt;
&lt;li&gt;Helps you work&lt;/li&gt;
&lt;li&gt;Manages your knowledge&lt;/li&gt;
&lt;li&gt;Schedules your Skills&lt;/li&gt;
&lt;li&gt;Operates your devices&lt;/li&gt;
&lt;li&gt;Grows alongside you over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point:&lt;/p&gt;

&lt;p&gt;What we use might no longer just be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But rather:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A new kind of personal AI operating system, with LLM at its core.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the chat box we use today&lt;/p&gt;

&lt;p&gt;may only be the earliest prototype of this new era.&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%2Flw5dvvrl9vgc4srgu32i.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%2Flw5dvvrl9vgc4srgu32i.png" alt="Personal AI OS" width="405" height="366"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Park, Joon Sung et al.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;MemGPT: Towards LLMs as Operating Systems&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
arXiv:2310.08560&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2310.08560&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wang, Lei et al.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;LLM as OS, Agents as Apps: Envisioning AIOS, Agents and the AIOS-Agent Ecosystem&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
arXiv:2312.03815&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2312.03815" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2312.03815&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How AI Cured My Writing Procrastination</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Fri, 08 May 2026 06:21:19 +0000</pubDate>
      <link>https://forem.com/codeplato/how-ai-cured-my-writing-procrastination-44j7</link>
      <guid>https://forem.com/codeplato/how-ai-cured-my-writing-procrastination-44j7</guid>
      <description>&lt;h2&gt;
  
  
  A Procrastinator's Excuse
&lt;/h2&gt;

&lt;p&gt;I haven't written a blog post in years.&lt;/p&gt;

&lt;p&gt;Not because I had nothing to say — I just couldn't bring myself to do it. Writing used to take me at least a week per article: brainstorming, drafting, revising over and over, then hunting for images, drawing flowcharts in draw.io, dragging and dropping for half an hour just to get a box on screen. The whole process was slow and exhausting, and I gradually built up a real resistance to it. Every time I opened my editor, the first thought that crossed my mind wasn't "what should I write?" — it was "forget it, maybe another day."&lt;/p&gt;

&lt;p&gt;And another day turned into several years.&lt;/p&gt;

&lt;p&gt;It was only recently that I realized what had stopped me was never a lack of things to write about. It was that writing itself had become too &lt;em&gt;heavy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now AI has taken away a large part of that weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pain Points
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Turning ideas into coherent prose is hard&lt;/strong&gt;: I just need to articulate my thoughts, even roughly, and AI can organize them into flowing paragraphs. I control the direction and the perspective; it polishes the language. This division of labor suits me much better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding images is time-consuming, and they're often the wrong format or size&lt;/strong&gt;: Now I describe what I want and AI generates it — style, composition, everything — in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawing flowcharts is slow&lt;/strong&gt;: I describe the logic to AI and it generates the diagram directly. I just check if it's right and adjust if needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Setup
&lt;/h2&gt;

&lt;p&gt;I've built myself a small writing pipeline, centered around two AI roles.&lt;/p&gt;

&lt;p&gt;The first is the &lt;strong&gt;writer&lt;/strong&gt;. I throw my ideas, thoughts, and core points at it, and it turns those fragments into a complete first draft.&lt;/p&gt;

&lt;p&gt;Once the draft is ready, &lt;strong&gt;I edit it myself&lt;/strong&gt;. This step is crucial — don't underestimate your readers. The best articles are as short as possible, and most people these days (myself included) don't have the patience for a long read. Later is never.&lt;/p&gt;

&lt;p&gt;After editing, I hand it to the second AI role — the &lt;strong&gt;editor&lt;/strong&gt;. It reviews the article and does another round of polishing. Honestly, I'm not sure yet whether I need the editor role. I'll try it this way and see.&lt;/p&gt;

&lt;p&gt;I'm not sure how many more articles I'll write after this. But at least today, I opened my editor — and finished this one.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>[Enterprise Git Workflow Best Practice] Use a Sub-Project Branch When Developing Large Features</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Sat, 22 Mar 2025 20:15:47 +0000</pubDate>
      <link>https://forem.com/codeplato/enterprise-git-workflow-best-practice-use-a-sub-project-branch-when-developing-large-features-3a4a</link>
      <guid>https://forem.com/codeplato/enterprise-git-workflow-best-practice-use-a-sub-project-branch-when-developing-large-features-3a4a</guid>
      <description>&lt;p&gt;In a large project team, when developing major features, we may assign a few people to form a sub-project team. From the perspective of the overall project, this temporary group is working on a single, independent feature as a whole. However, within the temporary project, each member has their own sub-feature development tasks.  &lt;/p&gt;

&lt;p&gt;In this case, individual developers should not commit their code directly to the main development branch, such as &lt;code&gt;develop&lt;/code&gt; . Instead, a &lt;strong&gt;sub-project branch&lt;/strong&gt; should be created. Each team member commits their code to the &lt;strong&gt;sub-project branch&lt;/strong&gt; first, and at a designated point in time, the &lt;strong&gt;sub-project branch&lt;/strong&gt; is merged into the main development branch.&lt;/p&gt;

&lt;h1&gt;
  
  
  Terminology Definitions
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;feature branch:&lt;/strong&gt; A Git branch created when developing a new feature. Normally, only one person commits to this branch. You can also think of it as a personal branch. It is often named &lt;code&gt;feature/&amp;lt;feature-name&amp;gt;&lt;/code&gt; or &lt;code&gt;feature-&amp;lt;feature-name&amp;gt;&lt;/code&gt; &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%2F0g4rk8bn0b17gf0yhuvn.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%2F0g4rk8bn0b17gf0yhuvn.png" alt=" " width="151" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;sub-project branch:&lt;/strong&gt; When developing a large feature, a sub-project team consisting of several developers is formed. In this case, a larger development branch can be created for this sub-project. This branch can span multiple sprints. The sub-project developers first commit their changes to the project branch, and at a certain point in time, the project branch is merged into the main branch. The project branch can be named &lt;code&gt;feature/&amp;lt;sub-project-name&amp;gt;-&amp;lt;creation-date&amp;gt;&lt;/code&gt;.&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%2Fnvi7pubojh8eq3227lo4.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%2Fnvi7pubojh8eq3227lo4.png" alt=" " width="301" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Mistakes We Made with Sub-Project Branch
&lt;/h1&gt;

&lt;p&gt;Before writing on this topic, I assumed the use of sub-project branch was self-evident. However, after our team encountered several issues while using sub-project branches, we considered abandoning them. This led to even more problems, making me truly understand the importance of sub-project branch. As expected, the most profound realizations often come through mistakes.&lt;/p&gt;

&lt;p&gt;Below are the reasons we abandoned project branches. However, these reasons actually stemmed from incorrect usage rather than inherent flaws in project branches. Therefore, I will list the problems we encountered, along with the real causes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project branches made the code messy:&lt;/strong&gt; We had different versions of components across different project branches.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real Cause:&lt;/strong&gt; Excessive development branches led to code management chaos, especially when many branches remained unsynchronized for long periods, making the overall code structure complex.
&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%2Fcucatt6voafurzmc1g5w.png" alt=" " width="214" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Frequent conflicts during merges:&lt;/strong&gt; Every time we merged a project branch, we encountered numerous conflicts that were difficult to resolve. Sometimes, new bugs were introduced while resolving conflicts, such as accidentally deleting correct code.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real Cause:&lt;/strong&gt; Long periods without synchronization caused excessive conflicts during merging, increasing the effort required to resolve them. The correct approach is to synchronize from the &lt;code&gt;develop&lt;/code&gt;  branch to the &lt;code&gt;sub-project branch&lt;/code&gt; regularly.
&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%2Faxj4382ylx9sjq5voykh.png" alt=" " width="350" height="350"&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In reality, these issues were not intrinsic to project branches themselves.&lt;/p&gt;

&lt;h1&gt;
  
  
  Necessity of Sub-Project Branch
&lt;/h1&gt;

&lt;p&gt;Below are the key reasons for using project branches and best practices for managing them properly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check for conflicts before merging:&lt;/strong&gt; Fix the conflicts on the PR before merging.&lt;/li&gt;
&lt;/ul&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%2Fhodyhbp6lkmt0yxylm5u.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%2Fhodyhbp6lkmt0yxylm5u.png" alt=" " width="200" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate the testing process:&lt;/strong&gt; Notify the testing team before merging and ensure they have enough time to conduct tests.&lt;/li&gt;
&lt;/ul&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%2Ftunor9zcrdf4avb6j6t1.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%2Ftunor9zcrdf4avb6j6t1.png" alt=" " width="377" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Significantly reduce the difficulty of reverts:&lt;/strong&gt; If a branch contains only a single change, it minimizes coupling issues with other functionalities.&lt;/li&gt;
&lt;/ul&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%2Fxijxsy0zeoolihiqvtvt.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%2Fxijxsy0zeoolihiqvtvt.png" alt=" " width="408" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run automated tests on the project branch:&lt;/strong&gt; Write sanity tests specifically for the branch to ensure feature reliability before merging.&lt;/li&gt;
&lt;/ul&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%2F4pfngbtq5bijket7o3o4.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%2F4pfngbtq5bijket7o3o4.png" alt=" " width="350" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The develop branch is used more widely than you think:&lt;/strong&gt; The &lt;code&gt;develop&lt;/code&gt;  branch is not just for some engineers—others, including different engineering teams, may also rely on it.&lt;/li&gt;
&lt;/ul&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%2Fk98mp1sds69vpjc5qfmw.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%2Fk98mp1sds69vpjc5qfmw.png" alt=" " width="300" height="300"&gt;&lt;/a&gt;&lt;br&gt;
Even testers and product managers might use the &lt;code&gt;develop&lt;/code&gt;  branch.&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%2Fa4r18vh7awa3v4d2xpfq.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%2Fa4r18vh7awa3v4d2xpfq.png" alt=" " width="350" height="350"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Using project branches can maximize release stability, improve code traceability, enhance testing efficiency, and facilitate better team collaboration.&lt;/p&gt;

&lt;h1&gt;
  
  
  Best Practices for Using Sub-Project Branch
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Daily synchronization:&lt;/strong&gt; Keep merging the &lt;code&gt;develop&lt;/code&gt;  branch changes to Sub-project branch to avoid excessive conflicts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep sub-project branches short-lived:&lt;/strong&gt; Sub-project branches should not exist for too long (&lt;strong&gt;no more than 3 sprints&lt;/strong&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Squash merges:&lt;/strong&gt; Use &lt;code&gt;squash &amp;amp; merge&lt;/code&gt; when merging code to make all commits in 1 commit. Cause from the perspective of the &lt;code&gt;develop&lt;/code&gt; branch, this feature should have only one or a few commits.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F9nzy9addnwm8kk2z0jgl.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%2F9nzy9addnwm8kk2z0jgl.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep it clean:&lt;/strong&gt; &lt;strong&gt;Delete the sub-project branch after merging&lt;/strong&gt; to prevent unnecessary future commits.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>The Bicycle-shed effect</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Wed, 05 Mar 2025 19:50:05 +0000</pubDate>
      <link>https://forem.com/codeplato/the-bicycle-shed-effect-1mln</link>
      <guid>https://forem.com/codeplato/the-bicycle-shed-effect-1mln</guid>
      <description>&lt;h1&gt;
  
  
  The Definition
&lt;/h1&gt;

&lt;p&gt;The Law of triviality as known as the bicycle-shed effect. Quote from  wiki page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The law of triviality is C. Northcote Parkinson's 1957 argument that people within an organization commonly give disproportionate weight to trivial issues.[1] Parkinson provides the example of a fictional committee whose job was to approve the plans for a nuclear power plant spending the majority of its time on discussions about relatively minor but easy-to-grasp issues, such as what materials to use for the staff bicycle shed, while neglecting the proposed design of the plant itself, which is far more important and a far more difficult and complex task.&lt;/p&gt;

&lt;p&gt;The law has been applied to software development and other activities.[2] The terms bicycle-shed effect, bike-shed effect, and bike-shedding were coined based on Parkinson's example; it was popularized in the Berkeley Software Distribution community by the Danish software developer Poul-Henning Kamp in 1999[3] and, due to that, has since become popular within the field of software development generally. &lt;/p&gt;
&lt;/blockquote&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%2Fcc4w0jku749lyclxc2ku.jpg" 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%2Fcc4w0jku749lyclxc2ku.jpg" alt=" " width="600" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What do we use it?
&lt;/h1&gt;

&lt;p&gt;Here are some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☎️ Don’t get too hung up on details during a meeting. For example, don’t argue over the details of the prompts that should be displayed for this feature. Don’t even waste time on technical details. Meeting time is for everyone, not just a few people.&lt;/li&gt;
&lt;li&gt;🖱️ When searching for information on the Internet, don't be distracted by interesting little bits of knowledge, or even Google them. Try to be patient with your curiosity.&lt;/li&gt;
&lt;li&gt;📦 When developing a feature or product, don’t waste too much time polishing it before the first release. Fine-tune it after the release.&lt;/li&gt;
&lt;li&gt;🗄️ When using the four-quadrant work method, try not to waste time on urgent but unimportant tasks. Once you have solved a problem, move on to the next one and do not extend the time for that problem.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>[Copilot Extreme Practice Journal] DAY 1: Using Copilot to Generate Unit Tests Without Writing a Single Line of Code</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Tue, 04 Mar 2025 05:13:52 +0000</pubDate>
      <link>https://forem.com/codeplato/copilot-extreme-practice-journal-day-1-using-copilot-to-generate-unit-tests-without-writing-a-c29</link>
      <guid>https://forem.com/codeplato/copilot-extreme-practice-journal-day-1-using-copilot-to-generate-unit-tests-without-writing-a-c29</guid>
      <description>&lt;p&gt;This series is called "Extreme Practice" because I don't know if this is the best practice. I am currently trying to push &lt;code&gt;ChatGPT&lt;/code&gt; to the extreme, meaning almost all actual coding and writing tasks are delegated to &lt;code&gt;ChatGPT&lt;/code&gt; to see how much efficiency can be improved—or decreased.&lt;/p&gt;

&lt;h1&gt;
  
  
  Terminology Introduction
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Copilot&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Copilot&lt;/code&gt; is a chatbot developed by Microsoft that utilizes &lt;code&gt;ChatGPT&lt;/code&gt;. You can consider it a wrapper around &lt;code&gt;ChatGPT&lt;/code&gt;. It allows you to switch between different models, including Gemini, Claude, and &lt;code&gt;ChatGPT&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;GitHub Copilot&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GitHub Copilot&lt;/code&gt; is an AI coding assistant that integrates &lt;code&gt;Copilot&lt;/code&gt; into &lt;code&gt;GitHub&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;GitHub Copilot VSCode Plugin&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GitHub&lt;/code&gt; has developed a &lt;code&gt;Copilot&lt;/code&gt; plugin for &lt;code&gt;GitHub&lt;/code&gt;. This plugin enables programmers to use &lt;code&gt;Copilot&lt;/code&gt; within the IDE by connecting it to &lt;code&gt;GitHub Copilot&lt;/code&gt;. It currently supports &lt;code&gt;VSCode&lt;/code&gt; and IntelliJ.&lt;/p&gt;

&lt;h1&gt;
  
  
  Task Requirements
&lt;/h1&gt;

&lt;p&gt;Generating unit tests for UI components is always a painful task. Testing pure logic functions is straightforward—you just pass in parameters and verify the output. However, testing components requires setting up many variables needed for component loading and passing them to the component in different ways.&lt;/p&gt;

&lt;p&gt;Today is the first day of practice. I attempted to use &lt;code&gt;Copilot&lt;/code&gt; to generate a unit test for the Vue component &lt;code&gt;BenefitsAccordion&lt;/code&gt;. The requirements are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏳ Must be completed within 30 minutes.&lt;/li&gt;
&lt;li&gt;✅ The generated unit test must pass.&lt;/li&gt;
&lt;li&gt;🏆 The unit test must follow good coding practices.&lt;/li&gt;
&lt;li&gt;🙅‍♂️ I should not write any code; the task should be completed through conversation only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Execution Process
&lt;/h1&gt;

&lt;p&gt;I will use ✅ and ❌ and 🤔 to show how it is doing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If it work as my expect. I will give it a ✅&lt;/li&gt;
&lt;li&gt;If it doesn't work as expect. I will give it a ❌&lt;/li&gt;
&lt;li&gt;If I don't know whether it works well or not, I will give it a 🤔&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Initial Generation of Test Cases ✅
&lt;/h2&gt;

&lt;p&gt;I opened the &lt;code&gt;Copilot Edits&lt;/code&gt; panel:&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%2Ftoejt7vepuctv3d6yntj.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%2Ftoejt7vepuctv3d6yntj.png" alt=" " width="438" height="946"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I selected the file and told it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;/tests generate unit test for this file&lt;/p&gt;
&lt;/blockquote&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%2Frcbt45t5usxt1ree2xmq.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%2Frcbt45t5usxt1ree2xmq.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It generated a test file, but it did not recognize that my codebase is a monorepo (&lt;a href="https://medium.com/@magenta2127/monorepo-vs-multi-repo-vs-monolith-7c4a5f476009" rel="noopener noreferrer"&gt;Monorepo vs Multi-repo vs Monolith&lt;/a&gt;). The generated test file should be placed in the corresponding sub-repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Moving the Test Case ❌
&lt;/h2&gt;

&lt;p&gt;I instructed it to move the unit test to &lt;code&gt;apps/&amp;lt;sub-repo&amp;gt;/tests/unit&lt;/code&gt;. So I said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/workspace"&gt;@workspace&lt;/a&gt; app/xxx has its own tests folder. Move the unit test you just generated to that folder instead of tests/unit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It agreed and moved the file, but placed it in the root directory &lt;code&gt;/tests/unit&lt;/code&gt;, which is incorrect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Moving the Test Case Again ✅
&lt;/h2&gt;

&lt;p&gt;Since test cases should be placed according to the structure of the System Under Test (SUT), I said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't put it in the root of apps/ms/tests/unit. Place it according to the source code file structure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This time, it got it right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Move the unit test file for the BenefitsAccordion.vue component to the apps/ms/tests/unit/components/xxx/xxx folder to match the source code file structure. &lt;br&gt;
But there were many errors&lt;/p&gt;
&lt;/blockquote&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%2F6hk0lb3sdv74llpoov70.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%2F6hk0lb3sdv74llpoov70.png" alt=" " width="682" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Attempting to Fix the Test Case ❌
&lt;/h2&gt;

&lt;p&gt;I asked it to fix the errors in the unit test file:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the errors in the unit test file BenefitsAccordion.spec.ts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the errors in the unit test file for the BenefitsAccordion.vue component.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, the errors remained unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Directly Telling It How to Fix the Errors  ✅
&lt;/h2&gt;

&lt;p&gt;The errors were basic—missing imports for Vitest functions like &lt;code&gt;describe&lt;/code&gt; and &lt;code&gt;beforeEach&lt;/code&gt;. I explicitly pointed this out:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The errors in BenefitsAccordion are because you didn't import describe, beforeEach, etc., from Vitest.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This time, it understood:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix the errors by importing describe, beforeEach, it, and expect from Vitest.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 6: Specifying Which Methods to Test ✅
&lt;/h2&gt;

&lt;p&gt;It generated some unhelpful test cases, such as &lt;code&gt;it should render ...&lt;/code&gt;, which I consider meaningless. So, I told it explicitly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;/tests in BenefitsAccordion.spec.ts, only generate unit tests for methods xxx, xxx, xxx, xxx, xxx, xxx. Remove other tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It responded correctly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Generate unit tests only for the methods xxx, xxx, xxx, xxx, xxx, and xxx. Remove other unit tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 7: Categorizing Test Methods ✅
&lt;/h2&gt;

&lt;p&gt;A good practice is to group test cases using &lt;code&gt;describe()&lt;/code&gt;. I instructed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use describe to categorize unit tests by the methods being tested.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It got me&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Organize the unit tests using describe blocks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 8: Testing More Logical Paths ✅
&lt;/h2&gt;

&lt;p&gt;It only tested one path per method, but each method had at least two logical paths. I told it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You only test one path. Test more paths. For example, for xxx, test when xxx is true.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It got me&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add more test cases to cover different paths of the methods being tested.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 9: Manually Specifying a Missing Path 🤔
&lt;/h2&gt;

&lt;p&gt;One test path was still missing, so I explicitly pointed it out:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For planId, you didn’t test when planId is null.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add a test case for planId when planId is null.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 10: Running the Test Cases ❌
&lt;/h2&gt;

&lt;p&gt;I asked it to run the tests, but it said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Sorry, I can't assist with that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I ran them manually and found one failed test:&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%2F4w5fze3z2tz21w9bcxl1.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%2F4w5fze3z2tz21w9bcxl1.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 11: Fixing the Test Case ❌
&lt;/h2&gt;

&lt;p&gt;I asked it to fix the failing test:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The unit test "returns empty string when planId is null" failed, correct it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Correct the unit test "returns empty string when planId is null".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, the error persisted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 12: Attempting to Fix the Test Again ❌
&lt;/h2&gt;

&lt;p&gt;After multiple attempts, it still couldn't fix the test. I had to fix it manually, which violated my goal of not touching the code. Additionally, fixing one test caused five others to fail.&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%2F8gexxb0mbq012bizd38l.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%2F8gexxb0mbq012bizd38l.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 13: Ensuring Test Isolation ❌
&lt;/h2&gt;

&lt;p&gt;To prevent tests from affecting each other, I instructed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ensure each test runs with a clean component instance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It responded:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ensure each test runs with a new component instance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, it did not work, and the errors remained.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The experiment ultimately failed. The tests did not pass, and the situation worsened. I even had to intervene manually. In the end, I deleted the test file. Tomorrow, I will attempt a different approach.&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>chatgpt</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>Use watch as the last resort</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Sat, 01 Mar 2025 04:28:13 +0000</pubDate>
      <link>https://forem.com/codeplato/use-watch-as-the-last-resort-5d5d</link>
      <guid>https://forem.com/codeplato/use-watch-as-the-last-resort-5d5d</guid>
      <description>&lt;p&gt;We should avoid using &lt;code&gt;watch&lt;/code&gt; in Vue. I'm not saying it's bad; we should just treat &lt;code&gt;watch&lt;/code&gt; (and &lt;code&gt;watchEffect&lt;/code&gt;) as a last resort. &lt;code&gt;watch&lt;/code&gt; is a very reliable tool. It is the simplest and laziest way to achieve a function. It can almost guarantee 100% triggering, thus covering your needs. But the problem is that sometimes &lt;strong&gt;it covers too much&lt;/strong&gt;. &lt;code&gt;watch&lt;/code&gt; has the following disadvantages:&lt;/p&gt;

&lt;h2&gt;
  
  
  Disadvantages
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Implicit Dependency
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;watch&lt;/code&gt; creates an implicit dependency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An implicit dependency is a hidden relationship between components in a system where one component relies on another without being explicitly stated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An explicit dependency occurs when component A directly calls component D, making the relationship clear and easy to trace.&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%2F6hm56xh6s18jt6ekjff2.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%2F6hm56xh6s18jt6ekjff2.png" alt="Explicit Dependency" width="431" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Implicit dependency means that component A eventually calls component D in an unobvious way, creating a connection between them.&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%2Fyuzo6t0lnc6gnbjb0qt7.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%2Fyuzo6t0lnc6gnbjb0qt7.png" alt="Implicit dependency" width="478" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although explicit dependencies seem easier to maintain, a system full of them would lack flexibility. For example, &lt;code&gt;vue-router&lt;/code&gt; is an implicit dependency, and implicit dependencies are essential for building frameworks. However, using them in business code increases maintenance difficulty.&lt;/p&gt;

&lt;p&gt;Here is a great article that explains the disadvantages of implicit dependencies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.marktinderholt.com/software%20development/2024/12/10/avoid-side-effects.html" rel="noopener noreferrer"&gt;Side Effects in Code: Why They Matter and How to Avoid Them&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although this article does not explicitly mention &lt;code&gt;implicit dependencies&lt;/code&gt;, side effects are essentially how &lt;code&gt;watch&lt;/code&gt; operates in Vue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Side effects create implicit dependencies between components, increasing the chance of bugs. For instance, in our discussion, I noted: "If a method assumes that a specific member variable will be updated beforehand, you’ve built a trap for the next developer — or even for yourself six months later."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Difficult to Trace the Source of Changes
&lt;/h3&gt;

&lt;p&gt;When an error occurs, it is difficult to determine which piece of code initially triggered the change. If you are debugging in a local environment, it's easy to check the stack trace. But if you are troubleshooting on QA, CM, or PROD and are unaware of a &lt;code&gt;watch&lt;/code&gt;, debugging can become a nightmare.&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%2Fpbw93zjmxk6xg8zvoq44.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%2Fpbw93zjmxk6xg8zvoq44.png" alt=" " width="638" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A real-world example: while working on one of the page of our project, we encountered a defect that seemed to originate from the data initialization. However, we didn't realize that the data were initialized twice—once via a &lt;code&gt;watch&lt;/code&gt;. If both initializations worked correctly, the duplicate execution would go unnoticed. But when bugs inevitably appear, identifying the source of the error becomes critical in measuring code quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Creates Tight Coupling, Making Refactoring Difficult
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;watch&lt;/code&gt; can tightly couple different parts of the code. Initially, we knew that code A triggered code B through &lt;code&gt;watch&lt;/code&gt;. Over time, additional code was introduced—code C also triggered code B through &lt;code&gt;watch&lt;/code&gt;. Then, a third engineer, seeing the existing pattern, added code D, further expanding the web of dependencies. This results in increased coupling, making the code harder to maintain.&lt;/p&gt;

&lt;p&gt;This article discusses the dangers of tight coupling:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/pragmatic-programmers/code-coupling-reducing-dependency-in-your-code-ae21c4534295" rel="noopener noreferrer"&gt;Code Coupling: Reducing Dependency in Your Code&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You’ve no doubt encountered this effect: you make a change in one corner of the system and it breaks code in a far, far distant corner. You might not even spot such a defect, particularly if you don’t do extensive regression testing with each release. That, of course, means your unfortunate customer will likely be the one who spots the defect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A &lt;code&gt;watch&lt;/code&gt; is like a spider web—it captures any logic that falls into its scope. If you &lt;code&gt;watch&lt;/code&gt; a global variable, such as &lt;code&gt;savedSession&lt;/code&gt;, its impact could extend across the entire project.&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%2Fk927lzvlacdcaikvg2l1.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%2Fk927lzvlacdcaikvg2l1.png" alt=" " width="516" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A project with excessive &lt;code&gt;watch&lt;/code&gt; usage resembles the image above.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. May Cause Infinite Loops
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;watch&lt;/code&gt; A triggers &lt;code&gt;watch&lt;/code&gt; B, and &lt;code&gt;watch&lt;/code&gt; B triggers &lt;code&gt;watch&lt;/code&gt; A, you create an infinite loop.&lt;/p&gt;

&lt;p&gt;A real example: while developing &lt;code&gt;QuotesPage.vue&lt;/code&gt;, I was a big fan of &lt;code&gt;watch&lt;/code&gt; and added five or six of them on a single page. This led to an infinite loop when the page attempted a "relaxation" operation. At the time, there was no good way to suspend a watcher. See this answer from Evan You, the creator of Vue.js:&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%2F77gvs3d9nlwwjpv68c2g.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%2F77gvs3d9nlwwjpv68c2g.png" alt=" " width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only way to suspend a &lt;code&gt;watch&lt;/code&gt; is to include a conditional check. I had to add some variables like &lt;code&gt;watcherEnabled&lt;/code&gt; disable the &lt;code&gt;watch&lt;/code&gt; when necessary. After I stopped using &lt;code&gt;watch&lt;/code&gt;, I was able to say goodbye to this ugly workaround.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Hard to Read and Understand
&lt;/h3&gt;

&lt;p&gt;When reviewing the logic behind a &lt;code&gt;watch&lt;/code&gt;, you often need to navigate between multiple files or distant parts of the same file.&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%2Fgdic6ilxem6gcbdc7m7j.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%2Fgdic6ilxem6gcbdc7m7j.png" alt=" " width="248" height="1114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might need to jump across different areas of the project to understand the full logic flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Solutions
&lt;/h2&gt;

&lt;p&gt;There are better alternatives to &lt;code&gt;watch&lt;/code&gt;. Consider the following before using a watcher:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Directly call the method&lt;/strong&gt; if they are in the same component.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;&lt;code&gt;computed&lt;/code&gt;&lt;/strong&gt; properties if you only need to display something.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;custom events&lt;/strong&gt; to trigger methods in a parent component.&lt;/li&gt;
&lt;li&gt;Use lifecycle hooks like &lt;strong&gt;&lt;code&gt;app:rendered&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;page:start&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;definePageMeta&lt;/code&gt;&lt;/strong&gt; in Nuxt, or &lt;strong&gt;&lt;code&gt;onMounted&lt;/code&gt;&lt;/strong&gt; in Vue.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use &lt;code&gt;watch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Despite its drawbacks, &lt;code&gt;watch&lt;/code&gt; is still useful in some cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you need to update something, but &lt;strong&gt;custom events&lt;/strong&gt; cannot achieve the desired behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using &lt;code&gt;watch&lt;/code&gt; cautiously and considering alternatives first, you can write more maintainable and predictable Vue applications.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>cleancoding</category>
    </item>
    <item>
      <title>How to write elegant code 1: Keep the chain of event calls short</title>
      <dc:creator>code plato</dc:creator>
      <pubDate>Sat, 21 Dec 2024 18:21:12 +0000</pubDate>
      <link>https://forem.com/codeplato/how-to-write-elegant-code-1-keep-the-chain-of-event-calls-short-n8e</link>
      <guid>https://forem.com/codeplato/how-to-write-elegant-code-1-keep-the-chain-of-event-calls-short-n8e</guid>
      <description>&lt;h1&gt;
  
  
  The chain of event calls
&lt;/h1&gt;

&lt;p&gt;There are some scenarios we keep throw up the event to the parent component. Then it handle the event in the component far way from the component which raise the event&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%2F6cadn7wzd19zuywwx1qe.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%2F6cadn7wzd19zuywwx1qe.png" alt=" " width="211" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This has the following disadvantages&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switching between different component source code increase the difficulty of developing&lt;/li&gt;
&lt;li&gt;We coupling deeply these components. The architecture is fragile. If there is a component updated might break the event chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we calculate the distance of event calls chain in this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when the event is handled in the same component which fire it, the distance is 0&lt;/li&gt;
&lt;li&gt;if the event if handled in the parent component we plus 1 to the distance. For example, the event is handled by the parent component, the distance is 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the example above, the distance is 3&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%2Ffksgn9aeb2uexoz36mdj.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%2Ffksgn9aeb2uexoz36mdj.png" alt=" " width="211" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is hard to read if the distance is larger than 1. If it’s 3, you will need to switch 4 files to read the event call chain completely.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to fix it
&lt;/h1&gt;

&lt;p&gt;Put the even handler beside the event listener&lt;/p&gt;

&lt;h1&gt;
  
  
  Questions
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Q&lt;/strong&gt;: Will this cause a lot of duplicate code? &lt;strong&gt;A&lt;/strong&gt;: No. we can extract common code to composable or component to reuse the same code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Q&lt;/strong&gt;: Will this create a lot of duplicate components like modals? &lt;strong&gt;A&lt;/strong&gt;: No, make sure the component only be created when it's needed. For example if you are using &lt;code&gt;Vue.js&lt;/code&gt; use &lt;code&gt;v-if&lt;/code&gt; instead of &lt;code&gt;v-show&lt;/code&gt; for modal component to make sure it won’t be rendered when no needed. Also, use private variable instead of global variable to control if the modal is shown to make sure the toggle method will only trigger 1 modal to be open or close.&lt;/li&gt;
&lt;/ul&gt;

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