<?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: Adam Neves</title>
    <description>The latest articles on DEV Community by Adam Neves (@adamsnows).</description>
    <link>https://dev.to/adamsnows</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%2F2792741%2F19c4fda4-a70a-4cb4-a854-99b87da949af.png</url>
      <title>DEV Community: Adam Neves</title>
      <link>https://dev.to/adamsnows</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adamsnows"/>
    <language>en</language>
    <item>
      <title>Week 7 - You're not stuck, you just skipped the basics: Git beyond push</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Mon, 11 Aug 2025 01:39:38 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-7-youre-not-stuck-you-just-skipped-the-basics-git-beyond-push-d91</link>
      <guid>https://dev.to/adamsnows/week-7-youre-not-stuck-you-just-skipped-the-basics-git-beyond-push-d91</guid>
      <description>&lt;p&gt;Before we dive in, I want to apologize for the delay in continuing this series.&lt;br&gt;&lt;br&gt;
I’ve been overloaded with work and handling a lot of demands lately, which has left me with little time to write.&lt;br&gt;&lt;br&gt;
Thanks for your patience, let’s pick up where we left off.&lt;/p&gt;



&lt;p&gt;Many people think they know Git because they learned &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and &lt;code&gt;git push&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
The truth is, that's just the tip of the iceberg.&lt;br&gt;&lt;br&gt;
If you want to stop struggling and start using Git effectively, you need to understand what happens &lt;strong&gt;beyond the push&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Branches: much more than “a copy of the code”
&lt;/h2&gt;

&lt;p&gt;A branch is just a pointer to a commit, but it gives you the freedom to work in parallel without messing up &lt;code&gt;main&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Want to create a new feature?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; my-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep branches short and focused, and don’t be afraid to create as many as needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Merge and Rebase: same road, different routes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt;: joins paths and preserves history.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git checkout main
  git merge my-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rebase&lt;/strong&gt;: rewrites history as if your work always started from the latest version.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git checkout my-feature
  git rebase main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rebase keeps history cleaner but requires caution in shared branches.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stash: Git’s secret pocket
&lt;/h2&gt;

&lt;p&gt;Started something and need to switch branches without losing work?&lt;br&gt;&lt;br&gt;
&lt;code&gt;stash&lt;/code&gt; saves your changes without committing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
git checkout another-branch
git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Reflog: the time machine
&lt;/h2&gt;

&lt;p&gt;If you “lost” a commit or reset something by mistake, &lt;code&gt;reflog&lt;/code&gt; can save you.&lt;br&gt;&lt;br&gt;
It records everything your HEAD has pointed to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reflog
git checkout &amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Flow strategies: choose your map
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Flow&lt;/strong&gt;: simple, great for continuous deployment.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trunk Based&lt;/strong&gt;: focuses on integrating quickly, avoiding long-lived branches.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Flow&lt;/strong&gt;: more formal, good for projects with defined release cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice depends on the team, delivery pace, and coordination level.&lt;/p&gt;




&lt;h2&gt;
  
  
  Broken history: now what?
&lt;/h2&gt;

