There Are No Emotions in Runtime Software
I read a piece this morning arguing that you shouldn’t trust software you didn’t “suffer” for. The premise being that personal …
I read a piece this morning arguing that you shouldn’t trust software you didn’t “suffer” for. The premise being that personal …
Six months ago, I started this series with a simple goal: document learning Go as an experienced C# developer. Not a tutorial—there are plenty of those—but an …
Last time I talked about what I miss from C#. Now let’s flip it: what has Go given me that I’d genuinely struggle to give up? Some of these I …
I’ve been writing Go full-time for a couple of months now. I like it. I’m productive. But let’s be honest: there are things I miss from C#. …
If you’ve run .NET on Lambda, you know the cold start pain. 3-5 seconds for a managed runtime. Even Native AOT helps but doesn’t eliminate it. Go on …
Go’s static binaries make for tiny Docker images. Where a .NET container might be 200MB+, a Go container can be under 20MB. Sometimes under 10MB. This …
CI/CD for Go projects is refreshingly simple. Fast builds, built-in testing, cross-compilation—everything you need is in the standard toolchain. Let’s set …
We touched on health checks in the Kubernetes post. Let’s go deeper—proper health checks that actually tell orchestrators useful information. The Three …
Kubernetes is written in Go. The CLI tools are Go. The ecosystem is Go. Running Go services on Kubernetes feels natural—the patterns align. But there are things …
Observability in production means three things: metrics (what’s happening), traces (how requests flow), and logs (what went wrong). OpenTelemetry unifies …
Go binaries are already small compared to .NET self-contained deployments. But sometimes you want smaller—for Lambda deployments, embedded systems, or just …
Here’s the thing that sold me on Go for production: you build a binary, you copy it to a server, you run it. No runtime to install. No framework version …
Versioning in Go is simple in concept—semantic versioning with git tags—but has quirks that’ll catch you if you’re coming from NuGet’s more …
In ASP.NET Core, configuration is a whole subsystem. IConfiguration, IOptions<T>, IOptionsSnapshot<T>, IOptionsMonitor<T>, multiple providers, …
Entity Framework is an ORM. It maps objects to tables, generates SQL, tracks changes, handles migrations. You can build entire applications barely writing SQL. …
Visual Studio’s debugger is exceptional. Breakpoints, watch expressions, edit-and-continue, conditional breakpoints, data tips, memory inspection, async …
Go developers love code generation. Where C# uses reflection, attributes, and source generators, Go often uses tools that generate code before compilation. This …
Despite Go’s “just write SQL” culture, ORMs exist and are popular. GORM is the most widely used. If you’re coming from Entity Framework …
ASP.NET Core is a sophisticated web framework. Dependency injection, middleware pipelines, model binding, routing with attributes, OpenAPI generation… it …
In C#, you add [JsonProperty("name")] or rely on naming conventions. The serializer figures out the rest. Newtonsoft.Json has been battle-tested for …
In C#, code formatting is a matter of preference. Tabs or spaces? Braces on the same line or next? Teams debate, .editorconfig files proliferate, and nobody …
For years, Go’s logging story was “use the log package or pick a third-party library.” The standard log package is basic—no levels, no …
Here’s something that surprised me: Go has built-in benchmarking. No BenchmarkDotNet to install. No configuration. Write a function, run go test -bench, …
In C#, you reach for Moq or NSubstitute without thinking. Interface? Mock it. Verify calls? Easy. Set up return values? One line. Go doesn’t have a …
Most Go projects have one go.mod file at the root. One module, one version, simple. But what happens when your repo grows? When you have shared libraries, …
So you’ve got the basics. You can write Go code. Now you need to organise it into something that won’t become a tangled mess in six months. Go has …
In C#, you pick a test framework: xUnit, NUnit, MSTest. You install packages. You learn attributes. You configure test runners. In Go, you run go test. …
We’ve all heard “favour composition over inheritance.” We’ve all nodded sagely. And then we’ve all written class hierarchies three …
Here’s a sentence that’ll make every C# developer uncomfortable: Go interfaces don’t require an implements keyword. You never explicitly …
Go has a type called any. Before Go 1.18, it was written interface{}. Same thing, nicer name. And it’s basically Go’s version of object—the type …
Here’s the thing about Go’s concurrency model: it’s going to feel backwards. You’ve spent years learning that async operations need …
If goroutines are Go’s lightweight threads, channels are how they talk to each other. Think BlockingCollection<T> meets message passing, with …
Every Go function that does I/O, might take a while, or should be cancellable will take a context.Context as its first parameter. It’s Go’s answer …
Go’s mantra is “share memory by communicating,” but sometimes you just need a bloody mutex. The sync package has all the primitives you know …
The select statement is where Go’s channel system goes from “neat” to “powerful.” It lets you wait on multiple channel operations …
Right, let’s talk about pointers. If you’ve spent your career in C#, you’ve probably used pointers approximately never. Maybe you’ve …
Every C# developer coming to Go makes the same mistake: they see []int and think “array” or “list.” It’s neither. It’s a …
In C#, you mostly don’t think about where variables live. Value types go on the stack (usually). Reference types go on the heap (always). The runtime and …
Let’s address the elephant in the room. You’re going to write if err != nil hundreds of times. Thousands, probably. And for the first week, …
So Go doesn’t have exceptions. Except… it kind of does. They’re called panic and recover, and they work almost exactly like throw and catch. …
C#’s switch statement has evolved a lot over the years. Pattern matching, switch expressions, when guards—it’s become genuinely powerful. But …
Go shipped generics in version 1.18 (March 2022). C# has had them since 2.0 (November 2005). That’s a seventeen-year head start, and it shows. If …
Go doesn’t have enums. Not “Go has something enum-like”—it genuinely doesn’t have a dedicated enum construct. What it has instead is …
Tony Hoare called null references his “billion dollar mistake.” Both C# and Go inherited some form of this mistake, but they’ve evolved to …
Coming from C#, one of the first things you’ll notice is that Go structs look… naked. Where are the { get; set; } blocks? Where’s private and …
Here’s something that’ll feel wrong for about a week: Go doesn’t have classes. Not “Go has classes but calls them something …
Right, let’s talk about dependencies. In .NET land, we’ve got NuGet, .csproj files, PackageReference elements, version ranges, transitive …
Before we get into the weeds of types and patterns, let’s establish some vocabulary. Go uses different names for familiar concepts, and has operators …
After twenty-odd years writing C#, I’m learning Go. Not because .NET has failed me—it hasn’t—but because some problems want a different shape of …
I’ve been building conversational AI features recently, and I hit an annoying problem: I want structured responses from the LLM (JSON with specific …
I’ve been thinking a lot about privacy consent lately. Not the legal side—though that matters—but the experience side. The way we currently handle consent …
Got a crash report from TestFlight this week. The user’s feedback was two words: “Hard exit.” That’s all I had to go on. No steps to …
I’m building an AI training tool for small language models that ultimately deploys on mobile. Nothing revolutionary there—it’s a natural endpoint …
I’ve been noodling around with the Model Context Protocol lately, and I wanted to share something I’ve built that demonstrates what I think is a …
In my previous post, I promised that the scene data was portable—that you could feed it to “a game engine, a GIS tool, a mapping API, whatever.” …
I spent the better part of a day staring at a blank screen on an iPhone 11. The 3D scene worked perfectly on the iOS Simulator. It worked on Android. But on an …