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