RSSAmplifier

Blog

Antman writes software

Former CTO of SKUTOPIA I write about Functional Programming, TypeScript, Node, Event Sourcing, and tech leadership. I also write at A Democratic Economy about t

antman-does-software.comRSS feed ↗20 posts

Latest posts

I Will Never Use AI to Code (or write)

This article was originally published on A Democratic Economy where are I write about an alternative way of doing business likely to result in a new economic paradigm and a better world. Language Warn

Coupling

Coupling is not intrinsically bad. Too little coupling makes systems brittle - changes have to be repeated in multiple places, system behaviour grows increasingly inconsistent, and finding 100% of the code that needs to be updated as part of a change...

Reliable HTTP: Outsmarting the Two Generals with Webhooks

The Two Generals Problem is a mathematical theorem proving that no messaging protocol can reliably ensure that two parties share the same state. However, some approaches guarantee that two distributed systems will follow an acceptable state progressi...

The Fundamental Problems of Software

As far as I can tell, there are six immutable fundamental problems faced by all commercial software. Identifying the correct problem to solve Getting the right specifications to solve the problem Distributing a shared understanding of the specific...

The Four Quadrants of Complexity

Essential complexity is where software engineers are uniquely able to deliver business value, whereas accidental complexity is what some engineers think looks good on their resumes. Another dimension, shown in the diagram below, is frequency. This ...

Implementing the Outbox Pattern in Nodejs and Postgres

As applications scale, infrequent problems become significant. A network failure for 0.1% of requests is trivial at 1,000 requests per day, but a nightmare for customer support at 1,000,000 requests per day. This commonly happens when we have externa...

Tech’s Surprisingly Bad Math in Team Design

How often have you seen this happen: The business is anxious that the product team is not kicking enough goals. They want better business outcomes faster, so they hire more software engineers. Makes sense at first glance, right? Engineers write the c...

Belonging & Psychological Safety in Remote Teams

Much of the existing literature regarding team culture assumes a co-located team. It’s not that hybrid or remote teams didn’t exist before the pandemic, but they certainly weren’t the norm. Existing studies consider facets such as desk position, buil...

Measuring Apdex from access logs in SumoLogic

Application Performance Index (Apdex) is a standardised method for calculating the perceived satisfaction of a user accessing your service. It divides all served requests into three categories: satisfied, tolerating, and frustrated. A user's request ...

Applying Google's Testing Methodology to Functional Domain-Driven Design For Scalable Testing

Recently I wrote an article about applying Functional Programming to Domain-Driven Design. One of the key benefits of that approach is improved testability, but we didn't get to delve into it too deeply. In this article, we will consider what factor...

Functional Domain Driven Design: Simplified

Domain-Driven Design (DDD) simplifies the development and maintenance of complex software applications. However, two seminal books on the topic, Domain-Driven Design and Domain-Driven Design Distilled focus on an object-oriented implementation. How c...

Are you using map, forEach, and reduce wrong?

In JavaScript, Array.prototype.map, Array.prototype.forEach, and Array.prototype.reduce are used heavily in functional-style programming. However, I meet many developers missing a clear mental model of when or how to use each function. This is a prob...

Your Microservices Are Slowing You Down, could Domain Services Boost Productivity?

The benefits of a Microservices Architecture are well known; they reduce coupling, allow independent deployments, and increase the rate of change in our applications, making product managers love us, finance teams applaud us, and CEOs offer us big bo...

Deliver a Meaningful Tech Strategy While Still Shipping Features with The Three Stream Backlog

It's a story as old as time, boy meets girl, girl falls in love with incomprehensible eldritch horror — oh wait no, sorry wrong story, this one is about TECH DEBT! In this painfully familiar story, before every other sprint, stakeholders in the busi...

Stop catching errors in TypeScript; Use the Either type to make your code predictable

In some languages such as Java, methods or functions can provide type information about the Exceptions or Errors they may throw. However in TypeScript, it is not possible to know what Errors a function may throw. In fact, a function could throw any v...

Strict & Weak Exhaustive Checks in TypeScript: Nuke your app at runtime for fun and profit!

This article assumes you are familiar with the never type, exhaustive checks, and the concept of failing fast. If you aren't yet, or want a refresher, here are some resources to get up to speed: When to use never and unknown in TypeScript The power ...

Dev Flags: Supercharge your Continuous Deployment by Dropping Database Feature Toggles

Those of us who use Trunk Based Development as the foundation of our approach to Continuous Delivery or continuous Deployment are familiar with the use of Feature Toggles to prevent work in progress changes becoming prematurely available to cus...

Sagas & Event Sourcing

By removing the constraint of atomicity for a transaction, we can break up a long lived transaction T into several transactions: \(T_{1},T_{2},T_{3},T_{n}\) In order to maintain consistency, we must also provide compensatory transactions for failure ...

Functional Singletons in TypeScript With Real Use Cases

Singletons are commonly used in Object Oriented Programming when we want to enforce that there is only ever a single instance of a class. This might be because we are trying to encapsulate some global state between processes. In this article, I will ...

Why You Will Never Write Another "Down" Migration

If you've used frameworks like Rails, Django, or even Hasura, you are probably familiar with the concept of "up" migrations and "down" migrations. These might also be called forwards and backwards, or in flyway they are called "undo" migrations. For ...