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.