<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kushal Sai</title>
    <description>The latest articles on Forem by Kushal Sai (@kushalsai).</description>
    <link>https://forem.com/kushalsai</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%2F3696672%2F96162b63-12bc-407d-a5a4-f4ea0f009fdd.png</url>
      <title>Forem: Kushal Sai</title>
      <link>https://forem.com/kushalsai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kushalsai"/>
    <language>en</language>
    <item>
      <title>Why I Chose Go for Backend Engineering (Pros, Cons, and Honest Trade-offs)</title>
      <dc:creator>Kushal Sai</dc:creator>
      <pubDate>Wed, 07 Jan 2026 05:10:39 +0000</pubDate>
      <link>https://forem.com/kushalsai/why-i-chose-go-for-backend-engineering-pros-cons-and-honest-trade-offs-jk6</link>
      <guid>https://forem.com/kushalsai/why-i-chose-go-for-backend-engineering-pros-cons-and-honest-trade-offs-jk6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I tell people I use Go for backend development, the most common reactions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Why not Java?”&lt;/li&gt;
&lt;li&gt;“Isn’t Go too simple?”&lt;/li&gt;
&lt;li&gt;“Rust is cooler, right?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a student, I didn’t choose Go because it’s trendy or because someone on Twitter said it’s the future.&lt;br&gt;
I chose Go because it &lt;strong&gt;forced me to think clearly&lt;/strong&gt; while building backend systems.&lt;/p&gt;

&lt;p&gt;This post is not a Go tutorial.&lt;br&gt;
It’s an honest explanation of &lt;strong&gt;why I use Go&lt;/strong&gt;, what it does well, where it frustrates me, and why I still stick with it for backend engineering.&lt;/p&gt;


&lt;h2&gt;
  
  
  My Background Before Go
&lt;/h2&gt;

&lt;p&gt;Before Go, my backend understanding was fragmented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I knew how to write APIs&lt;/li&gt;
&lt;li&gt;I knew how to connect databases&lt;/li&gt;
&lt;li&gt;I knew frameworks more than systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I didn’t really &lt;em&gt;understand&lt;/em&gt; what my backend was doing under load, under failure, or under concurrency.&lt;/p&gt;

&lt;p&gt;At the same time, I was learning &lt;strong&gt;Operating Systems, Computer Networks, and DBMS&lt;/strong&gt; in college.&lt;br&gt;
I wanted a language that didn’t hide these fundamentals behind heavy abstractions.&lt;/p&gt;

&lt;p&gt;That’s when Go clicked.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Go Taught Me About Backend Engineering
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Simplicity Is a Feature, Not a Limitation
&lt;/h3&gt;

&lt;p&gt;Go is often criticized for being “too simple”.&lt;/p&gt;

&lt;p&gt;No fancy syntax.&lt;br&gt;
No deep inheritance trees.&lt;br&gt;
No clever language tricks.&lt;/p&gt;

&lt;p&gt;At first, this felt restrictive.&lt;br&gt;
Later, I realized it was intentional.&lt;/p&gt;

&lt;p&gt;Go forces you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write readable code&lt;/li&gt;
&lt;li&gt;think before adding abstractions&lt;/li&gt;
&lt;li&gt;make decisions explicit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When building backend systems, &lt;strong&gt;clarity matters more than cleverness&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Explicit Error Handling Changed How I Think
&lt;/h3&gt;

&lt;p&gt;Go doesn’t have exceptions.&lt;/p&gt;

&lt;p&gt;Instead of hiding failures, Go makes you face them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initially, this felt repetitive.&lt;/p&gt;

&lt;p&gt;But over time, it taught me something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Backend systems fail all the time — pretending they don’t is dangerous.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Explicit error handling made me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;think about failure paths&lt;/li&gt;
&lt;li&gt;design safer APIs&lt;/li&gt;
&lt;li&gt;avoid “happy path only” thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This aligned very well with what I learned in &lt;strong&gt;Operating Systems and DBMS&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Go and Concurrency: Simple, But Not Magical
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Goroutines Felt Natural
&lt;/h3&gt;

