Logo
Logo
54 results for
  • Building a great CLI tool is half the job. The other half is getting it to users without making them compile it from source, navigate a GitHub releases page manually, or run a curl-pipe-to-bash script from an unverified URL. Distribution is where many Go projects stop short: the binary exists, the README says go install, and that is considered “distributed.”

    go install is fine for Go developers. It is not acceptable for operators, system administrators, and end users who reasonably expect brew install or apt install. GoReleaser closes this gap by automating the full release pipeline — cross-compiled binaries, checksums, GitHub releases, Homebrew formulas, Debian packages, Docker images — from a single configuration file and one git push --tags.

    Go tutorial golang CLI Created Thu, 05 Jun 2025 00:00:00 +0000
  • I once watched a team spend six months building a “distributed database” that was really just PostgreSQL with a cron job that copied rows between data centers. It worked until it didn’t — conflicting writes, lost updates, and an incident where the same order was fulfilled twice from different warehouses. They learned the hard way that distributed systems aren’t just “run it on multiple machines.” They’re a fundamentally different programming model with different guarantees, different failure modes, and different mental models.

    Rust tutorial rust networking distributed-systems Created Wed, 04 Jun 2025 11:08:00 +0000
  • The first time I used gRPC in production was on a Go project. The experience was fine — protoc generated stubs, you implemented an interface, done. Then I tried tonic in Rust, and I realized what gRPC was supposed to feel like. Type-safe request/response types generated at compile time, streaming that works with Rust’s async model, and interceptors built on the same Tower middleware stack as Axum. It’s gRPC done right.

    Rust tutorial rust microservices architecture Created Tue, 03 Jun 2025 14:37:00 +0000
  • If you’ve come from Java or C++, you’re probably waiting for Go to show you its inheritance model. Where’s the extends keyword? Where are the base classes? There aren’t any — Go made a deliberate choice to leave them out. After writing a few thousand lines of Go, most people agree it was the right call.

    The Problem

    Object-oriented languages lean heavily on the “is-a” relationship. A Dog is-a Animal. A Manager is-a Employee. This sounds elegant until real-world complexity enters the picture: is a FlyingFish a Fish or a Bird? Now you’re in multiple inheritance territory and things get messy fast. And in Go, the instinct to fake it with named fields creates its own noise:

    Go tutorial golang Created Mon, 02 Jun 2025 00:00:00 +0000
  • The moment I stopped thinking of services as calling each other and started thinking of them as reacting to events, my architecture got dramatically simpler. Instead of service A calling service B calling service C in a synchronous chain that’s as fragile as it sounds, service A publishes an event. Services B and C subscribe and react independently. A doesn’t even know they exist. B can be down for maintenance without affecting A. C can be added next month without changing A’s code. Message queues are the backbone of this pattern.

    Rust tutorial rust networking distributed-systems Created Sun, 01 Jun 2025 15:25:00 +0000
  • I once joined a team that had 47 microservices for what was essentially a CRUD app with a payment flow. Forty-seven. Each one had its own database, its own deployment pipeline, its own on-call rotation. When a customer placed an order, the request bounced through eleven services before a confirmation email went out. Latency was terrible, debugging was a nightmare, and nobody could explain why the “UserPreferences” service existed separately from the “UserProfile” service.

    Rust tutorial rust microservices architecture Created Sun, 01 Jun 2025 09:14:00 +0000
  • I made a rule for myself a few years ago: if I leave a code review comment about something a tool could have caught, I’ve wasted both the author’s time and mine. A linter can catch unused variables, missing error checks, shadowed variables, inefficient string concatenation, and dozens of other patterns automatically — in seconds, every commit, without reviewer fatigue. The code review should be about design and correctness, not about whether someone forgot to handle an error returned by rows.Close().

    Go tutorial golang code quality Created Sun, 01 Jun 2025 00:00:00 +0000
  • Channels get the spotlight in Go talks and blog posts — they’re the shiny, idiomatic, philosophically interesting tool. Mutexes feel like the C and Java baggage everyone was supposed to leave behind. But here’s what I’ve learned after several years of writing concurrent Go: mutexes are often the right tool, especially when you’re protecting shared state, and the problems you see in production are almost never “we should’ve used channels” — they’re “we copied the mutex” or “we forgot to narrow the critical section.” Learn to use mutexes properly and stop apologizing for them.

    Go tutorial golang concurrency Created Sat, 31 May 2025 00:00:00 +0000
  • Picture this: your payment service depends on a fraud detection API that’s completely down. Every request to it takes 30 seconds to timeout. Your payment service has 200 requests queued up, each holding a thread and a database connection while waiting for fraud detection to respond. Within minutes, you’re out of connections, the payment service itself starts failing, and now the checkout service that depends on payments starts failing too. One dead service has cascaded into a full outage.

    Rust tutorial rust networking distributed-systems Created Thu, 29 May 2025 07:35:00 +0000
  • Here’s a scenario that’s burned me more than once: a downstream service has a brief hiccup — maybe a pod is restarting, maybe there’s a momentary network partition — and instead of gracefully retrying, my service immediately returns a 500 to every caller. The hiccup lasts 3 seconds. My P99 latency graph spikes. On-call gets paged. Everyone’s unhappy. The fix? A retry loop with exponential backoff. Three lines of logic that would’ve made the entire incident invisible.

    Rust tutorial rust networking distributed-systems Created Mon, 26 May 2025 10:40:00 +0000