<?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: bramwelM</title>
    <description>The latest articles on DEV Community by bramwelM (@bram_m).</description>
    <link>https://dev.to/bram_m</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3895062%2Ffd501f3b-1141-4c49-bf3b-4254319ca95b.png</url>
      <title>DEV Community: bramwelM</title>
      <link>https://dev.to/bram_m</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bram_m"/>
    <language>en</language>
    <item>
      <title>Building ls in Go, Best Two Weeks So Far</title>
      <dc:creator>bramwelM</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:47:15 +0000</pubDate>
      <link>https://dev.to/bram_m/building-ls-in-go-best-two-weeks-so-far-1d6d</link>
      <guid>https://dev.to/bram_m/building-ls-in-go-best-two-weeks-so-far-1d6d</guid>
      <description>&lt;p&gt;There are projects that teach you a programming language, and then there are projects that teach you how computers actually work. Building my own implementation of the &lt;em&gt;Unix&lt;/em&gt; &lt;em&gt;ls&lt;/em&gt; &lt;em&gt;command&lt;/em&gt; in Go belongs firmly in the second category. &lt;/p&gt;

&lt;p&gt;Going into it, I thought I was building a small command-line utility. After all, ls simply lists files in a directory. How difficult could it be? &lt;br&gt;
It turned out to be the most technically challenging project I've worked on so far, and easily the most rewarding. This is why I am writing this article.&lt;/p&gt;

&lt;p&gt;The project took my teammate and me two weeks to complete. Surprisingly, nearly half of that time was spent debugging. Every time we solved one issue, three more seemed to emerge. We'd celebrate matching the output of the system's ls, only to notice that a single column had shifted by one space or that a directory had the wrong color. It was frustrating at times, but looking back, those debugging sessions taught me more than writing the initial code ever did.&lt;/p&gt;

&lt;h4&gt;
  
  
  Complexity
&lt;/h4&gt;

&lt;p&gt;One of the first lessons was that even something as familiar as ls hides an incredible amount of complexity. Supporting flags like &lt;em&gt;-a, -l,&lt;/em&gt; and combinations such as &lt;em&gt;-la&lt;/em&gt; wasn't just a matter of checking whether a character appeared on the command line. Each flag represented a different behavior, and those behaviors had to work independently while still interacting correctly with one another. Parsing the flags cleanly, deciding what each one enabled, and keeping the implementation maintainable became an exercise in software design rather than simply writing conditionals.&lt;/p&gt;

&lt;h4&gt;
  
  
  Architecture
&lt;/h4&gt;

&lt;p&gt;As the project grew, we naturally separated responsibilities. One part of the program handled configuration and flags, another dealt with traversing the file system, while another focused entirely on formatting the output. That separation made debugging significantly easier because we could reason about one piece of the program without worrying about everything else breaking at the same time. It reinforced the importance of designing software around clear responsibilities instead of letting everything accumulate inside a single file.&lt;/p&gt;

&lt;p&gt;The biggest revelation, however, came from exploring the Unix file system itself. Before this project, I'd heard the phrase &lt;em&gt;"everything in Unix is a file"&lt;/em&gt; countless times. I understood it intellectually, but I don't think I truly appreciated it until I spent hours working with directories like &lt;em&gt;/dev&lt;/em&gt;, which I now know is where device files are.&lt;/p&gt;

&lt;p&gt;I wasn't just looking at regular files and folders anymore. Character devices, block devices, symbolic links, sockets and named pipes all appeared through the same file system interface. The operating system wasn't hiding behind layers of abstraction but rather exposing itself through files. Understanding why &lt;em&gt;/dev/null&lt;/em&gt; exists &lt;em&gt;(operating systems and automation scripts frequently need a way to discard unwanted data or simulate a completely empty file),&lt;/em&gt;    why device files have major and minor numbers, or why symbolic links behave differently from regular files made Unix feel far less mysterious than it had before.&lt;/p&gt;

&lt;p&gt;Trying to replicate the behavior of GNU ls introduced an entirely different set of challenges. It wasn't enough for the program to produce similar output. We wanted it to match the system utility as closely as possible. That meant paying attention to details most users never notice. Permissions had to be formatted exactly right. Symbolic links needed to display their targets correctly. Device files had to show major and minor numbers instead of file sizes. Columns had to line up perfectly regardless of file type. Even the tiny + symbol that indicates an Access Control List turned out to be surprisingly difficult because adding a single character without accounting for spacing threw the entire output out of alignment.&lt;/p&gt;

&lt;p&gt;Coloring the output became another unexpected rabbit hole. At first, it seemed sufficient to color every directory blue, but that assumption quickly fell apart. Certain directories, such as mqueue and shm, receive entirely different colors because they are sticky, world-writable directories. Learning that even terminal colors follow specific Unix conventions reminded me that mature software rarely contains arbitrary decisions. There is usually a reason hidden beneath every detail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkkv5n7ba4f2iu2e8obo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkkv5n7ba4f2iu2e8obo.jpg" alt="Linux System" width="736" height="1104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My Key Takeaway
&lt;/h4&gt;