&lt;p&gt;After studying OS concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;threads&lt;/li&gt;
&lt;li&gt;context switching&lt;/li&gt;
&lt;li&gt;synchronization&lt;/li&gt;
&lt;li&gt;race conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go’s concurrency model felt… honest.&lt;/p&gt;

&lt;p&gt;Goroutines are lightweight, but they’re not magic.&lt;br&gt;
Channels help structure communication, but they don’t replace thinking.&lt;/p&gt;

&lt;p&gt;Go doesn’t stop you from writing buggy concurrent code —&lt;br&gt;
but it &lt;strong&gt;makes concurrency visible&lt;/strong&gt;, not hidden.&lt;/p&gt;

&lt;p&gt;That visibility matters a lot in backend systems.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Go Doesn’t Protect You From
&lt;/h3&gt;

&lt;p&gt;This is important.&lt;/p&gt;

&lt;p&gt;Go &lt;strong&gt;will not save you&lt;/strong&gt; from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;race conditions&lt;/li&gt;
&lt;li&gt;deadlocks&lt;/li&gt;
&lt;li&gt;poor synchronization design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You still need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;discipline&lt;/li&gt;
&lt;li&gt;understanding&lt;/li&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I actually like this.&lt;br&gt;
It matches real backend engineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Go Works Well for Backend Systems
&lt;/h2&gt;

&lt;p&gt;From a practical perspective, Go fits backend work really well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strong Standard Library
&lt;/h3&gt;

&lt;p&gt;Out of the box, Go gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP servers&lt;/li&gt;
&lt;li&gt;networking primitives&lt;/li&gt;
&lt;li&gt;encoding and decoding&lt;/li&gt;
&lt;li&gt;concurrency tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t need 10 libraries just to start building.&lt;/p&gt;




&lt;h3&gt;
  
  
  Performance Without Complexity
&lt;/h3&gt;

&lt;p&gt;Go gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;good performance&lt;/li&gt;
&lt;li&gt;predictable memory usage&lt;/li&gt;
&lt;li&gt;fast startup times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manual memory management&lt;/li&gt;
&lt;li&gt;overly complex language rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For backend services, this balance is powerful.&lt;/p&gt;




&lt;h3&gt;
  
  
  Easy Deployment
&lt;/h3&gt;

&lt;p&gt;This might sound boring, but it matters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single static binary&lt;/li&gt;
&lt;li&gt;Minimal runtime dependencies&lt;/li&gt;
&lt;li&gt;Easy containerization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a student deploying projects, this reduced friction a lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Downsides (Go Is Not Perfect)
&lt;/h2&gt;

&lt;p&gt;I don’t trust blogs that only talk about pros.&lt;br&gt;
So here are the real downsides I’ve experienced.&lt;/p&gt;




&lt;h3&gt;
  
  
  Verbosity Can Be Annoying
&lt;/h3&gt;

&lt;p&gt;Go code can feel repetitive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;error checks everywhere&lt;/li&gt;
&lt;li&gt;boilerplate in some patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can slow you down for small scripts.&lt;/p&gt;




&lt;h3&gt;
  
  
  Generics Arrived Late (and Are Limited)
&lt;/h3&gt;

&lt;p&gt;Generics exist now, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they’re intentionally conservative&lt;/li&gt;
&lt;li&gt;some patterns are still awkward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re coming from languages with powerful generics, this can feel limiting.&lt;/p&gt;




&lt;h3&gt;
  
  
  Not Ideal for Everything
&lt;/h3&gt;

&lt;p&gt;I wouldn’t use Go for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI-heavy applications&lt;/li&gt;
&lt;li&gt;complex domain-heavy business logic&lt;/li&gt;
&lt;li&gt;places where expressive type systems matter more than simplicity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go shines in &lt;strong&gt;systems and services&lt;/strong&gt;, not everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Still Choose Go as a Student
&lt;/h2&gt;

