<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Neilton Rocha</title>
    <description>The latest articles on DEV Community by Neilton Rocha (@neilton_rocha_dev).</description>
    <link>https://dev.to/neilton_rocha_dev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3064002%2F15f7a3dd-4e2b-48ff-8b29-d6ec8391116c.jpg</url>
      <title>DEV Community: Neilton Rocha</title>
      <link>https://dev.to/neilton_rocha_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neilton_rocha_dev"/>
    <language>en</language>
    <item>
      <title>What should go into a Git commit when a coding agent writes the code?</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Tue, 18 Aug 2026 13:09:00 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/what-should-go-into-a-git-commit-when-a-coding-agent-writes-the-code-3h1</link>
      <guid>https://dev.to/neilton_rocha_dev/what-should-go-into-a-git-commit-when-a-coding-agent-writes-the-code-3h1</guid>
      <description>&lt;p&gt;A diff shows what changed. Agent-written code also needs context, verification results, human decisions, and known limits.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvugpv44x7oopwrlc6qix.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvugpv44x7oopwrlc6qix.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A coding agent can touch four files, generate a large diff, run several commands, and still leave the reviewer with the same unanswered question:&lt;/p&gt;

&lt;p&gt;Why should anyone trust this change?&lt;/p&gt;

&lt;p&gt;The diff shows the implementation. It does not show the original task, the reasoning behind the design, the checks that actually ran, or the parts that remain unverified.&lt;/p&gt;

&lt;p&gt;Writing code became cheaper. Reviewing the result did not.&lt;/p&gt;

&lt;p&gt;The diff is still necessary. It is no longer sufficient.&lt;/p&gt;

&lt;p&gt;For agent-written code, I think the permanent record should preserve the task, engineering intent, final change, verification evidence, and known limitations. Prompts, tool calls, intermediate attempts, and checkpoints belong somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The transcript is not the software history
&lt;/h2&gt;

&lt;p&gt;An agent session can contain a long sequence of exploratory work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prompt
Files inspected
Tool calls
Intermediate attempts
Failed tests
Checkpoints
Reverted changes
Final patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That record may help someone audit or reproduce the execution. It can also become very large, especially when an agent investigates several possible causes before settling on one implementation.&lt;/p&gt;

&lt;p&gt;Most of that material has no lasting value in the project history.&lt;/p&gt;

&lt;p&gt;A checkpoint helps restore an earlier state. A commit should explain a decision that remains useful after the session ends.&lt;/p&gt;

&lt;p&gt;The distinction is easier to see when the records are separated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENT EXECUTION
prompts
attempts
tool calls
checkpoints
        ↓
observability

ACCEPTED CHANGE
task
intent
diff
verification
limitations
        ↓
Git

REVIEW DECISION
review
approval
        ↓
pull request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution record answers, "What did the agent do?"&lt;/p&gt;

&lt;p&gt;The Git commit answers, "What change did the project accept?"&lt;/p&gt;

&lt;p&gt;The pull request answers, "Who reviewed and approved it, and under what conditions?"&lt;/p&gt;

&lt;p&gt;Those are related questions, but they do not need the same document.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is no longer only an individual workflow
&lt;/h2&gt;

&lt;p&gt;Coding agents can now investigate issues, modify repositories, execute verification commands, and prepare pull requests.&lt;/p&gt;

&lt;p&gt;That workflow is moving beyond a developer working alone in a local checkout. Spotify has described its background coding agent, Honk, operating through an internal engineering platform. The company reported more than 1,500 AI-generated pull requests merged through that platform and later described the context and feedback loops needed to make those changes reliable.&lt;/p&gt;

&lt;p&gt;Amazon Q Developer follows a similar issue-driven workflow. According to AWS documentation, it can work from a GitHub issue, implement a change, and open a pull request for review. The implementation and the review remain separate steps.&lt;/p&gt;

&lt;p&gt;At that scale, producing a patch becomes less of a constraint. The harder question is what evidence an organization should require before accepting it.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://engineering.atspotify.com/2025/06/honk-background-coding-agent" rel="noopener noreferrer"&gt;Spotify Engineering: Honk&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/software-dev.html" rel="noopener noreferrer"&gt;AWS documentation for Amazon Q Developer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the diff leaves out
&lt;/h2&gt;

&lt;p&gt;A hypothetical payment bug makes the gap concrete.&lt;/p&gt;

&lt;p&gt;Suppose an issue called &lt;code&gt;ENG-412&lt;/code&gt; reports duplicate payment processing. An agent investigates the worker, the Redis lock, and the webhook handler. It tries one implementation, changes a test, reverts that approach, and produces a final patch involving four files.&lt;/p&gt;

&lt;p&gt;The final diff may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4 files changed
87 insertions
31 deletions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That summary tells the reviewer how large the patch is. It does not answer the questions that affect acceptance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What behavior was supposed to change?&lt;/li&gt;
&lt;li&gt;Which test reproduced the original failure?&lt;/li&gt;
&lt;li&gt;Did the agent change an existing test?&lt;/li&gt;
&lt;li&gt;Why does the implementation use a Redis idempotency lock?&lt;/li&gt;
&lt;li&gt;Which commands ran against the final version?&lt;/li&gt;
&lt;li&gt;What was not tested?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful commit does not need to preserve every failed attempt. It does need to retain the information required to understand the accepted decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification should come from the repository
&lt;/h2&gt;

&lt;p&gt;The agent can propose a solution and run commands. The repository tools remain the source of truth for compilation, linting, and tests.&lt;/p&gt;

&lt;p&gt;That means the commit or pull request should record the commands and their actual output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest tests/payments/
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
mypy src/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verification:
- pytest tests/payments/: 142 passed
- ruff check .: passed
- mypy src/: passed
- existing tests modified: no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These results are illustrative. The real values must come from the repository where the change was made.&lt;/p&gt;

&lt;p&gt;The tool name is useful for provenance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generated with Claude Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does not establish correctness. A &lt;code&gt;Co-authored-by&lt;/code&gt; trailer can satisfy an internal attribution or audit requirement, but it does not replace test output.&lt;/p&gt;

&lt;p&gt;The evidence should also state what did not run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Not run:
- end-to-end tests require a local payment provider
- load tests were not executed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That small section makes the boundary of the verification explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passing tests does not settle the whole question
&lt;/h2&gt;

&lt;p&gt;An agent can change the implementation and the tests. That creates a review point that should never remain implicit.&lt;/p&gt;

&lt;p&gt;A test may have changed because the expected behavior was wrong. It may also have changed because the agent adjusted the test until the implementation passed.&lt;/p&gt;

&lt;p&gt;The reviewer needs to know which happened.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verification:
- tests added: tests/payments/test_idempotency.py
- existing tests modified: no
- tests removed: no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an existing test changes, explain why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Existing test modified:
- updated the fixture to match the payment provider's documented
  duplicate webhook response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A green test suite is evidence about the cases covered by that suite. It does not establish that every relevant behavior is correct.&lt;/p&gt;

&lt;p&gt;The discussion around &lt;a href="https://arxiv.org/abs/2503.15223" rel="noopener noreferrer"&gt;SWE-bench&lt;/a&gt; includes examples of patches that pass available tests while failing broader evaluation. That is one reason the accepted record should include scope and limitations, not only a green status.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical contract for the commit
&lt;/h2&gt;

&lt;p&gt;I would keep the permanent record small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task
Intent
Change
Verification
Limitations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Task
&lt;/h3&gt;

&lt;p&gt;State where the work came from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refs: ENG-412
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might point to an issue, an incident, or a technical specification. The purpose is to let a future reader recover the original problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intent
&lt;/h3&gt;

&lt;p&gt;Describe the engineering decision in one or two sentences.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use a Redis-backed idempotency lock so duplicate webhooks do not
create multiple payment records across worker instances.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more useful than documenting the entire chain of prompts that led to the decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change
&lt;/h3&gt;

&lt;p&gt;The diff remains the central artifact. Keep the scope reviewable.&lt;/p&gt;

&lt;p&gt;An agent can produce a large patch quickly, but the cost of understanding that patch still falls on the reviewer. If a small issue creates thousands of changed lines, the commit should explain why or be split before review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Record the commands and the results from the final state of the repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verification:
- pytest tests/payments/: 142 passed
- ruff check .: passed
- mypy src/: passed
- existing tests modified: no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;p&gt;State where the verification stops:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Limitations:
- provider sandbox was unavailable locally
- concurrency was checked with unit tests only
- production load characteristics were not measured
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A limitation does not weaken the record. It defines the boundary of the claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pull request records acceptance
&lt;/h2&gt;

&lt;p&gt;The commit and the pull request should not carry the same information.&lt;/p&gt;

&lt;p&gt;The commit should remain useful when someone reads it months later, outside the original review conversation. The pull request can hold the discussion around acceptance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reviewed:
- payment idempotency behavior
- migration compatibility
- test coverage

Open risk:
- production concurrency was not measured

Approved by: [reviewer]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is where reviewer questions, requested changes, follow-up work, and the final approval belong.&lt;/p&gt;

&lt;p&gt;The agent may have produced the implementation. A human still decides whether the project should accept it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where execution history can live
&lt;/h2&gt;

&lt;p&gt;There are legitimate reasons to preserve the agent's execution history.&lt;/p&gt;

&lt;p&gt;A regulated environment may need an audit trail. A team may want to study failed attempts. An observability system may capture prompts, tool calls, repository state, and command output for debugging.&lt;/p&gt;

&lt;p&gt;Those records can be valuable without becoming part of every Git commit.&lt;/p&gt;

&lt;p&gt;The useful boundary is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Execution evidence → accepted change → human acceptance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution log supports the change. The commit describes the change. The pull request records the acceptance decision.&lt;/p&gt;

&lt;p&gt;Antigravity CLI's &lt;a href="https://www.agy.dev/docs/cli/features" rel="noopener noreferrer"&gt;checkpointing documentation&lt;/a&gt; illustrates why checkpoints belong to the execution layer. They help restore a previous state while work is in progress. They are not automatically the right explanation for a change that remains in the repository.&lt;/p&gt;

