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…