<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Neilton Rocha</title>
    <description>The latest articles on Forem by Neilton Rocha (@neilton_rocha_dev).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3064002%2F15f7a3dd-4e2b-48ff-8b29-d6ec8391116c.jpg</url>
      <title>Forem: Neilton Rocha</title>
      <link>https://forem.com/neilton_rocha_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/neilton_rocha_dev"/>
    <language>en</language>
    <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://forem.com/neilton_rocha_dev/10-engineering-lessons-i-wish-i-learned-sooner-every-developer-should-master-7pd</link>
      <guid>https://forem.com/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://forem.com/neilton_rocha_dev/dont-be-just-a-developer-6-soft-skills-that-actually-define-your-career-50hd</link>
      <guid>https://forem.com/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://forem.com/neilton_rocha_dev/you-are-the-pilot-how-to-stand-out-in-the-vibe-coding-era-2n41</link>
      <guid>https://forem.com/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://forem.com/neilton_rocha_dev/the-software-engineer-is-the-new-farmer-of-the-digital-age-2d40</link>
      <guid>https://forem.com/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>