&lt;p&gt;Worktrees have a similar limit. They isolate parallel execution, but isolation does not provide verification, review, or acceptance.&lt;/p&gt;

&lt;h2&gt;
  
  
  A commit template for agent-written code
&lt;/h2&gt;

&lt;p&gt;A practical template could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix duplicate payment processing

Refs: ENG-412

Intent:
Use a Redis-backed idempotency lock so duplicate webhooks do not
create multiple payment records across worker instances.

Verification:
- pytest tests/payments/: 142 passed
- ruff check .: passed
- mypy src/: passed
- existing tests modified: no

Limitations:
- provider sandbox unavailable locally
- concurrency checked with unit tests only
- production load not measured
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The template does not attempt to reconstruct the agent's entire thought process. It records the information a maintainer needs to evaluate the accepted result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Known limit
&lt;/h2&gt;

&lt;p&gt;This format cannot compensate for incomplete requirements, weak tests, or behavior that only appears under production load.&lt;/p&gt;

&lt;p&gt;Some changes will need a design document, an incident record, a security review, or a separate audit trail. The commit remains one part of that system.&lt;/p&gt;

&lt;p&gt;Its job is narrower: preserve the engineering decision, the evidence available at acceptance time, and the limitations that future readers should not have to rediscover.&lt;/p&gt;

&lt;p&gt;Agents make patches cheap. The decision to accept a patch still requires engineering judgment.&lt;/p&gt;

&lt;p&gt;Git history should preserve that decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/using-git-with-coding-agents/" rel="noopener noreferrer"&gt;Simon Willison: Using Git with coding agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mitchellh.com/writing/my-ai-adoption-journey" rel="noopener noreferrer"&gt;Mitchell Hashimoto: My AI Adoption Journey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.atspotify.com/2025/06/honk-background-coding-agent" rel="noopener noreferrer"&gt;Spotify Engineering: Honk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/software-dev.html" rel="noopener noreferrer"&gt;AWS: Amazon Q Developer documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.agy.dev/docs/cli/features" rel="noopener noreferrer"&gt;Antigravity CLI: Checkpointing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2503.15223" rel="noopener noreferrer"&gt;Are "Solved Issues" in SWE-bench Really Solved Correctly?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>codingagents</category>
      <category>softwareengineering</category>
      <category>git</category>
    </item>
    <item>
      <title>Building a company in 2026: What I’m learning along the way</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Mon, 03 Aug 2026 23:55:20 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/building-a-company-in-2026-what-im-learning-along-the-way-15n5</link>
      <guid>https://dev.to/neilton_rocha_dev/building-a-company-in-2026-what-im-learning-along-the-way-15n5</guid>
      <description>&lt;p&gt;I have spent the last 18 years working in technology, including around six years as a CTO in startups.&lt;/p&gt;

&lt;p&gt;Architecture, cloud infrastructure, engineering teams, incidents, and delivery deadlines are familiar to me. This is also my second time as a co-founder, but my role is different now.&lt;/p&gt;

&lt;p&gt;At CatechLabs, I work across product, sales, customer discovery, positioning, partnerships, and strategy.&lt;/p&gt;

&lt;p&gt;That shift made something clear: knowing how to build software is not the same as knowing how to build a company.&lt;/p&gt;

&lt;p&gt;I am still learning the second part.&lt;/p&gt;

&lt;p&gt;We talk to customers, test ideas, send proposals, adjust the scope, and learn from what does not work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building is no longer the main bottleneck
&lt;/h2&gt;

&lt;p&gt;In 2026, creating software is much faster than it was a few years ago.&lt;/p&gt;

&lt;p&gt;AI helps with research, prototypes, interfaces, code, documentation, and integrations. A small team can now build in days what might previously have taken months.&lt;/p&gt;

&lt;p&gt;Because software is easier to build, it is tempting to treat shipping as progress. A working prototype does not prove that there is a business behind it.&lt;/p&gt;

&lt;p&gt;Many products use the same models, interfaces, and promises. Building is easier; finding a real problem and earning trust are not.&lt;/p&gt;

&lt;p&gt;My instinct as an engineer is still to start solving immediately. Now I first try to understand who has the problem, what it costs, whether it is a priority, and who has the authority to buy.&lt;/p&gt;

&lt;p&gt;It is possible to build the wrong product very efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning to listen first
&lt;/h2&gt;

&lt;p&gt;One of the most useful parts of this journey has been spending time with customers and the people who run the processes we want to improve.&lt;/p&gt;

&lt;p&gt;Not to present the product. Just to understand how the work happens today.&lt;/p&gt;

&lt;p&gt;I look for where time is lost, which steps are manual, where mistakes happen, and what result would justify changing the current process.&lt;/p&gt;

&lt;p&gt;Customers are often polite. They may praise a demonstration or say they would use the product. That does not mean they will buy.&lt;/p&gt;

&lt;p&gt;The stronger signals are urgency, budget, access to the decision-maker, willingness to run a pilot, and commitment to changing the process.&lt;/p&gt;

&lt;p&gt;Sales conversations have also become a source of product information. Objections show what is unclear. Unanswered proposals and lost opportunities often reveal problems with urgency, positioning, price, or trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Claude question
&lt;/h2&gt;

&lt;p&gt;During a customer conversation, someone asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why should we pay for your platform instead of simply giving our team access to Claude?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My first instinct was technical. I thought about retrieval, permissions, orchestration, integrations, security, and data architecture.&lt;/p&gt;

&lt;p&gt;Those points were relevant, but they did not answer the real question. The customer wanted to know what would change in the operation.&lt;/p&gt;

&lt;p&gt;That conversation changed how we explained the product. Instead of starting with models and agents, we started with the workflow.&lt;/p&gt;

&lt;p&gt;People were manually collecting information, reviewing documents, checking inconsistencies, and repeating similar analyses across multiple cases.&lt;/p&gt;

&lt;p&gt;The value was not access to an AI model. It was making that process faster, more consistent, traceable, and easier to review.&lt;/p&gt;

&lt;p&gt;We gave less attention to generic chat features and more attention to structured workflows, audit trails, integrations, and human validation.&lt;/p&gt;

&lt;p&gt;A general AI tool can help one person complete a task. A business system needs to make that process work repeatedly across a team.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am studying
&lt;/h2&gt;

&lt;p&gt;As part of this transition, I have been studying areas that were less central to my work as a CTO.&lt;/p&gt;

&lt;p&gt;Some of the books that keep coming up in conversations with founders are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/dp/1492180742" rel="noopener noreferrer"&gt;The Mom Test&lt;/a&gt;, by Rob Fitzpatrick&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/dp/0063046067" rel="noopener noreferrer"&gt;Build&lt;/a&gt;, by Tony Fadell&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/dp/1119836115" rel="noopener noreferrer"&gt;Amp It Up&lt;/a&gt;, by Frank Slootman&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also follow &lt;a href="https://www.lennysnewsletter.com/" rel="noopener noreferrer"&gt;Lenny’s Newsletter&lt;/a&gt;, which shares practical lessons on product, growth, leadership, and company building.&lt;/p&gt;

&lt;p&gt;None of these references provides a formula.&lt;/p&gt;

&lt;p&gt;They help me ask better questions, avoid obvious mistakes, and learn faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Building software is faster than ever.&lt;/p&gt;

&lt;p&gt;Building something valuable is still difficult.&lt;/p&gt;

&lt;p&gt;That is what I am learning now: how to move beyond technology and build the company around it.&lt;/p&gt;

&lt;p&gt;CatechLabs is still early, and I am documenting the lessons as we build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://catechlabs.com.br/en" rel="noopener noreferrer"&gt;Visit CatechLabs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>founder</category>
      <category>focus</category>
      <category>schedule</category>
      <category>product</category>
    </item>
    <item>
      <title>If you knew how hard It was, would you still start?</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sun, 21 Jun 2026 22:03:31 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/if-you-knew-how-hard-it-was-would-you-still-start-40fn</link>
      <guid>https://dev.to/neilton_rocha_dev/if-you-knew-how-hard-it-was-would-you-still-start-40fn</guid>
      <description>&lt;p&gt;The most honest thing I read about building a company this year wasn't from a venture capitalist, a founder on stage, or a bestselling business book. It came from a MicroSaaS founder who wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If I knew how hard it would be to be an entrepreneur, I wouldn't have started."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not a marketing line. &lt;strong&gt;It is an operational truth.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are sold a romanticized version of entrepreneurship. We see the funding announcement, the acquisition, the viral launch, the successful exit. We see the highlight reel and assume success happens on a specific day. But companies are not built on days of victory. They are built on ordinary days when nobody is watching.&lt;/p&gt;

&lt;p&gt;The real victory is not becoming the entrepreneur people admire. It is the accumulation of thousands of decisions made under uncertainty, pressure, and incomplete information.&lt;/p&gt;

&lt;h2&gt;
  
  
  The vision trap
&lt;/h2&gt;

&lt;p&gt;One of the biggest misconceptions about entrepreneurship is the belief that vision is the primary driver of success. &lt;strong&gt;Vision matters, but it is often overrated.&lt;/strong&gt; What matters more is what happens after the excitement fades.&lt;/p&gt;

&lt;p&gt;Every founder starts with optimism. Most have a roadmap. Many have capital. Some have exceptional products. The hard moments arrive regardless.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I've seen months of work become irrelevant because a market assumption was wrong. &lt;/li&gt;
&lt;li&gt;I've watched key contributors leave at the worst possible moment. &lt;/li&gt;
&lt;li&gt;I've experienced launches that generated almost no response after weeks of preparation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those situations cared about the original vision. They only tested whether the team would continue executing anyway.&lt;/p&gt;

&lt;p&gt;This is where a different trait becomes important. Not vision. Not intelligence. Not even creativity. &lt;strong&gt;Stomach.&lt;/strong&gt; The ability to keep moving when conditions are far from ideal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Key Takeaway:&lt;/strong&gt; most startups do not die because they run out of ideas. They die because founders run out of emotional endurance. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The market rarely rewards the smartest person in the room. More often, it rewards the person who can absorb uncertainty for longer than everyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stomach Is a competitive advantage
&lt;/h2&gt;

