Step Into Dev
  • Posts
  • About

Posts

ai software-engineering philosophy hot-takes

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 …

January 13, 2026 · 5 min read
go dotnet retrospective career csharp

Six Months In: Was It Worth It?

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 …

June 28, 2025 · 5 min read
go dotnet reflection csharp

What I'll Never Go Back For

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 …

February 1, 2025 · 4 min read
go dotnet reflection csharp

What I Actually Miss From C#

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#. …

January 15, 2025 · 4 min read
go dotnet aws lambda serverless csharp

AWS Lambda and Go: Cold Starts That Don't Hurt

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 …

January 5, 2025 · 3 min read
go dotnet docker containers csharp

Dockerfile for Go: Simpler Than You'd Think

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 …

January 5, 2025 · 4 min read
go dotnet ci-cd github-actions csharp

GitHub Actions for Go Projects

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 …

January 5, 2025 · 4 min read
go dotnet health-checks kubernetes csharp

Health Checks and Readiness Probes

We touched on health checks in the Kubernetes post. Let’s go deeper—proper health checks that actually tell orchestrators useful information. The Three …

January 5, 2025 · 4 min read
go dotnet kubernetes containers csharp

Kubernetes and Go: A Natural Fit

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 …

January 5, 2025 · 5 min read
go dotnet observability opentelemetry csharp

Metrics, Traces, and Logs: The OpenTelemetry Way

Observability in production means three things: metrics (what’s happening), traces (how requests flow), and logs (what went wrong). OpenTelemetry unifies …

January 5, 2025 · 4 min read
go dotnet deployment build-tags csharp

Shrinking Binaries and Build Tags

Go binaries are already small compared to .NET self-contained deployments. But sometimes you want smaller—for Lambda deployments, embedded systems, or just …

January 5, 2025 · 4 min read
go dotnet deployment cross-compilation csharp

Single Binary Deploys: The Killer Feature

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 …

January 5, 2025 · 4 min read
go dotnet versioning modules csharp

Versioning Your Modules

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 …

January 5, 2025 · 4 min read
go dotnet configuration csharp

Configuration Without IOptions<T>

In ASP.NET Core, configuration is a whole subsystem. IConfiguration, IOptions<T>, IOptionsSnapshot<T>, IOptionsMonitor<T>, multiple providers, …

January 4, 2025 · 5 min read
go dotnet database sql csharp

Database Access: database/sql vs Entity Framework

Entity Framework is an ORM. It maps objects to tables, generates SQL, tracks changes, handles migrations. You can build entire applications barely writing SQL. …

January 4, 2025 · 5 min read
go dotnet tooling debugging csharp

Debugging: Delve vs Visual Studio's Comfort

Visual Studio’s debugger is exceptional. Breakpoints, watch expressions, edit-and-continue, conditional breakpoints, data tips, memory inspection, async …

January 4, 2025 · 4 min read
go dotnet tooling codegen csharp

Generate All the Things

Go developers love code generation. Where C# uses reflection, attributes, and source generators, Go often uses tools that generate code before compilation. This …

January 4, 2025 · 4 min read
go dotnet database orm gorm csharp

GORM and Friends: When You Do Want an ORM

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 …

January 4, 2025 · 4 min read
go dotnet http web csharp

HTTP Services: net/http vs ASP.NET Core

ASP.NET Core is a sophisticated web framework. Dependency injection, middleware pipelines, model binding, routing with attributes, OpenAPI generation… it …

January 4, 2025 · 5 min read
go dotnet json serialization csharp

JSON: Struct Tags and the Marshal Dance

In C#, you add [JsonProperty("name")] or rely on naming conventions. The serializer figures out the rest. Newtonsoft.Json has been battle-tested for …

January 4, 2025 · 4 min read
go dotnet tooling linting csharp

Linting and Formatting: gofmt Is Non-Negotiable

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 …

January 4, 2025 · 4 min read
go dotnet logging slog csharp

Logging: slog and the Structured Logging Story

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 …

January 4, 2025 · 3 min read
go dotnet testing performance benchmarks csharp

Benchmarks and Profiling Out of the Box

Here’s something that surprised me: Go has built-in benchmarking. No BenchmarkDotNet to install. No configuration. Write a function, run go test -bench, …

January 3, 2025 · 5 min read
go dotnet testing mocking csharp

Mocking in a Language Without Mockito

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 …

January 3, 2025 · 5 min read
go dotnet modules monorepo csharp

Multi-Module Repos: Monorepo Thinking

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, …

January 3, 2025 · 4 min read
go dotnet project-structure packages csharp

Organising a Real Project

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 …

January 3, 2025 · 6 min read
go dotnet testing csharp

Testing Without a Framework

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. …

January 3, 2025 · 5 min read
go dotnet composition embedding csharp

Composition Over Inheritance (For Real This Time)

We’ve all heard “favour composition over inheritance.” We’ve all nodded sagely. And then we’ve all written class hierarchies three …

January 2, 2025 · 6 min read
go dotnet interfaces csharp

Implicit Interfaces: Scary Then Brilliant

