What It Actually Takes to Fine-Tune an LLM in Europe
This series has so far dealt with deployment. Where to host models, how to wrap them in compliance logic, which providers can serve inference, and how to verify …
This series has so far dealt with deployment. Where to host models, how to wrap them in compliance logic, which providers can serve inference, and how to verify …
This is the fourth post in a series on European AI sovereignty. I have covered why jurisdiction matters, how to handle UK-EU regulatory divergence in code, and …
I wrote previously about why jurisdiction matters for European AI platforms and then about how to handle the UK-EU compliance split in code. Those posts covered …
I wrote recently about building AI platforms under European sovereignty constraints. That post treated “Europe” as broadly singular. The reality is …
The Problem Is Not Capability# The debate over European AI often begins in the wrong place. It starts with benchmarks, parameter counts, and the gap between …
I read a piece this morning arguing that you shouldn’t trust software you didn’t “suffer” for. The premise being that personal struggle …
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 properly 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 …
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 …
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: Lambda deployments, embedded systems, or just …
What 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 matching. No dependency …
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 …
Go’s concurrency model is going to feel backwards. You’ve spent years learning that async operations need async keywords, await expressions, …
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 else”. …
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 …
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 …