<?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: Renato Silva</title>
    <description>The latest articles on DEV Community by Renato Silva (@renato_silva_71eef0fc385f).</description>
    <link>https://dev.to/renato_silva_71eef0fc385f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1698909%2F98e99ca4-6bff-40dc-9314-cf98388fbbf3.jpg</url>
      <title>DEV Community: Renato Silva</title>
      <link>https://dev.to/renato_silva_71eef0fc385f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renato_silva_71eef0fc385f"/>
    <language>en</language>
    <item>
      <title>Architecture Saved My Project - Swapping an ORM for Pure SQL in Minutes</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Fri, 17 Apr 2026 19:02:47 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/architecture-saved-my-project-swapping-an-orm-for-pure-sql-in-minutes-393j</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/architecture-saved-my-project-swapping-an-orm-for-pure-sql-in-minutes-393j</guid>
      <description>&lt;p&gt;In the world of software development, we are often told that &lt;strong&gt;Clean Architecture&lt;/strong&gt; and &lt;strong&gt;SOLID principles&lt;/strong&gt; are "over-engineering" for small projects. This week, I proved that theory wrong in the most practical way possible: &lt;strong&gt;I fired my ORM.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Goal
&lt;/h3&gt;

&lt;p&gt;I was building a &lt;strong&gt;Minimalist Feedback API&lt;/strong&gt;. The plan was simple: use &lt;strong&gt;Prisma 6&lt;/strong&gt; with &lt;strong&gt;SQLite&lt;/strong&gt; to persist data. I had already built my Core Domain (Entities) and Business Logic (Use Cases), keeping them isolated from external frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem: When Tools Fight Back
&lt;/h3&gt;

&lt;p&gt;As I moved to the infrastructure layer, I integrated Prisma 6. However, I ran into unexpected breaking changes and rigid configuration requirements—specifically the deprecation of certain URL properties in the schema files that were previously standard.&lt;/p&gt;

&lt;p&gt;I had two choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spend hours debugging a tool's internal configuration and fighting its "opinionated" setup.&lt;/li&gt;
&lt;li&gt;Rely on my architecture to swap the tool entirely.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Pivot: From Prisma to SQLite
&lt;/h3&gt;

&lt;p&gt;Because I used the &lt;strong&gt;Repository Pattern&lt;/strong&gt;, my Use Cases didn't know Prisma existed. They only knew about an abstract interface (or contract) called &lt;code&gt;FeedbackRepository&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I decided to drop the ORM and implement a native &lt;code&gt;SqliteFeedbackRepository&lt;/code&gt; using the standard &lt;code&gt;sqlite3&lt;/code&gt; driver. &lt;/p&gt;

&lt;h4&gt;
  
  
  1. The Repository Swap
&lt;/h4&gt;

&lt;p&gt;I created a new implementation. Note how the logic remains focused only on data persistence, keeping the code clean and predictable:&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;// src/repositories/sqlite/sqlite-feedback-repository.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sqlite3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sqlite3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FeedbackRepository&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../feedback-repository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Connect to the database file&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./database.db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SqliteFeedbackRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FeedbackRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * Persists a new feedback into the SQLite database
   */&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createdAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stmt&lt;/span&gt; &lt;span class="o"&gt;=&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;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INSERT INTO feedbacks (id, name, email, message, createdAt) VALUES (?, ?, ?, ?, ?)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&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;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;,&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&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="nf"&gt;resolve&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createdAt&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nx"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finalize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * Retrieves all feedbacks from the database
   */&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listAll&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="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM feedbacks ORDER BY createdAt DESC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&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="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SqliteFeedbackRepository&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Dependency Injection in Action
&lt;/h4&gt;

&lt;p&gt;​In my server.js, the only change required was the import line. This is the &lt;strong&gt;Liskov Substitution Principle&lt;/strong&gt; in the real world: the ability to replace an implementation with another without breaking the system.&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;// server.js&lt;/span&gt;
&lt;span class="c1"&gt;// Swapping the implementation is as simple as changing one line:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SqliteFeedbackRepository&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./repositories/sqlite/sqlite-feedback-repository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The rest of the setup remains identical!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SqliteFeedbackRepository&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;submitFeedback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SubmitFeedback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Use Case stays the same!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;​If my database logic had been leaked into my Routes or Use Cases, a change like this would have forced me to rewrite a significant portion of the application.&lt;br&gt;
​Instead, it took me &lt;strong&gt;less than 10 minutes&lt;/strong&gt; to pivot and have a fully working API again.&lt;br&gt;
​&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Software architecture is the art of postponing decisions until you have more data. Or in this case, the art of making tools replaceable."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't be a hostage to your tools:&lt;/strong&gt; If a library is causing more friction than value, be ready to replace it.&lt;br&gt;
​&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Isolate your Domain:&lt;/strong&gt; Keep your business rules pure. They should not care if you are using an ORM, a Cloud DB, or a simple text file.&lt;br&gt;
​&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pragmatism &amp;gt; Hype:&lt;/strong&gt; Sometimes, "boring" technology like native SQL is exactly what you need to keep the project moving forward.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What about you?&lt;/strong&gt; &lt;br&gt;
Have you ever had to swap a core library mid-project? Let's discuss in the comments!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Check out the live API here:&lt;/strong&gt; [&lt;a href="https://https://minimalist-feedback-api.onrender.com/feedbacks" rel="noopener noreferrer"&gt;https://https://minimalist-feedback-api.onrender.com/feedbacks&lt;/a&gt;]&lt;br&gt;
&lt;em&gt;(Note: Since this uses a free-tier ephemeral SQLite, the data resets on every deploy)&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;The biggest takeaway from this project was learning how to navigate version incompatibilities between technologies. &lt;/p&gt;

&lt;p&gt;I saw firsthand how a solid architecture acts as a safety net. It turned what could have been a complete project restart into a series of manageable, easy-to-execute changes. Tools will always change, but good architecture ensures your business rules remain constant.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Beyond the Terminal: Why My Next Project is a Minimalist API</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Tue, 31 Mar 2026 17:53:05 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/beyond-the-terminal-why-my-next-project-is-a-minimalist-api-fp6</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/beyond-the-terminal-why-my-next-project-is-a-minimalist-api-fp6</guid>
      <description>&lt;p&gt;Moving from local tools to network services. Let's talk about the architecture and challenges of building a professional Feedback API.&lt;/p&gt;




&lt;p&gt;In my last posts, I shared the journey of building a CLI tool with a focus on simple architecture and automated testing. It was a success in terms of &lt;strong&gt;local automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But in the real world, software often needs to live on the network. It needs to be available for multiple users, persist data in a database, and handle concurrent requests.&lt;/p&gt;

&lt;p&gt;That’s why my next project is a &lt;strong&gt;Minimalist Feedback API&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Here is why I’m building it and the "Senior-level" architectural choices I’m making.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Use Case: A Universal Feedback Bridge
&lt;/h2&gt;