&lt;p&gt;As a student backend engineer, Go gave me something more valuable than productivity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It gave me a clear mental model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Go made me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understand what my code is doing&lt;/li&gt;
&lt;li&gt;respect concurrency&lt;/li&gt;
&lt;li&gt;think about failures&lt;/li&gt;
&lt;li&gt;build systems, not just features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That foundation matters more than learning five frameworks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Go vs Other Languages (My Honest Take)
&lt;/h2&gt;

&lt;p&gt;I don’t think Go is “better” than everything else.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java has a massive ecosystem&lt;/li&gt;
&lt;li&gt;Rust has stronger safety guarantees&lt;/li&gt;
&lt;li&gt;Python is incredibly productive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Go sits in a sweet spot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple&lt;/li&gt;
&lt;li&gt;fast&lt;/li&gt;
&lt;li&gt;honest about systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For backend engineering, that trade-off works for me.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I’m Still Learning
&lt;/h2&gt;

&lt;p&gt;Using Go didn’t make me an expert.&lt;/p&gt;

&lt;p&gt;I’m still learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better concurrency patterns&lt;/li&gt;
&lt;li&gt;distributed systems&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;database internals&lt;/li&gt;
&lt;li&gt;system design trade-offs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go didn’t solve these problems —&lt;br&gt;
it &lt;strong&gt;made them visible&lt;/strong&gt;, which is more important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Choosing a backend language is not about hype.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;how it shapes your thinking&lt;/li&gt;
&lt;li&gt;how it handles failure&lt;/li&gt;
&lt;li&gt;how it scales with complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, Go helped bridge the gap between &lt;strong&gt;CS fundamentals&lt;/strong&gt; and &lt;strong&gt;real backend systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And as a student, that mattered more than anything else.&lt;/p&gt;

&lt;p&gt;Thanks for reading — still learning, still building.&lt;/p&gt;




</description>
      <category>systems</category>
      <category>backend</category>
      <category>learning</category>
      <category>go</category>
    </item>
    <item>
      <title>How I Think About Backend Engineering as a Student</title>
      <dc:creator>Kushal Sai</dc:creator>
      <pubDate>Wed, 07 Jan 2026 05:00:30 +0000</pubDate>
      <link>https://forem.com/kushalsai/how-i-think-about-backend-engineering-as-a-student-al8</link>
      <guid>https://forem.com/kushalsai/how-i-think-about-backend-engineering-as-a-student-al8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I started learning backend development, I initially thought it was just about writing APIs and connecting databases. But as I progressed through my second year of engineering, subjects like &lt;strong&gt;Operating Systems, Computer Networks, and DBMS&lt;/strong&gt; completely changed how I think about backend systems.&lt;/p&gt;

&lt;p&gt;This post is not a tutorial. It’s about how learning core CS fundamentals shaped my mindset as a backend-focused student engineer—and how it helped me understand real-world systems better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Backend Engineering Interested Me
&lt;/h2&gt;

&lt;p&gt;I’ve always been more curious about what happens &lt;strong&gt;behind the scenes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How requests are handled&lt;/li&gt;
&lt;li&gt;How data is stored and retrieved efficiently&lt;/li&gt;
&lt;li&gt;How systems scale under load&lt;/li&gt;
&lt;li&gt;How failures are handled gracefully&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend engineering felt less about visuals and more about &lt;strong&gt;logic, reliability, and correctness&lt;/strong&gt;, which naturally aligned with how I like to think.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Operating Systems Changed My Perspective
&lt;/h2&gt;

&lt;p&gt;Studying &lt;strong&gt;Operating Systems&lt;/strong&gt; gave me clarity on things I was blindly using before.&lt;/p&gt;