&lt;p&gt;Many people treat resilience as a personality trait. It is not. &lt;strong&gt;It is a skill.&lt;/strong&gt; Like any skill, it is developed through repetition.&lt;/p&gt;

&lt;p&gt;You build it by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making difficult decisions.&lt;/li&gt;
&lt;li&gt;Shipping despite imperfection.&lt;/li&gt;
&lt;li&gt;Facing rejection, setbacks, delays, and unexpected problems without allowing them to stop execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why waiting for the perfect moment is such a dangerous strategy. There is no perfect moment. There is only the next decision. The market does not validate what is planned. &lt;strong&gt;It validates what is launched.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Victory is a process
&lt;/h2&gt;

&lt;p&gt;Most founders make a mistake when defining success. They treat success as a destination: An exit, an IPO, a valuation milestone, or a specific revenue target. The problem is that these moments are rare. If those are the only victories you recognize, the journey becomes emotionally unsustainable.&lt;/p&gt;

&lt;p&gt;A healthier perspective is recognizing that victory happens throughout the process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When you ship a feature&lt;/strong&gt; that reduces churn by 1%, &lt;em&gt;that is a victory.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When you solve a critical production issue&lt;/strong&gt; before customers notice, &lt;em&gt;that is a victory.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When you have a difficult conversation&lt;/strong&gt; with a customer and learn something valuable, &lt;em&gt;that is a victory.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When you make a hard hiring decision&lt;/strong&gt; that protects the company long-term, &lt;em&gt;that is a victory.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small wins are not distractions from success. &lt;strong&gt;They are success.&lt;/strong&gt; The visible outcome is simply the accumulation of hundreds of invisible victories.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real combination of factors
&lt;/h2&gt;

&lt;p&gt;Building a company is not a linear sequence of product, engineering, marketing, and sales. It is a balancing act between constraints. Eventually, everyone is managing the same variables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time availability:&lt;/strong&gt; the finite window to achieve product-market fit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial runway:&lt;/strong&gt; the literal burn rate limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotional endurance:&lt;/strong&gt; the capacity to make high-stakes decisions under stress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution speed:&lt;/strong&gt; how fast cycles of feedback turn into code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability to recover:&lt;/strong&gt; the MTTR (Mean Time to Recover) after a strategic or technical setback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ignoring any one of these creates fragility. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You cannot compensate for a lack of execution with more planning.&lt;/li&gt;
&lt;li&gt;You cannot compensate for a lack of endurance with a better idea.&lt;/li&gt;
&lt;li&gt;You cannot compensate for repeated failure to recover by working harder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The strongest founders are not necessarily the most talented. They are often the ones who recover the fastest and continue moving forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actionable shift
&lt;/h2&gt;

&lt;p&gt;If success is not about waiting for the perfect moment, what should founders and builders do instead?&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Stop optimizing for ideal conditions
&lt;/h3&gt;

&lt;p&gt;The ideal conditions rarely arrive.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Treat difficulty as part of the job description
&lt;/h3&gt;

&lt;p&gt;A crisis is not evidence that something is wrong. It is evidence that you are building something real. Technical failures, hiring mistakes, customer churn, cash flow pressure, and competitive threats are not exceptions—&lt;strong&gt;they are standard operating conditions.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Measure progress daily
&lt;/h3&gt;

&lt;p&gt;Ask yourself every day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Did you ship the code?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Did you talk to customers?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Did you improve the product?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Did you make the difficult decision you were avoiding?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those actions matter more than most founders realize because entrepreneurship is a continuous process of building the capacity to operate under uncertainty. &lt;/p&gt;

&lt;p&gt;Most people think entrepreneurship is a test of intelligence. It is usually a test of endurance. The market does not reward the founder with the best idea. It rewards the founder who remains in the arena long enough to make the idea work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vision may start a company. Stomach is what keeps it alive.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Let's keep it real in the comments:
&lt;/h3&gt;

&lt;p&gt;Building a company is a balancing act of trade-offs. We often trap ourselves trying to optimize the wrong things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, where are you investing your stomach right now?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beautiful Code&lt;/strong&gt; (The engineering dream: clean architecture, perfect test coverage, scalable infrastructure) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vs. Beautiful Product&lt;/strong&gt; (The market reality: shipping features fast, hacking a Monolith, validating with real users before the runway ends)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;How do you balance your &lt;strong&gt;financial runway&lt;/strong&gt; with your &lt;strong&gt;emotional endurance&lt;/strong&gt; when you know the code isn't perfect, but it needs to go live?&lt;/li&gt;
&lt;li&gt;What is one difficult product or technical decision you’ve been avoiding that you need to execute on today?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Drop your frameworks, battles, and thoughts below. 👇&lt;/p&gt;

</description>
      <category>startup</category>
      <category>entrepreneurship</category>
      <category>business</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Stop reading to build a library. Start reading to solve a problem.</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sun, 21 Jun 2026 00:11:41 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/stop-reading-to-build-a-library-start-reading-to-solve-a-problem-55ag</link>
      <guid>https://dev.to/neilton_rocha_dev/stop-reading-to-build-a-library-start-reading-to-solve-a-problem-55ag</guid>
      <description>&lt;p&gt;Most engineering reading lists are optimized for knowledge accumulation.&lt;/p&gt;

&lt;p&gt;Modern engineering rewards bottleneck elimination.&lt;/p&gt;

&lt;p&gt;Last week, a junior engineer showed me a "Top 10 Books Every Engineer Should Read" list. It looked almost identical to the lists I saw ten years ago.&lt;/p&gt;

&lt;p&gt;The same classics.&lt;/p&gt;

&lt;p&gt;The same process books.&lt;/p&gt;

&lt;p&gt;The same assumption:&lt;/p&gt;

&lt;p&gt;Read enough books and you'll become a better engineer.&lt;/p&gt;

&lt;p&gt;That's not how most high-performing teams learn.&lt;/p&gt;

&lt;p&gt;The best engineers I know don't build learning plans around books.&lt;/p&gt;

&lt;p&gt;They build learning plans around constraints.&lt;/p&gt;

&lt;p&gt;The Problem with standard reading lists&lt;/p&gt;

&lt;p&gt;Most reading lists assume that knowledge is universally valuable.&lt;/p&gt;

&lt;p&gt;In practice, engineering value is highly contextual.&lt;/p&gt;

&lt;p&gt;A backend engineer struggling with database contention does not need another chapter on Agile.&lt;/p&gt;

&lt;p&gt;A team spending thousands of dollars per month on LLM inference does not need a generic software craftsmanship book.&lt;/p&gt;

&lt;p&gt;A startup fighting latency issues does not need a leadership framework.&lt;/p&gt;

&lt;p&gt;They need solutions to the bottleneck directly in front of them.&lt;/p&gt;

&lt;p&gt;Reading lists rarely account for this.&lt;/p&gt;

&lt;p&gt;They optimize for completeness.&lt;/p&gt;

&lt;p&gt;Engineering rewards relevance.&lt;/p&gt;

&lt;p&gt;The Shift Most Engineers Miss&lt;/p&gt;

&lt;p&gt;The fundamentals still matter.&lt;/p&gt;

&lt;p&gt;Distributed systems matter.&lt;/p&gt;

&lt;p&gt;Databases matter.&lt;/p&gt;

&lt;p&gt;Networking matters.&lt;/p&gt;

&lt;p&gt;Operating systems matter.&lt;/p&gt;

&lt;p&gt;They are not obsolete.&lt;/p&gt;

&lt;p&gt;But they are no longer sufficient.&lt;/p&gt;

&lt;p&gt;Modern systems introduce constraints that barely existed a few years ago:&lt;/p&gt;

&lt;p&gt;AI inference costs&lt;br&gt;
Context window limitations&lt;br&gt;
Agent orchestration&lt;br&gt;
Evaluation pipelines&lt;br&gt;
Semantic caching&lt;br&gt;
Non-deterministic workflows&lt;br&gt;
Model routing&lt;br&gt;
Human-in-the-loop systems&lt;/p&gt;

&lt;p&gt;Many traditional reading lists never touch these problems.&lt;/p&gt;

&lt;p&gt;Yet these are exactly the problems teams are solving every day.&lt;/p&gt;

&lt;p&gt;The challenge is no longer simply writing correct software.&lt;/p&gt;

&lt;p&gt;The challenge is building reliable systems on top of components that are inherently probabilistic.&lt;/p&gt;

&lt;p&gt;What Changed&lt;/p&gt;

&lt;p&gt;For decades, engineers mostly worked with deterministic systems.&lt;/p&gt;

&lt;p&gt;Given the same input, the same code produced the same output.&lt;/p&gt;

&lt;p&gt;Today, many production systems contain components that behave differently.&lt;/p&gt;

&lt;p&gt;A prompt may generate different responses.&lt;/p&gt;

&lt;p&gt;An agent may choose different execution paths.&lt;/p&gt;

&lt;p&gt;A model upgrade may change behavior without changing your application code.&lt;/p&gt;

&lt;p&gt;The architecture challenges become different:&lt;/p&gt;

&lt;p&gt;How do you evaluate quality?&lt;br&gt;
How do you measure reliability?&lt;br&gt;
How do you observe failures?&lt;br&gt;
How do you control costs?&lt;br&gt;
How do you debug probabilistic behavior?&lt;/p&gt;

&lt;p&gt;These are not edge cases anymore.&lt;/p&gt;

&lt;p&gt;They are becoming part of everyday engineering.&lt;/p&gt;

&lt;p&gt;Read for Mechanisms, Not for Completion&lt;/p&gt;

&lt;p&gt;Most engineers read cover to cover.&lt;/p&gt;

&lt;p&gt;The strongest engineers read for mechanisms.&lt;/p&gt;

&lt;p&gt;When they encounter a bottleneck, they identify the underlying mechanism and learn exactly what is needed.&lt;/p&gt;

&lt;p&gt;If latency becomes a problem:&lt;/p&gt;

&lt;p&gt;Study batching.&lt;br&gt;
Study caching.&lt;br&gt;
Study asynchronous execution.&lt;/p&gt;