&lt;p&gt;What made the experience so valuable wasn't simply solving those problems but learning how to approach them. We spent countless hours comparing our output against the system's ls, reading documentation, testing edge cases and questioning every discrepancy instead of accepting "close enough." It was the first project where I truly appreciated that engineering isn't just about making software work. It's about making software behave correctly under conditions you didn't originally think about.&lt;/p&gt;

&lt;p&gt;This project also changed the way I think about debugging. I used to see debugging as something standing between me and finishing a project. Now I see it as part of the project itself. Every bug forced us to understand another aspect of the operating system or our own implementation. The solution was rarely to write more code. More often, it was to understand the problem more deeply.&lt;/p&gt;

&lt;p&gt;Looking back, I can confidently say this has been my favorite project so far. Not because it was easy, but because it wasn't. It challenged the way I think, exposed gaps in my understanding, and pushed me to learn concepts I probably wouldn't have encountered otherwise. Those are exactly the kinds of problems I hope to keep solving as I continue working towards backend engineering, DevOps and payment infrastructure.&lt;/p&gt;

&lt;p&gt;If this project taught me anything, it's that I genuinely enjoy technically demanding work. The more a problem forces me to understand what's happening beneath the surface, the more satisfying it becomes to solve.&lt;/p&gt;

&lt;p&gt;The complete project is available on GitHub. Find it &lt;a href="https://github.com/dev-bramwel/my-ls" rel="noopener noreferrer"&gt;here&lt;/a&gt; to compare notes.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Django Was Just the Excuse</title>
      <dc:creator>bramwelM</dc:creator>
      <pubDate>Sun, 05 Jul 2026 17:50:07 +0000</pubDate>
      <link>https://dev.to/bram_m/django-was-just-the-excuse-7g8</link>
      <guid>https://dev.to/bram_m/django-was-just-the-excuse-7g8</guid>
      <description>&lt;p&gt;This weekend I stood in front of a room of developers to give a talk that was advertised as being about backend development with Django.&lt;/p&gt;

&lt;p&gt;The funny thing is, I planned on talking about something most beginner backend developers often overlook.&lt;/p&gt;

&lt;p&gt;I begun by asking a rather unexpected question: "As an aspiring backend dev, what will you be doing in a real world scenario, what would your typical day in the life look like?" The answers I got was just as I expected, and that right there was what I wanted to bring to light in my talk.&lt;/p&gt;

&lt;p&gt;Somewhere along the way, many of us start believing that learning backend development means memorizing a framework. We learn models, views, serializers, authentication, migrations, and enough commands to build an application that works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuovs3kjllrqxjwvxph2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuovs3kjllrqxjwvxph2.png" alt="Backend logic importance" width="800" height="270"&gt;&lt;/a&gt;&lt;br&gt;
But eventually you realize that none of those things answer the questions that actually matter. How do you decide where business logic belongs? What happens when two people try to buy the last item at exactly the same time? What if a payment succeeds but your server crashes before saving the transaction? What if a user keeps clicking the payment button because nothing seems to be happening? Those aren't Django questions. They're backend engineering questions. That's what I wanted my audience to leave with.&lt;/p&gt;

&lt;p&gt;Throughout the session, we explored the idea that backend development is really about making decisions. Every endpoint represents a business process. Every database table represents something that exists in the real world. Every bug is usually an assumption you forgot to question.&lt;/p&gt;

&lt;p&gt;One idea kept coming back throughout the talk:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Frameworks help you write software. Thinking helps you build systems.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Preparing for the session also taught me something about myself. Building projects is one way to learn. Explaining those projects to other people is another level entirely. It forces you to strip away jargon and ask whether you actually understand the ideas underneath the code.&lt;/p&gt;

&lt;p&gt;Walking off that stage, I was happy because the talk went well. I was also happy because it confirmed something I've been working toward over the past year.&lt;/p&gt;

&lt;p&gt;I don't just want to write backend software.&lt;/p&gt;

&lt;p&gt;I want to understand how great backend systems are designed.&lt;/p&gt;

&lt;p&gt;And then help other developers think that way too.&lt;/p&gt;