&lt;p&gt;Concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;processes vs threads
&lt;/li&gt;
&lt;li&gt;context switching
&lt;/li&gt;
&lt;li&gt;synchronization and race conditions
&lt;/li&gt;
&lt;li&gt;memory management
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;made backend concepts feel &lt;em&gt;real&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When I later worked with goroutines, worker pools, or concurrent request handling, I wasn’t just using features—I understood &lt;strong&gt;why concurrency needs discipline&lt;/strong&gt; and &lt;strong&gt;what can go wrong if it’s misused&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;OS taught me that performance and correctness are deeply connected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Computer Networks Made APIs Make Sense
&lt;/h2&gt;

&lt;p&gt;Before learning &lt;strong&gt;Computer Networks&lt;/strong&gt;, HTTP felt like magic.&lt;/p&gt;

&lt;p&gt;After studying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP vs UDP&lt;/li&gt;
&lt;li&gt;latency and packet loss&lt;/li&gt;
&lt;li&gt;DNS resolution&lt;/li&gt;
&lt;li&gt;client–server communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APIs stopped being “endpoints” and started becoming &lt;strong&gt;network conversations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Understanding how data travels over the network helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;design cleaner APIs&lt;/li&gt;
&lt;li&gt;think about timeouts and retries&lt;/li&gt;
&lt;li&gt;respect the cost of every request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It made me more careful, not just more confident.&lt;/p&gt;




&lt;h2&gt;
  
  
  DBMS Taught Me to Respect Data
&lt;/h2&gt;

&lt;p&gt;DBMS was a turning point.&lt;/p&gt;

&lt;p&gt;Concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;normalization&lt;/li&gt;
&lt;li&gt;indexing&lt;/li&gt;
&lt;li&gt;transactions&lt;/li&gt;
&lt;li&gt;isolation levels&lt;/li&gt;
&lt;li&gt;crash recovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;completely changed how I view databases.&lt;/p&gt;

&lt;p&gt;Instead of treating a database as a black box, I started thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why queries are slow&lt;/li&gt;
&lt;li&gt;how indexes actually help&lt;/li&gt;
&lt;li&gt;what consistency really means&lt;/li&gt;
&lt;li&gt;why failures don’t mean data loss&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mindset later helped me while building backend projects that dealt with real data and edge cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Applying These Concepts in Backend Projects
&lt;/h2&gt;

&lt;p&gt;When I started building backend systems, everything connected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS helped me reason about concurrency and resource usage&lt;/li&gt;
&lt;li&gt;CN helped me design better request flows&lt;/li&gt;
&lt;li&gt;DBMS helped me write safer and more efficient data logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I stopped asking &lt;em&gt;“How do I implement this?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
and started asking &lt;em&gt;“How should this behave under real conditions?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That shift mattered a lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Like Go for Backend Systems
&lt;/h2&gt;

&lt;p&gt;While learning backend development, I gravitated toward &lt;strong&gt;Go&lt;/strong&gt; because it encourages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simplicity over cleverness&lt;/li&gt;
&lt;li&gt;explicit error handling&lt;/li&gt;
&lt;li&gt;clear concurrency models&lt;/li&gt;
&lt;li&gt;strong standard libraries for networking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go didn’t let me hide mistakes—it forced me to think clearly.&lt;br&gt;&lt;br&gt;
That aligned well with the fundamentals I was learning academically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Still Learning, Still Improving
&lt;/h2&gt;

&lt;p&gt;I don’t consider myself an expert.&lt;/p&gt;

&lt;p&gt;I’m still learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deeper system design concepts&lt;/li&gt;
&lt;li&gt;distributed systems&lt;/li&gt;
&lt;li&gt;better database internals&lt;/li&gt;
&lt;li&gt;observability and reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But learning OS, CN, and DBMS early helped me build a &lt;strong&gt;strong mental model&lt;/strong&gt; for backend engineering—and that matters more than tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Backend engineering is not just about frameworks or languages.&lt;br&gt;&lt;br&gt;
It’s about understanding systems, trade-offs, and failure modes.&lt;/p&gt;

&lt;p&gt;If you’re a student learning backend development, don’t ignore your CS fundamentals—they quietly shape how good of an engineer you become.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>softwareengineering</category>
      <category>go</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