&lt;p&gt;If context becomes a problem:&lt;/p&gt;

&lt;p&gt;Study retrieval.&lt;br&gt;
Study chunking.&lt;br&gt;
Study memory architectures.&lt;/p&gt;

&lt;p&gt;If agents become unreliable:&lt;/p&gt;

&lt;p&gt;Study evaluation.&lt;br&gt;
Study state management.&lt;br&gt;
Study workflow orchestration.&lt;/p&gt;

&lt;p&gt;Learning becomes directly connected to production outcomes.&lt;/p&gt;

&lt;p&gt;Knowledge is immediately converted into leverage.&lt;/p&gt;

&lt;p&gt;The Learning Loop That Actually Scales&lt;/p&gt;

&lt;p&gt;The most effective learning loop I've observed is simple:&lt;/p&gt;

&lt;p&gt;Identify the bottleneck.&lt;br&gt;
Find the mechanism behind it.&lt;br&gt;
Study only what is necessary.&lt;br&gt;
Apply immediately.&lt;br&gt;
Measure results.&lt;br&gt;
Repeat.&lt;/p&gt;

&lt;p&gt;This approach compounds much faster than consuming books for the sake of completion.&lt;/p&gt;

&lt;p&gt;Because the goal is not to finish a reading list.&lt;/p&gt;

&lt;p&gt;The goal is to improve the system.&lt;/p&gt;

&lt;p&gt;The Practical Test&lt;/p&gt;

&lt;p&gt;Before starting your next book, ask a different question:&lt;/p&gt;

&lt;p&gt;What is the biggest constraint in my current system?&lt;/p&gt;

&lt;p&gt;Latency?&lt;/p&gt;

&lt;p&gt;Cost?&lt;/p&gt;

&lt;p&gt;Reliability?&lt;/p&gt;

&lt;p&gt;Observability?&lt;/p&gt;

&lt;p&gt;Evaluation?&lt;/p&gt;

&lt;p&gt;Now find the best resource for that specific problem.&lt;/p&gt;

&lt;p&gt;Not the most popular resource.&lt;/p&gt;

&lt;p&gt;Not the resource everyone recommends.&lt;/p&gt;

&lt;p&gt;The resource that directly attacks the bottleneck.&lt;/p&gt;

&lt;p&gt;Because engineering is not a reading competition.&lt;/p&gt;

&lt;p&gt;It's a constraint-solving profession.&lt;/p&gt;

&lt;p&gt;The system should dictate what you learn next.&lt;/p&gt;

&lt;p&gt;Not a list.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>software</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SEO Isn't Dead — But GEO Is already eating Its lunch</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sat, 20 Jun 2026 01:43:42 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/seo-isnt-dead-but-geo-is-already-eating-its-lunch-pon</link>
      <guid>https://dev.to/neilton_rocha_dev/seo-isnt-dead-but-geo-is-already-eating-its-lunch-pon</guid>
      <description>&lt;p&gt;&lt;em&gt;Three signals landed in the same week. Together they answer one question: whether a machine ever mentions your name.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most teams still ask whether they rank. The sharper question in 2026 is whether a model ever cites them — because for a growing share of users, the model's answer is the only page they read.&lt;/p&gt;

&lt;p&gt;Three signals landed almost on top of each other this week: someone declaring that "SEO is dead and GEO is the new game," a new tool that tracks brand citations inside ChatGPT, Perplexity, Claude, and Gemini, and analysts arguing that product discovery is migrating from Search Engine Optimization to Generative Engine Optimization (GEO) — the practice of getting your content cited inside an AI-generated answer rather than ranked in a list of links. When a meme becomes three headlines on the same day, it's worth stopping to look carefully.&lt;/p&gt;

&lt;p&gt;The short thesis: search didn't die. It stopped being the only front door. More people now put the question to a model and accept the finished answer, without clicking ten blue links. If your content isn't cited in that answer, you don't exist for that user.&lt;/p&gt;

&lt;p&gt;This is no longer a forecast. SparkToro's 2026 data shows fewer than one in three Google searches still ends in a click. In Google's AI Mode, roughly 93% of queries end with no click at all. And Capston.ai projects that by late 2026, more than 40% of product discovery will begin inside AI-native platforms. The front door moved while most teams were still optimizing the hallway.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes from SEO to GEO
&lt;/h2&gt;

&lt;p&gt;In classic SEO the goal was to rank: land on page one, win the click. In GEO the goal is to be cited: become the source the model uses to compose its answer. Same sport, different rules.&lt;/p&gt;

&lt;p&gt;The target stops being position on the SERP (the search engine results page) and becomes presence in the generated answer. The metric stops being the click and becomes &lt;em&gt;share of citation&lt;/em&gt; — how often you are the source named for a given set of questions. And the unit of content stops being a page optimized for a keyword and becomes a clear, verifiable, easy-to-extract claim.&lt;/p&gt;

&lt;p&gt;No surprise a wave of tools showed up to measure exactly this: who gets cited, in which model, for which question. It's the Google Search Console of the LLM era — crude still, but it's the beginning. The demand is already real: 43% of marketers report actively implementing GEO in 2026, up from near zero a year earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is happening now
&lt;/h2&gt;

&lt;p&gt;GEO isn't an isolated marketing trick. It's a symptom of a larger shift: the reader of your content is no longer always human.&lt;/p&gt;

&lt;p&gt;This week Coinbase made that literal. It gave AI agents their own wallets to execute trades and pay for data, and launched Coinbase Advisor, one of the first AI investment advisers registered with the SEC. When the thing consuming your information stops being a person scrolling results and becomes an agent composing an answer or making a decision, how you publish has to change. Text written to seduce a human into a click is not always text a model can extract and cite with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The risk almost no one priced
&lt;/h2&gt;

&lt;p&gt;Then came the uncomfortable news of the week. On June 12, the US government issued an export-control directive suspending access to Anthropic's newest models, Fable 5 and Mythos 5, for any foreign national — which forced Anthropic to disable both models for every customer overnight to stay compliant. Other Claude models stayed online; these two went dark. Legal analysts described it as an escalation in the use of export controls against frontier AI models.&lt;/p&gt;

&lt;p&gt;The lesson for anyone building on these APIs is blunt: model availability is now a geopolitical variable, not just a technical one.&lt;/p&gt;

&lt;p&gt;Here two distinct dependencies tend to get confused, so name them separately. The first is a &lt;strong&gt;distribution dependency&lt;/strong&gt;: your content has to be citable across every answer engine — ChatGPT, Claude, Gemini, Perplexity — not tuned for one. Invisible in three of the four means invisible to most of the market. The second is a &lt;strong&gt;build dependency&lt;/strong&gt;: if your product runs on a single model, you inherited a risk you don't control. Anyone who had built on Fable 5 lost it without warning.&lt;/p&gt;

&lt;p&gt;Both collapse into one principle a regulated-infrastructure operator learns early: a single point of dependency is a single point of failure. Provider diversity stopped being hygiene and became strategy — on the distribution side and the build side alike.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do this week
&lt;/h2&gt;

&lt;p&gt;None of this requires rewriting your site from scratch. It requires starting to play the new game in parallel with the old one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick 10 questions an ideal customer would ask an LLM about your market, and test how ChatGPT, Perplexity, Claude, and Gemini answer them today. Note whether you're cited.&lt;/li&gt;
&lt;li&gt;Rewrite your key pages with direct, verifiable claims at the top — definition, number, source — instead of warming up until the third paragraph.&lt;/li&gt;
&lt;li&gt;Treat model-provider diversity as a requirement, not a future optimization.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SEO isn't dead. But ignoring GEO in 2026 is the equivalent of ignoring Google in 2006. The cost of starting now is one afternoon's experiment. The cost of waiting is becoming invisible on the only surface that's still growing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>llm</category>
    </item>
    <item>
      <title>LLM Routing: How to cut AI Infrastructure costs by 70% Without losing quality</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Thu, 07 May 2026 11:40:05 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/llm-routing-how-to-cut-ai-infrastructure-costs-by-70-without-losing-quality-3d0m</link>
      <guid>https://dev.to/neilton_rocha_dev/llm-routing-how-to-cut-ai-infrastructure-costs-by-70-without-losing-quality-3d0m</guid>
      <description>&lt;p&gt;Running everything on frontier models is an operational mistake. Here is the routing architecture that reduced cost per task from $8.20 to $2.44 in production&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;GPT-5.5 costs 34x more than DeepSeek V4-Pro. 95% of your queries do not need frontier.&lt;/li&gt;
&lt;li&gt;Routing (upfront decision) and cascading (confidence-based fallback) solve different problems. Production uses both.&lt;/li&gt;
&lt;li&gt;ESKOM.ai went from $8.20 to $2.44 per completed task. Same quality. 70% cost reduction.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;Every week someone tells me the same thing: "I tested an AI agent and it was useless. LLMs are overrated."&lt;/p&gt;

&lt;p&gt;My answer: you sent a cardiac surgeon to put on a bandage and did not give him the patient notes.&lt;/p&gt;

&lt;p&gt;The model is not the problem. The problem is that everything runs on frontier with zero selection logic. Here is what that costs at scale:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cost per 1M tokens&lt;/th&gt;
&lt;th&gt;Multiplier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;$0.435&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4o-mini&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;td&gt;3.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;11.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;td&gt;34.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;$26.00&lt;/td&gt;
&lt;td&gt;59.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A well-designed router pushes 95% of traffic to the cheap tier and reserves frontier for the 5% that actually needs it.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Routing vs. Cascading
&lt;/h2&gt;

&lt;p&gt;These are two distinct strategies. Mixing them up is the most common architecture mistake I see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routing&lt;/strong&gt; is an upfront decision. A classifier evaluates the query and picks a tier before any LLM call is made. One decision, one execution, no fallback.&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;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract the cost values from document X&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;tier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# returns "simple"
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# DeepSeek, $0.435/1M
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it for structured, well-defined workloads: extraction, classification, fixed-template generation. The trade-off is that a wrong classification has no recovery path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cascading&lt;/strong&gt; starts at the cheapest model and escalates based on a confidence score. If the output confidence falls below a threshold, it retries at the next tier automatically.&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deepseek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sonnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Total cost: $0.435 + $5.00 = $5.435 vs. $26 going straight to Opus
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it for unpredictable workloads: open-ended analysis, financial or legal reasoning, anything where query difficulty varies widely.&lt;/p&gt;