&lt;p&gt;Here's to more code, more architecture diagrams scribbled on whiteboards, and hopefully many more conversations about why the most important question in backend development isn't &lt;em&gt;"How do I build this?"&lt;/em&gt; but &lt;em&gt;"What happens when this breaks?"&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>django</category>
      <category>backenddevelopment</category>
      <category>devbugsmash</category>
    </item>
    <item>
      <title>📝 Slapping It on the Wall: What the Invention of the Sticky Note Taught Me About Coding</title>
      <dc:creator>bramwelM</dc:creator>
      <pubDate>Tue, 26 May 2026 19:59:12 +0000</pubDate>
      <link>https://dev.to/bram_m/slapping-it-on-the-wall-what-the-invention-of-the-sticky-note-taught-me-about-coding-2k3g</link>
      <guid>https://dev.to/bram_m/slapping-it-on-the-wall-what-the-invention-of-the-sticky-note-taught-me-about-coding-2k3g</guid>
      <description>&lt;p&gt;A while back, I stepped away from my IDE and onto a stage at &lt;em&gt;Pint of Science Kisumu&lt;/em&gt;. If you aren’t familiar, Pint of Science is a global festival that brings researchers and techies out of their labs and into local spots to talk about their work over a drink. No jargon, no dense slide decks—just raw stories of discovery.&lt;/p&gt;

&lt;p&gt;My talk was titled "&lt;strong&gt;Sticky Note.&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;Initially, the audience looked a bit confused. Why is a developer talking about stationery?&lt;/p&gt;

&lt;p&gt;But as it turns out, the history of the humble sticky note is the ultimate metaphor for the chaotic, beautiful reality of building software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Failed" Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 1968, a scientist named Spencer Silver was trying to develop a super-strong aerospace adhesive. Instead, he ended up with a weak, sensitive glue that could barely hold two pieces of paper together.&lt;/p&gt;

&lt;p&gt;The project failed. It was discarded as a failure.&lt;/p&gt;

&lt;p&gt;It sat on a shelf for years as a useless mistake. It wasn't until years later that his colleague, Art Fry, frustrated by his bookmarks constantly falling out of his hymnal during choir practice, remembered the "weak glue." He applied it to the paper, and the world’s first Sticky Note was born. Even its iconic canary yellow color was a complete accident—the lab next door just happened to have a stack of yellow scrap paper lying around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Illusion of "Seamless" Code&lt;/strong&gt;&lt;br&gt;
Lately, I’ve been diving deep into logic and system architecture. One major thing I’ve discovered is the massive amount of hidden detail that goes into building any functioning system.&lt;/p&gt;

&lt;p&gt;From an outsider’s point of view, a finished application or an elegant script looks seamless. It feels automatic. But as anyone who writes code knows: everything you see is highly intentional.&lt;/p&gt;

&lt;p&gt;Behind that smooth user experience is a chaotic trail of:&lt;/p&gt;

&lt;p&gt;Fatal errors and broken loops&lt;/p&gt;

&lt;p&gt;Hours spent staring at a terminal screen&lt;/p&gt;

&lt;p&gt;"Weak glue" solutions that didn't work the way we expected&lt;/p&gt;

&lt;p&gt;The real magic of engineering isn't about getting it right on the first try. If it were, none of us would have a job. The magic lies in having the patience to stare at a mistake, slap it on the wall like a sticky note, and look at it from a different angle until we find its true purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't Delete the Broken Script&lt;/strong&gt;&lt;br&gt;
My main takeaway—and my encouragement to the crowd last night—was simple: &lt;strong&gt;&lt;em&gt;Do not stop.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're working on a feature and the logic completely breaks, or when your data looks incredibly messy, don't just panic and scrap the code. Development is rarely a straight line. It is a process of accidental discoveries disguised as bugs. If we delete our work the moment it goes wrong, we might just be throwing away the foundation of our next big breakthrough.&lt;/p&gt;

&lt;p&gt;I am incredibly humbled to say that the audience voted my talk the People’s Choice for the night! 🏆&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymwa02y0j9s9suzf8agl.jpeg" 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%2Fymwa02y0j9s9suzf8agl.jpeg" alt="sticky note" width="640" height="640"&gt;&lt;/a&gt;&lt;br&gt;
It was an amazing reminder that whether you are in a high-tech research lab or debugging a local server in Kisumu, we are all just trying to navigate the chaos of creation.&lt;/p&gt;

&lt;p&gt;The next time your code crashes or a project falls apart, embrace it. Trust your process, look at the error from a new perspective, and keep pushing forward. Your greatest bug might just be the feature that changes everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Have you ever turned a massive coding mistake into a successful feature? Let me know your best "accidental discovery" stories in the comments below! 👇
&lt;/h2&gt;

</description>
      <category>coding</category>
      <category>learning</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Confessions of a Git Beginner: Why the Terminal Stopped Scaring Me</title>
      <dc:creator>bramwelM</dc:creator>
      <pubDate>Sat, 23 May 2026 12:49:07 +0000</pubDate>
      <link>https://dev.to/bram_m/confessions-of-a-git-beginner-why-the-terminal-stopped-scaring-me-26o8</link>
      <guid>https://dev.to/bram_m/confessions-of-a-git-beginner-why-the-terminal-stopped-scaring-me-26o8</guid>
      <description>&lt;p&gt;When I started my coding journey, I thought writing code was the hard part. Then I met Git and the command line. At first, it felt like a series of incantations I had to type perfectly into the terminal, or my entire project would vanish. But after breaking a few things and pushing through the confusion, I realized Git isn't just a tool only, it's also a mindset shift.&lt;/p&gt;