&lt;p&gt;Many developers build beautiful static portfolios (using Astro, Next.js, or Hugo). But when it comes to adding a "Contact Me" or "Feedback" form, they hit a wall. They usually end up using a third-party paid service or a complex backend.&lt;/p&gt;

&lt;p&gt;I’m building a lightweight, professional service that any static site can "talk to" to store messages and feedbacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architectural Shift: Clean Thinking
&lt;/h2&gt;

&lt;p&gt;For this API, I’m not just throwing everything into a single &lt;code&gt;server.js&lt;/code&gt; file. I’m introducing a simplified version of &lt;strong&gt;Clean Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Domain First, Framework Second
&lt;/h3&gt;

&lt;p&gt;The "Business Logic" (what defines a valid feedback) should not depend on whether I'm using Express, Fastify, or even if I'm saving to MongoDB or PostgreSQL. The heart of the application will be isolated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Validation as a First-Class Citizen
&lt;/h3&gt;

&lt;p&gt;In a CLI, you control the input. In an API, the world is a chaotic place. I’ll be using &lt;strong&gt;Zod&lt;/strong&gt; to ensure that only "clean" data enters my system. No validation, no entry.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Dependency Injection
&lt;/h3&gt;

&lt;p&gt;I want to be able to test my logic without actually hitting a real database. By using Dependency Injection, I can swap a "Real Repository" for a "Mock Repository" in my tests instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack for 2024/2025
&lt;/h2&gt;

&lt;p&gt;To keep it modern and fast, I’ve chosen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; (Runtime)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fastify&lt;/strong&gt;: Faster and more modern than Express, with great TypeScript support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite + Prisma&lt;/strong&gt;: For easy setup and type-safe database queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jest&lt;/strong&gt;: Because a professional API without tests is just a disaster waiting to happen.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What to Expect in the Next Posts
&lt;/h2&gt;

&lt;p&gt;I’ll be documenting the &lt;strong&gt;Step-by-Step&lt;/strong&gt; construction of this API. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 1:&lt;/strong&gt; Designing the Domain and Entities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 2:&lt;/strong&gt; Setting up the HTTP Layer with Fastify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 3:&lt;/strong&gt; Database Integration and Migrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4:&lt;/strong&gt; Deploying with Docker/Cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't just to show you "how to code an API," but how to &lt;strong&gt;engineer a service&lt;/strong&gt; that you’d be proud to show in a technical interview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you build an API, what is your biggest challenge? Authentication, Database design, or Deployment? Let's talk in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>architecture</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Stop Losing Your Documentation Images: Building a Practical CLI with Node.js</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Sun, 29 Mar 2026 15:58:22 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/stop-losing-your-documentation-images-building-a-practical-cli-with-nodejs-1de4</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/stop-losing-your-documentation-images-building-a-practical-cli-with-nodejs-1de4</guid>
      <description>&lt;p&gt;External images in Markdown are a risk. I built a tool to solve this, focusing on simple architecture and testability.&lt;/p&gt;




&lt;p&gt;Have you ever opened an old GitHub repository or a blog post only to find "broken image" icons everywhere? &lt;/p&gt;

&lt;p&gt;It happens because we rely on external hosts. If the host goes down, your documentation dies. &lt;/p&gt;

&lt;p&gt;In my last articles, I talked about &lt;strong&gt;Senior Mindset&lt;/strong&gt; and &lt;strong&gt;Simple Architecture&lt;/strong&gt;. Today, I’m putting those words into practice. I built &lt;strong&gt;MIL (Markdown Image Localizer)&lt;/strong&gt;: a CLI tool that finds remote images in your files, downloads them locally, and updates your links automatically.&lt;/p&gt;

&lt;p&gt;Here is how I built it and why the "how" matters more than the code itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: The Fragility of the Web
&lt;/h2&gt;

&lt;p&gt;We often use direct links for images in Markdown. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dependency:&lt;/strong&gt; If the source site changes, your image breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Access:&lt;/strong&gt; You can't read your docs properly without internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Labor:&lt;/strong&gt; Downloading 20 images and updating 20 links manually is a waste of an engineer's time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Solution: MIL (Markdown Image Localizer)
&lt;/h2&gt;

&lt;p&gt;I designed this tool following three core principles: &lt;strong&gt;Simplicity, Separation of Concerns, and Testability.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Simple Architecture
&lt;/h3&gt;

&lt;p&gt;Instead of one giant file, I split the logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Parser&lt;/code&gt;: Pure logic to find URLs using Regex.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Downloader&lt;/code&gt;: Handles the I/O and HTTP requests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Processor&lt;/code&gt;: Orchestrates the flow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLI&lt;/code&gt;: The entry point that talks to the user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because if I want to turn this into a VS Code extension or a Web API tomorrow, the "Core" logic is already isolated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reliability through Testing
&lt;/h3&gt;

&lt;p&gt;I didn't just "hope" the Regex worked. I implemented unit tests using &lt;strong&gt;Jest&lt;/strong&gt;. &lt;br&gt;
Before the first commit, I ensured that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It ignores local images.&lt;/li&gt;
&lt;li&gt;It handles duplicate URLs (no redundant downloads).&lt;/li&gt;
&lt;li&gt;It returns empty results when no images exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"Code without tests is just a rumor."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  See the Code
&lt;/h2&gt;