&lt;p&gt;The latency trade-off is real. Sequential calls at 100ms each stack up. If P95 exceeds 500ms, rethink.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production systems use both. Routing for structured flows, cascading for analytical ones.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The 3-layer architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   |
[Semantic Cache] -- hit --&amp;gt; Response (zero cost)
   | miss
[Intent Classifier] (0.5B model, ~5ms)
   |
   |-- Simple     --&amp;gt; DeepSeek V4-Pro   ($0.435/1M)
   |-- Medium     --&amp;gt; GPT-4o-mini       ($1.50/1M)
   |-- Critical   --&amp;gt; GPT-5.5 / Opus    ($15-26/1M)
                         ^
                  [Confidence Gate]
                  confidence &amp;lt; 0.70: escalate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Layer 1, semantic cache:&lt;/strong&gt; before any classification, check if this query was already answered. For B2C products with repetitive queries, a 30-40% hit rate is realistic. Marginal cost: zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2, Intent classifier:&lt;/strong&gt; a small model (0.5B parameters) trained on your actual workload, not on generic benchmarks. Running locally with vLLM, latency is under 5ms. Cost is roughly $0.20/hour of GPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3, confidence gate:&lt;/strong&gt; each response returns a score. Below 0.70, escalate. Above 0.85, trust it. Financial and legal domains bypass the gate and go straight to frontier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five mistakes that break this in production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No observability on routing decisions.&lt;/strong&gt; If you are not logging the classifier score, selected tier, and final confidence for every query, you will not know when calibration drifts. The system degrades silently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single provider dependency.&lt;/strong&gt; If DeepSeek goes down, your cheap tier goes with it. Configure a same-tier fallback on a different provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tail miscalibration.&lt;/strong&gt; Overall accuracy of 94% sounds good. The 6% that fails is exactly the rare, high-stakes queries your classifier has the least training data for. Oversample the tail when you validate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cascade latency stacking.&lt;/strong&gt; Three sequential calls at 100ms each equals 300ms. Sometimes paying $26 directly on Opus is cheaper than the latency cost to your conversion rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thresholds set by intuition.&lt;/strong&gt; Run an A/B test. Compare 0.65 vs. 0.75 for one week. Measure escalation rate, average quality score, and cost per task. The optimal point is specific to your workload.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real case: ESKOM.ai
&lt;/h2&gt;

&lt;p&gt;ESKOM.ai runs an agent stack for energy data processing. Before and after implementing the architecture above:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Query distribution&lt;/td&gt;
&lt;td&gt;100% GPT-4.5&lt;/td&gt;
&lt;td&gt;70% DeepSeek / 25% mid / 5% frontier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per task&lt;/td&gt;
&lt;td&gt;$8.20&lt;/td&gt;
&lt;td&gt;$2.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalation rate&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P95 latency&lt;/td&gt;
&lt;td&gt;250ms&lt;/td&gt;
&lt;td&gt;180ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality score&lt;/td&gt;
&lt;td&gt;4.1/5&lt;/td&gt;
&lt;td&gt;4.2/5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 30,000 tasks per month, that is $27,000 saved in the first month. Annualized: approximately $324,000.&lt;/p&gt;

&lt;p&gt;An escalation rate of 2.8% means the classifier was well calibrated: 97.2% of queries stayed at the initial tier. If yours is above 5%, retrain.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to implement this week
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LiteLLM&lt;/strong&gt; handles routing and fallback across 100+ models with a YAML config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;litellm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tier-simple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tier-medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tier-frontier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RouteLLM&lt;/strong&gt; (Berkeley, arXiv:2410.13765) provides a calibration matrix trained on your query history. Their published benchmark: 85% of queries routed to cheap tier, maintaining 95% of frontier quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vLLM&lt;/strong&gt; lets you run the intent classifier locally for sub-5ms latency and full query privacy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;vllm
vllm serve Qwen/Qwen2.5-0.5B-Instruct &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four-week rollout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Week 1: LiteLLM with 3 tiers + structured logging
Week 2: Confidence gate + domain overrides (finance and legal to frontier)
Week 3: Empirical threshold calibration via A/B test
Week 4: Monitor cost per task, escalation rate, quality score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Target at week 4: cost per task down at least 40%. If not, the classifier needs more domain-specific training data.&lt;/p&gt;

&lt;p&gt;That is exactly backwards.&lt;/p&gt;

&lt;p&gt;The defensible moat in AI infrastructure is not which model you have access to. Every competitor has API access to the same frontier models you do. The moat is how efficiently you decide which model to use for each specific task.&lt;/p&gt;

&lt;p&gt;Organizations building this routing layer today operate with a 10-30x structural cost advantage over everyone still sending everything to frontier. That gap compounds. As usage scales, the teams without a router pay exponentially more for the same output quality.&lt;/p&gt;

&lt;p&gt;The question is not "which LLM is best." The question is "which LLM is best for this query, right now, given confidence and latency constraints."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If this was useful:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a comment with the escalation rate you are currently seeing in production, or the tier distribution you are targeting. I read every one.&lt;/p&gt;

&lt;p&gt;If you are setting up LLM routing for the first time and hit a wall on classifier calibration, tell me your domain and workload profile. Worth a follow-up post if enough people are stuck on the same step.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;References: &lt;a href="https://github.com/lm-sys/RouteLLM" rel="noopener noreferrer"&gt;RouteLLM&lt;/a&gt; · &lt;a href="https://docs.litellm.ai" rel="noopener noreferrer"&gt;LiteLLM&lt;/a&gt; · &lt;a href="https://arxiv.org/abs/2410.13765" rel="noopener noreferrer"&gt;arXiv:2410.13765&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>architecture</category>
      <category>software</category>
    </item>
    <item>
      <title>10 Engineering lessons I wish I learned sooner (Every Developer Should Master)</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Wed, 10 Dec 2025 16:30:00 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/10-engineering-lessons-i-wish-i-learned-sooner-every-developer-should-master-7pd</link>
      <guid>https://dev.to/neilton_rocha_dev/10-engineering-lessons-i-wish-i-learned-sooner-every-developer-should-master-7pd</guid>
      <description>&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%2Fwcdli7tjkjxl3vuw0k4p.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%2Fwcdli7tjkjxl3vuw0k4p.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 2009, I was fresh out of the gate. I had plenty of energy, but very little wisdom.&lt;/p&gt;

&lt;p&gt;My toolkit was simple: FileZilla, jQuery, and a lot of blind faith. I genuinely believed that if it worked on my laptop, the job was done.&lt;/p&gt;

&lt;p&gt;Then came the day that taught me otherwise.&lt;/p&gt;

&lt;p&gt;I deployed an e-commerce feature on a Friday afternoon without load testing. It worked fine for me. But on Monday morning, under real traffic, a bad database query locked the entire system.&lt;/p&gt;

&lt;p&gt;I spent four hours sweating while support tickets piled up.&lt;/p&gt;

&lt;p&gt;I wasn't a bad developer. I was just inexperienced. I knew the syntax, but I didn't understand the system. There is a massive gap between writing code that runs and engineering software that survives.&lt;/p&gt;

&lt;p&gt;If you are early in your journey, don't fear these moments. They are the price of entry. It took me a decade to bridge the gap between 'coder' and 'engineer.'&lt;/p&gt;

&lt;p&gt;You can cross it faster. Here are the 10 shifts that changed my career.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Don't block the user (async processing)
&lt;/h2&gt;

&lt;p&gt;I used to handle heavy tasks, like generating a PDF or importing a CSV, right inside the main HTTP request. The browser would spin for 40 seconds, and if the user got bored and closed the tab, the process died.&lt;/p&gt;

&lt;p&gt;I didn’t realize I was blocking the user from doing anything else.&lt;/p&gt;

&lt;p&gt;How I handle it today: I treat the API like a receptionist, not a factory worker. It takes the order, acknowledges it, and moves on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: asynchronous API handling&lt;/strong&gt;&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="c1"&gt;// 1. Add to queue (Redis/SQS)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reportQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-gen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Release the user immediately&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;We are working on it.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the application responsive, no matter how heavy the workload is.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Zero trust architecture (validation)
&lt;/h2&gt;

&lt;p&gt;I used to be naive about the Frontend. I thought: "If I put type='email' in the HTML input, I don't need to validate it on the server."&lt;/p&gt;

&lt;p&gt;I was wrong. A malicious user can bypass your UI with a simple curl command and send garbage (or exploits) to your database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: Backend data validation with Zod&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Assuming zod is installed&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// If this fails, the code stops here, ensuring data integrity.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Backend is the guardian of data integrity. Never lower the shields just because the UI looks safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The N+1 problem (database efficiency)
&lt;/h2&gt;

&lt;p&gt;I often wrote code that looked logical in the editor but was a disaster in production. I would fetch a list of posts and then loop through them to fetch the author.&lt;/p&gt;

&lt;p&gt;In code, it looks fine. In reality, for 50 posts, I was triggering 51 separate database queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: efficient SQL Join&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; 
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Latency kills user experience. Reduce the round trips.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Logs are for context, not text
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;console.log("Error happened")&lt;/code&gt; is useless when you have 500 concurrent users. You need to know who crashed and why.&lt;/p&gt;

&lt;p&gt;I stopped writing text logs and started writing structured logs (JSON).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: structured logging&lt;/strong&gt;&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="c1"&gt;// Assuming a logger like Winston or Pino is configured&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cartTotal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, instead of guessing, you can search your log aggregator for &lt;code&gt;userId: 123&lt;/code&gt; and see exactly what happened to that specific customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Config goes in the environment
&lt;/h2&gt;

&lt;p&gt;I used to hardcode API keys and database passwords directly in the code. It was "easier". Until I accidentally committed a password to a public repo and had to rotate every key we had.&lt;/p&gt;