&lt;p&gt;To be completely honest, the terminal terrified me. It felt like a cold, unforgiving void where typing a single wrong character could accidentally delete my entire project or break my machine. For the first few weeks, running commands felt like shouting magic incantations into the dark and praying everything didn't blow up. But a funny thing happens when you use Git every day: the fear fades, and the mindset changes.&lt;/p&gt;

&lt;p&gt;I’m still very much a beginner, but Git has completely changed how I think about building software. Here are the four biggest lessons version control has taught me so far.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Making Mistakes is Part of the Process (The Safety Net)&lt;/strong&gt;&lt;br&gt;
Before I started using Git, writing code felt incredibly high-stakes.&lt;/p&gt;

&lt;p&gt;Git completely flipped that script. It taught me that software development, it’s about having a safety net that allows you to fail safely.&lt;/p&gt;

&lt;p&gt;Realizing that I can ruthlessly experiment, completely mess up a file, and then simply run a command to discard those changes and reset back to safety was a massive breakthrough. Git didn't just save my code; it gave me the psychological freedom to break things on purpose just to see how they work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Art of Breaking Things Down&lt;/strong&gt;&lt;br&gt;
Git forced me to stop, breathe, and think modularly. It taught me to break big problems into micro-steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Isolate the feature: &lt;br&gt;
Instead of working on everything in the main branch, I learned to spin up a dedicated feature branch for a single specific task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Work in tiny increments:&lt;br&gt;
Fix a small bug? Commit it. Format a file? Commit it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write meaningful histories:&lt;br&gt;
Wrapping my head around why &lt;em&gt;git commit -m "fixed stuff"&lt;/em&gt; is a bad idea made me a better critical thinker. Writing a clear, structured commit message forces you to explain what you changed and why.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It made me look at projects differently. I now view coding as a series of small, manageable stepping stones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Communication &amp;amp; Collaboration&lt;/strong&gt;&lt;br&gt;
Even if you are working on a solo project, you are never truly coding alone. At the very least, you are collaborating with Future You.&lt;/p&gt;

&lt;p&gt;There is nothing quite like looking back at a project you wrote three weeks ago and trying to figure out what your past self was thinking. Git taught me that code isn't just written for computers to execute; it's written for humans to read.&lt;/p&gt;

&lt;p&gt;Maintaining a clean Git history, naming branches logically, and writing a solid, detailed &lt;em&gt;README.md&lt;/em&gt; file aren't just administrative chores. They are essential communication tools. Git taught me that being a good developer means being a good teammate to whoever reads my repository next—even if that person is just me in a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Navigating the "oops" Moments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Git will throw errors at you that look like complete gibberish at first. You'll run into an unexpected merge conflict, a permission issue, or a &lt;em&gt;403 Forbidden error&lt;/em&gt; when trying to push to a remote repository.&lt;/p&gt;

&lt;p&gt;In my first week, those errors made my stomach drop. I assumed I had broken everything beyond repair.&lt;/p&gt;

&lt;p&gt;But navigating those "uh-oh" moments taught me the most valuable lesson of all: senior developers don't have fewer errors; they just have more practice solving them.&lt;/p&gt;

&lt;p&gt;I learned to slow down, read the terminal logs closely, check my remote configurations, and realize that every single error is fixable. The terminal isn't an enemy looking to punish your mistakes; it’s just a tool waiting for clear instructions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfl4f5yx4wcsn0sonmfw.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%2Fdfl4f5yx4wcsn0sonmfw.png" alt="Happy terminal" width="799" height="436"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Repetition Builds Muscle Memory&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
If you're a beginner reading this and you still have to look up how to update your branch from main, delete a local branch, or fix a detached HEAD state—that is completely normal.&lt;/p&gt;

&lt;p&gt;I still keep a cheatsheet open on my second monitor. The commands don't stick overnight, but the confidence does. Git stopped being a scary obstacle and became the ultimate developer tool. It keeps me organized, gives me permission to make mistakes, and reminds me that every big problem is just a collection of tiny, committable pieces.&lt;/p&gt;

&lt;p&gt;If you’re hiding from the terminal, take the leap. Type git init, embrace the errors, and let yourself break things. It's the only way to learn!&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ What was the most terrifying Git error you ran into as a beginner, and how did you fix it? Let's swap horror stories in the comments!
&lt;/h2&gt;

</description>
      <category>gitlab</category>
      <category>tutorial</category>
      <category>git</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