Here’s a sentence that’ll make every C# developer uncomfortable: Go interfaces don’t require an implements keyword. You never explicitly …

January 2, 2025 · 6 min read
go dotnet interfaces any csharp

The Empty Interface and Type Assertions

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 …

January 2, 2025 · 6 min read
go dotnet concurrency async csharp

Async/Await vs Goroutines: A Mindset Shift

Here’s the thing about Go’s concurrency model: it’s going to feel backwards. You’ve spent years learning that async operations need …

January 1, 2025 · 6 min read
go dotnet concurrency channels csharp

Channels: The sync You Didn't Know You Wanted

If goroutines are Go’s lightweight threads, channels are how they talk to each other. Think BlockingCollection<T> meets message passing, with …

January 1, 2025 · 5 min read
go dotnet concurrency context csharp

Context Is King

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 …

January 1, 2025 · 5 min read
go dotnet concurrency sync csharp

Mutexes and WaitGroups: When Channels Aren't the 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 …

January 1, 2025 · 5 min read
go dotnet concurrency channels csharp

select: Multiplexing Like a Pro

The select statement is where Go’s channel system goes from “neat” to “powerful.” It lets you wait on multiple channel operations …

January 1, 2025 · 5 min read
go dotnet memory pointers csharp

Pointers Without the Pain

Right, let’s talk about pointers. If you’ve spent your career in C#, you’ve probably used pointers approximately never. Maybe you’ve …

December 31, 2024 · 7 min read
go dotnet memory slices csharp

Slices Are Not Arrays (And Neither Is List<T>)

Every C# developer coming to Go makes the same mistake: they see []int and think “array” or “list.” It’s neither. It’s a …

December 31, 2024 · 6 min read
go dotnet memory performance csharp

Stack vs Heap: Go's Escape Analysis

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 …

December 31, 2024 · 6 min read
go dotnet errors csharp

if err != nil: Your New Reality

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, …

December 30, 2024 · 6 min read
go dotnet errors csharp

Panic and Recover: The Emergency Exit

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. …

December 30, 2024 · 5 min read
go dotnet control-flow csharp

The switch Statement You Always Wanted

C#’s switch statement has evolved a lot over the years. Pattern matching, switch expressions, when guards—it’s become genuinely powerful. But …

December 30, 2024 · 6 min read
go dotnet generics csharp

Generics: Late to the Party

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 …

December 29, 2024 · 6 min read
go dotnet enums csharp

No Enums? No Problem (Sort Of)

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 …

December 29, 2024 · 6 min read
go dotnet nil csharp

The Million Dollar Mistake, Differently

Tony Hoare called null references his “billion dollar mistake.” Both C# and Go inherited some form of this mistake, but they’ve evolved to …

December 29, 2024 · 6 min read
go dotnet types csharp

Where Did My Properties Go?

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 …

December 29, 2024 · 6 min read
go dotnet types csharp

Your Class Is Now a Struct (And That's Fine)

Here’s something that’ll feel wrong for about a week: Go doesn’t have classes. Not “Go has classes but calls them something …

December 29, 2024 · 6 min read
go dotnet dependencies csharp

Goodbye .csproj, Hello go.mod

Right, let’s talk about dependencies. In .NET land, we’ve got NuGet, .csproj files, PackageReference elements, version ranges, transitive …

December 28, 2024 · 6 min read
go dotnet syntax csharp

The Phrasebook: C# Concepts in Go Terms

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 …

December 28, 2024 · 8 min read
go dotnet tooling csharp

You Know .NET, Now Meet the Go Toolchain

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 …

December 28, 2024 · 6 min read
llm ai typescript streaming

Streaming LLM Responses: A Partial JSON Parser for Structured Output

I’ve been building conversational AI features recently, and I hit an annoying problem: I want structured responses from the LLM (JSON with specific …

December 11, 2024 · 6 min read
ai privacy gdpr llm architecture

The Conversational Consent Pattern: Privacy That Actually Respects Your Users

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 …

December 11, 2024 · 7 min read
react-native ios expo worklets reanimated filament debugging

The Force-Quit Crash: When Worklets Outlive Your App

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 …

December 7, 2024 · 9 min read
ai expo react-native android business

Seven Dollars and Twenty-Five Years: Building an Expo Plugin with AI

I’m building an AI training tool for small language models that ultimately deploys on mobile. Nothing revolutionary there—it’s a natural endpoint …

December 3, 2024 · 5 min read
mcp ai python gis

Building 3D Scenes Through Conversation: An MCP Server for Geographic Objects

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 …

December 2, 2024 · 5 min read
mcp ai threejs webgl python

Rendering Conversational 3D Scenes with Three.js and MCP

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.” …

December 2, 2024 · 13 min read
react-native ios 3d filament debugging

The Invisible Models: Debugging 3D Rendering on iOS Physical Devices

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 …

November 30, 2024 · 5 min read
  • ««
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
  • »»

Stay Updated

Get notified about new posts on AI, MCP development, and building things that matter.

© 2026 Step Into Dev · Powered by Hugo