&lt;p&gt;The Rule: code is logic. Configuration is environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: Environment variables for configuration&lt;/strong&gt;&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="c1"&gt;// The code doesn't know the secret. It asks the environment.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_PASS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your application secure and portable. You can move from Staging to Production without touching a single line of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The network is unreliable (retry logic)
&lt;/h2&gt;

&lt;p&gt;I assumed APIs would always be online. If a request failed, I just threw an error to the user. But networks glitch. Packets get lost. A 50ms blip shouldn't break your app.&lt;/p&gt;

&lt;p&gt;Now, I implement Exponential backoff. If it fails, wait 200ms and try again. Then 500ms. Then stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: fetch with exponential backoff Retry&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Assuming axios is installed&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Max 3 retries&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Request to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; failed, retrying in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Exponential backoff&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed to fetch &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; after multiple retries.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example usage:&lt;/span&gt;
&lt;span class="c1"&gt;// fetchWithRetry('https://api.example.com/data')&lt;/span&gt;
&lt;span class="c1"&gt;//   .then(response =&amp;gt; console.log(response.data))&lt;/span&gt;
&lt;span class="c1"&gt;//   .catch(error =&amp;gt; console.error(error.message));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Robust systems absorb small failures instead of passing them to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Cache the heavy stuff
&lt;/h2&gt;

&lt;p&gt;I used to hit the database for data that rarely changed, like the list of product categories or site settings. It was a waste of resources.&lt;/p&gt;

&lt;p&gt;The solution: Check memory (Redis) first. Check the database second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior Code example: caching with redis&lt;/strong&gt;&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="c1"&gt;// Assuming redis client and db client are initialized&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;categories&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM categories&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Cache for 1 hour (3600 seconds)&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;categories&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;categories&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;Protect your primary database. It is the hardest part of your stack to scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Cookies over localstorage
&lt;/h2&gt;

&lt;p&gt;I stored JWT tokens in &lt;code&gt;localStorage&lt;/code&gt; because it was easy. But any JavaScript code (including third-party analytics libraries) can read &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I switched to &lt;code&gt;HttpOnly&lt;/code&gt; cookies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: secure HttpOnly cookies&lt;/strong&gt;&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="c1"&gt;// When setting the cookie in a Node.js (Express) app&lt;/span&gt;
&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;httpOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// JavaScript cannot read this, mitigating XSS&lt;/span&gt;
  &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Only send over HTTPS in production&lt;/span&gt;
  &lt;span class="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lax&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Protection against CSRF attacks&lt;/span&gt;
  &lt;span class="na"&gt;maxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600000&lt;/span&gt; &lt;span class="c1"&gt;// 1 hour expiration&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simple change eliminates a huge class of XSS attacks. It might be slightly annoying to set up, but it is worth the security boost.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Infrastructure as code
&lt;/h2&gt;

&lt;p&gt;I used to configure servers manually via SSH. If the server died, I had to spend hours setting up a new one from memory.&lt;/p&gt;

&lt;p&gt;Now, I use Docker. I define the environment in a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior code example: basic dockerfile&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use a Node.js base image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;

&lt;span class="c"&gt;# Set the working directory in the container&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copy package.json and package-lock.json to install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Copy the rest of the application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Expose the port your app runs on&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="c"&gt;# Command to run the application&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a server dies, an automated process kills it and spins up a new clone in seconds. No emotional attachment required.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Focus on the solution, not the code
&lt;/h2&gt;

&lt;p&gt;This was the hardest shift. If a client asked for an "Export to Excel" button, I built it.&lt;/p&gt;

&lt;p&gt;Today, I ask "Why?". Often, they want the Excel file to import data into another system. So I suggest: "Let's integrate directly with that system via API."&lt;/p&gt;

&lt;p&gt;The lesson: A junior developer builds what is asked. A senior engineer solves the underlying problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Seniority is not about how many years you have been coding. It is about how much you care about what happens after the deploy.&lt;/p&gt;

&lt;p&gt;It is about moving from "it works" to "it lasts".&lt;/p&gt;

&lt;p&gt;I'm currently drafting Part 2, focusing on the messy stuff: heavy debugging and production scars.&lt;/p&gt;

&lt;p&gt;But first, I want to hear from you:&lt;/p&gt;

&lt;p&gt;Which of these lessons did you learn the hard way?&lt;/p&gt;

&lt;p&gt;Your story might save someone from a 2 AM incident. 👇&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>careeradvice</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Don't Be (just) a developer: 6 "Soft" skills that actually define your career</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sun, 02 Nov 2025 19:50:00 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/dont-be-just-a-developer-6-soft-skills-that-actually-define-your-career-50hd</link>
      <guid>https://dev.to/neilton_rocha_dev/dont-be-just-a-developer-6-soft-skills-that-actually-define-your-career-50hd</guid>
      <description>&lt;p&gt;Your code might be perfect. &lt;em&gt;Fine.&lt;/em&gt; But your career will fail if you &lt;em&gt;only&lt;/em&gt; know how to code.&lt;/p&gt;

&lt;p&gt;The real job? it's not about syntax. it's about navigating the corporate chaos outside your editor.&lt;/p&gt;

&lt;p&gt;Look, most junior devs are obsessed with syntax, frameworks, and raw performance. that's just the baseline. it's table stakes. the real problem is that the corporate world doesn't &lt;em&gt;really&lt;/em&gt; run on code. it runs on solving problems. Period. and it &lt;em&gt;really&lt;/em&gt; runs on communicating those solutions to people who don't code &lt;em&gt;and&lt;/em&gt; people who do. if tech and business aren't on the same page, you're sunk.&lt;/p&gt;

&lt;p&gt;I saw this happen firsthand. e-commerce project. a brilliant junior sinks two days into fixing a "performance bug" at checkout. his code? &lt;em&gt;chef's kiss.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But the real issue wasn't performance. it was a stupid business requirement that was overloading the API from the start.&lt;/p&gt;

&lt;p&gt;He solved the symptom, not the disease.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That's&lt;/em&gt; the difference. a programmer codes. an engineer navigates the chaos outside the IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 "Soft" skills that aren't soft at all
&lt;/h2&gt;

&lt;p&gt;Frameworks are nice. But your career is defined by this stuff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill 1: customer obsession (the real starting point)
&lt;/h3&gt;

&lt;p&gt;Too many engineers fall in love with the &lt;em&gt;elegance&lt;/em&gt; of their solution. they forget who it's for.&lt;/p&gt;

&lt;p&gt;"Customer Obsession" (yeah, the Amazon thing) isn't some fluffy marketing cliché. it's your starting block. before you argue Kafka vs. RabbitMQ, you &lt;em&gt;must&lt;/em&gt; know &lt;em&gt;why&lt;/em&gt; the customer even needs it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; the team's arguing about Kafka vs. RabbitMQ for notifications. hold on. the &lt;em&gt;right&lt;/em&gt; question is: "what does the user expect? do they need it &lt;em&gt;now&lt;/em&gt;, or can they wait 5 seconds?" that one question changes the entire architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill 2: problem solving (first principles thinking)
&lt;/h3&gt;

&lt;p&gt;Most people build by analogy. "Spotify does it this way, so we will too."&lt;/p&gt;

&lt;p&gt;It's fast, sure. But it's a trap. it &lt;em&gt;kills&lt;/em&gt; innovation.&lt;/p&gt;

&lt;p&gt;First Principles Thinking is the opposite. you tear the problem down to its fundamental truths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "we need a login screen. username, password. done."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First principles:&lt;/strong&gt; "we need to (1) identify a user, and (2) prove they are who they say they are. what's safest? what has the least friction? magic link? biometrics? OAuth?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This forces you to think about the &lt;em&gt;job&lt;/em&gt; of the feature, not just copy-pasting the form.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill 3: clarity (The Feynman Technique)
&lt;/h3&gt;

&lt;p&gt;If you can't explain it simply, you don't get it. it's that simple.&lt;/p&gt;

&lt;p&gt;Early in your career, it's &lt;em&gt;so&lt;/em&gt; tempting to hide behind jargon. "We optimized the query using an 'index hint' to force the 'nested loop'..."&lt;/p&gt;

&lt;p&gt;Stop.&lt;/p&gt;

&lt;p&gt;I guarantee your Product Manager is already checking their email. it's useless to them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Jargon:&lt;/strong&gt; "the CDN cache had 'stale data' and didn't invalidate."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feynman:&lt;/strong&gt; "the system saves an 'old photo' of the site on fast servers. our update didn't tell those servers to take a 'new photo.' so, users saw the old one."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You become the translator. the person who turns tech chaos into business clarity. that person is &lt;em&gt;never&lt;/em&gt; fired.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill 4: "Selling" Ideas (The Pyramid Principle)
&lt;/h3&gt;

&lt;p&gt;Your boss is busy. Your VP is &lt;em&gt;really&lt;/em&gt; busy.&lt;/p&gt;

&lt;p&gt;They don't have time for your chronological detective story of how you found the bug. they need the answer. Now.&lt;/p&gt;

