<?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: Dhaval_Rasputala</title>
    <description>The latest articles on DEV Community by Dhaval_Rasputala (@dhavalrasputala).</description>
    <link>https://dev.to/dhavalrasputala</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%2F4035969%2Feb24207d-edff-42d7-9908-2f6d4d2a2287.png</url>
      <title>DEV Community: Dhaval_Rasputala</title>
      <link>https://dev.to/dhavalrasputala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhavalrasputala"/>
    <language>en</language>
    <item>
      <title>Learning Go the Slow Way: Building Projects Instead of Following Tutorials.</title>
      <dc:creator>Dhaval_Rasputala</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:46:06 +0000</pubDate>
      <link>https://dev.to/dhavalrasputala/learning-go-the-slow-way-building-projects-instead-of-following-tutorials-1aod</link>
      <guid>https://dev.to/dhavalrasputala/learning-go-the-slow-way-building-projects-instead-of-following-tutorials-1aod</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Like a lot of beginners, I started learning Go the usual way: tutorials, courses, and coding along with someone who had already solved every problem. It felt productive. I finished lessons, learned the syntax, and everything seemed to make sense.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then I tried building something on my own.I had no idea where to start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That was the point where I changed my approach. Instead of following tutorials, I started building small, messy, imperfect projects. I still use AI, but not to generate the code for me. I use it as a guide that helps me think through the problem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why tutorials stopped working for me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tutorials are great for introducing concepts and showing that something works. What they don't teach very well is how to make decisions when you're on your own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you're following along, someone else has already decided how to organize the project, what to name things, how to structure the packages, and how to solve the tricky parts. You learn what to type, but you don't get much practice deciding why to do it that way.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I could finish a tutorial and still struggle to build a simple API from scratch. That was a clear sign that I wasn't actually learning how to solve problems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My new approach: start with a real project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now I begin with a small project I actually want to build.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nothing huge—just something manageable, like:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;A URL shortener&lt;/li&gt;
&lt;li&gt;A simple job queue&lt;/li&gt;
&lt;li&gt;A CLI tool that automates something I find repetitive&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The goal isn't to build an impressive portfolio piece. It's to build something that's mine, where every design decision is one I have to make myself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The problem, of course, is that starting from a blank page can be overwhelming when you're still learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That's where AI has become genuinely useful.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I use AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I don't ask AI to build the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead, I ask it to break the project into small, testable milestones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For example:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"I want to build a basic URL shortener in Go.Break this project into small steps, where each step is one feature I can build and test before moving on."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The response usually looks something like this:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Create a basic HTTP server.&lt;/li&gt;
&lt;li&gt;Add a single hardcoded route.&lt;/li&gt;
&lt;li&gt;Create a struct to represent stored URLs.&lt;/li&gt;
&lt;li&gt;Store URLs in an in-memory map.&lt;/li&gt;
&lt;li&gt;Add a POST endpoint for creating short URLs.&lt;/li&gt;
&lt;li&gt;Add a GET endpoint that redirects.&lt;/li&gt;
&lt;li&gt;Replace the in-memory storage with a database.&lt;/li&gt;
&lt;li&gt;Add expiration support.&lt;/li&gt;
&lt;li&gt;Improve validation and error handling.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The exact steps aren't the important part.The Order is.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each milestone is small enough that I can build it, understand it, test it, and only then move on. I still write the code myself. I still get stuck. I still read documentation and debug my mistakes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The AI simply helps me avoid feeling overwhelmed by turning one big project into a series of achievable problems.One rule: don't skip ahead&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I've made one rule for myself: Don't move to the next step until the current one works and I understand why it works.That has made a much bigger difference than I expected.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I've learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Building projects has taught me things that tutorials never really did.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Goroutines and channels only clicked after I introduced a real concurrency bug into my own project and had to figure out why it happened.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Error handling stopped feeling like repetitive boilerplate once I experienced how a single ignored error could break an entire feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Package structure became much more intuitive because I had to make those decisions myself, realize where I'd gone wrong, and refactor instead of copying someone else's layout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Those lessons stuck because they came from solving my own problems rather than watching someone else solve them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Still learning,I'm not writing this as someone who's mastered Go.&lt;br&gt;
I'm only a few projects into this approach, but it's already helped me understand the language more deeply than tutorials ever did.&lt;br&gt;
It's definitely slower.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You'll spend more time stuck, debugging, and reading documentation.&lt;br&gt;
But for me, that's exactly where the learning happens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If tutorials haven't been sticking for you, try picking one small project, breaking it into tiny milestones, and refusing to move on until each one genuinely works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I'd also love to hear how other people learned Go. If you've found an approach that worked well, let me know.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>backend</category>
      <category>learning</category>
    </item>
    <item>
      <title>How I Tackle Blank Days as Beginner Developer</title>
      <dc:creator>Dhaval_Rasputala</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:36:24 +0000</pubDate>
      <link>https://dev.to/dhavalrasputala/how-i-tackle-blank-days-as-beginner-developer-5ep5</link>
      <guid>https://dev.to/dhavalrasputala/how-i-tackle-blank-days-as-beginner-developer-5ep5</guid>
      <description>&lt;h2&gt;
  
  
  What are "Blank Days"?