&lt;p&gt;You can check the full source code, the folder structure, and the tests here:&lt;br&gt;
👉 &lt;a href="https://github.com/rj-dev/markdown-image-localizer" rel="noopener noreferrer"&gt;GitHub: markdown-image-localizer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to run it:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
git clone [https://github.com/rj-dev/markdown-image-localizer](https://github.com/rj-dev/markdown-image-localizer)
npm install
node index.js your-file.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>node</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Art of Finishing: Why a Working "Simple" Project is Worth More Than a Perfect "Unfinished" One</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Sun, 29 Mar 2026 11:21:40 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/the-art-of-finishing-why-a-working-simple-project-is-worth-more-than-a-perfect-unfinished-one-3h7j</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/the-art-of-finishing-why-a-working-simple-project-is-worth-more-than-a-perfect-unfinished-one-3h7j</guid>
      <description>&lt;p&gt;We all have a folder full of unfinished projects. Here is why finishing a small, simple tool is the best thing you can do for your career right now.&lt;/p&gt;




&lt;p&gt;We’ve all been there. &lt;/p&gt;

&lt;p&gt;You have a "revolutionary" idea for a SaaS. You spend three days picking the perfect CSS library. Two days setting up a complex Docker environment. Another week debating which state management tool to use.&lt;/p&gt;

&lt;p&gt;And then... you stop. &lt;/p&gt;

&lt;p&gt;The project stays in your &lt;code&gt;/dev&lt;/code&gt; folder, gathering digital dust. &lt;/p&gt;

&lt;p&gt;In the professional world, &lt;strong&gt;an unfinished "perfect" architecture is worth zero.&lt;/strong&gt; A simple, working, and tested script that solves a real problem is worth everything.&lt;/p&gt;

&lt;p&gt;As I prepare to launch my first practical projects here on DEV.to, I want to talk about the "Mindset of Done."&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The "Scope Creep" Trap
&lt;/h2&gt;

&lt;p&gt;The reason we don't finish things is that we let the scope grow too fast. &lt;br&gt;
&lt;em&gt;"It needs a login!"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"It needs a dashboard!"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"It needs to be mobile-responsive!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Senior Approach:&lt;/strong&gt; Cut everything until you have the &lt;strong&gt;Minimum Viable Value.&lt;/strong&gt; If you are building a CLI tool to rename files, just make it rename files. Everything else is a distraction for "Version 2."&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Shipping is a Feature
&lt;/h2&gt;

&lt;p&gt;Shipping—actually putting your code on GitHub with a README and a release—is a skill. &lt;/p&gt;

&lt;p&gt;When you finish a project, you deal with the "unfun" parts that teach you the most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixing that last annoying bug.&lt;/li&gt;
&lt;li&gt;Writing the installation guide.&lt;/li&gt;
&lt;li&gt;Setting up a simple CI/CD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recruiters don't look for "Genius in Progress." They look for &lt;strong&gt;"Engineers who Deliver."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The "90/10" Rule of Software
&lt;/h2&gt;

&lt;p&gt;The first 90% of a project is fun. The last 10% (documentation, edge cases, final polish) is where the real engineering happens. &lt;/p&gt;

&lt;p&gt;Most developers quit at 90%. If you can push through that last 10%, you are already ahead of the majority of the market.&lt;/p&gt;




&lt;h2&gt;
  
  
  How AI Helps You Cross the Finish Line
&lt;/h2&gt;

&lt;p&gt;I use AI specifically to kill the "Last 10%" friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"The Boring Stuff":&lt;/strong&gt; I ask AI to generate the &lt;code&gt;package.json&lt;/code&gt; or &lt;code&gt;requirements.txt&lt;/code&gt; based on my imports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"README Architect":&lt;/strong&gt; I describe my project and ask: &lt;em&gt;"Write a clear 'How to Install' section for a beginner."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Edge Case Hunter":&lt;/strong&gt; I share my logic and ask: &lt;em&gt;"What is the one thing that will make this crash when a user runs it for the first time?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is my "Finishing Assistant." It handles the friction so I can focus on the core value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Week: The First Commit
&lt;/h2&gt;

&lt;p&gt;I’m done talking about theory. &lt;/p&gt;

&lt;p&gt;Next week, I’ll be sharing the first repository of this series: &lt;strong&gt;A CLI Tool built with Simple Architecture.&lt;/strong&gt; It’s not going to be a 10,000-line monster. It’s going to be a clean, tested, and &lt;strong&gt;finished&lt;/strong&gt; piece of software that solves a specific problem. I’m doing this to show you that "Simple and Done" is the ultimate senior flex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many unfinished projects do you have in your folders right now? Let's be honest in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>opensource</category>
      <category>career</category>
    </item>
    <item>
      <title>The Seniority Gap: Why Companies Hire Solutions, Not Just Syntax</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Thu, 19 Mar 2026 19:37:49 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/the-seniority-gap-why-companies-hire-solutions-not-just-syntax-1l1e</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/the-seniority-gap-why-companies-hire-solutions-not-just-syntax-1l1e</guid>
      <description>&lt;p&gt;Technical skills are the baseline. But what actually gets you hired at high-level positions? Let's talk about the gap between coding and engineering.&lt;/p&gt;

&lt;p&gt;I’ve interviewed hundreds of developers over the last decade. &lt;/p&gt;

&lt;p&gt;Many of them were brilliant at solving LeetCode puzzles. They knew every obscure feature of their favorite language. &lt;/p&gt;

&lt;p&gt;But when I asked them: &lt;em&gt;"How would this code impact the business if the requirements changed tomorrow?"&lt;/em&gt;... they went silent.&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;"Seniority Gap."&lt;/strong&gt; Companies aren't looking for people who can just type code. They are looking for Engineers who can bridge the gap between a business problem and a sustainable technical solution.&lt;/p&gt;

&lt;p&gt;Before I share my upcoming practical projects on GitHub, I want to talk about the three pillars that actually make a developer "Hirable" in today's market.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Context Over Syntax
&lt;/h2&gt;

&lt;p&gt;A junior developer focuses on &lt;em&gt;how&lt;/em&gt; to write a loop. A senior developer focuses on &lt;em&gt;why&lt;/em&gt; that loop is necessary and if there’s a way to avoid it entirely.&lt;/p&gt;

&lt;p&gt;When you show a project to a recruiter, don't just show the code. Explain the &lt;strong&gt;context&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem were you solving?&lt;/li&gt;
&lt;li&gt;Why did you choose this specific approach over others?&lt;/li&gt;
&lt;li&gt;What were the constraints?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The "Maintainability" Mindset
&lt;/h2&gt;

&lt;p&gt;Code is written once, but read and modified a thousand times. &lt;/p&gt;

&lt;p&gt;If your project is "clever" but impossible to understand six months later, it’s a liability, not an asset. &lt;/p&gt;

&lt;p&gt;In the professional world, &lt;strong&gt;clarity is more valuable than brilliance.&lt;/strong&gt; High-level developers write code that looks "obvious" because they’ve done the hard work of simplifying the complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Ownership and "The Big Picture"
&lt;/h2&gt;

&lt;p&gt;Professional engineering is about taking ownership. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s about knowing how your code is deployed. &lt;/li&gt;
&lt;li&gt;It’s about understanding if your API is slow for the end-user. &lt;/li&gt;
&lt;li&gt;It’s about ensuring that your tests actually protect the business logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you demonstrate that you care about the &lt;strong&gt;entire lifecycle&lt;/strong&gt; of the software, you stop being a "task-taker" and start being a "partner."&lt;/p&gt;




&lt;h2&gt;
  
  
  How AI Helps You Close the Gap
&lt;/h2&gt;

&lt;p&gt;AI is the ultimate tool for expanding your perspective beyond the code editor. Use it to simulate "Business Thinking":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Roleplay as a Product Manager":&lt;/strong&gt; Feed your project idea to the AI and ask: &lt;em&gt;"What are the 3 biggest risks for this project from a business perspective?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Critique my Architecture":&lt;/strong&gt; Ask: &lt;em&gt;"If I need to scale this to 10x the users, where will it break first?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Documentation for Humans":&lt;/strong&gt; Use AI to help you write a README that speaks to both developers (technical) and managers (value-driven).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI handles the "how," which leaves you free to master the "why."&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought: Setting the Stage
&lt;/h2&gt;

&lt;p&gt;In my next posts, I will finally open my GitHub for the projects I’ve been talking about. &lt;/p&gt;

&lt;p&gt;But I won't just dump code there. I’ll be applying everything we’ve discussed: &lt;strong&gt;Simplicity, Testing, and Business Value.&lt;/strong&gt; I want to show you that a "Senior Portfolio" isn't about how many stars you have, but about how clearly you demonstrate your ability to solve real problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you ready to stop just "coding" and start "engineering"? What’s the biggest non-technical challenge you face at work? Let’s discuss below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mistakes I Made as a Developer (And What They Taught Me)</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Sun, 15 Mar 2026 09:17:50 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/mistakes-i-made-as-a-developer-and-what-they-taught-me-4l94</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/mistakes-i-made-as-a-developer-and-what-they-taught-me-4l94</guid>
      <description>&lt;p&gt;If you stay long enough in software development, you will make mistakes.&lt;/p&gt;

&lt;p&gt;Not small ones.&lt;/p&gt;

&lt;p&gt;Real ones.&lt;/p&gt;

&lt;p&gt;Bugs in production.&lt;br&gt;&lt;br&gt;
Bad architectural decisions.&lt;br&gt;&lt;br&gt;
Features that had to be rewritten from scratch.&lt;/p&gt;

&lt;p&gt;When I started my career, I thought good developers avoided mistakes.&lt;/p&gt;

&lt;p&gt;Now I understand something different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Good developers learn faster from them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are some mistakes I made during my journey — and what they taught me.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Trying to Know Everything
&lt;/h2&gt;

&lt;p&gt;Early in my career I believed I needed to understand everything.&lt;/p&gt;

&lt;p&gt;Every framework.&lt;br&gt;&lt;br&gt;
Every new tool.&lt;br&gt;&lt;br&gt;
Every programming language trend.&lt;/p&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;p&gt;Constant context switching.&lt;/p&gt;

&lt;p&gt;I was learning many things, but mastering none.&lt;/p&gt;

&lt;p&gt;What I eventually realized is that depth matters more than breadth.&lt;/p&gt;

&lt;p&gt;It's better to deeply understand a few tools than to superficially know many.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Writing “Perfect” Code Too Early
&lt;/h2&gt;

&lt;p&gt;Another mistake I made was trying to write perfect code from the beginning.&lt;/p&gt;

&lt;p&gt;Spending too much time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refactoring early&lt;/li&gt;
&lt;li&gt;overthinking architecture&lt;/li&gt;
&lt;li&gt;worrying about edge cases that never happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But software development is iterative.&lt;/p&gt;

&lt;p&gt;Often the best approach is:&lt;/p&gt;

&lt;p&gt;Write something simple → make it work → improve it later.&lt;/p&gt;

&lt;p&gt;Perfection too early slows progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Avoiding Asking Questions
&lt;/h2&gt;

&lt;p&gt;For a long time I hesitated to ask questions.&lt;/p&gt;

&lt;p&gt;I thought it might make me look inexperienced.&lt;/p&gt;

&lt;p&gt;So instead I would spend hours stuck on problems that could have been clarified in minutes.&lt;/p&gt;

&lt;p&gt;Eventually I realized something important:&lt;/p&gt;

&lt;p&gt;Good teams respect thoughtful questions.&lt;/p&gt;

&lt;p&gt;Asking for help is not weakness.&lt;/p&gt;

&lt;p&gt;It's efficiency.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Underestimating the Importance of Communication
&lt;/h2&gt;

&lt;p&gt;At first I believed programming was mostly about writing good code.&lt;/p&gt;

&lt;p&gt;But over time I learned that communication is just as important.&lt;/p&gt;

&lt;p&gt;Explaining decisions.&lt;br&gt;&lt;br&gt;
Discussing trade-offs.&lt;br&gt;&lt;br&gt;
Aligning with teammates.&lt;/p&gt;

&lt;p&gt;Great developers are not only good coders.&lt;/p&gt;

&lt;p&gt;They are also good communicators.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Ignoring the Bigger Picture
&lt;/h2&gt;

&lt;p&gt;When you're early in your career, it's easy to focus only on the code in front of you.&lt;/p&gt;

&lt;p&gt;But software exists inside larger systems.&lt;/p&gt;

&lt;p&gt;Understanding things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system architecture&lt;/li&gt;
&lt;li&gt;user impact&lt;/li&gt;
&lt;li&gt;scalability&lt;/li&gt;
&lt;li&gt;product goals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;changes the way you approach problems.&lt;/p&gt;

&lt;p&gt;Coding becomes more intentional.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Waiting Too Long to Build Personal Projects
&lt;/h2&gt;

&lt;p&gt;For a long time, most of my coding happened only at work.&lt;/p&gt;

&lt;p&gt;But personal projects teach things that professional environments sometimes don't.&lt;/p&gt;

&lt;p&gt;They give you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full ownership&lt;/li&gt;
&lt;li&gt;freedom to experiment&lt;/li&gt;
&lt;li&gt;the chance to try new ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small projects can expand your thinking as a developer.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Not Realizing How Long the Journey Is
&lt;/h2&gt;

&lt;p&gt;In the beginning, I thought becoming a strong developer would happen quickly.&lt;/p&gt;

&lt;p&gt;But this field is a long-term journey.&lt;/p&gt;

&lt;p&gt;There is always more to learn.&lt;/p&gt;

&lt;p&gt;New tools.&lt;br&gt;&lt;br&gt;
New patterns.&lt;br&gt;&lt;br&gt;
New ways to solve problems.&lt;/p&gt;

&lt;p&gt;And that's actually one of the best parts of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Mistakes are not the opposite of progress.&lt;/p&gt;

&lt;p&gt;They are part of it.&lt;/p&gt;

&lt;p&gt;Every developer has a list of things they would do differently today.&lt;/p&gt;

&lt;p&gt;The important thing is to keep learning from those experiences and keep moving forward.&lt;/p&gt;

&lt;p&gt;Because in software development, improvement is continuous.&lt;/p&gt;

&lt;p&gt;And that's what makes the journey interesting.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why I’m Choosing Simplicity for My Next GitHub Projects</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Sun, 15 Mar 2026 09:10:12 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/why-im-choosing-simplicity-for-my-next-github-projects-je8</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/why-im-choosing-simplicity-for-my-next-github-projects-je8</guid>
      <description>&lt;p&gt;I’m starting a series of practical projects to demonstrate that clean, simple architecture is the best way to build software. Here is the plan.&lt;/p&gt;




&lt;p&gt;In my last post, I talked about why &lt;strong&gt;Simple Architecture&lt;/strong&gt; is a superpower. &lt;/p&gt;

&lt;p&gt;But talk is cheap. Code is what matters.&lt;/p&gt;

&lt;p&gt;To prove that you don't need overengineered systems to build high-quality software, I’m starting a series of small, real-world projects that I’ll be sharing on GitHub. &lt;/p&gt;

&lt;p&gt;My goal is twofold: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To show that a clean, well-tested "boring" stack is often better than a complex trendy one.&lt;/li&gt;
&lt;li&gt;To help other developers see how to structure projects that are easy to maintain and scale.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the "Mental Framework" I’m using to choose my tools and why this matters for your career too.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The "Boring Technology" Rule
&lt;/h2&gt;

&lt;p&gt;For these projects, I’m avoiding the "flavor of the week" frameworks. &lt;/p&gt;

&lt;p&gt;I’m choosing technologies that are stable, have great documentation, and a strong community. Whether it's Node.js, Python, or Go, the focus isn't on the language itself, but on how I solve problems with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because companies don't want a developer who experiments with their production code. They want someone who delivers reliable solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Focus on "Core Logic" first
&lt;/h2&gt;

&lt;p&gt;In the upcoming projects, you will notice that the business logic is separated from the framework. &lt;/p&gt;

&lt;p&gt;If I’m building a &lt;strong&gt;CLI Tool&lt;/strong&gt; (my first project!), the logic that calculates a task shouldn't care if it's running in a terminal or a web server. This is the heart of simple architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. README as a First-Class Citizen
&lt;/h2&gt;

&lt;p&gt;A project without a good README is like a book without a cover. &lt;/p&gt;

&lt;p&gt;For every repo I share, I’m focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The "Why":&lt;/strong&gt; What problem does this solve?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "How":&lt;/strong&gt; Clear installation and usage instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Tests":&lt;/strong&gt; Showing that the code works as expected.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How AI is Helping Me Prototype Faster
&lt;/h2&gt;

&lt;p&gt;I'm using AI to speed up the "setup" phase of these projects. Here’s how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Boilerplate Generation":&lt;/strong&gt; Instead of spending an hour setting up a folder structure, I ask AI to generate a clean, modular structure based on my architectural rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Documentation Drafts":&lt;/strong&gt; I feed my code to the AI and ask it to write the first draft of the README. I then refine it to ensure it has my "voice" and technical accuracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI allows me to focus on the &lt;strong&gt;decisions&lt;/strong&gt;, while it handles the &lt;strong&gt;repetition&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Coming Next?
&lt;/h2&gt;

&lt;p&gt;The first project will be a &lt;strong&gt;CLI Tool&lt;/strong&gt; designed to solve a common developer pain point. It will be small, fast, and 100% open-source.&lt;/p&gt;

&lt;p&gt;I want to show you that a professional repository isn't about the number of files, but the quality of the decisions inside them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you value most when you look at someone's GitHub? The complexity of the code or the clarity of the documentation? Let's talk below!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Simple Architecture: The Secret Skill of High-Impact Developers</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Sun, 08 Mar 2026 16:01:13 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/simple-architecture-the-secret-skill-of-high-impact-developers-8de</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/simple-architecture-the-secret-skill-of-high-impact-developers-8de</guid>
      <description>&lt;p&gt;Most developers overcomplicate systems thinking it makes them look "senior." Real seniority is building things that stay simple.&lt;br&gt;
tags: architecture, programming, softwaredevelopment, career&lt;/p&gt;




&lt;p&gt;When I started my career, I thought a "Senior Architect" was someone who could draw the most complex diagrams.&lt;/p&gt;

&lt;p&gt;I thought that if a system didn't have layers of abstractions, microservices, and design patterns everywhere, it wasn't "professional."&lt;/p&gt;

&lt;p&gt;I was wrong. &lt;/p&gt;

&lt;p&gt;After 10+ years, I realized that &lt;strong&gt;complexity is a debt you pay every day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most impressive thing you can build is a system that a junior can understand in 30 minutes, but that can still handle millions of requests.&lt;/p&gt;

&lt;p&gt;Here is how you can start thinking about "Simple Architecture."&lt;/p&gt;




&lt;h2&gt;
  
  
  1. YAGNI (You Ain't Gonna Need It)
&lt;/h2&gt;

&lt;p&gt;This is the golden rule. &lt;/p&gt;

&lt;p&gt;We often build "generic" solutions because we think: &lt;em&gt;"What if we need to change the database next month?"&lt;/em&gt; or &lt;em&gt;"What if we need to scale to a billion users tomorrow?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality check:&lt;/strong&gt; You probably won't. &lt;/p&gt;

&lt;p&gt;When you build for a future that hasn't happened yet, you are wasting the company's time and making the current code harder to maintain. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Simple Rule:&lt;/strong&gt; Build for the problems you have today. Design your code to be &lt;em&gt;easy to change&lt;/em&gt;, not &lt;em&gt;pre-built for everything&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Follow the "Delete" Principle
&lt;/h2&gt;

&lt;p&gt;A good architecture is not measured by how much code you add, but by how much code you can safely delete.&lt;/p&gt;

&lt;p&gt;If your "Business Logic" is mixed with your "Database Logic" and your "UI Logic," you can't change anything without breaking everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Simple Fix:&lt;/strong&gt; Keep things separated. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep your rules in one place.&lt;/li&gt;
&lt;li&gt;Keep your data access in another.&lt;/li&gt;
&lt;li&gt;Make sure they talk to each other through clear, simple "contracts."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Don't Invent Your Own Problems
&lt;/h2&gt;

&lt;p&gt;Before you decide to use a complex tool (like Redux, Kubernetes, or a NoSQL database), ask yourself: &lt;em&gt;"Does this solve a problem I actually have, or am I just following a trend?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, a simple SQL table and a well-organized folder structure are all you need for 90% of projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  How AI Can Help You "Simplify"
&lt;/h2&gt;

&lt;p&gt;AI is great at generating code, but it's even better at &lt;strong&gt;simplifying&lt;/strong&gt; it. Use it as a "Complexity Auditor":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Spot the Overengineering":&lt;/strong&gt; Paste a piece of your architecture/code and ask: &lt;em&gt;"Is there a simpler way to achieve this result without these abstractions?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Explain the Logic":&lt;/strong&gt; Ask AI: &lt;em&gt;"If a Junior developer reads this, what would be the most confusing part?"&lt;/em&gt; Then, refactor that part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Contract Design":&lt;/strong&gt; Use it to help define simple interfaces between your modules, ensuring they stay decoupled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can help you find the shortest path between a problem and a solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought: The Path to Your Next Project
&lt;/h2&gt;

&lt;p&gt;Simple architecture isn't about being "lazy." It's about being &lt;strong&gt;strategic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In my next posts, I’m going to start sharing &lt;strong&gt;small, real-world projects on GitHub&lt;/strong&gt; that follow these principles. No "hello world" stuff, but real tools built with simplicity and scalability in mind.&lt;/p&gt;

&lt;p&gt;If you want to build a portfolio that actually catches the eye of a recruiter, stop showing them how "complex" you can be. Show them how &lt;strong&gt;efficient&lt;/strong&gt; you are.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What is the most overengineered system you've ever worked on? Tell me your horror stories in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>career</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Why You Hate Testing (And How to Stop Worrying About Your Code)</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Fri, 06 Mar 2026 09:27:09 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/why-you-hate-testing-and-how-to-stop-worrying-about-your-code-kke</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/why-you-hate-testing-and-how-to-stop-worrying-about-your-code-kke</guid>
      <description>&lt;p&gt;Testing isn't about finding bugs. It's about buying your freedom and sleeping better at night. Let's change how you look at QA.&lt;br&gt;
tags: testing, programming, career, softwaredevelopment&lt;/p&gt;




&lt;p&gt;"I don't have time to write tests. I have features to deliver."&lt;/p&gt;

&lt;p&gt;I said this for years.&lt;/p&gt;

&lt;p&gt;I thought I was being productive. I thought I was fast. &lt;/p&gt;

&lt;p&gt;But I wasn't fast. I was just leaving a trail of "time bombs" behind me. &lt;/p&gt;

&lt;p&gt;Every time I touched an old piece of code, I was terrified of breaking something. Every deployment felt like a gamble. Every weekend, I was afraid of getting a notification that the production server was down.&lt;/p&gt;

&lt;p&gt;If you hate testing, it’s probably because you’re looking at it the wrong way.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Testing Is Not for the Machine
&lt;/h2&gt;

&lt;p&gt;The computer doesn't care if your code is tested. It will run whatever you give it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing is for You.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a gift you give to your "Future Self." &lt;/p&gt;

&lt;p&gt;When you have a solid test suite, you gain the freedom to refactor, the freedom to change frameworks, and the freedom to go on vacation without checking your email every five minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Don't Test "Implementation," Test "Behavior"
&lt;/h2&gt;

&lt;p&gt;The biggest reason developers struggle with tests is that they try to test &lt;em&gt;how&lt;/em&gt; the code works.&lt;/p&gt;

&lt;p&gt;If you change a variable name and your tests break, your tests are too fragile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Secret:&lt;/strong&gt; Test the output, not the journey. &lt;br&gt;
If I put &lt;code&gt;2 + 2&lt;/code&gt; into the function, I expect &lt;code&gt;4&lt;/code&gt;. I don't care if the function uses a loop, a library, or magic to get there. Focus on the results that matter to the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The "Cost of Fixing" Rule
&lt;/h2&gt;

&lt;p&gt;A bug found during development costs &lt;strong&gt;$1&lt;/strong&gt; to fix.&lt;br&gt;
A bug found in a Pull Request costs &lt;strong&gt;$10&lt;/strong&gt;.&lt;br&gt;
A bug found in Production costs &lt;strong&gt;$100&lt;/strong&gt; (and your reputation).&lt;/p&gt;

&lt;p&gt;Writing tests is like paying for insurance. You hope you never need it, but you're incredibly glad it's there when a disaster happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Start Small: The "One-Test" Rule
&lt;/h2&gt;

&lt;p&gt;Don't try to reach 100% code coverage overnight. It’s a trap.&lt;/p&gt;

&lt;p&gt;Start by testing the "Happy Path"—the most common way a user uses your feature. If that works, you’ve already eliminated 80% of the risk. &lt;/p&gt;

&lt;p&gt;Confidence is built one test at a time.&lt;/p&gt;




&lt;h2&gt;
  
  
  How AI Can Help You Write Better Tests
&lt;/h2&gt;

&lt;p&gt;Writing tests used to be tedious. Not anymore. You can use AI to do the "heavy lifting" so you can focus on the logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Generate Edge Cases":&lt;/strong&gt; Paste your function and ask AI: &lt;em&gt;"Give me 5 edge cases (null values, empty strings, huge numbers) that could break this code."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Explain the Failure":&lt;/strong&gt; If a test fails and you don't know why, ask AI: &lt;em&gt;"This test is failing with error X. Based on this code, what am I missing?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Boilerplate Assistant":&lt;/strong&gt; Use AI to generate the repetitive setup code (Mocks and Stubs) so you can get straight to the assertions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI makes testing faster, but your human experience is what decides &lt;strong&gt;what&lt;/strong&gt; is worth testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;A Senior Developer isn't someone who never makes mistakes. &lt;/p&gt;

&lt;p&gt;A Senior Developer is someone who builds systems that &lt;em&gt;catch&lt;/em&gt; those mistakes automatically. &lt;/p&gt;

&lt;p&gt;Stop thinking of testing as a chore. Start thinking of it as your "Freedom Policy."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you feel about testing? Is it a part of your daily workflow or a "nice-to-have" that never happens? Let's talk in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>career</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How to Read Code You Didn't Write (Without Losing Your Mind)</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Tue, 03 Mar 2026 20:01:16 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/how-to-read-code-you-didnt-write-without-losing-your-mind-284e</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/how-to-read-code-you-didnt-write-without-losing-your-mind-284e</guid>
      <description>&lt;p&gt;Reading other people's code is a superpower. Here is a practical guide on how to navigate a new codebase without feeling overwhelmed.&lt;/p&gt;




&lt;p&gt;Opening a new, massive codebase for the first time feels like being dropped in the middle of a foreign city without a map.&lt;/p&gt;

&lt;p&gt;The folders are unfamiliar.&lt;br&gt;
The naming conventions are strange.&lt;br&gt;
The logic seems to jump from one file to another for no apparent reason.&lt;/p&gt;

&lt;p&gt;When I was a junior, this terrified me. I thought that if I couldn't understand it all in ten minutes, I wasn't "smart enough" for the job.&lt;/p&gt;

&lt;p&gt;But here is the truth: &lt;strong&gt;Reading code is harder than writing it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even for experienced engineers.&lt;/p&gt;

&lt;p&gt;If you are struggling to understand a legacy project or a teammate’s Pull Request, here is a mental framework to help you navigate the chaos.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Stop Trying to Understand Everything at Once
&lt;/h2&gt;

&lt;p&gt;The biggest mistake is trying to read a codebase like a book—from start to finish.&lt;/p&gt;

&lt;p&gt;Software is a web, not a linear story.&lt;/p&gt;

&lt;p&gt;If you try to understand every single line in your first hour, you will burn out before you even find the &lt;code&gt;main&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Focus on a single "Path of Execution." Pick one feature (e.g., "User Login") and follow only the code related to that specific flow. Ignore everything else for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Find the "Entry Points"
&lt;/h2&gt;

&lt;p&gt;Every application has a starting point.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In a React app, it might be &lt;code&gt;App.tsx&lt;/code&gt; or your router file.&lt;/li&gt;
&lt;li&gt;In a backend API, it’s the &lt;code&gt;Routes&lt;/code&gt; or &lt;code&gt;Controllers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In a script, it’s the &lt;code&gt;main&lt;/code&gt; function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start there. Ask yourself: "Where does the data enter the system?" Once you find the door, it's much easier to follow the hallway.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Look at the Tests (The Secret Documentation)
&lt;/h2&gt;

&lt;p&gt;If the project has good tests, you are in luck.&lt;/p&gt;

&lt;p&gt;Documentation can lie or be outdated. &lt;strong&gt;Tests never lie.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read the test descriptions (the &lt;code&gt;it&lt;/code&gt; or &lt;code&gt;test&lt;/code&gt; blocks). They tell you exactly what the code is &lt;em&gt;supposed&lt;/em&gt; to do in plain English. If you see a test named &lt;code&gt;should_return_error_when_email_is_invalid&lt;/code&gt;, you’ve just learned a business rule without reading a single line of complex logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use "Print Debugging" as a Compass
&lt;/h2&gt;

&lt;p&gt;Sometimes, modern IDEs and debuggers are overkill when you just want to see how things connect.&lt;/p&gt;

&lt;p&gt;Don't be afraid to sprinkle some &lt;code&gt;console.log&lt;/code&gt; or &lt;code&gt;print&lt;/code&gt; statements throughout the code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Did the code reach this line?"&lt;/li&gt;
&lt;li&gt;"What does the data look like at this point?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seeing the output in your terminal makes the abstract code feel real and tangible. Just remember to delete them before you commit!&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Reverse Engineer the UI
&lt;/h2&gt;

&lt;p&gt;If it's a frontend project, use the browser's "Inspect Element" tool.&lt;/p&gt;

&lt;p&gt;Find a unique CSS class or a specific piece of text on the screen. Then, search for that string in your code editor. This will lead you directly to the component responsible for that part of the app.&lt;/p&gt;

&lt;p&gt;It’s like working backward from the result to the cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Write Your Own Comments
&lt;/h2&gt;

&lt;p&gt;As you explore, you will figure things out. Don't let that knowledge vanish.&lt;/p&gt;

&lt;p&gt;Add temporary comments:&lt;br&gt;
&lt;code&gt;// This function calculates the total price including tax&lt;/code&gt;&lt;br&gt;
&lt;code&gt;// This part seems to handle the database connection&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Treat the codebase like a map you are drawing while exploring a cave. These notes are your breadcrumbs.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Use AI as Your "Code Translator"
&lt;/h2&gt;

&lt;p&gt;We live in an era where you don't have to decipher complex logic alone. AI can be a powerful ally when reading unfamiliar code—if you use it correctly.&lt;/p&gt;

&lt;p&gt;Instead of asking "What does this whole project do?", try these specific prompts with a snippet of code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Explain the data flow in this function":&lt;/strong&gt; Great for understanding how an input becomes an output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What are the edge cases handled here?":&lt;/strong&gt; This helps you see the hidden logic you might have missed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Refactor this for readability":&lt;/strong&gt; You don't have to keep the refactored code, but seeing a "cleaner" version of the same logic can help you understand the original intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat the AI like a Senior Developer sitting next to you. Ask it questions, but always verify the answers against the actual behavior of the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Reading code is a muscle.&lt;/p&gt;

&lt;p&gt;The first time you do it, it’s painful. The second time, it’s slightly less confusing. By the hundredth time, you start seeing patterns instead of just syntax.&lt;/p&gt;

&lt;p&gt;Don't rush yourself. Be patient with your brain.&lt;/p&gt;

&lt;p&gt;You don't need to know how the whole clock works to tell the time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What is your biggest challenge when joining a new project? Let’s talk about it in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Things I Wish I Knew When I Started Learning Programming</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Mon, 02 Mar 2026 13:17:49 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/things-i-wish-i-knew-when-i-started-learning-programming-22m5</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/things-i-wish-i-knew-when-i-started-learning-programming-22m5</guid>
      <description>&lt;p&gt;When I first started learning programming, I thought the hardest part would be understanding the code.&lt;/p&gt;

&lt;p&gt;I was wrong.&lt;/p&gt;

&lt;p&gt;The hardest part was everything around it.&lt;/p&gt;

&lt;p&gt;The confusion.&lt;br&gt;&lt;br&gt;
The frustration.&lt;br&gt;&lt;br&gt;
The feeling that everyone else understood things faster than I did.&lt;/p&gt;

&lt;p&gt;Looking back now, after many years working as a software engineer, there are a few things I wish someone had told me earlier.&lt;/p&gt;

&lt;p&gt;Not technical things.&lt;/p&gt;

&lt;p&gt;Human things.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Feeling Lost Is Part of the Process
&lt;/h2&gt;

&lt;p&gt;In the beginning, everything feels overwhelming.&lt;/p&gt;

&lt;p&gt;You see terms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs
&lt;/li&gt;
&lt;li&gt;Frameworks
&lt;/li&gt;
&lt;li&gt;Databases
&lt;/li&gt;
&lt;li&gt;Containers
&lt;/li&gt;
&lt;li&gt;Cloud
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it feels like an endless mountain of things you need to learn.&lt;/p&gt;

&lt;p&gt;What nobody tells you is that &lt;strong&gt;even experienced developers feel lost sometimes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technology moves fast.&lt;/p&gt;

&lt;p&gt;No one knows everything.&lt;/p&gt;

&lt;p&gt;Learning how to navigate uncertainty is part of becoming a developer.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Progress Is Slower Than You Expect
&lt;/h2&gt;

&lt;p&gt;When you start learning programming, you often imagine quick progress.&lt;/p&gt;

&lt;p&gt;Maybe a few months of study and then things will feel easy.&lt;/p&gt;

&lt;p&gt;But real growth in programming happens slowly.&lt;/p&gt;

&lt;p&gt;Sometimes you spend hours fixing a tiny bug.&lt;/p&gt;

&lt;p&gt;Sometimes you feel stuck for days.&lt;/p&gt;

&lt;p&gt;And then suddenly, months later, you realize something that once felt impossible now feels normal.&lt;/p&gt;

&lt;p&gt;Growth in programming is quiet.&lt;/p&gt;

&lt;p&gt;It happens gradually.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Everyone Struggles More Than They Show
&lt;/h2&gt;

&lt;p&gt;When you look at experienced developers online, everything seems polished.&lt;/p&gt;

&lt;p&gt;Clean repositories.&lt;br&gt;&lt;br&gt;
Confident explanations.&lt;br&gt;&lt;br&gt;
Well-written code.&lt;/p&gt;

&lt;p&gt;What you don't see are the messy parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The debugging sessions that took hours&lt;/li&gt;
&lt;li&gt;The mistakes&lt;/li&gt;
&lt;li&gt;The rewrites&lt;/li&gt;
&lt;li&gt;The moments of doubt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Behind every clean solution is usually a lot of trial and error.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Building Things Changes Everything
&lt;/h2&gt;

&lt;p&gt;For a long time, I focused mostly on learning.&lt;/p&gt;

&lt;p&gt;Courses.&lt;br&gt;&lt;br&gt;
Documentation.&lt;br&gt;&lt;br&gt;
Tutorials.&lt;/p&gt;

&lt;p&gt;But the moment things really started to change was when I began &lt;strong&gt;building things on my own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small tools.&lt;br&gt;&lt;br&gt;
Simple applications.&lt;br&gt;&lt;br&gt;
Experiments.&lt;/p&gt;

&lt;p&gt;Building forces you to think.&lt;/p&gt;

&lt;p&gt;It exposes gaps in your understanding.&lt;/p&gt;

&lt;p&gt;And it creates the kind of learning that sticks.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. It's Okay Not to Know Everything
&lt;/h2&gt;

&lt;p&gt;One of the biggest mindset shifts in this field is accepting that &lt;strong&gt;you will never know everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that's okay.&lt;/p&gt;

&lt;p&gt;Being a good developer isn't about knowing all technologies.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Learning continuously
&lt;/li&gt;
&lt;li&gt;Solving problems
&lt;/li&gt;
&lt;li&gt;Staying curious
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't perfection.&lt;/p&gt;

&lt;p&gt;The goal is progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Journey Is Longer Than You Think — and That's Good
&lt;/h2&gt;

&lt;p&gt;Programming is not something you master quickly.&lt;/p&gt;

&lt;p&gt;It's a long journey.&lt;/p&gt;

&lt;p&gt;But that's part of what makes it interesting.&lt;/p&gt;

&lt;p&gt;There is always something new to explore.&lt;/p&gt;

&lt;p&gt;A new concept to understand.&lt;/p&gt;

&lt;p&gt;A better way to solve a problem.&lt;/p&gt;

&lt;p&gt;And over time, what once felt confusing becomes familiar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;If you're learning programming right now and sometimes feel lost, frustrated, or behind…&lt;/p&gt;

&lt;p&gt;You're not alone.&lt;/p&gt;

&lt;p&gt;Most developers have felt that way at some point.&lt;/p&gt;

&lt;p&gt;The important thing is not to rush the process.&lt;/p&gt;

&lt;p&gt;Keep learning.&lt;br&gt;&lt;br&gt;
Keep building.&lt;br&gt;&lt;br&gt;
Keep showing up.&lt;/p&gt;

&lt;p&gt;Over time, things start to make sense.&lt;/p&gt;

&lt;p&gt;And one day you'll look back and realize how far you've come.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>5 Signs You're Learning Programming the Wrong Way</title>
      <dc:creator>Renato Silva</dc:creator>
      <pubDate>Mon, 02 Mar 2026 13:11:50 +0000</pubDate>
      <link>https://dev.to/renato_silva_71eef0fc385f/5-signs-youre-learning-programming-the-wrong-way-2ih4</link>
      <guid>https://dev.to/renato_silva_71eef0fc385f/5-signs-youre-learning-programming-the-wrong-way-2ih4</guid>
      <description>&lt;p&gt;Learning programming today is easier than ever.&lt;/p&gt;

&lt;p&gt;Thousands of courses.&lt;br&gt;&lt;br&gt;
Endless tutorials.&lt;br&gt;&lt;br&gt;
AI assistants that can explain almost anything.&lt;/p&gt;

&lt;p&gt;And yet, many beginners spend &lt;strong&gt;years learning without feeling truly confident.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because they are unknowingly learning the wrong way.&lt;/p&gt;

&lt;p&gt;Here are five signs that might be happening to you.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. You Consume More Than You Build
&lt;/h2&gt;

&lt;p&gt;You watch tutorials.&lt;/p&gt;

&lt;p&gt;You follow along with instructors.&lt;/p&gt;

&lt;p&gt;You understand the explanation.&lt;/p&gt;

&lt;p&gt;But when the video ends, you rarely build something on your own.&lt;/p&gt;

&lt;p&gt;Learning by watching feels productive.&lt;/p&gt;

&lt;p&gt;But programming is a &lt;strong&gt;construction skill&lt;/strong&gt;, not a consumption skill.&lt;/p&gt;

&lt;p&gt;You only grow when you struggle to build something yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. You Keep Restarting From Scratch
&lt;/h2&gt;

&lt;p&gt;Many beginners do this cycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a course
&lt;/li&gt;
&lt;li&gt;Reach the middle
&lt;/li&gt;
&lt;li&gt;Feel confused
&lt;/li&gt;
&lt;li&gt;Restart another course
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It creates the illusion of progress.&lt;/p&gt;

&lt;p&gt;But restarting constantly prevents you from reaching the stage where learning actually becomes deep: &lt;strong&gt;problem solving.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. You Avoid Problems That Feel Too Hard
&lt;/h2&gt;

&lt;p&gt;When you encounter something difficult, you might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immediately search for the full solution&lt;/li&gt;
&lt;li&gt;Copy code without understanding it&lt;/li&gt;
&lt;li&gt;Skip the problem entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But difficult problems are where real growth happens.&lt;/p&gt;

&lt;p&gt;Struggle is not a sign of failure.&lt;/p&gt;

&lt;p&gt;It’s a sign that your brain is adapting.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Your Learning Has No Direction
&lt;/h2&gt;

&lt;p&gt;Sometimes beginners jump between topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend this week&lt;/li&gt;
&lt;li&gt;Backend next week&lt;/li&gt;
&lt;li&gt;A bit of AI&lt;/li&gt;
&lt;li&gt;A bit of cloud&lt;/li&gt;
&lt;li&gt;A new framework every month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exploration is good.&lt;/p&gt;

&lt;p&gt;But without focus, your progress becomes shallow.&lt;/p&gt;

&lt;p&gt;Depth matters more than variety early on.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. You Wait Until You Feel “Ready”
&lt;/h2&gt;

&lt;p&gt;Many people delay building real projects because they think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I need to learn more first.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But in programming, readiness comes &lt;strong&gt;after action&lt;/strong&gt;, not before.&lt;/p&gt;

&lt;p&gt;Your first projects will be messy.&lt;/p&gt;

&lt;p&gt;Your code will be imperfect.&lt;/p&gt;

&lt;p&gt;That’s normal.&lt;/p&gt;

&lt;p&gt;Every good developer has written bad code.&lt;/p&gt;

&lt;p&gt;A lot of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Better Way to Learn Programming
&lt;/h2&gt;

&lt;p&gt;A simple structure works surprisingly well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn a concept&lt;/li&gt;
&lt;li&gt;Build something small with it&lt;/li&gt;
&lt;li&gt;Break it&lt;/li&gt;
&lt;li&gt;Fix it&lt;/li&gt;
&lt;li&gt;Improve it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repeat.&lt;/p&gt;

&lt;p&gt;Progress in programming is iterative.&lt;/p&gt;

&lt;p&gt;Not linear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where AI Fits Into This
&lt;/h2&gt;

&lt;p&gt;AI can accelerate learning.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Explain errors&lt;/li&gt;
&lt;li&gt;Suggest solutions&lt;/li&gt;
&lt;li&gt;Generate starter code&lt;/li&gt;
&lt;li&gt;Help you debug faster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But AI should support your learning — not replace your thinking.&lt;/p&gt;

&lt;p&gt;The key is to &lt;strong&gt;understand the solution&lt;/strong&gt;, not just obtain it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;If learning programming feels harder than it should, the problem might not be your intelligence.&lt;/p&gt;

&lt;p&gt;It might be your approach.&lt;/p&gt;

&lt;p&gt;Shift from consuming to building.&lt;/p&gt;

&lt;p&gt;From avoiding problems to confronting them.&lt;/p&gt;

&lt;p&gt;From waiting to starting.&lt;/p&gt;

&lt;p&gt;That’s when things begin to change.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
      <category>career</category>
    </item>
  </channel>
</rss>
