-
Smash the Test Pyramid!
For many years, the Test Pyramid was (still is?) the de-facto model for formulating the testing strategy for your software system. But it’s not perfect, and if you are focused…
-
Machine Learning for Programmers – Part 1 – The Fundamentals
Machine Learning and AI can be a daunting domain. There is a lot of advanced math, new technical terms, and low level hardware that a typical programmer may not be…
-
Observability, Testability, and Encapsulation – Opposing Tensions Shape Good Design
There is so much to learn to become a good software developer. Once you get past the technical hurdle of mastering all the tools, frameworks, and languages you need to…
-
Building a Multiplayer Gaming System – Part 3 – Establishing the Context
Welcome to Part 3 of the series! In Part 2 we discussed the process we’re going to use to design our system. Now we’re going to use that process to…
-
Building a Multiplayer Gaming System – Part 2 – Design Process
Welcome to Part 2! In Part 1, we laid out some of the high level components of the system and established that we are going to build the system with…
-
Building a Multiplayer Gaming System – Part 1 – Introduction
Greetings! Welcome to Part 1 of Building a Multiplayer Gaming System. Throughout this series we are going to design a system that supports a turn-based 1v1 multiplayer gaming experience from…
-
Two Kinds of Learning in Turn-Based Game AI
AI is all the rage, and for some folks, it’s just magic. Well, it’s not magic. It’s an algorithmic system based on combining decision models with data analysis. We’re going…
-
Natural Language is a Bad Way to Communicate
There is a general push in the software industry towards using more natural language. Generative AI tools allow people to build software using natural language. Behavior Driven Development methodologies use…
-
Building an Interactive Generative AI for Music in TypeScript – Part 1
Have you ever wanted to listen to some music but couldn’t quite find what you wanted? Or have you ever wanted to make some music, but you aren’t a trained…
-
Building a 1v1 Game Matchmaking Service in Go – Part 3
This article is part 3 of a series. Part 1 – Domain ModelingPart 2 – Turning Domain Model into Code The associated code repo is here. Deployment At the end of…
-
Building a 1v1 Game Matchmaking Service in Go – Part 2
This article is part 2 of a series. Part 1 – Domain Modeling The associated code repo is here. Turning the Domain Model into Code In Part 1, we modeled…
-
Building a 1v1 Game Matchmaking Service in Go
This article is Part 1 of a series. Part 2 – Turning the Domain Model into Code A 1v1 Game Matchmaking Service is a service that pairs up opponents for…
-
How AI will change Software Development
Lessons from Mathematical Optimization – the basis for current AI Machine Learning and many parts of current ‘AI’ systems are built on top of the field of Mathematical Optimization. There…
-
Taming Concurrent Code – State Transitions vs Flows
Concurrent code is everywhere. Anytime you have multiple operations that can take a little time and happen simultaneously, you’ve got concurrent code. If you are reading and writing files, interacting…
-
The Duality of State and Events
Duality has different meanings in different domains, but the essential idea is that of ‘two sides of the same coin’. There is one object, or one entity, and there are…
-
Functional Core, Imperative Shell implemented with Finite State Transducers
In a previous article we looked at Finite State Transducers (FSTs). To quickly recap, a Finite State Transducer is a type of Finite State Machine that also produces output. This…
-
Thinking in Finite State Transducers to Enhance Precision
What is a Finite State Transducer? Your first guess might be that its an essential component of a car-based time machine, like a flux capacitor. It isn’t, but believe it…
-
Using Queueing Theory to Build Better Software Systems
Here’s a fun question you can use at parties: Can you think of a word with 5 consecutive vowels? If you have really interesting friends, you might get some exotic…