&lt;p&gt;The "Pyramid Principle" (by Barbara Minto) is built for this. it flips the script. start with the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Wrong (Chronological):&lt;/strong&gt; "so, I started looking at the logs, and I saw a 500 error, which was weird, and I thought maybe it was API X..." (They're already asleep).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correct (Pyramid):&lt;/strong&gt; "the slowdown is 100% the payment provider. it's killing our conversions. &lt;strong&gt;immediate fix:&lt;/strong&gt; a 3s timeout and a fallback to save the sale. &lt;strong&gt;long-term fix:&lt;/strong&gt; we must replace them. I need approval to start the RFP for next quarter."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Skill 5: storytelling (Ideas That Stick)
&lt;/h3&gt;

&lt;p&gt;Facts are forgettable. Stories stick.&lt;/p&gt;

&lt;p&gt;The "Made to Stick" book nailed this. to make an idea land, it has to be simple, concrete, and (shock) emotional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bad (Facts):&lt;/strong&gt; "bug 87-B caused a 4% error rate on the checkout endpoint, affecting 1,200 users." (Nobody cares).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good (Story):&lt;/strong&gt; "maria, a 5-year customer, tried to buy a birthday present yesterday. the system errored out 4 times. she called support, furious. we lost the sale. this bug is doing that to hundreds of other 'Marias' &lt;em&gt;right now&lt;/em&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;See the difference? the second one gets a P0 ticket opened &lt;em&gt;immediately&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill 6: conflict Management (Crucial Conversations)
&lt;/h3&gt;

&lt;p&gt;You're &lt;em&gt;going&lt;/em&gt; to disagree with your lead. Your teammate &lt;em&gt;is&lt;/em&gt; going to merge messy code. A requirement &lt;em&gt;will&lt;/em&gt; be absurd.&lt;/p&gt;

&lt;p&gt;Most devs go quiet (fear) or go loud (ego). Both are career-killers.&lt;/p&gt;

&lt;p&gt;The "Crucial Conversations" method is about keeping it safe. using facts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example (PR Review):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bad (judgment):&lt;/strong&gt; "this code is way too complex and it's going to break."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good (facts):&lt;/strong&gt; "i see this function has 5 'if/else' levels (fact). i'm worried about maintaining it (my story). could we simplify this with a strategy pattern? what do you think? (question)."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You attack the problem, not the person.&lt;/p&gt;

&lt;p&gt;I had to invalidate a Senior's architecture three days before a sprint. total nightmare. i used this 'Facts-first' method. it focused us on the &lt;em&gt;problem&lt;/em&gt;, not my &lt;em&gt;opinion&lt;/em&gt; or his &lt;em&gt;ego&lt;/em&gt;. it prevented a war.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code is just the beginning
&lt;/h2&gt;

&lt;p&gt;Look, you get hired for your tech skills.&lt;/p&gt;

&lt;p&gt;You get &lt;em&gt;promoted&lt;/em&gt; for your ability to communicate, think, and solve the &lt;em&gt;real&lt;/em&gt; business problem.&lt;/p&gt;

&lt;p&gt;The code is just the tool. These skills? this is your &lt;em&gt;impact&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading list
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Pyramid-Principle-Logic-Writing-Thinking/dp/0273710516" rel="noopener noreferrer"&gt;The Pyramid Principle (Barbara Minto)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Made-Stick-Survive-Others-English-ebook/dp/B000N2HCKQ/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;s=books&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;Made to Stick (Chip Heath &amp;amp; Dan Heath)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Crucial-Conversations-Talking-Stakes-English-ebook/dp/B093Y3N433?ref_=ast_author_dp_lf_English_rw&amp;amp;psc=1" rel="noopener noreferrer"&gt;Crucial Conversations (Patterson, Grenny, et al.)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Output-Management-English-Andrew-Grove-ebook/dp/B015VACHOK/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;s=digital-text&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;High Output Management (Andy Grove)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What's the one 'soft' skill that blindsided you in your first year? Drop it in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>softskills</category>
      <category>softwaredevelopment</category>
      <category>leadership</category>
    </item>
    <item>
      <title>You are the pilot: How to stand out in the vibe coding era</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sun, 20 Jul 2025 14:40:38 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/you-are-the-pilot-how-to-stand-out-in-the-vibe-coding-era-2n41</link>
      <guid>https://dev.to/neilton_rocha_dev/you-are-the-pilot-how-to-stand-out-in-the-vibe-coding-era-2n41</guid>
      <description>&lt;p&gt;You know that feeling? You open your editor, type a few words... and in seconds, Copilot completes the entire code. Claude, Gemini CLI, Cursor, Windsurf—all ready to refactor your function like magic. It's impressive. And, to be honest, a little scary too.&lt;br&gt;
AIs are the best programming assistants we've ever had. I use them every day, and you should too. But here's the problem: if you let AI think for you, you're walking into a trap.&lt;br&gt;
Think of it this way: AI is like a super-amplifier. If you have a solid foundation, it takes you far. But if your foundation is weak, you'll just get to the wrong place faster.&lt;br&gt;
Microsoft made an excellent choice with the name "Copilot." The pilot still needs to know the destination, how to navigate through turbulence, and most importantly, how to land without breaking everything.&lt;br&gt;
This article is your pilot's manual.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fundamentals: Understand What's Happening
Before asking AI to "create a function that searches for users," try writing a loop yourself. If you don't know the difference between a for...of and a forEach, or when you really need to use async/await, you'll have trouble debugging that "perfect" code the AI generated.
What doesn't work: Blindly trusting the tool. Asking AI to "avoid excessive API calls" might generate functional code, but it might not be ideal for your specific case.
What works: Understanding the why behind things. Knowing how to implement a debounce by hand shows you understand closures, setTimeout, and event management. That's what separates those who "use" code from those who "understand" code.
JavaScript example:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Example: implementing a debounce to understand the concept
function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() =&amp;gt; {
      func.apply(this, args);
    }, delay);
  };
}

const searchAPI = (term) =&amp;gt; console.log(`Searching for: ${term}`);
const debouncedSearch = debounce(searchAPI, 500);

// Only the last call within 500ms will execute
debouncedSearch('rea');
debouncedSearch('reac');
debouncedSearch('react'); // Only this one will run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Book: "Data Structures and Algorithms with JavaScript" — Loiane Groner&lt;br&gt;
Video: CS50 Introduction to Computer Science (Harvard on YouTube)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Front-End: Performance Is Not an Accident
Anyone can "throw a component on screen." The differentiator is understanding how much it costs. AI can build a beautiful dashboard with 10 charts, but it won't warn you that the final file is 5MB and the page takes 8 seconds to load.
Common mistake: Throwing everything in the same bundle. Importing heavy libraries directly, making users wait forever.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript// ❌ Naive way
import MegaHeavyChart from './MegaHeavyChart';

function Dashboard() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;My Dashboard&amp;lt;/h1&amp;gt;
      &amp;lt;MegaHeavyChart /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Smart solution: Load on demand. Use React.lazy to load components only when needed. Shows you care about user experience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript// ✅ Professional way
import React, { lazy, Suspense } from 'react';

const MegaHeavyChart = lazy(() =&amp;gt; import('./MegaHeavyChart'));

function Dashboard() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;My Dashboard&amp;lt;/h1&amp;gt;
      &amp;lt;Suspense fallback={&amp;lt;p&amp;gt;Loading chart...&amp;lt;/p&amp;gt;}&amp;gt;
        &amp;lt;MegaHeavyChart /&amp;gt;
      &amp;lt;/Suspense&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Official React documentation on optimization&lt;br&gt;