&lt;/h2&gt;

&lt;p&gt;My definition of a Blank Day as a beginner programmer is simple: Those days where you just don't feel like doing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As a beginner to development, there are days where you don't want to solve that one bug or tackle that one error because it instantly makes you feel exposed—it reminds you that you are a beginner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I’ve had plenty of experiences with these blank days. To combat them, I put together a basic five-step framework to help shift mindset and instantly salvage a productive workflow.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 5-Step Framework to Overcome Blank Day:-
&lt;/h2&gt;

&lt;p&gt;1.Check for typos and minor syntax errors.Often, the resistance comes from feeling overwhelmed by a massive architectural problem. Shrink the scope. Look for missing semicolons, misspelled variables, or broken imports. Getting a tiny win builds quick momentum.&lt;/p&gt;

&lt;p&gt;2.Step away from the screen for 15 minutes.If staring at the cursor isn't working, force a reset. Walk away, drink a glass of water, or step outside. Do not look at code during this break. Let your subconscious process the problem.&lt;/p&gt;

&lt;p&gt;3.Switch to documentation or reading.If writing logic feels impossible, drop down a gear. Read an article, review documentation for a tool you use, or read someone else's code on GitHub. It keeps you in the tech space without the pressure of outputting code.&lt;/p&gt;

&lt;p&gt;4.Write the problem out in plain English.Open up a markdown file or grab a physical notebook. Explain the bug or feature out loud or on paper as if you are teaching it to a rubber duck. Stripping away the syntax often reveals the logic gap instantly.&lt;/p&gt;

&lt;p&gt;5.Lower the bar drastically.Tell yourself: "I am only going to write one terrible line of code today." The hardest part of a blank day is the friction of starting. Once you break the inertia, you'll often find yourself working longer than expected.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
Remember: Hitting a wall doesn't mean you aren't cut out for development. It just means you're human, and you're learning how to problem-solve when things get frustrating.&lt;br&gt;

&lt;/div&gt;


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

&lt;blockquote&gt;
&lt;p&gt;Blank days used to make me feel like giving up entirely, but realizing they are a normal part of the engineering journey has changed everything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;What about you? How do you handle days when your brain refuses to cooperate with your IDE? Have you tried a framework like this, or do you prefer to just step away and take the day off? Let me know in the comments below!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building GateKeeper: Designing a Role-Based Access Control Library in Pure Go</title>
      <dc:creator>Dhaval_Rasputala</dc:creator>
      <pubDate>Sun, 19 Jul 2026 03:20:56 +0000</pubDate>
      <link>https://dev.to/dhavalrasputala/building-gatekeeper-designing-a-role-based-access-control-library-in-pure-go-5a7e</link>
      <guid>https://dev.to/dhavalrasputala/building-gatekeeper-designing-a-role-based-access-control-library-in-pure-go-5a7e</guid>
      <description>&lt;p&gt;As developers, we use authorization libraries almost every day. Whether it's a web application, an API, or an internal tool, we often rely on packages that decide who can do what.&lt;/p&gt;