&lt;p&gt;If a problematic commit made it into &lt;code&gt;main&lt;/code&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revert&lt;/strong&gt;: creates a new commit undoing changes (&lt;code&gt;git revert&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reset&lt;/strong&gt;: deletes commits (dangerous if already pushed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cherry-pick&lt;/strong&gt;: reuse only what’s useful from a lost commit.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  In summary
&lt;/h3&gt;

&lt;p&gt;Git is not just about storing code, it’s about telling your project’s story clearly and safely.&lt;br&gt;&lt;br&gt;
Mastering branches, merges, rebases, and tools like stash and reflog will make you much more confident in experimenting and fixing mistakes.&lt;/p&gt;

&lt;p&gt;Next time you type &lt;code&gt;git push&lt;/code&gt;, remember: that’s just the beginning.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My second week on Woovi: Getting into the swing of things (or almost there)</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Tue, 15 Jul 2025 23:36:37 +0000</pubDate>
      <link>https://dev.to/woovi/my-second-week-on-woovi-getting-into-the-swing-of-things-or-almost-there-h1p</link>
      <guid>https://dev.to/woovi/my-second-week-on-woovi-getting-into-the-swing-of-things-or-almost-there-h1p</guid>
      <description>&lt;h3&gt;
  
  
  A False Sense of Comfort
&lt;/h3&gt;

&lt;p&gt;My second week at Woovi felt calmer. I started delivering more and understood the codebase better, although honestly, I probably understand only 1 percent of what I need.&lt;/p&gt;

&lt;p&gt;What’s interesting is that even as things started to fall into place, I realized how much context and depth are still missing. Each day exposes new gaps, unexpected architectural decisions, and subtle product nuances that force you to slow down and truly think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Growth Beyond Code
&lt;/h3&gt;

&lt;p&gt;A clear pattern emerged: every day, someone taught me something, whether technical or related to soft skills.&lt;/p&gt;

&lt;p&gt;At Woovi, everyone seems to have a superpower. Some are masters of communication, others have exceptional technical depth, and some have sharp product instincts that guide big decisions. You start to see how each strength blends into the culture and how these traits build an environment where questioning and debating ideas is not just allowed but expected.&lt;/p&gt;

&lt;p&gt;One of the most interesting cultural lessons this week was about how learning is shared. For example, today I learned about &lt;strong&gt;eventual consistency&lt;/strong&gt;, a fundamental concept in distributed systems. It means that while data updates might not be immediately visible everywhere, the system will eventually reach a consistent state. In practice, this forces you to think differently about user experience, error handling, and how to communicate system states clearly to users.&lt;/p&gt;

&lt;p&gt;These small technical insights are passed around naturally, in PR comments, quick chats, or even casual messages. They aren't pushed in forced "knowledge sharing" sessions; they emerge as part of daily work.&lt;/p&gt;

&lt;p&gt;This also reinforces a crucial point: growth here depends on you actively engaging. If you stay passive, you risk missing valuable lessons hidden in daily interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow Maturity
&lt;/h3&gt;

&lt;p&gt;I noticed a significant evolution in our workflow. In the first few days, things felt a bit chaotic, with processes and responsibilities less defined. By the second week, communication aligned, priorities became clearer, and deliveries started to feel more predictable.&lt;/p&gt;

&lt;p&gt;This transition from initial chaos to controlled speed shows that Woovi is constantly iterating. There is no static mindset of “we’ve solved everything.” The culture is shaped around continuous improvement, even in internal processes. Everyone is expected to contribute to refining how we work, not just what we build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Motivation and Expectation
&lt;/h3&gt;

&lt;p&gt;Watching the team operate at this level is energizing. It pushes you to deliver more, keep improving, and constantly challenge your own limits.&lt;/p&gt;

&lt;p&gt;Are we moving toward excellence? For me, the answer is yes. But it’s not the kind of excellence that comes from rigid structure or strict guidelines. It’s an evolving, living excellence that requires self-drive, curiosity, and a willingness to get uncomfortable.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Progress can feel fast, but there is always deeper context to uncover.&lt;/li&gt;
&lt;li&gt;Learning here is organic and requires proactive behavior.&lt;/li&gt;
&lt;li&gt;Process improvements are constant and collective, not accidental.&lt;/li&gt;
&lt;li&gt;The culture values questioning and sees discomfort as a growth catalyst.&lt;/li&gt;
&lt;li&gt;Technical lessons like eventual consistency show how deep the rabbit hole goes, even in seemingly "simple" features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The second week was not about settling in. It was about realizing how much there still is to learn, both technically and personally.&lt;/p&gt;




&lt;p&gt;The main lesson? Onboarding never truly ends here, and that might be exactly the point.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Week 6 - You're not stuck, you just skipped the basics: What is a real database?</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Thu, 10 Jul 2025 00:37:01 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-6-youre-not-stuck-you-just-skipped-the-basics-what-is-a-real-database-4ag5</link>
      <guid>https://dev.to/adamsnows/week-6-youre-not-stuck-you-just-skipped-the-basics-what-is-a-real-database-4ag5</guid>
      <description>&lt;p&gt;Most beginners think “database” just means “a place to store data.” But a real relational database is designed to handle way more than that, correctness, consistency, and efficient querying at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just save data anywhere?
&lt;/h3&gt;

&lt;p&gt;When you use a proper SQL database, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ACID properties&lt;/strong&gt; (Atomicity, Consistency, Isolation, Durability): you don’t want to half-update a payment or lose data after a crash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joins&lt;/strong&gt;: data in the real world is related. Users have orders, orders have products, etc. You can join tables instead of duplicating data everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indexes&lt;/strong&gt;: searching without indexes is like scanning every page of a book to find a word. With indexes (B-Tree or others), you get faster lookups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data integrity&lt;/strong&gt;: foreign keys, constraints, and types prevent accidental or corrupt data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Normalization vs Denormalization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normalization&lt;/strong&gt; reduces duplication and enforces data consistency. You split data into multiple tables and relate them through keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denormalization&lt;/strong&gt; (often used for performance or analytics) duplicates data intentionally to avoid heavy joins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don’t just copy blog diagrams. Ask: &lt;em&gt;Does my data really need to be fully normalized?&lt;/em&gt; &lt;em&gt;How will I query it most often?&lt;/em&gt; These choices affect both correctness and performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  ORM vs Manual Queries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ORM (Object-Relational Mapping)&lt;/strong&gt;: abstracts SQL into code objects. Faster to get started, easier migrations, but can hide what's really happening under the hood.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual SQL&lt;/strong&gt;: gives you full control. You see exactly how joins and conditions work, and can fine-tune performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beginners often think ORM is always “better”, it isn't. It depends on your project, team skill, and performance constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to design healthy data models
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand your &lt;em&gt;access patterns&lt;/em&gt; first. What queries will run most? Where are the bottlenecks likely to appear?&lt;/li&gt;
&lt;li&gt;Choose keys carefully (avoid wide composite primary keys if you don’t need them).&lt;/li&gt;
&lt;li&gt;Use constraints (unique, foreign keys) to keep your data correct.&lt;/li&gt;
&lt;li&gt;Think about indexes from day one, adding them later when you already have millions of rows can be painful.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Your challenge this week:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Go beyond “I just save data somewhere.” Design a small relational schema for a fake app (a simple marketplace), sketch out relationships, and try writing actual SQL joins instead of only relying on your ORM.&lt;/p&gt;




&lt;p&gt;Next week: Git Beyond Push: Real Version Control&lt;/p&gt;




</description>
      <category>career</category>
      <category>basic</category>
      <category>programming</category>
      <category>developer</category>
    </item>
    <item>
      <title>My First 7 Days at Woovi: Learnings, Surprises, and Open Questions</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Wed, 09 Jul 2025 01:54:54 +0000</pubDate>
      <link>https://dev.to/woovi/my-first-7-days-at-woovi-learnings-surprises-and-open-questions-3mb3</link>
      <guid>https://dev.to/woovi/my-first-7-days-at-woovi-learnings-surprises-and-open-questions-3mb3</guid>
      <description>&lt;p&gt;Starting at a new company is often romanticized: welcome coffees, a nicely packaged onboarding plan, and a slow ramp-up. My first week at Woovi turned out to be quite the opposite: a fast-paced, pragmatic environment where questioning is not only allowed but expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Impressions
&lt;/h2&gt;

&lt;p&gt;On day one, I realized the culture is heavily biased towards fast delivery and technical autonomy. Instead of following step-by-step tutorials, I was encouraged to explore real repositories, understand actual deployment flows, and challenge architectural decisions.&lt;/p&gt;

&lt;p&gt;This breaks the common assumption that onboarding must be 100% guided and “hand-holding.” Here, you’re treated as someone who should contribute from day one, not just passively consume information.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fear of Not Being Enough
&lt;/h2&gt;

&lt;p&gt;A hidden part of this experience was the fear of not being enough for the role. I came in wondering if I could really match the expectations, whether I would deliver fast enough, and whether I would truly add value.&lt;/p&gt;

&lt;p&gt;Very quickly, I realized there was no way to simply "meet expectations" here. Woovi feels more like a high-level engineering school than a typical company. You could be the most senior engineer out there, and you would still get overwhelmed by the codebase. It’s the result of years of creation, iteration, and continuous learning.&lt;/p&gt;

&lt;p&gt;This realization actually eased my anxiety. Instead of obsessing over "being enough," I shifted focus to learning fast and contributing incrementally. The expectation is not perfection on day one. The expectation is to keep moving, questioning, improving, and growing as part of the team.&lt;/p&gt;

&lt;p&gt;The codebase will push you out of your comfort zone. But in return, it turns you into a better engineer, faster than any comfortable environment ever could.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Challenges
&lt;/h2&gt;

&lt;p&gt;During the week, I dived into the main stack, Node.js, Koa, TypeScript, GraphQL, Relay and integrations with financial systems like Pix and payment gateways. One surprise was how modular yet unopinionated the architecture is: there’s more room for customization, and fewer rigid patterns.&lt;/p&gt;

&lt;p&gt;This requires critical thinking: you can’t just “do it like Google.” You have to weigh real trade-offs, performance vs readability, coupling vs delivery speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Integration
&lt;/h2&gt;

&lt;p&gt;Most interactions happened asynchronously. Far fewer meetings than I expected. This forces you to write better, whether it’s commits, pull requests, or internal docs, and not rely on endless live clarifications.&lt;/p&gt;

&lt;p&gt;Interestingly, this exposed a personal flaw: I underestimated how much poor written communication can slow down a project. If you don’t document well, everyone stops to answer your basic questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Still Question
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Does a loose, self-guided onboarding work for everyone?&lt;/li&gt;
&lt;li&gt;How much does full autonomy from day one increase the risk of mistakes or rework?&lt;/li&gt;
&lt;li&gt;Does async culture, while efficient, alienate those who prefer real-time discussions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions stuck with me all week. I don’t have final answers yet, but I’m watching closely how this affects long-term alignment and productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Writing good documentation is as critical as writing good code.&lt;/li&gt;
&lt;li&gt;Questioning architecture is not just tolerated, it’s actively encouraged.&lt;/li&gt;
&lt;li&gt;Onboarding doesn’t need to be paternalistic to be effective.&lt;/li&gt;
&lt;li&gt;Organizational performance is deeply tied to clear written communication.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My First 2 Days: Building a Centralized Onboarding Flow
&lt;/h2&gt;

&lt;p&gt;During my first two days, I noticed something that might sound paradoxical: &lt;em&gt;everything was documented, yet no one knew exactly how to navigate it&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;The documentation was thorough, covering internal APIs, deployment workflows, local setup, and architectural decisions. But each piece was isolated, like having a pile of puzzle pieces with no reference picture.  &lt;/p&gt;

&lt;p&gt;New engineers often found themselves constantly asking, &lt;em&gt;"In what order should I read these docs?"&lt;/em&gt; or &lt;em&gt;"What’s the first thing I should run locally before touching feature X?"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Instead of just consuming the scattered docs and pinging people repeatedly, I decided to start drafting a &lt;strong&gt;centralized onboarding flow&lt;/strong&gt;. The goal was to connect all these pieces into a clear sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What to clone first.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which scripts to run and in which order.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What services need to be up before running the app.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Where to look for environment configuration and secrets.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key architectural diagrams to understand before jumping into PRs.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This initiative not only helped me get up to speed faster but also turned into a reusable asset for future newcomers.  &lt;/p&gt;

&lt;p&gt;It challenged the assumption that "more docs = better onboarding." In reality, &lt;em&gt;structured narrative beats raw volume every time&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;By proactively organizing this flow, I ended up learning the system more deeply and reduced the dependency on constant Slack or chat questions. And perhaps more importantly, I started contributing real value on day two instead of just passively absorbing information.&lt;/p&gt;




&lt;h2&gt;
  
  
  Special Thanks to the Woovi Engineering Team
&lt;/h2&gt;

&lt;p&gt;One thing that stood out immediately and deserves a special mention is the quality of the people here. It genuinely feels like every developer was handpicked, and after experiencing it firsthand, I now understand why the selection process is so demanding and sometimes lengthy.&lt;/p&gt;

&lt;p&gt;Everyone I've interacted with acted with an impressive sense of honor and strength, always pushing to help each other, no matter how busy they were. They deeply remember what it felt like to be new in the company, and they step up to assist with patience, without sarcasm or condescension.&lt;/p&gt;

&lt;p&gt;I won’t mention names, but to all of you who joined calls with me during this first week, consider this a public tribute. You turned what could have been a chaotic start into an empowering, fast-learning experience.&lt;/p&gt;

&lt;p&gt;This reinforced for me that a strong engineering culture isn't just about code quality or architecture; it's built on people who genuinely want each other to succeed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;My first week at Woovi was less about a “cute onboarding” and more about a pragmatic deep dive. I realized that in a team focused on speed and autonomy, the worst mistake is waiting passively for instructions.&lt;/p&gt;

&lt;p&gt;If you’re about to join a fast-moving team, here’s a provocation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you ready to swim without a float? Or are you still sitting on the edge, waiting for the manual?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Have you gone through an ultra-fast or hyper-structured onboarding before? What worked best for you? Share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>onboarding</category>
      <category>workplace</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Week 5 - You're not stuck, you just skipped the basics: Understanding the B-Tree</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Mon, 30 Jun 2025 14:42:22 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-5-youre-not-stuck-you-just-skipped-the-basics-understanding-the-b-tree-oga</link>
      <guid>https://dev.to/adamsnows/week-5-youre-not-stuck-you-just-skipped-the-basics-understanding-the-b-tree-oga</guid>
      <description>&lt;p&gt;When we hear about search algorithms and data structures, we often think of simple binary trees or hash tables. However, in the context of databases and large-scale systems, one structure stands out: the B-Tree. Let's explore what it is, why it matters, and how it impacts the performance of modern databases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics of tree data structures
&lt;/h2&gt;

&lt;p&gt;Trees are hierarchical structures that help organize data in a way that supports efficient lookups, insertions, and deletions. In a &lt;strong&gt;binary search tree (BST)&lt;/strong&gt;, each node has at most two children: left for smaller keys and right for larger keys. BSTs are simple but can become unbalanced easily, degrading their performance to linear time in the worst case.&lt;/p&gt;

&lt;p&gt;To address this, self-balancing trees were introduced. The &lt;strong&gt;AVL tree&lt;/strong&gt; is a well-known example. It maintains a strict balance condition to ensure that operations remain O(log n). AVL trees work well for in-memory data structures where individual node access is fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing the B-Tree
&lt;/h2&gt;

&lt;p&gt;The B-Tree is designed specifically for systems where disk access is a bottleneck. Instead of having only two children, a B-Tree node can have multiple keys and multiple children. This allows it to stay shallow, reducing the number of disk reads required to locate a value.&lt;/p&gt;

&lt;p&gt;The "B" in B-Tree does not officially stand for anything, but it is often associated with "balanced" or "Bayer," after Rudolf Bayer, one of its inventors. Unlike AVL trees, which minimize tree height using strict balance conditions, B-Trees are optimized to minimize disk I/O by allowing more keys per node.&lt;/p&gt;

&lt;h2&gt;
  
  
  How B-Trees work
&lt;/h2&gt;

&lt;p&gt;A B-Tree of order m has the following properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each node can contain a maximum of m - 1 keys and m children.&lt;/li&gt;
&lt;li&gt;All leaf nodes appear at the same depth.&lt;/li&gt;
&lt;li&gt;All keys within a node are kept in sorted order.&lt;/li&gt;
&lt;li&gt;Non-leaf nodes act as separation points, dividing the key space for their children.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a node exceeds its maximum allowed keys during insertion, it splits into two nodes, and the middle key moves up to the parent node. This splitting ensures that the tree remains balanced while minimizing restructuring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why databases rely on B-Trees
&lt;/h2&gt;

&lt;p&gt;Databases store massive amounts of data on disk. Each disk read is orders of magnitude slower than an in-memory operation. B-Trees are ideal because they minimize the number of disk reads required to find or insert data.&lt;/p&gt;

&lt;p&gt;Most relational databases (like MySQL, PostgreSQL, and SQLite) use B-Tree or variants (such as B+Tree) for their indexing strategies. These indexes improve query performance by allowing the database to quickly locate rows matching specific conditions without scanning the entire table.&lt;/p&gt;

&lt;h2&gt;
  
  
  B-Trees vs binary and AVL trees
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Binary trees and AVL trees are typically used in memory. They keep the height low but still require many pointer traversals, which are cheap in RAM but costly on disk.&lt;/li&gt;
&lt;li&gt;B-Trees, with their wide nodes, reduce height dramatically. This allows a single node read to cover a larger key range, resulting in fewer disk I/O operations.&lt;/li&gt;
&lt;li&gt;B+Trees, a variant of B-Trees, store all values in leaf nodes and maintain a linked list between leaves. This further optimizes range queries and sequential scans, which are common in database workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impact on query performance
&lt;/h2&gt;

&lt;p&gt;Indexes built on B-Trees allow queries to run in logarithmic time rather than linear time. Without an index, a database must scan all rows to satisfy a condition. With a B-Tree index, it can navigate the tree structure and find matching rows with far fewer reads.&lt;/p&gt;

&lt;p&gt;This design choice directly affects query latency, resource utilization, and overall database scalability. Choosing the right index and understanding its underlying structure is critical for designing performant database applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;While B-Trees might seem like a specialized data structure, they are fundamental to modern storage systems. Understanding them helps developers make better decisions about indexing, query optimization, and system architecture.&lt;/p&gt;

&lt;p&gt;By grasping the difference between basic binary trees, self-balancing trees like AVL, and disk-optimized trees like B-Trees, we gain insight into how databases can scale to handle billions of rows without falling apart in terms of performance.&lt;/p&gt;




&lt;p&gt;Next time: &lt;strong&gt;Git beyond pushing: true version control&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Week 4 - You're not stuck, you just skipped the basics: Threads, processes and why your app “freezes”</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Sat, 21 Jun 2025 16:09:57 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-4-youre-not-stuck-you-just-skipped-the-basics-threads-processes-and-why-your-app-954</link>
      <guid>https://dev.to/adamsnows/week-4-youre-not-stuck-you-just-skipped-the-basics-threads-processes-and-why-your-app-954</guid>
      <description>&lt;p&gt;Ever clicked a button and your entire app just froze? You're not alone.&lt;br&gt;&lt;br&gt;
Let’s go back to the basics and unpack what’s really happening under the hood.&lt;/p&gt;
&lt;h3&gt;
  
  
  One thread to rule them all
&lt;/h3&gt;

&lt;p&gt;In the browser, your JavaScript runs in a &lt;strong&gt;single thread&lt;/strong&gt; by default. That means everything from rendering the UI to handling user input to executing your code happens in &lt;strong&gt;one sequence&lt;/strong&gt;. If you block this thread, nothing else happens.&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;while &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="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// infinite loop — UI becomes unresponsive&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even animations, clicks, scrolls — they all wait for your code to finish.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processes vs threads
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;process&lt;/strong&gt; is like a separate app: it has its own memory and runs independently. A &lt;strong&gt;thread&lt;/strong&gt; is a unit of execution inside that process, sharing memory with others.&lt;/p&gt;

&lt;p&gt;Modern browsers isolate each tab in its own &lt;strong&gt;process&lt;/strong&gt; for security and stability. But inside each tab, your JS runs in one &lt;strong&gt;main thread&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Want more threads? You have to create them manually using &lt;strong&gt;Web Workers&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&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;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heavy-task.js&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;Web Workers don’t share memory. You communicate via messages (&lt;code&gt;postMessage&lt;/code&gt; / &lt;code&gt;onmessage&lt;/code&gt;). It’s like sending letters — safe, but a bit inconvenient.&lt;/p&gt;

&lt;h3&gt;
  
  
  Async is not parallel
&lt;/h3&gt;

&lt;p&gt;Just because you write &lt;code&gt;async&lt;/code&gt; doesn’t mean the work happens in parallel. JS uses &lt;strong&gt;asynchronous callbacks&lt;/strong&gt;, not native concurrency (unless you go out of your way).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Done&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This runs first&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;Here’s what really happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;fetch()&lt;/code&gt; is handed off to a Web API.&lt;/li&gt;
&lt;li&gt;Your thread keeps going — no waiting.&lt;/li&gt;
&lt;li&gt;When the result is ready, it’s put in a &lt;strong&gt;callback queue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;event loop&lt;/strong&gt; picks it up when the thread is free.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Enter the event loop
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;event loop&lt;/strong&gt; is a behind-the-scenes mechanism that monitors two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;call stack&lt;/strong&gt; (what's running now)&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;callback queue&lt;/strong&gt; (what’s waiting to run)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the stack is empty, it picks something from the queue and runs it.&lt;/p&gt;

&lt;p&gt;So if you freeze the stack with heavy code, nothing from the queue gets executed.&lt;/p&gt;

&lt;h3&gt;
  
  
  So why does your app freeze?
&lt;/h3&gt;

&lt;p&gt;Because you didn’t give the event loop a chance to breathe.&lt;/p&gt;

&lt;p&gt;Heavy loops, complex calculations, sync XHR, or just too much logic in one go — they all block the thread.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UI frozen for 2s&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;You can prevent this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaking work into smaller chunks&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;setTimeout(fn, 0)&lt;/code&gt; or &lt;code&gt;requestIdleCallback&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Offloading to Web Workers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bonus curiosity: DOM isn’t thread-safe
&lt;/h3&gt;

&lt;p&gt;Ever wondered why Web Workers can’t touch the DOM?&lt;br&gt;&lt;br&gt;
Because the DOM API isn’t designed for concurrency. It’s not thread-safe, meaning two threads accessing it could break things. That’s why rendering is tied to the main thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  The basics you skipped
&lt;/h3&gt;

&lt;p&gt;If you understand that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JS is single-threaded&lt;/li&gt;
&lt;li&gt;Async just delays work, it doesn’t parallelize it&lt;/li&gt;
&lt;li&gt;The event loop needs space to operate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...then you stop writing code that accidentally sabotages your own UI.&lt;/p&gt;




&lt;p&gt;Next time: Search algorithms and data structures: understand the B-Tree&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Skill That Can (Actually) Change Your Career</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Sat, 14 Jun 2025 20:51:40 +0000</pubDate>
      <link>https://dev.to/adamsnows/the-skill-that-can-actually-change-your-career-5beo</link>
      <guid>https://dev.to/adamsnows/the-skill-that-can-actually-change-your-career-5beo</guid>
      <description>&lt;p&gt;You might have years of study, technical experience, certifications, mastery of the latest tools in your field. But if you don’t know how to handle conflict, your professional growth will eventually hit an invisible ceiling.&lt;/p&gt;

&lt;p&gt;Yes, conflict. It’s inevitable. At some point, you’ll disagree with someone. You’ll feel disrespected, wronged, overlooked. And more importantly, at some point, you’ll be &lt;em&gt;that&lt;/em&gt; person to someone else, even without realizing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Every Person Is a World
&lt;/h2&gt;

&lt;p&gt;Backgrounds, upbringing, trauma, insecurities, values. No one sees the world the same way. And that doesn’t magically change in the workplace. What changes is how people express (or suppress) those differences.&lt;/p&gt;

&lt;p&gt;Expecting everyone to react like you, interpret your words the way you meant, or automatically understand your intentions is a setup for frustration. Most conflict is born from mismatched expectations between people who are, in their own way, trying to do the right thing, just through very different lenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. There Are Multiple Versions of You
&lt;/h2&gt;

&lt;p&gt;You are a different person in the eyes of everyone who interacts with you. One person sees you as reliable, another as distant. Someone thinks you’re arrogant, another thinks you’re just direct. These perceptions depend on their history, context, and what they project onto you.&lt;/p&gt;

&lt;p&gt;You can’t fully control how others perceive you, but you can control how you respond. How you deal with someone’s misunderstanding of who you are says more about your maturity than any certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Conflict Isn’t the Problem, Avoiding It Is
&lt;/h2&gt;

&lt;p&gt;Conflict itself isn’t the issue. The real problems are the silence afterward, the unresolved tension, the gossip that grows in the absence of honest conversation. When handled well, conflict brings alignment, clarity, and growth.&lt;/p&gt;

&lt;p&gt;Avoiding conflict only delays the inevitable explosion, one that you may no longer be able to contain.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Tip: Be Who You Say You Are
&lt;/h2&gt;

&lt;p&gt;There’s no point in acting like the “good guy” online if you’re a jerk in real life. Your post won’t erase your behavior in meetings. Your storytelling won’t cover up your lack of empathy. People feel it. And reputation spreads.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Respect Is the Foundation
&lt;/h2&gt;

&lt;p&gt;Whether in projects, friendships, companies, or families, no real dialogue exists without mutual respect. Respect doesn’t mean agreement; it means acknowledging the other person’s perspective as valid, even when you disagree.&lt;/p&gt;

&lt;p&gt;And that requires listening, something that’s becoming rare in a world full of fragile egos and absolute certainties.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Assuming Good Intentions Is a Smart Move
&lt;/h2&gt;

&lt;p&gt;This isn’t about being naive. It’s about creating the conditions for resolution. If you assume someone is attacking you, you’ll respond with aggression. But if you assume they might just be having a bad day or misinterpreted something, you leave room for a conversation that builds.&lt;/p&gt;

&lt;p&gt;Most people don’t wake up wanting to hurt others. They react to what they’ve lived, and not always in the best way. Understanding that and maintaining your composure is what separates reactive professionals from trustworthy ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Don’t Turn Your Back on Someone Trying to Resolve a Conflict With You
&lt;/h2&gt;

&lt;p&gt;If someone reaches out to talk, to understand, to make peace, see it as a gesture. They could’ve chosen to ignore you, walk away, or hold a grudge. But they took the harder path: conversation.&lt;/p&gt;

&lt;p&gt;If someone is trying to resolve a conflict with you, at the very least, they care enough to want you around.&lt;/p&gt;

&lt;p&gt;If you ignore that, dismiss it, or turn your back, you might avoid the discomfort for now. But don’t be surprised if, later, you’re the one trying to reconnect, and they’ve already moved on.&lt;/p&gt;

&lt;p&gt;Resolution needs two bridges. If only one side is building, it collapses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought: Those Who Handle Conflict Well Grow Where Others Stagnate
&lt;/h2&gt;

&lt;p&gt;Promotions, partnerships, leadership opportunities, all of these hinge on how you handle people, especially in difficult moments. People who avoid conflict sabotage themselves. People who attack impulsively close doors. But those who can listen, name the tension, and seek resolution respectfully build solid reputations.&lt;/p&gt;

&lt;p&gt;And reputation, in the long run, matters more than your resume.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Question
&lt;/h2&gt;

&lt;p&gt;Have you ever lost good friends just because they didn’t know how to deal with a conflict?&lt;/p&gt;

&lt;p&gt;Maybe they disappeared instead of talking. Maybe they got defensive when all you wanted was to clear the air. Maybe they waited too long, and by the time they tried, you had already let go.&lt;/p&gt;

&lt;p&gt;Think about that. And now ask yourself: are you doing the same to someone else?&lt;/p&gt;

</description>
      <category>human</category>
      <category>being</category>
      <category>work</category>
      <category>tips</category>
    </item>
    <item>
      <title>Week 3 - You're not Stuck - You just skipped the Basics: What Really Happens When You Type a URL?</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Wed, 11 Jun 2025 13:55:27 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-3-youre-not-stuck-you-just-skipped-the-basics-what-really-happens-when-you-type-a-url-3djf</link>
      <guid>https://dev.to/adamsnows/week-3-youre-not-stuck-you-just-skipped-the-basics-what-really-happens-when-you-type-a-url-3djf</guid>
      <description>&lt;p&gt;You open your browser, type &lt;code&gt;www.example.com&lt;/code&gt;, and hit enter. Two seconds later, the site loads. Magic? Not quite. There's a chain of invisible steps happening behind the scenes, and if you're building web apps, it's worth knowing where things can slow down or fail.&lt;/p&gt;

&lt;p&gt;This post is part of the &lt;strong&gt;"You're not stuck, you just skipped the basics"&lt;/strong&gt; series.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Step 1: Your browser needs an IP address
&lt;/h2&gt;

&lt;p&gt;The web doesn’t work with names like &lt;code&gt;example.com&lt;/code&gt;. It works with IP addresses like &lt;code&gt;93.184.216.34&lt;/code&gt;. So the first thing your browser does is ask:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey DNS, what’s the IP for this domain?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;DNS (Domain Name System)&lt;/strong&gt; is basically the phone book of the internet. Your browser sends a DNS request to a DNS resolver (usually your ISP’s or Google’s &lt;code&gt;8.8.8.8&lt;/code&gt;), and it responds with the IP address.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Slow DNS equals slow first impression.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚪 Step 2: Connecting to the server (TCP and Port)
&lt;/h2&gt;

&lt;p&gt;Now that your browser knows the IP, it needs to open a connection. This usually happens over TCP (Transmission Control Protocol). Think of it as establishing a reliable tunnel where both sides agree on the rules.&lt;/p&gt;

&lt;p&gt;Also, your request goes to a &lt;strong&gt;port&lt;/strong&gt;, typically port &lt;code&gt;80&lt;/code&gt; for HTTP or &lt;code&gt;443&lt;/code&gt; for HTTPS. Ports help the server route your request to the correct service.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 3: Sending and receiving packets
&lt;/h2&gt;

&lt;p&gt;The actual data (your GET request, the HTML, the images) travels in &lt;strong&gt;packets&lt;/strong&gt;. A packet is just a small chunk of data with some metadata (like source, destination, and order).&lt;/p&gt;

&lt;p&gt;Your request might be broken into 20 or more packets. They can travel different routes across the internet and still arrive in the right order.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Packets can get lost, duplicated, or arrive out of order. TCP handles all of this for you.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⏱️ Latency, response time, and where things get slow
&lt;/h2&gt;

&lt;p&gt;Here’s a breakdown of what can affect the speed of a request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DNS lookup time&lt;/strong&gt;, the first network call
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP handshake&lt;/strong&gt;, needs a round-trip
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS handshake (HTTPS)&lt;/strong&gt;, an extra handshake step
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server response time&lt;/strong&gt;, is your backend fast?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload size&lt;/strong&gt;, big HTML or images means more packets
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client rendering&lt;/strong&gt;, slow JavaScript kills performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if your app feels slow, it might not be your React code. It could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A misconfigured DNS
&lt;/li&gt;
&lt;li&gt;An overloaded backend
&lt;/li&gt;
&lt;li&gt;A fat payload with 5MB hero images
&lt;/li&gt;
&lt;li&gt;Or even a CDN edge being too far from the user&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why should you care?
&lt;/h2&gt;

&lt;p&gt;Understanding this flow gives you better debugging instincts. If a user says “the site is slow,” your mind shouldn’t go straight to blaming React or the database. It might be a DNS cache miss, or maybe the server is in Europe and your user is in Brazil.&lt;/p&gt;

&lt;p&gt;Next week, we’ll dive deeper into &lt;strong&gt;HTTP itself&lt;/strong&gt;, including headers, methods, caching, and how to avoid breaking the internet.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the series:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: What does a CPU actually do?
&lt;/li&gt;
&lt;li&gt;Week 2: Essential Memory &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3: (You’re here)&lt;/strong&gt; What happens when you type a URL
&lt;/li&gt;
&lt;li&gt;Week 4: (coming soon...)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>dns</category>
      <category>hacker</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Validated My MVP Without Investing Any Cents On It Using Cloudflared Tunnel</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Tue, 10 Jun 2025 21:08:11 +0000</pubDate>
      <link>https://dev.to/adamsnows/creating-your-own-vps-using-your-own-computer-and-cloudflare-tunnel-j8d</link>
      <guid>https://dev.to/adamsnows/creating-your-own-vps-using-your-own-computer-and-cloudflare-tunnel-j8d</guid>
      <description>&lt;h3&gt;
  
  
  Use your own machine to validate your MVP
&lt;/h3&gt;

&lt;p&gt;When you're bootstrapping a project or simply want to validate an MVP without burning cash on infrastructure, most MVPs don't need a VPS. I just needed a URL I could share, fast. That’s exactly what I did to get &lt;strong&gt;DevScout&lt;/strong&gt; online and test the MVP.&lt;/p&gt;

&lt;p&gt;In this article, I’ll explain how I used &lt;strong&gt;my own computer as a server&lt;/strong&gt;, combined with &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;, to make the app publicly accessible, allowing me to test everything end-to-end, gather feedback, and only later invest in a proper VPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not Just Pay for a VPS?
&lt;/h2&gt;

&lt;p&gt;Simple: I didn’t want to spend money before proving the idea had potential.&lt;/p&gt;

&lt;p&gt;Even cheap VPS options can be overkill when you're still building and validating your minimum viable product. And for side projects or personal experiments, using your own machine with a tunnel can be enough to simulate a real deployment environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tools I Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My local machine&lt;/strong&gt; (MacBook Pro M1 16 GB RAM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Tunnel (cloudflared)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python Flask API / Next.js app (DevScout)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local database (SQLite initially, after i changed to PostgreSQL)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step-by-Step: Exposing My Local App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install Cloudflare CLI
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Or follow the &lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/" rel="noopener noreferrer"&gt;official installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Authenticate with Cloudflare
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens your browser and asks you to select a domain from your Cloudflare account.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: You need to have your own domain added to Cloudflare.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Create a Tunnel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel create devscout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new named tunnel and registers its credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Configure the Tunnel
&lt;/h3&gt;

&lt;p&gt;Create a configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/.cloudflared/config.yml&lt;/span&gt;
&lt;span class="na"&gt;tunnel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devscout&lt;/span&gt;
&lt;span class="na"&gt;credentials-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/Users/yourname/.cloudflared/devscout.json&lt;/span&gt;

&lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devscout.example.com&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http_status:404&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure your local app (e.g. Next.js) is running on port 3000.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Route the Tunnel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel route dns devscout devscout.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This connects the subdomain to the tunnel.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Start the Tunnel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel run devscout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done, your local app is now live at &lt;code&gt;https://devscout.example.com&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Worked for Me
&lt;/h2&gt;

&lt;p&gt;Running the MVP this way gave me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A public URL I could share&lt;/li&gt;
&lt;li&gt;HTTPS without extra setup&lt;/li&gt;
&lt;li&gt;A real-world way to test and iterate&lt;/li&gt;
&lt;li&gt;Zero cost hosting (since the app runs on my machine)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allowed me to test assumptions, collect feedback, and confirm that the core idea behind DevScout made sense, all before spending anything on cloud infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Cloudflare Tunnel Works (Technical Overview)
&lt;/h2&gt;

&lt;p&gt;Cloudflare Tunnel (formerly Argo Tunnel) provides a secure way to expose services running locally on your machine or network, without having to open ports or configure NAT on your router.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 No Open Ports
&lt;/h3&gt;

&lt;p&gt;One of the biggest advantages is that &lt;strong&gt;you don’t need to expose your ports to the public internet&lt;/strong&gt;. Instead, &lt;code&gt;cloudflared&lt;/code&gt; creates an &lt;strong&gt;outbound-only connection&lt;/strong&gt; from your machine to Cloudflare’s edge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional setup: &lt;code&gt;Public Internet ➝ Open port ➝ Your server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tunnel setup: &lt;code&gt;Your server ➝ Encrypted tunnel ➝ Cloudflare edge&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the connection is outbound, it works even behind NAT, CGNAT, or firewalls that block incoming traffic.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 Persistent Connection to the Cloudflare Edge
&lt;/h3&gt;

&lt;p&gt;When you run &lt;code&gt;cloudflared tunnel run&lt;/code&gt;, your machine initiates &lt;strong&gt;one or more persistent WebSocket connections&lt;/strong&gt; to Cloudflare's global edge network.&lt;/p&gt;

&lt;p&gt;These connections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are encrypted (TLS)&lt;/li&gt;
&lt;li&gt;Use HTTP/2 multiplexing&lt;/li&gt;
&lt;li&gt;Are load-balanced automatically across multiple connections for reliability&lt;/li&gt;
&lt;li&gt;Support automatic reconnection and failover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, &lt;code&gt;cloudflared&lt;/code&gt; opens &lt;strong&gt;four&lt;/strong&gt; parallel connections to different Cloudflare data centers. This gives global reach and resilience.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ Authentication and Identity
&lt;/h3&gt;

&lt;p&gt;Every tunnel is uniquely associated with a &lt;strong&gt;Cloudflare account and zone (domain)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you run &lt;code&gt;cloudflared login&lt;/code&gt;, a signed token is stored locally (e.g. &lt;code&gt;~/.cloudflared/cert.pem&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;When you create a tunnel (&lt;code&gt;cloudflared tunnel create&lt;/code&gt;), credentials are stored in a &lt;code&gt;.json&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Only machines with that credential file can start that specific tunnel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents unauthorized access, and you can revoke credentials or delete tunnels at any time via the Cloudflare dashboard.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌍 DNS Integration
&lt;/h3&gt;

&lt;p&gt;Cloudflare updates your DNS records to &lt;strong&gt;proxy traffic through the tunnel&lt;/strong&gt;, rather than pointing directly to an IP address.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Now I had &lt;a href="https://devscout.app" rel="noopener noreferrer"&gt;https://devscout.app&lt;/a&gt; live, and recruiters could actually test the platform.&lt;/li&gt;
&lt;li&gt;It automatically uses HTTPS (thanks to Cloudflare’s SSL termination)&lt;/li&gt;
&lt;li&gt;I didn’t need it for DevScout yet, but Cloudflare Access lets you lock it down with login or IP rules.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧩 Behind the Scenes Flow
&lt;/h3&gt;

&lt;p&gt;Let’s break down the actual request flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User hits &lt;code&gt;https://devscout.example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cloudflare resolves the domain and routes it to the tunnel&lt;/li&gt;
&lt;li&gt;Cloudflare edge sends the request over one of the persistent connections to &lt;code&gt;cloudflared&lt;/code&gt; running on your machine&lt;/li&gt;
&lt;li&gt;Your local app responds&lt;/li&gt;
&lt;li&gt;The response is sent back over the tunnel to Cloudflare, and then to the user&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🧠 Bonus: Multiplexing and Load Balancing
&lt;/h3&gt;

&lt;p&gt;Each &lt;code&gt;cloudflared&lt;/code&gt; process can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle &lt;strong&gt;multiple services&lt;/strong&gt; (via &lt;code&gt;config.yml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Load-balance across &lt;strong&gt;multiple origins&lt;/strong&gt; if needed&lt;/li&gt;
&lt;li&gt;Run as a system service (daemon mode)&lt;/li&gt;
&lt;li&gt;Be monitored/logged using standard tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to scale it beyond your machine later, you can also connect multiple origins to the same tunnel for &lt;strong&gt;zero-downtime rollouts or blue-green deployments&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;Understanding how Cloudflare Tunnel works helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trust it as a production-grade tool, not a dev-only hack&lt;/li&gt;
&lt;li&gt;Use its advanced features (like Zero Trust access)&lt;/li&gt;
&lt;li&gt;Know exactly how your traffic flows, which helps with debugging and performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running everything locally wasn’t perfect, but it unblocked me. DevScout got real users and feedback, and that’s all I needed to justify the next step.&lt;/p&gt;




&lt;p&gt;
  &lt;a href="https://devscout.app" rel="noopener noreferrer"&gt;DevScout&lt;/a&gt; – Automated Job Search Platform Connecting you between Tech Recruiters
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Week 2 – You’re Not Stuck - You Just Skipped the Basics: Essential Memory</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Tue, 03 Jun 2025 14:17:09 +0000</pubDate>
      <link>https://dev.to/adamsnows/week-2-youre-not-stuck-you-just-skipped-the-basics-essential-memory-5154</link>
      <guid>https://dev.to/adamsnows/week-2-youre-not-stuck-you-just-skipped-the-basics-essential-memory-5154</guid>
      <description>&lt;p&gt;Hello, dev community! 👋&lt;/p&gt;

&lt;p&gt;We’re back with our series &lt;em&gt;“You’re Not Stuck - You Just Skipped the Basics”&lt;/em&gt;. After exploring the CPU in Week 1, the brain of your program, today we’re diving into another fundamental concept every developer needs to master to &lt;strong&gt;truly level up&lt;/strong&gt;: &lt;strong&gt;memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every piece of code we write, every variable we declare, every object we create, they all live in and interact with the computer’s memory. Ignoring how memory works is like trying to build a house without understanding the ground it stands on.&lt;/p&gt;

&lt;p&gt;In this post, we’ll break down the essential memory concepts that directly impact the performance, robustness, and behavior of your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Memory and Why Does Your Code Depend on It?
&lt;/h2&gt;

&lt;p&gt;Think of RAM (Random Access Memory) as your computer’s &lt;strong&gt;temporary workspace&lt;/strong&gt; while a program is running. It’s where data is stored that the processor needs quick access to in order to execute your instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your code depends on memory&lt;/strong&gt; because it’s where everything happens during execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The actual instructions of your program are loaded into memory.&lt;/li&gt;
&lt;li&gt;Variables store their values in memory.&lt;/li&gt;
&lt;li&gt;Data structures (lists, arrays, objects, etc.) are built in memory.&lt;/li&gt;
&lt;li&gt;Function calls and execution state are managed in memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without memory, there’s no space for your program to exist or operate. Understanding this dependency is the first step toward writing &lt;strong&gt;more conscious and efficient code&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack vs. Heap: The Two Main Memory Areas
&lt;/h2&gt;

&lt;p&gt;When your program runs, it primarily uses two distinct memory areas: the &lt;strong&gt;Stack&lt;/strong&gt; and the &lt;strong&gt;Heap&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works like a LIFO (Last-In, First-Out) stack.&lt;/li&gt;
&lt;li&gt;Used to store &lt;strong&gt;fixed-size and known-at-compile-time data&lt;/strong&gt;, such as local variables (primitives in many languages) and function call metadata (return addresses, arguments, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extremely fast allocation/deallocation&lt;/strong&gt;, since it only involves moving the stack pointer up or down.&lt;/li&gt;
&lt;li&gt;Each thread typically has its own stack.&lt;/li&gt;
&lt;li&gt;Has a limited size and can cause a &lt;strong&gt;stack overflow&lt;/strong&gt; if too many nested function calls or large variables are allocated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Heap:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;larger and more flexible&lt;/strong&gt; memory area.&lt;/li&gt;
&lt;li&gt;Used for data whose &lt;strong&gt;size is not known at compile time&lt;/strong&gt;, or that needs a longer lifespan than the current function scope. Dynamically created objects (&lt;code&gt;new&lt;/code&gt;, &lt;code&gt;malloc&lt;/code&gt;, etc.) usually go to the Heap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slower allocation&lt;/strong&gt; than the Stack, as the system must find a suitable memory block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deallocation&lt;/strong&gt; may be manual (C/C++) or automatic (via Garbage Collector).&lt;/li&gt;
&lt;li&gt;Shared among all threads (with proper concurrency controls).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Knowing where your data lives&lt;/strong&gt; (Stack or Heap) helps you understand &lt;strong&gt;performance implications&lt;/strong&gt; and &lt;strong&gt;memory management&lt;/strong&gt; in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variables, Scope, and Automatic Management (GC)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Variables&lt;/strong&gt; are symbolic names we give to &lt;strong&gt;memory locations&lt;/strong&gt; that store values. A variable’s &lt;strong&gt;scope&lt;/strong&gt; defines the code region where it’s accessible, and more importantly, its &lt;strong&gt;lifetime&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables declared inside a function (local scope) usually live on the &lt;strong&gt;Stack&lt;/strong&gt; and are automatically deallocated when the function ends.&lt;/li&gt;
&lt;li&gt;Dynamically created objects and the variables referencing them (usually pointers or references) live on the &lt;strong&gt;Heap&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many modern languages (JavaScript, Python, Java, C#, Go, etc.), memory management in the Heap is handled by a &lt;strong&gt;Garbage Collector (GC)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;GC&lt;/strong&gt; automatically tracks which objects in the Heap are still &lt;strong&gt;referenced&lt;/strong&gt; by your program. If an object is no longer referenced, it’s considered "garbage" and the GC will &lt;strong&gt;free the memory&lt;/strong&gt;, making it available for reuse.&lt;/p&gt;

&lt;p&gt;GC &lt;strong&gt;doesn’t eliminate the need to understand memory&lt;/strong&gt;, it just changes the &lt;em&gt;type&lt;/em&gt; of memory issues you’ll face.&lt;/p&gt;

&lt;h2&gt;
  
  
  References, Allocation, and Memory Leaks
&lt;/h2&gt;

&lt;p&gt;When you create an object in the Heap, the variable accessing it usually holds a &lt;strong&gt;reference&lt;/strong&gt; to it. Think of a reference as the “address” in memory where the object is stored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allocation&lt;/strong&gt; is the act of &lt;strong&gt;reserving&lt;/strong&gt; a space in memory (Stack or Heap) to store data. Whenever you declare a local variable or create a new object, allocation is happening.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;memory leak&lt;/strong&gt; occurs when memory that was allocated &lt;strong&gt;is not released&lt;/strong&gt; when it’s no longer needed. This happens when a Heap object continues to be referenced even though your program no longer uses it. The Garbage Collector can only release memory if &lt;strong&gt;no references&lt;/strong&gt; to it remain.&lt;/p&gt;

&lt;p&gt;Memory leaks cause your application to consume more and more memory over time, leading to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Degraded performance&lt;/strong&gt;: The OS might start swapping memory to disk to compensate for low free RAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instability&lt;/strong&gt;: Eventually, your app may run out of memory and crash with “Out of Memory” errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding how references work and how allocation/deallocation happens (manually or via GC) is &lt;strong&gt;critical for identifying and preventing memory leaks&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Memory isn’t just some “low-level” concept that only matters in C or embedded systems. It’s the foundation where all your code operates.&lt;/p&gt;

&lt;p&gt;Mastering concepts like &lt;strong&gt;Stack vs. Heap&lt;/strong&gt;, scope-driven &lt;strong&gt;lifetimes&lt;/strong&gt;, and &lt;strong&gt;reference-based allocation&lt;/strong&gt; (and how GC fits into this) gives you a &lt;strong&gt;clearer mental model&lt;/strong&gt; of what your code is actually doing behind the scenes. That empowers you to write &lt;strong&gt;more robust, predictable code&lt;/strong&gt; and debug problems more effectively.&lt;/p&gt;

&lt;p&gt;Don’t skip the basics. Next week, we’ll dive into what really happens when you type a URL, and explore the fundamentals of &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Types of Memory and Why Access Speed Matters
&lt;/h2&gt;

&lt;p&gt;Memory in a computer isn’t just RAM and that’s it. There are &lt;strong&gt;multiple levels of memory&lt;/strong&gt;, each with different &lt;strong&gt;speeds&lt;/strong&gt;, &lt;strong&gt;sizes&lt;/strong&gt;, and &lt;strong&gt;purposes&lt;/strong&gt;. Understanding this hierarchy helps you reason about performance more deeply.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Types of Memory
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Registers&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Super fast, tiny memory blocks inside the CPU itself. Used to store immediate values during execution.&lt;br&gt;&lt;br&gt;
Examples: &lt;code&gt;EAX&lt;/code&gt;, &lt;code&gt;EBX&lt;/code&gt;, &lt;code&gt;RAX&lt;/code&gt;, &lt;code&gt;RDX&lt;/code&gt; — depending on CPU architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L1, L2, L3 Cache&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Small memory levels closer to the CPU than RAM. Used to reduce access time to frequently used data.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L1&lt;/strong&gt;: fastest but smallest
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L2&lt;/strong&gt;: mid-size, slower
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L3&lt;/strong&gt;: largest, but slowest among the caches&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;RAM (Main Memory)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
Where your programs and runtime data live during execution. Much slower than CPU cache, but much larger.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disk (Swap Space / Virtual Memory)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
If RAM is full, the system may use the disk as memory — extremely slow in comparison.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  Approximate Memory Access Times
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Memory Type&lt;/th&gt;
&lt;th&gt;Access Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Registers&lt;/td&gt;
&lt;td&gt;~1 CPU cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1 Cache&lt;/td&gt;
&lt;td&gt;~3–4 cycles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L2 Cache&lt;/td&gt;
&lt;td&gt;~10–12 cycles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L3 Cache&lt;/td&gt;
&lt;td&gt;~30–50 cycles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;~100–150 cycles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSD (swap)&lt;/td&gt;
&lt;td&gt;~10,000+ cycles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;A well-optimized program minimizes RAM access and maximizes use of registers and cache — that’s how you make code &lt;em&gt;really fast&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registers&lt;/strong&gt; are where your CPU does its thinking — lightning fast but limited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory hierarchy&lt;/strong&gt; impacts your code’s performance more than you think.&lt;/li&gt;
&lt;li&gt;Understanding how data flows from storage to CPU helps you write &lt;strong&gt;faster, more efficient code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This isn’t just for systems programming — even frontend and backend code can suffer from poor memory usage patterns.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;You’re building abstractions every day — but those abstractions run on &lt;strong&gt;physical memory&lt;/strong&gt;. Know the terrain, and you'll navigate like a pro.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of the series "You’re Not Stuck — You Just Skipped the Basics".&lt;/em&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>memory</category>
      <category>basic</category>
      <category>programming</category>
    </item>
    <item>
      <title>Week 1 – You’re Not Stuck - You Just Skipped the Basics: Understanding the CPU</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Fri, 30 May 2025 22:36:55 +0000</pubDate>
      <link>https://dev.to/adamsnows/why-you-should-understand-what-a-cpu-is-even-as-a-high-level-developer-3emm</link>
      <guid>https://dev.to/adamsnows/why-you-should-understand-what-a-cpu-is-even-as-a-high-level-developer-3emm</guid>
      <description>&lt;p&gt;If you're a developer working with web frameworks, high-level languages, or even no-code tools, you might think low-level hardware knowledge is irrelevant to you.&lt;/p&gt;

&lt;p&gt;But here's the truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Understanding how a CPU works gives you superpowers as a developer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me explain why &lt;/p&gt;




&lt;h2&gt;
  
  
  1. You’re Writing Code That Runs on It
&lt;/h2&gt;

&lt;p&gt;Every line of code you write, whether it’s in Python, JavaScript, or Rust, eventually becomes a set of &lt;strong&gt;instructions executed by the CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Knowing how the CPU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches instructions&lt;/li&gt;
&lt;li&gt;Decodes them&lt;/li&gt;
&lt;li&gt;Executes and writes results back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...helps you understand how your code actually performs on the machine. It’s not magic, it’s instructions and cycles.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Debugging Gets Way Easier
&lt;/h2&gt;

&lt;p&gt;Ever seen performance bottlenecks? Threading issues? Spikes in CPU usage?&lt;/p&gt;

&lt;p&gt;If you know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What a thread really is
&lt;/li&gt;
&lt;li&gt;How CPU caches work
&lt;/li&gt;
&lt;li&gt;What context switching means&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll be &lt;em&gt;that dev&lt;/em&gt; who can debug what others can’t. You'll stop guessing and start &lt;strong&gt;profiling like a pro&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. You’ll Write Faster and More Efficient Code
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Instruction cycles
&lt;/li&gt;
&lt;li&gt;Branch prediction
&lt;/li&gt;
&lt;li&gt;Memory access latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…helps you write code that’s not just correct, but fast. Especially in performance-sensitive environments like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game development
&lt;/li&gt;
&lt;li&gt;Backend services
&lt;/li&gt;
&lt;li&gt;Embedded systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even for web apps, understanding the CPU helps when working with animations, image processing, or parsing large data.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. It’s Not That Hard (Seriously)
&lt;/h2&gt;

&lt;p&gt;You don’t need to be a chip engineer.&lt;/p&gt;

&lt;p&gt;A basic grasp of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What registers, ALU, and control units do
&lt;/li&gt;
&lt;li&gt;The CPU lifecycle: fetch → decode → execute → write back
&lt;/li&gt;
&lt;li&gt;How RAM and CPU interact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…is more than enough to level up your intuition.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Knowing how a CPU works won’t make you a better &lt;em&gt;typist&lt;/em&gt;, but it will make you a better &lt;em&gt;developer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It connects the dots between what you write and &lt;strong&gt;what the machine actually does&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So take a weekend, watch some YouTube videos, read a few docs, maybe mess around with a simulator, and unlock a deeper understanding of the magic box we all depend on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Got any CPU-related “aha!” moments from your dev journey?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Drop them below, i’d love to hear them!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Honorable mention to &lt;a href="https://dev.to/sibelius"&gt;Sibelius Seraphini&lt;/a&gt;&lt;/strong&gt; for opening my eyes to this topic and encouraging a deeper understanding of how things really work under the hood.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of the series "You’re Not Stuck - You Just Skipped the Basics".&lt;/em&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>development</category>
      <category>lowcode</category>
      <category>performance</category>
    </item>
    <item>
      <title>Want to Make Money as a Developer? Start Solving Problems Around You</title>
      <dc:creator>Adam Neves</dc:creator>
      <pubDate>Tue, 27 May 2025 04:49:34 +0000</pubDate>
      <link>https://dev.to/adamsnows/want-to-make-money-as-a-developer-start-solving-problems-around-you-2c3c</link>
      <guid>https://dev.to/adamsnows/want-to-make-money-as-a-developer-start-solving-problems-around-you-2c3c</guid>
      <description>&lt;h2&gt;
  
  
  How Programmers Can Earn More by Solving Real Problems Around Them
&lt;/h2&gt;

&lt;p&gt;As developers, we're often told that to make money, we need to build the next big startup, land a high-paying job at a tech giant, or become influencers in the dev space. But there's a more grounded, human, and immediate path to financial freedom: &lt;strong&gt;look around you and solve real problems&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Profitable Ideas Are Near You
&lt;/h2&gt;

&lt;p&gt;You don’t have to search far. Think about your friends, your family, your neighbors. What frustrates them daily? What tasks do they waste time on? What services do they wish existed but don’t?&lt;/p&gt;

&lt;p&gt;These are &lt;strong&gt;goldmines for meaningful software&lt;/strong&gt;. If you can create tools, automations, or even simple websites that improve someone’s day-to-day life, you're not just adding value, you're building something people are often willing to pay for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of Human-Centered Projects
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A local baker struggling with order management? Build a lightweight dashboard for them.&lt;/li&gt;
&lt;li&gt;A teacher overwhelmed with grading? Automate it.&lt;/li&gt;
&lt;li&gt;Your friend runs a small business and hates dealing with invoices? Create a tool that makes it painless.&lt;/li&gt;
&lt;li&gt;Someone in your community needs a way to track donations, requests, or schedules? There’s your next weekend project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need to scale to a million users. You just need to &lt;strong&gt;deeply help 10, 20, or 50 people&lt;/strong&gt;. And from there, things grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Focus on Impact, Not Virality
&lt;/h2&gt;

&lt;p&gt;Instead of chasing trending topics or building for likes, build to &lt;strong&gt;make someone’s life better&lt;/strong&gt;. When you focus on creating genuine impact, money tends to follow, through word-of-mouth, referrals, consulting gigs, and even product sales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think Like a Craftsman, Not a Startup Founder
&lt;/h2&gt;

&lt;p&gt;Craftsmen don’t start by raising capital. They start by understanding a real need and building something useful. You can do the same with code. The tools you create don’t need to be flashy, they need to work and solve a pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;You don’t need to wait for your big break. It's already around you, in the lives of people you care about. Start small. Start local. &lt;strong&gt;Solve real problems&lt;/strong&gt;, and the money will follow.&lt;/p&gt;

&lt;p&gt;Let your code be in service of people, and in return, it will serve you too.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What small problem around you could you solve with code today?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>indiehacker</category>
      <category>career</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
