ACCU World of Code
-
AI or not AI: you still need to test
Grok demonstrates AI systems need testing: testing is only going to become more important in the AI age
-
Distribution of small project completion times
Records of project estimates and actual task times show that round numbers are very common. Various possible reasons have been suggested for why actual times are often reported as a round number. This post analyses the impact of round number reports of actual times on the accuracy of estimates. The plot below shows the number…
-
Building Services That Scale
Building Services That ScalePart 2 of Beyond the Code: Designing Services That Stand the Test of Time When we hear the word service, it sounds simple, almost obvious. In practice, defining what a service is can be surprisingly nuanced….
-
Modelling time to next reported fault
After the arrival of a fault report for a program, what is the expected elapsed time until the next fault report arrives (assuming that the report relates to a coding mistake and is not a request for enhancement or something the user did wrong, and the number of active users remains the same and the…
-
Rational irrationality and anarchy in the workplace
Our mental models need updating. In a garbage can world rational thinking might be making things worse, the only repeatable method is in the rear view mirror.
-
One Simple Habit That Builds Trust in Teams
One of the most powerful things you can do as a leader is to talk to your team every day. It sounds simple, but it’s often overlooked, especially in distributed teams. Daily conversations help build and maintain relationships, foster trust, and remind …
-
My 2025 in software engineering
Unrelenting talk of LLMs now infests all the software ecosystems I frequent. Almost all the papers published (week) daily on the Software Engineering arXiv have an LLM themed title. Way back when I read these LLM papers, they seemed to be more concerned with doing interesting things with LLMs than doing software engineering research. Predictions…
-
ACCU Oxford – 4 February ’26: Beyond the Code: Designing Services That Stand the Test of Time
Beyond the Code: Designing Services That Stand the Test of Time Wednesday, 4th February 2026 St Aldates Tavern, 108 Saint Aldate’s, Oxford @ 6pm RSVP As software engineers, it’s easy to get lost in the exciteme…
-
Programming Punched card machines
Punched card machines, or Tabulating machines, or Unit Record equipment, or according to a 1931 article Super Computing machines, were electromechanical devices that summarised information contained on punched cards (aka tabulating cards). These machines date from 1884, with the publication of Herman Hollerith’s patent application 18840923. In 1948 the electronic valve based IBM 603 calculating…
-
Why Irrational Ideas Often Win in Marketing
This book was recommended to me by a designer I work with and we’re still friends, so it’s not a bad recommendation!I found many of the ideas fascinating, especially the story of how Red Bull was conceived and marketed. At first glance, some of these c…
-
[Video] From Zero to Deployed: Building & Shipping an AWS Lambda
On the 5th November this year (2025) I had the pleasure of speaking about deploying Lambdas at ACCU York. They were a fantastic group of engineers. I had a fantastic time and they shot this video of me. From Zero to Deployed: Building and Shi…
-
Why I don’t use AI
(Balaam, A.J. (2025). In F. Buontempo, editor, Overload 190 (2025).) I choose to avoid using “AI” (by which I mean Large Language Models1). Here’s why: they have a devastating environmental impact, they are trained by exploiting and traumatising milli…
-
Review of Halcyon Years by Alastair Reynolds
Alastair Reynolds has long been my favorite author, but this latest book feels like he’s not even trying. Once again, the story revolves around a character who has lost their memory, a trope that’s starting to feel overused. What’s missing is the rich,…
-
Naming convergence in a network of pairwise interactions
While naming and categorizing things are perhaps the two most contentious issues in software engineering, there is often a great deal of similarity in the names and categorizes used by unconnected groups. These characteristics of naming and categorization are general observed behaviors across cultures and languages, with software engineering being a particular example. Studies have…
-
OUT NOW: ‘So you think you can lead a team?’
A Series of Random Context Switches So You Think You Can Lead A Team? is a firsthand look into what team leadership means. Bringing real world examples into everyday workplace situations, So You Think… offers practical advice and support for those…
-
Context! Context! Context! Part 1 of Beyond the Code: Designing Services That Stand the Test of Time
As software engineers, it’s easy to get lost in the excitement of crafting clever business logic: the algorithms, the workflows, the elegant domain models. However, the success or failure of a service rarely hinges on its core logic alone. What really …
-
Converting a string to an int in Rust (for no reason)
How about a little light relief? Let’s convert a string to an int in Rust. Follow me on mastodon: @andybalaam@mastodon.social
-
Why I don’t use AI (expanded)
Soon after I wrote Why I don’t use AI, I researched and submitted a significantly longer version to ACCU’s Overload journal. It has now been published! You can read it here: Why I don’t use AI (Overload). It contains references to a lot more sources, a…
-
Why do we have runaway WIP?
Can’t decide, optimism, too interesting, yes not no – some of the reasons behind runaway WIP
-
Resizing and moving an encrypted LVM volume
I use a LUKS-encrypted LVM setup for my laptop. Within the encrypted volume I have partitions for / and /home and I guessed the sizes wrong, so I needed to change them. I did various reading, and even resized some filesystems and partitions, before I d…
-
Christmas books for 2025
My rate of book reading has remained steady this year, however, my ability to buy really interesting books has declined. Consequently, the list of honourable mentions is longer than the main list. Hopefully my luck/skill will improve next year. As is usually the case, most book were not published in this year. Liberal Fascism: The…
-
Evolving Agile: the motion picture
Video blog describing the Agile Evolution and my own journey from Xanpan to Objective Driven
-
Lifetime of coding mistakes in the Linux kernel
What is the lifetime of coding mistakes in the Linux kernel? Some coding mistakes result in fault reports (some of which are fixed), while many are removed when the source that contains them is deleted/changed during ongoing development. After fixing the coding mistake(s) in the kernel that generated a reported fault, developer(s) log the commit…
-
Implementing FizzBuzz in Rust (for no reason)
Things getting you down? Let’s implement FizzBuzz. It should be low stress because it’s not a difficult task, but maybe we can think about some nice ways to make it work. Follow me on mastodon: @andybalaam@mastodon.social
-
A review of The Butlerian Jihad
The Butlerian Jihad is a middle of the road science fiction story. It lacks the gravitas of Frank Herbert’s original Dune series. The story is different in scope and style, and some of the elements, particularly the intelligent, emotionally curious rob…
-
Agile: not Dead, but evolving
Head on: is agile dead? No, it is everywhere. But the mania is over. Agile won’t return, but the ideas in it will.
-
Decline in downloads of once popular packages
What happens to the popularity of Open source packages, measured in monthly downloads, once they cease to be updated or attract new users? If the software does not have any competition within its domain, there is no reason why its popularity should decline. In practice, there are usually alternative packages offering the same or similar…
-
Occurrence of binary operator overloading in C++
Operator overloading, like many programming language constructs, was first supported in the 1960s (Algol 68 also provided a means to specify a precedence for the operator). C++ is perhaps the most widely used language supporting operator overloading; but not redefining their precedence. I have always thought that operator overloading was more talked about than actually…
-
ACCU Cambridge: ‘So you think you can lead a team?’ and From Zero to Deployed – Double Header (December 2025)
When: Wednesday 3rd December 2025 @ 6pmWhere: The Bradfield Centre, 184 Cambridge Science Park Milton Road, CB4 0GARSVP: https://www.meetup.com/accu-cambridge/events/311991390/ACCU Cambridge are making the most of me in December and letting …
-
Reversing a string in Rust (for no reason)
Feeling slightly exhausted by the world? Let’s reverse a string in Rust in a needlessly complicated way. I was expecting to make a tiny simple video and ended up going further into unsafe than I ever have before, which was an unexpected treat. Let me k…
-
Listen to my Top-5 intriguing tips for using OKRs
Top-5 tips for working with OKRs – podcast interview
-
Fifth anniversary of Evidence-based Software Engineering book
Yesterday was the 5th anniversary of the publication of my book Evidence-based Software Engineering. The general research trajectory I was expecting in the 2020s (e.g., more sophisticated statistical analysis and more evidence based studies) has been derailed by the arrival of LLMs three years ago. Almost all software engineering researchers have jumped on the LLM…
-
What a night at ACCU York!
This evening, I had the pleasure of speaking at ACCU York about lambdas, and what an incredible audience they were. Warm, welcoming, and fully engaged from start to finish.I was enjoying it so much that my 45-minute talk somehow turned into 75 minutes!…
-
6 ways my OKRs are different
To some OKRs are an evil management enforcement technique. They aren’t. Here are 6 ways I see OKRs driving change and improvement.
-
A Review: Unlearning Masculinity by Cassandra Andrews
Unlearning Masculinity by Cassandra Andrews, is a powerful and thought-provoking read.Full disclosure:I know the author personally. I found the book both useful and genuinely interesting. I only partially overlap with the target audience, as I haven’t …
-
Best tool for measuring lots of source code
Human written source code contains various common usage patterns. This blog has analysed a variety of these patterns, and in a few cases built models of processes that replicate these patterns. The data for this analysis has primarily comes from programs written in C and Java, because these are the languages that researchers most often…
-
A prvalue is not a temporary
This is part one of a series of blog posts on temporaries, copies, return value optimization, and passing by value vs. reference. A good place to start, and the point of this first article, is how a prvalue isn’t necessarily a temporary. If you’re entirely new to value categories (lvalues, rvalues etc.), you might want…
-
What I’ve been getting wrong about PDCA
The 4 steps of the PDCA cycle are not equal, the fourth step might be the shortest, and it might be the most overlooked, but it is the most important.
-
Distribution of method chains in Java and Python
Some languages support three different ways of organizing a sequence of functions/methods, with calls taking as their first argument the value returned by the immediately prior call. For instance, Java supports the following possibilities: r1=f1(val); r2=f2(r1); r3=f3(r2); // Sequential calls r3=f3(f2(f1(val))); // Nested calls, read right to left r3=val.f1().f2().f3(); // Method chain, read left to…
-
Mini-rust in Rust 050: Parsing function definitions
To make real programs, we will need functions. We’ll start off by allowing you to define functions that take no arguments. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
If AI is the solution, what is the problem?
AI is actually 3 technologies and we need to keep asking “What is the problem?” before we jump to solutions
-
Why do I have 2 passwords? How to talk about encryption in Matrix
Most modern software applications give total trust to the service provider. End-to-end encrypted (E2EE) services are different: the service provider is a gateway, and the real trust is with other people. This is unfamiliar, and can make using E2EE con…
-
Invisible Crypto: can Matrix be both secure and easy to use?
The Invisible Crypto initiative intends to make Matrix easier to use by ensuring that encrypted messaging is secure by default, and the user is not bothered by irrelevant information. In this talk we will give a status update, hopefully explaining why…
-
Mini-rust in Rust 049: Lexing an empty function
The next big thing we need to be able to do is define functions. Let’s start by lexing the fn keyword and brackets: we’re going to need both of those. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworld…
-
Patterns for building a learning organization
Patterns for building a learning organization – download for free
-
A Review: Katy Perry at the O2 Arena
We took our youngest, Ed (14), to see Katy Perry last night, his first ever gig, and he absolutely loved it. Seeing his excitement made the whole evening worthwhile.Katy Perry is undeniably a talented singer and performer, but the relentless, thumping …
-
4 quick fixes to bring order out of choas
In which I discuss four quick fixes I use to bring order from chaos plus a couple which are slower
-
Mini-rust in Rust 048: Handling variable scope
Variables should be defined inside their curly braces and not elsewhere, and it should be fine to “shadow” variables by defining new ones inside a smaller scope. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at arti…
-
A Review: Ego is the Enemy by Ryan Holiday
I first spotted Ego Is the Enemy years ago, sticking out of someone’s bag in the kitchen of an office I rented back in the mid-teenies. The title caught my eye, so I bought the Kindle version there and then. It’s taken me until now to actually re…
-
Do software engineering professionals still read? – survey results
In order to gauge the potential audience for my book, So you think you can lead a team?, I conducted a small survey of my colleagues, co-workers and anyone from Linked. I read regularly, for work and pleasure, and assumed everyone else did too bu…
-
What makes Product Managers hetrogenous
Product Manager roles are hetrogenous. The corporate environment, product lifecycle stage and the supporting roles present are key driver of these differences.
-
A Review: It’s Hard to Tell You This by James Kinsley
Having previously read two of James Kinsley’s novels, I was surprised, and impressed, by It’s Hard to Tell You This. While I’ve always associated Kinsley with science fiction, this book takes a different direction, focusing instead on intimate human em…
-
Mini-rust in Rust 047: Updating types as we get more information
If we know that y is an f64, when we see x *= y, we can guess that x is an f64 too. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
A Review: Babylon’s Ashes by James S. A. Corey
It’s dull, which is a shame as Nemisis Games had picked up after Cibola Burn. There’s nothing new from the characters. No new characters of interest. What was an exciting sci-fi series in the beginning has turned into politics and war in spa…
-
Jez and Andy write a Parser
My friend Jez is back, and we make a start on a parser for the Cell language (in Rust, of course). You can find Jez at jezuk.co.uk and follow him at @jezhiggins@mastodon.me.uk. Soon after we finished recording, Jez reported to me that he’d got it pass…
-
Jez learns Rust by writing a Lexer
My friend Jez joins us and we talk about his new implementation of my Cell programming language in Rust, which is his first from-scratch Rust project. You can find Jez at jezuk.co.uk and follow him at @jezhiggins@mastodon.me.uk.
-
Mini-rust in Rust 046: Type-checking mutations
When we see x *= 1.3 we need to check that x is a float – otherwise this is a compile error. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
A Review: The Art of War (illustrated)
ISBN-13: 978-1773137735 I found Lionel Giles’ introduction very boring. In this edition, there are more of his notes than Sun Tzu’s actual text. I gave up on them early, as they didn’t add any value for me.The Art of War itself is 13 short…
-
Mini-rust in Rust 045: Combining two types when we add things
We had a weird hack in place to handle the type of an expression like x + 3 but now we can do better. Let’s do it! You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
Review: Rob Newman at the Norwich Playhouse
I went to see Rob Newman at the Playhouse in Norwich this evening, and he was every bit as brilliant as I’d hoped. At times he came across as a little nervous, but that vulnerability only made the performance feel more genuine and engaging.The Mary Whi…
-
Why I don’t use AI
I choose to avoid using “AI” (by which I mean Large Language Models). Here’s why: They have a devastating environmental impact. 1 2 They are trained by exploiting and traumatising millions of low-paid workers. 3 4 They produce biased and dangerously i…
-
Out of Order: Debugging a NetBSD virtio Hang
On a NetBSD 10.1 VPS I noticed that it would occasionally become somewhat unresponsive: it would still respond to pings, but any attempt to connect via SSH would just hang. Strangely, when logging in on the console, it would then continue as nothing ha…
-
Mini-rust in Rust 044: Finding the type of a symbol
If we write let x: i32 = 3; then we should know that x is an i32, right? Let’s make it so! You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
A Review: Foundation’s Edge
Isaac Asimov ISBN-13: 978-0007381159 Although the original Foundation trilogy (1950s) laid the groundwork for Asimov’s universe, I’ve always found it rather bland. When Asimov returned to the series in the 1980s with Foundation’s Edge, the le…
-
Mini-rust in Rust 043: Expressions on the left of operators
The final (for now) side mission before we get back onto type-checking variables: allowing complex expressions to exist before operators. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
Introducing C++: what it will cover
As some of you may know, I’m writing a new book, this time for O’Reilly called “Introducing C++”. You can see it on the O’Reilly platform and leave comments: you can get a short free trial if you haven’t paid for access. Cover picture o…
-
Mini-rust in Rust 042: An unexpected token means stop this expression
We’re on our way towards type-checking variables, but first we take another detour into parsing expressions: if we hit an unexpected token, we should backtrack and return what we found so far, not just stop with an error. You can find the source code …
-
A Brief History of Catch(2)
Prehistory In the middle of 2010 I started working on a little side project. It was originally meant to be a test framework for Objective-C (I wasn’t happy with OCUnit, at the time, and I didn’t find any other options). But the framework was written …
-
A Review: The 7 Habits of Highly Effective People
By Steve R. CoveyISBN-13: 978-1471195204 This book was recommended to me years ago when I was running my own business, but I only picked it up recently. I wish I’d read it back then, it would have been even more useful.I was expecting the habits t…
-
Mini-rust in Rust 041: While conditions that are not operations
We are starting down a road towards type checking variables, but we go on a detour to make sure we can parse the simplest possible condition in a while loop, which it turns out we missed. You can find the source code at codeberg.org/andybalaam/milk an…
-
C++ on Sea 2025 trip report
I’m writing this up a while after the event, because life got in the way. I hosted the lightning talks again, which distracted me for some parts of the first two days. I also gave a talk on the first day. The third day allowed me to just sit back and l…
-
Mini-rust in Rust 040: While conditions should be bool
Working up towards some difficult type-checking, we do some easy type-checking: the condition part of a while condition should be a boolean, and to get there we need to improve the type we give to the result of an operation. You can find the source co…
-
Doing the work isn’t the only way to add value
So you think you can lead a team?I’ve been talking and writing a lot about leading a software engineering team in 2025. I started thinking about it more deeply the year before when I decided to give a colleague, who was moving into team leading, …
-
Turning it off and on again
You probably shouldn’t read this post. It breaks several of the top rules in blog post content authorship: apologising for not posting in a while, explaining why, and promising to post more in the future. So if that sounds dull, you can (and should)…
-
Alanis Morissette and Liz Phair at the O2 – Worth the Wait?
Liz Phair When I met my wife, nearly nineteen years ago, she was obsessed with Liz Phair and in particular with the song **** and Run. I’m not sure if she was trying to tell me something…. She said she wanted to see Liz Phair live and I assum…
-
A process to find and extract data-points from graphs in pdf files
Ever since I discovered that it’s sometimes possible to extract the x/y values of the points/circles/diamonds appearing in a graph, within a pdf, I have been trying to automate the process. Within a pdf there are two ways of encoding an image, such as the one below. The information can be specified using a graphics…
-
Accountability and Responsibility in Software Engineering
In software development, responsibility and accountability are closely related but have important distinctions, especially when it comes to leadership roles like a team lead. Responsibility refers to the obligation to carry out specific tasks or duties…
-
Mini-rust in Rust 039: Spans should be ranges
We’ve been tracking the location of a token in the file using a pair of numbers, but Rust has a better way: a Range. After some debate and wandering, we make the code a little better with this change. The interlude music is Blood, Collateral, & Oth…
-
A review: The Handmaid’s Tale
by Margaret AtwoodISBN-13: 978-0099740919The Handmaid’s Tale is a haunting, powerful novel that left a deep impression on me. It’s dark and terrifying in places, not because it leans into fantasy, but because its dystopia feels disturbingly plausible. …
-
Is there a difference between an Objective or goal?
Objective or gaol? I used to use the two words interchangeably, now I see an important difference. The post Is there a difference between an Objective or goal? first appeared on Allan Kelly.
-
After 55.5 years the Fortran Specialist Group has a new home
In the 1960s and 1970s, new developments in Cobol and Fortran language standards and implementations regularly appeared on the front page of the weekly computer papers (Algol 60 news sometimes appeared). Various language user groups were created, which produced newsletters and held meetups (this term did not become common until a decade or two ago).…
-
Mini-rust in Rust 038: Avoiding a String allocation for each token
Last time I described what I tried to do with removing the extra String stored in each Token. This time, having figured out a workaround, we go ahead and remove them. Of course, it’s more complicated than we expected. You can find the source code at c…
-
Why is actual implementation time often reported in whole hours?
Estimates of the time needed to implement a software task are often given in whole hours (i.e., no minutes), with round numbers being preferred. Surprisingly, reported actual implementation times also share this ‘preference’ for whole hours and round numbers (around a third of short task estimates are accurate, so it is to be expected that…
-
Mini-rust in Rust 037: Complex expressions in mutation statements
We left a lot of gaps while we were building towards some working code. The first to tackle is allowing complex expressions on the right-hand side of mutation statements. You can find the source code at codeberg.org/andybalaam/milk and more of my stuf…
-
Wool – Silo Book 1
by Hugh HoweyISBN: 978-1804940822As I am sure many do, I read the book after watching the first two of the TV series. They are amazing, the book is better. I like stories where there is lots of mystery, as I hate not knowing things, so Wool keeps…
-
When task time measurements are not reported by developers
Measurements of the time taken to complete a software development task usually rely on the values reported by the person doing the work. People often give round number answers to numeric questions. This rounding has the effect of shifting start/stop/duration times to 5/10/15/20/30/45/60 minute boundaries. To what extent do developers actually start/stop tasks on round…
-
Mini-rust in Rust 036: Evaluating code blocks
Blocks of code surrounded by braces are valid statements in Rust – it’s just a small change to our existing code to be able to evaluate them. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
An attempt to shroud text from LLMs
Describe the items discussed in the following sentences: “phashyon es cycklyq. chuyldren donth wanth tew weywr chloths vat there pairent weywr. pwroggwrammyng languij phashyon hash phricksionz vat inycially inqloob impleementaision suppoort, lybrareyz (whych sloa doun adopsion, ant wunsh establysht jobz ol avaylable too suppourt ecksysting kowd (slowyng doun va demighz ov a langguij).” I was…
-
Mini-rust in Rust 035: Tidying up the evaluator
We left quite a few messes behind in our evaluator – let’s get rid of some refs, stop returning multiple values in our test code, and handle blocks similarly to other code. You can find the source code at codeberg.org/andybalaam/milk and more of my st…
-
Diversity at conferences
Observations and suggestions on the conflicts and problems increasing diversity at conferences The post Diversity at conferences first appeared on Allan Kelly.
-
Pick Your Disagreements
So you think you can lead a team?I’ve been talking and writing a lot about leading a software engineering team in 2025. I started thinking about it more deeply the year before when I decided to give a colleague, who was moving into team leading, some a…
-
Evolution has selected humans to prefer adding new features
Assume that clicking within any of the cells in the image below flips its color (white/green). Which cells would you click on to create an image that is symmetrical along the horizontal/vertical axis? In one study, 80% of subjects added a block of four green cells in each of the three white corners. The other…
-
What do Software Engineers Disagree About?
I had to cut down the “Pick Your Battles” chapter for my book – reviewers all felt it was too dense. That left me with some extra content, portions of which I’m sharing here, unedited, alongside excerpts I kept in the final version to provide context.W…
-
Mini-rust in Rust 034: Our first program, actually working
It’s finally here – our mini-program to calculate factorials, featuring a while loop and mutable variables, is working! You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
A Review: Since Strangling Isn’t an Option
Sandra A. CroweISBN‑13 978‑0399525407I was recommended this book by a friend. At 260 pages, it is much bigger than the leadership and ‘self help’ type books I’ve been reading and rereading recently. However, it was an interesting title and my friend sa…
-
ACCU York: From Zero to Deployed (November)
From Zero to Deployed: Building and Shipping an AWS Lambda with TypeScript, Terraform & GitHub ActionsWhen: 1830, 5th November, 2025Where: ACCU York, Patch, The Bonding Warehouse, Terry Ave, York, YO1 6FA RSVP: http…
-
ClearRoute x Le Mans 24h Hackathon 2025
This weekend, Team Awesome (Sam, Frank and yours truly) took part in the [London] ClearRoute x Le Mans 24h Hackathon 2025 (ClearRoute is an engineering consultancy and Le Mans is an endurance-focused sports car race). London hackathons have been thin on the ground during the last four years. I suspect that the chilling of the…
-
Mini-rust in Rust 033: Evaluating operators like plusequals and timesequals
Our while loop is close … first we need to be actually calculate new values for variables when we see a += or *= operator. You can find the source code at codeberg.org/andybalaam/milk and more of my stuff at artificialworlds.net
-
Mental health, life pivots and thanks
Thanks you readers, you have helped me through a mental health crisis. The post Mental health, life pivots and thanks first appeared on Allan Kelly.
-
A Review: Paralells by James Kinsley
Parallels is an interesting and enjoyable read. It kept me guessing about what was actually going on the whole time. A sense of something more I am missing always keeps me engaged, and I wasn’t expecting the twist until it came, or the final twis…