&lt;p&gt;But I realized I had never actually built one.&lt;/p&gt;

&lt;p&gt;So instead of using an existing library, I decided to build my own Role-Based Access Control (RBAC) library in Go using only the standard library.&lt;/p&gt;

&lt;p&gt;This project eventually became GateKeeper v1.0.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built One
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As a beginner in backend development, I wanted to get exposure on how to make public APIs and how to make them work under the hood.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It also made me fight my old syntax habits. Go has strict error handling, which I also learned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I built it because I wanted to understand the engineering decisions behind public libraries. Instead of watching another tutorial, I built it myself.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Before writing any code, I brainstorm the architecture in my mind.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No external library used, only the standard Go library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeping the public APIs simple and easy to read for developers to use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write tests for each and every function, no matter how small.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These constraints forced me to think more carefully about the design instead of depending on external packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engine
├── Users
├── Roles
└── Permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Relationships are straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Users
  |
  V
Roles
  |
  V
Permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A user can have multiple roles, and roles can have multiple permissions.&lt;/li&gt;
&lt;li&gt;Permissions describe access to a resource and an action.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Designing The API
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;One thing I learned the hard way is that API design matters more than the implementation itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I wanted to keep the library easy to read even without documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The public API ended up looking something like this:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CreateUser()
CreateRole()
CreatePermission()

AssignRole()
AssignPermission()

Can()

DeleteUser()
DeleteRole()
DeletePermission()

RenameUser()
RenameRole()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I had to redesign the API many times before eventually coming up with the final one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The time spent fighting the design was worth it. It taught me API design and how to think about architecture rather than just implementation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bugs I Found Along The Way
&lt;/h2&gt;

&lt;p&gt;One of the most interesting bugs appeared when deleting roles.&lt;/p&gt;

&lt;p&gt;Initially, my implementation simply deleted the role.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Delete Role
    |
    V
Role disappears
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That looked correct.&lt;/p&gt;

&lt;p&gt;Until I realized users still stored that role ID. But the role no longer existed. The system had entered an invalid state.&lt;/p&gt;

&lt;p&gt;The correct solution wasn't just deleting the role. It was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Delete Role
    |
    V
Remove role from every user
    |
    V
Delete Role
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same issue existed when deleting permissions.&lt;/p&gt;

&lt;p&gt;That experience introduced me to the idea of maintaining referential integrity, something I had previously only encountered in databases.&lt;/p&gt;

&lt;p&gt;Another bug that surprised me, and almost went unseen, was about slices.&lt;/p&gt;

&lt;p&gt;Slices in Go point to their backing array, which means if we send a user a copy of &lt;code&gt;User&lt;/code&gt;, that user can modify the internal state of the engine, which can cause problems.&lt;/p&gt;

&lt;p&gt;The fix was to make defensive copies of the slices before returning them.&lt;/p&gt;

&lt;p&gt;That bug taught me more about Go's memory model than several hours of reading documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons I Learned
&lt;/h2&gt;

&lt;p&gt;As a beginner, you are always fighting two battles while learning: one with the programming language, and the other with the architecture you want to create.&lt;/p&gt;

&lt;p&gt;By making this project, I not only had to think about correct, production-ready architecture, but also had to learn about Go's underlying structure.&lt;/p&gt;

&lt;p&gt;This project made me learn many topics that are important for a beginner, like encapsulation, API design, maintaining invariants, and designing software that remains consistent after every operation.&lt;/p&gt;

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

&lt;p&gt;Building software from scratch is a very different experience from using libraries.&lt;/p&gt;

&lt;p&gt;You begin to appreciate the small design decisions that make software reliable.&lt;/p&gt;

&lt;p&gt;GateKeeper started as an exercise in learning authorization. It ended up teaching me much more about software engineering than I expected.&lt;/p&gt;

&lt;p&gt;If you have any suggestions or feedback, I'd be happy to hear them.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/dhavalrasputala/gatekeeper" rel="noopener noreferrer"&gt;GateKeeper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>go</category>
      <category>backend</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
