Go

Why I Chose Go for My Side Projects

After years of writing Java professionally, I started using Go for personal projects. Here's why Go's simplicity, concurrency model, and deployment story won me over for backend side projects.

May 10, 20243 min read
gojavabackendprogramming-languagescareer

The Java Comfort Zone

I've written Java professionally for most of my career. At both Oracle and Amazon, Java was the primary language — and for good reason. The ecosystem is mature, the tooling is excellent, and the JVM is battle-tested at scale. Spring Boot makes it easy to spin up production-grade services with minimal boilerplate.

But when I started building side projects on evenings and weekends, Java felt heavy. A simple HTTP service required pulling in Spring Boot, configuring a build tool, waiting for the JVM to start, and managing a pom.xml that grew faster than the actual business logic.

What Attracted Me to Go

Simplicity as a Feature

Go deliberately avoids complexity. There's one way to write a for loop, one way to handle errors, and one standard formatting tool. Coming from Java, where you can spend hours debating between checked exceptions and runtime exceptions, between Stream API and for-each loops, Go's "one way to do it" philosophy is refreshing.

Concurrency That Makes Sense

Goroutines and channels model concurrent systems more naturally than Java's threads and executors. My distributed cache project has components that need to run concurrently — handling client requests, replicating data, running health checks. In Go, each of these is a goroutine communicating through channels. The code reads like the architecture diagram.

go s.handleClientRequests(ctx)
go s.replicateToFollowers(ctx)
go s.runHealthChecks(ctx)

Single Binary Deployment

go build produces a single binary with no external dependencies. No JRE to install, no classpath to configure, no Docker image layering to optimize. For side projects running on a $5/month VPS, this simplicity is invaluable.

Fast Compilation

The Go compiler is almost instantaneous. My distributed cache project — roughly 5,000 lines — compiles in under 2 seconds. The fast feedback loop makes development feel snappy and keeps me in flow.

Where Java Still Wins

Go isn't replacing Java in my professional toolkit. For the types of systems I build at work — complex domain-heavy services with deep ecosystem integration — Java's strengths shine:

  • Ecosystem: Spring's ecosystem for enterprise features (security, observability, database access) is unmatched
  • Generics maturity: Java's generics, while imperfect, are more mature than Go's recent addition
  • IDE support: IntelliJ's Java support makes navigating large codebases effortless
  • Library ecosystem: For every integration you need, there's a well-maintained Java library

The Right Tool for the Right Job

I've settled into a comfortable pattern: Java at work for production services, Go for personal projects and learning exercises. Go forces me to think about problems differently — its constraints push toward simpler designs, which often turn out to be better designs.

The best programming language is the one that helps you ship. For side projects where I'm the only engineer, Go's simplicity and deployment story help me spend more time building and less time configuring.