Video: "How the Virtual DOM Works" (PurelyFunctional on YouTube)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Back-End: Architecture Is Your Legacy
Messy code is the result of rushing. AI can generate an entire CRUD in a single file, but you're the one who should insist on proper organization. Why? Because a well-structured system is easy to test, modify, and understand—both for you and whoever comes next.
Common mistake: Mixing everything—business logic, validation, and database in the same place. Impossible to test or modify without breaking something.
Solution: Separate responsibilities. Divide into layers (controllers, services, repositories). This way you can change the database by modifying only one part, without touching business rules.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript// /services/userService.js
// AI generates the code, but you define the structure
export function createUser(userData, userRepository) {
  // Business logic here
  if (!userData.email || !userData.password) {
    throw new Error("Email and password are required");
  }

  // AI doesn't know that in your system all emails are lowercase
  const processedData = { 
    ...userData, 
    email: userData.email.toLowerCase() 
  };

  return userRepository.save(processedData);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Book: "Clean Architecture" — Robert C. Martin (Uncle Bob)&lt;br&gt;
Blog: "The Clean Architecture" (Uncle Bob's Blog)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SQL: Where Performance Really Happens
Frameworks are great, but they hide the database. If you don't know what a JOIN, an index, or how to read an execution plan is, you're flying blind. AI writes the query, but won't optimize it for 1 million users.
Inefficient query: A search on a giant table without an index. The database needs to read everything (sequential scan), causing slowness.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sql-- Slow on large tables
SELECT * FROM orders WHERE user_id = 123;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Optimized query: You know that user_id is frequently queried, so you create an index. The database now goes straight to the point.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sql-- 1. Create the index (once only)
CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 2. Analyze performance
EXPLAIN SELECT * FROM orders WHERE user_id = 123;

-- Result:
-- Before: "Seq Scan" (slow)
-- After: "Index Scan" (fast)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Site: Use The Index, Luke!&lt;br&gt;
Site: "SQL Tutorial", W3Schools!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Security: It's Not Optional
In 2025, insecure code is broken code. AI can suggest dangerous practices if you're not explicit. Security is your responsibility from the first line, not a problem to solve later.
Dangerous mistake: Exposed credentials. Leaving passwords and tokens in code. One public git push and your company breaks.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;javascript// ❌ DANGER: exposed key
const API_KEY = "sk_live_123456789SECRET"; // Leaked!
fetch(`https://api.service.com/data?key=${API_KEY}`);
Safe approach: Use environment variables and tokens with expiration.
javascript// ✅ SAFE: environment variables
import 'dotenv/config';
import jwt from 'jsonwebtoken';

const privateKey = process.env.JWT_PRIVATE_KEY; // Never in code!

const token = jwt.sign(
  { userId: 123, permissions: ['read:data'] },
  privateKey,
  { algorithm: 'RS256', expiresIn: '15m' } // Expires in 15 minutes
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Site: OWASP Top 10 (official list of security risks)&lt;br&gt;
Video: "OWASP Top 10 Explained" (Fireship on YouTube)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Communication: What No AI Replaces
You can write the most brilliant code in the world. If you can't explain it, defend your choices in meetings, or document it in Pull Requests, your impact will be limited. Code solves technical problems; communication solves business problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;❌ Technical communication (the "bluff"): in meeting: "We implemented a distributed cache pattern with Redis to optimize N+1 queries from the ORM, resulting in P99 latency reduction from 2.5s to 340ms through TTL-based invalidation strategy and cache-aside pattern."&lt;br&gt;
Result: Everyone agrees but nobody understood. The manager doesn't know if this solves the customer's problem or just shows you know difficult words.&lt;/p&gt;

&lt;p&gt;✅ Effective communication: in meeting: "Our customers were complaining that the product page took too long to load—some were abandoning their purchases. I discovered the system was making 50 database queries to show a simple list. I implemented a smart cache system. Result: the page that took 3 seconds now loads in 0.3 seconds. This should significantly reduce cart abandonment."&lt;br&gt;
Bad Pull Request:&lt;/p&gt;

&lt;p&gt;Title: "Fixes bug"&lt;br&gt;
Description: (empty)&lt;/p&gt;

&lt;p&gt;Pull Request that tells a story:&lt;/p&gt;

&lt;p&gt;Title: "Improves user search performance by 40%"&lt;br&gt;
Description:&lt;/p&gt;

&lt;p&gt;The problem: admin page took 5s to load due to unnecessary queries in userController&lt;br&gt;
The solution: replaced multiple small calls with a single JOIN and added index on profile.user_id column&lt;br&gt;
How to test: run user.spec.js test or access /admin/users. Should load in less than 500ms&lt;/p&gt;

&lt;p&gt;To study more:&lt;/p&gt;

&lt;p&gt;Book: "The Minto Pyramid Principle" — Barbara Minto&lt;br&gt;
Video: "How to Communicate Like a Senior Developer" (Travis Media on YouTube)&lt;br&gt;
Site: Bluf.co — learn the "Bottom Line Up Front" structure for direct and effective communication&lt;/p&gt;

&lt;p&gt;Conclusion: You Remain in Command&lt;br&gt;
AIs are incredible assistants. Use them to accelerate, automate tasks, and get a second opinion.&lt;br&gt;
But never let go of the steering wheel.&lt;br&gt;
Those who stand out aren't those who program fastest, but those who understand what they're programming. Those who think about architecture, optimize slow points, protect the system, and can explain their decisions clearly.&lt;br&gt;
AI can be the hand that writes. But the mind that guides, that has the vision and takes responsibility, continues to be yours.&lt;br&gt;
You are the pilot.&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Is the software engineer the new farmer of the digital age?</title>
      <dc:creator>Neilton Rocha</dc:creator>
      <pubDate>Sun, 22 Jun 2025 00:46:29 +0000</pubDate>
      <link>https://dev.to/neilton_rocha_dev/the-software-engineer-is-the-new-farmer-of-the-digital-age-2d40</link>
      <guid>https://dev.to/neilton_rocha_dev/the-software-engineer-is-the-new-farmer-of-the-digital-age-2d40</guid>
      <description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BJjsfNO5JTo&amp;amp;list=PLQ-uHSnFig5M9fW16o2l35jrfdsxGknNB" rel="noopener noreferrer"&gt;The software engineer is the new farmer of the digital age&lt;/a&gt;. Just as modern farmers use tractors, drones, and automated irrigation systems to maximize productivity, we software engineers now have artificial intelligence as our most powerful tool for cultivating quality code. But here's the crucial point: you can have the most advanced tractor in the world, but if you don't know how to plant, when to irrigate, or which soil is suitable for each crop, your harvest will be a disaster.&lt;/p&gt;

&lt;p&gt;AI can dramatically accelerate our ability to write code — studies show developers can complete tasks up to twice as fast with tools like GitHub Copilot. However, this speed only translates into real value when built upon solid foundations of technical knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why fundamentals are non-negotiable
&lt;/h2&gt;

&lt;p&gt;Imagine you're building an API and AI suggests implementing caching, but you don't understand the fundamental concepts of caching, asynchronous versus synchronous processing, or when to use message queues. You might implement the suggestion quickly, but you won't know if you're solving the right problem, if the solution is appropriate for your specific context, or if you're creating new performance or security issues.&lt;/p&gt;

&lt;p&gt;Data structures and algorithms remain the foundation of everything. A developer who doesn't understand the difference between a linked list and an array won't be able to ask intelligent questions to AI about performance optimization. Database knowledge and SQL are fundamental , how can you ask AI to optimize a query if you don't understand indexes, normalization, or joins?&lt;/p&gt;

&lt;p&gt;MIT Sloan research revealed something fascinating: junior developers achieved productivity gains of 27% to 39% with AI, while senior developers saw only 8% to 13% improvement. Why? Because experienced developers already possess the contextual knowledge necessary to ask more sophisticated questions and critically evaluate AI suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The modern software engineer roadmap
&lt;/h2&gt;

&lt;p&gt;To navigate effectively in this new era, you need to master both fundamentals and modern tools. &lt;a href="https://roadmap.sh" rel="noopener noreferrer"&gt;Roadmap.sh&lt;/a&gt; offers a comprehensive guide, but here are the critical areas every engineer should master:&lt;/p&gt;

&lt;h3&gt;
  
  
  Essential technical fundamentals
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data structures and algorithms&lt;/strong&gt; — Practice on &lt;a href="https://leetcode.com" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt; and visualize concepts with &lt;a href="https://algorithm-visualizer.org" rel="noopener noreferrer"&gt;Algorithm Visualizer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database and SQL&lt;/strong&gt; — Improve your skills on &lt;a href="https://lost-at-sql.therobinlord.com" rel="noopener noreferrer"&gt;Lost at SQL&lt;/a&gt; and &lt;a href="https://www.stratascratch.com" rel="noopener noreferrer"&gt;StrataScratch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System design&lt;/strong&gt; — Study real cases on &lt;a href="https://www.pramp.com/dev/uc-system-design" rel="noopener noreferrer"&gt;Pramp System Design&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version control&lt;/strong&gt; — Master Git with &lt;a href="https://learngitbranching.js.org" rel="noopener noreferrer"&gt;Learn Git Branching&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practical development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; — Build real projects on &lt;a href="https://www.frontendpractice.com" rel="noopener noreferrer"&gt;Frontend Practice&lt;/a&gt; and &lt;a href="https://www.frontendmentor.io" rel="noopener noreferrer"&gt;Frontend Mentor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project-based learning&lt;/strong&gt; — Explore the &lt;a href="https://github.com/practical-tutorials/project-based-learning" rel="noopener noreferrer"&gt;Project Based Learning&lt;/a&gt; repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build your own tools&lt;/strong&gt; — Follow the &lt;a href="https://github.com/codecrafters-io/build-your-own-x" rel="noopener noreferrer"&gt;Build Your Own X&lt;/a&gt; guide&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub repositories with best practice examples
&lt;/h2&gt;

&lt;p&gt;To accelerate your learning and see quality code in action, study these repositories that exemplify excellent programming practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/palash25/best-practices-checklist" rel="noopener noreferrer"&gt;Programming Best Practices&lt;/a&gt; — Comprehensive collection of best practices for multiple languages&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dronezzzko/software-development-best-practices" rel="noopener noreferrer"&gt;Software Engineering Best Practices&lt;/a&gt; — Fundamental principles for professional development&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pmndrs/zustand" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt; — Example of a library with clean, well-structured code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How AI Amplifies (But Doesn't Replace) Knowledge
&lt;/h2&gt;

&lt;p&gt;AI works best when you already have sufficient context to ask the right questions. For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without knowledge:&lt;/strong&gt; "AI, make my API faster"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With knowledge:&lt;/strong&gt; "AI, implement Redis caching for this specific query that's causing a bottleneck, considering cache invalidation when data is updated"&lt;/p&gt;

&lt;p&gt;The difference is striking. The first request might result in a generic and inadequate solution. The second demonstrates problem understanding and directs AI toward a specific and effective solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Specializations and complementary tools
&lt;/h2&gt;

&lt;p&gt;For specific areas, consider these platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — Practice on &lt;a href="https://www.hackthebox.com" rel="noopener noreferrer"&gt;Hack The Box&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Science&lt;/strong&gt; — Explore datasets on &lt;a href="https://www.kaggle.com" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps&lt;/strong&gt; — Solve real problems on &lt;a href="https://sadservers.com" rel="noopener noreferrer"&gt;SadServers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical assessment&lt;/strong&gt; — Prepare on &lt;a href="https://codesignal.com" rel="noopener noreferrer"&gt;CodeSignal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The future belongs to technical polyglots
&lt;/h2&gt;

&lt;p&gt;AI isn't here to replace us — it's here to amplify us. But this amplification only works when we have a solid knowledge base to amplify. 71% of organizations globally are impacted by technology failures, often because developers implement solutions without fully understanding their implications.&lt;/p&gt;

&lt;p&gt;The software engineer of the future will be one who masters both technical fundamentals and the art of collaborating effectively with AI. They'll be able to ask intelligent questions, critically evaluate responses, and implement solutions that don't just work, but are robust, scalable, and maintainable.&lt;/p&gt;

&lt;p&gt;Like the new digital farmer, you need to know your soil (architecture), your seeds (algorithms), your tools (AI and frameworks), and the seasons (development cycles). Only then will your code harvest be truly abundant and high-quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;In this AI-driven era, your technical fundamentals aren't becoming obsolete — they're becoming more valuable than ever. They're what separate the developers who use AI as a powerful amplifier from those who become dependent on it as a crutch.&lt;/p&gt;

&lt;p&gt;Master the basics, embrace the tools, and become the kind of developer who doesn't just write code faster, but writes better code that stands the test of time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recommended reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="noopener noreferrer"&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/strong&gt; - Robert C. Martin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.amazon.com/Grokking-Algorithms-illustrated-programmers-curious/dp/1617292230" rel="noopener noreferrer"&gt;Grokking Algorithms: An Illustrated Guide for Programmers&lt;/a&gt;&lt;/strong&gt; - Aditya Bhargava&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321" rel="noopener noreferrer"&gt;Designing Data-Intensive Applications&lt;/a&gt;&lt;/strong&gt; - Martin Kleppmann&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X" rel="noopener noreferrer"&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt;&lt;/strong&gt; - Andrew Hunt and David Thomas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.amazon.com/Data-Structures-Algorithms-Java-6th/dp/1118771338" rel="noopener noreferrer"&gt;Data Structures and Algorithms in Java&lt;/a&gt;&lt;/strong&gt; - Michael T. Goodrich&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What's your experience with AI-powered development? Share your thoughts in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
