Last updated: February 27, 2020 02:22 PM (All times are UTC.)

February 27, 2020

Yesterday, we observed that the goal of considering the go to statement harmful was so that a programmer could write a correct program and have done with it. We noticed that this is never how computering works: many programs are not even instantaneously correct because they represent an understanding of a domain captured at an earlier time, before the context was altered by both external changes and the introduction of the software itself.

Today, let’s look at the benefits of removing the go to statement. Dijkstra again:

My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible.

This makes sense! Our source code is a static model of our software system, which is itself (we hope) a model of a problem that somebody has along with tools to help with solving that problem. But our software system is a dynamic actor that absorbs, transforms, and emits data, reacting to and generating events in communication with other human and non-human actors. We need to ensure that the dynamic behaviour is evident in the static model, so that we can “reason about” the development of the system. How does Dijkstra’s removal of go to help us achieve that?

Let us now consider how we can characterize the progress of a process. (You may think about this question in a very concrete manner: suppose that a process, considered as a time succession of actions, is stopped after an arbitrary action, what data do we have to fix in order that we can redo the process until the very same point?) If the program text is a pure concatenation of, say, assignment statements (for the purpose of this discussion regarded as the descriptions of single actions) it is sufficient to point in the program text to a point between two successive action descriptions. (In the absence of go to statements I can permit myself the syntactic ambiguity in the last three words of the previous sentence: if we parse them as “successive (action descriptions)” we mean successive in text space; if we parse as “(successive action) descriptions” we mean successive in time.) Let us call such a pointer to a suitable place in the text a “textual index.”


Why do we need such independent coordinates? The reason is – and this seems to be inherent to sequential processes – that we can interpret the value of a variable only with respect to the progress of the process. If we wish to count the number, n say, of people in an initially empty room, we can achieve this by increasing n by one whenever we see someone entering the room. In the in-between moment that we have observed someone entering the room but have not yet performed the subsequent increase of n, its value equals the number of people in the room minus one!

So the value of go to-less programming is that I can start at the entry point, and track every change in the system between there and the point of interest. But I only need to do that once (well, once for each different condition, loop, procedure code path, etc.) and then I can write down “at this index, these things have happened”. Conversely, I can start with the known state at a known point, and run the program counter backwards, undoing the changes I observe (obviously encountering problems if any of those are assignments). With go to statements present, I cannot know the history of how the program counter came to be here, so I can’t make confident statements about the dynamic evolution of the system.

This isn’t the only way to ensure that we understand a software system’s dynamic behaviour, which is lucky because it’s not a particularly good one. In today’s parlance, it “doesn’t scale”. Imagine being given the bug report “I clicked in the timeline on a YouTube video during an advert and the comments disappeared”, and trying to build a view of the stateful evolution of the entire YouTube system (or even just the browser, if you like, and if it turns out you don’t need the rest of the information) between main() and the location of the program counter where the bug emerged. Even if we pretend that a browser isn’t multithreaded, you would not have a good time.

Another approach is to encapsulate parts of the program, so that the amount we need to comprehend in one go is smaller. When you do that, you don’t need to worry about where the global program counter is or how it got there. Donald Knuth demonstrated this in Structured Programming with go to Statements, and went on to say that removing all instances of go to is solving the wrong problem:

One thing we haven’t spelled out clearly, however, is what makes some go to’s bad and others acceptable. The reason is that we’ve really been directing our attention to the wrong issue, to the objective question of go to elimination instead of the important subjective question of program structure.

In the words of John Brown [here, Knuth cites an unpublished note], “The act of focusing our mightiest intellectual resources on the elusive goal of go to-less programs has helped us get our minds off all those really tough and possibly unresolvable problems and issues with which today’s professional programmer would otherwise have to grapple.”

Much has been written on structured programming, procedural programming, object-oriented programming, and functional programming, which all have the same goal: separate a program into “a thing which uses this little bit of software, according to its contract” and “the thing that you would like to believe implements this contract”. OOP and FP additionally make explicit the isolation of state changes, so that you don’t need to know the whole value of the computer’s memory to assert conformance to the contract. Instead, you just need to know the value of the little bit of memory in the fake standalone computer that runs this one object, or this one function (or indeed model the behaviour of the object or function without reference to computer details like memory).

Use or otherwise of go to statements in a thoughtfully-designed (I admit that statement opens a can of worms) is orthogonal to understanding the behaviour of the program. Let me type part of an Array class based on a linked list directly into my blog editor:

Public Class Array Of ElementType
  Private entries As LinkedList(Of ElementType)
  Public Function Count() As Integer
    Dim list As LinkedList(Of ElementType) = entries
    Count = 0
    If list.IsEmpty() Then GoTo empty
    Count = Count + 1
    list = list.Next()
    GoTo nonempty
    Exit Function
  End Function

  Public Function At(index As Integer) As ElementType
    Dim cursor As Integer = index
    Dim list As LinkedList(Of ElementType) = entries
    If list.IsEmpty() Then Err.Raise("Index Out of Bounds Error")
    If cursor = 0 Then Return list.Element()
    list = list.Next()
    cursor = cursor - 1
    GoTo next
  End Function
End Class

While this code sample uses go to statements, I would suggest it’s possible to explore the assertion “objects of class Array satisfy the contract for an array” without too much difficulty. As such, the behaviour of the program anywhere that uses arrays is simplified by the assumption “Array behaves according to the contract”, and the behaviour anywhere else is simplified by ignoring the Array code entirely.

Whatever harm the go to statement caused, it was not as much harm as trying to define a “correct” program by understanding all of the ways in which the program counter arrived at the current instruction.

February 26, 2020

Aquamarine by Bruce Lawson (@brucel)

Here’s a newly-recorded version of one of the favourite songs I wrote (crappy cassette 4-track demo previously posted). I was obsessed with TS Eliot’s poem Marina, a monologue inspired by Shakespeare’s Pericles. So I ripped that off, nicked a line or two from The Waste Land, pinched a bit of Shakespeare’s The Tempest and, while the literary store detective was looking the other way, ran off with a bit of Dylan Thomas too. The Shakespeare reading is by my friend Richard Crowest. Bass guitar and production is by Shez.

Aquamarine –
I’m a ship becalmed after stormy seas.
You’ve been silver and green;
I love you best now for your clarity.
You sing to me in sharpened keys.
You bring me emeralds and harmonies.

I will be here for you if you’ll be here for me
Sometimes, the tide turns
and everything is monochrome.

Aquamarine –
Your wet hair dries in the warm sea breeze.
Lie still and dream
Of the mountains – there you feel free.
Sail across still memories
Under sleep where all the waters meet.

I will be here for you if you’ll be here for me
Dry stones and white bones
and everything is monochrome.

Aquamarine –
This music crept upon the water to me
I’m a machine
Powered by your electricity.
You sail across still memories
You bring me emeralds and energy.

I will be here for you if you’ll be here for me
From the horizon
The world can turn monochrome.

What seas, what shores,
what great rocks?

Seize what’s yours;
What grey rocks?

What islands? What waters lap at the bow?

The sea’s daughter, you ebb and you flow;
The sea’s daughter, emerald green;
The sea’s daughter, Aquamarine.

Lie still, be calm, and dream.

Words and music © Bruce Lawson 1991, all rights reserved.

Dijkstra didn’t claim to consider the go to statement harmful, not in those words. The title of his letter to CACM was provided by the editor, Niklaus Wirth, who did such a great job that the entire industry knows that go to is “Considered Harmful”, and that you can quickly rack up the clicks by considering other things harmful.

A deeper reading of his short (~1400 words) article raises some interesting points, that did not as yet receive as much airing. Here, in the interests of writing an even shorter letter, is just one.

My first remark is that, although the programmer’s activity ends when he has constructed a correct program, the process taking place under control of his program is the true subject matter of his activity, for it is this process that has to accomplish the desired effect; it is this process that in its dynamic behavior has to satisfy the desired specifications. Yet, once the program has been made, the “making’ of the corresponding process is delegated to the machine.

There are many difficulties with this statement, including the presumed gender of the programmer. Let us also consider the idea of a “correct” program, which does not exist for the majority of programmers. Eight years after Dijkstra’s letter was published, Belady and Lehman published the first law of program evolution dynamics:

_ Law of continuing change_. A system that is used undergoes continuing change until it is judged more cost effective to freeze and recreate it. Software does not face the physical decay problems that hardware faces. But the power and logical flexibility of computing systems, the extending technology of computer applications, the ever-evolving hardware, and the pressures for the exploitation of new business opportunities all make demands. Manufacturers, therefore, encourage the continuous adaptation of programs to keep in step with increasing skill, insight, ambition, and opportunity. In addition to such external pressures for change, there is the constant need to repair system faults, whether they are errors that stem from faulty implementation or defects that relate to weaknesses in design or behavior. Thus a programming system undergoes continuous maintenance and development, driven by mutually stimulating changes in system capability and environmental usage. In fact, the evolution pattern of a large program is similar to that of any other complex system in that it stems from the closed-loop cyclic adaptation of environment to system changes and vice versa.

This model of programming looks much more familiar to me when I reflect on my experience than the Dijkstra model. If Dijkstra’s programmer stopped programming when they have “constructed a correct program”, then their system would fail as it didn’t adapt to “increasing skill, insight, ambition, and opportunity”.

The programmer who would thrive in this environment is more akin to Ward Cunningham’s opportunistic rewriter, based on his experience of the WyCash Portfolio Management System. That programmer rewrites every module they touch, to ensure that it represents the latest information they have. We recognise the genesis of Ward’s “technical debt” concept in this quote, and also perhaps what we would now call “refactoring”:

Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. Objects make the cost of this transaction tolerable. The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.

The traditional waterfall development cycle has endeavored to avoid programming catastrophe by working out a program in detail before programming begins. We watch with some interest as the community attempts to apply these techniques to objects. However, using our debt analogy, we recognize this amounts to preserving the concept of payment up-front and in-full. The modularity offered by objects and the practice of consolidation make the alternative, incremental growth, both feasible and desirable in the competitive financial software market.

Ward also doesn’t use go to statements, his programming environment doesn’t supply them. But it is not the ability of his team to avoid incorrect programs by using other control structures that he finds valuable; rather the willingness of his programmers to jettison old code and evolve their system with its context.

February 21, 2020

Reading List 251 by Bruce Lawson (@brucel)

February 19, 2020

I like having the news headlines on my phone’s home screen. (Well, on the screen to the right.) It helps me keep up with what’s going on in the world. But it’s hard to find a simple headline home screen widget which isn’t full of ads or extra frippery or images or tracking; I just want headlines, plain text, not unpleasantly formatted, and high-density. I don’t want to see three headlines; I’d rather see ten. I tried a whole bunch of news headline home screen widgets and they’re all terrible; not information-dense enough, or they are but they’re ugly, or they insist on putting pictures in, or they display a ton of other information I don’t want.

It occurred to me that I don’t really need a news reader per se; just an RSS reader, which I then point at Google’s “all news” feed (which they move around from time to time but at time of writing in February 2020 is at However, RSS reader widgets are also all terrible.

Finally, I thought: fine, I’ll just do it myself. But I really don’t want to write Java and set up Android Studio. So I installed Web Widget which just renders a web page to a home screen widget, and then wrote a simple web page and stuck it at the root of my phone’s storage. I can then point Web Widget at file:///sdcard/noos.html and it all works, and I can customise it how I like. Every one’s a winner. Nice simple way to create widgets that do what I want. They can’t be animated or anything, but if you want something which displays some external data and is happy to be polled every now and again to update, it’s perfectly fine. Sadly, there’s no continuity of storage (indexedDB exists but doesn’t persist and localStorage doesn’t exist at all), but it’s good for what I needed.

February 17, 2020

On the Birmingham tech scene by Stuart Langridge (@sil)

A certain amount of kerfuffle over the last couple of days in the half of the Birmingham tech scene that I tend to inhabit, over an article in Business Live about Birmingham Tech Week, a new organisation in the city which ran a pretty successful set of events at the back end of last year.1

I think what got people’s backs up was the following from BTW organiser Yiannis Maos, quoted in the article:

I saw an opportunity borne out of the frustration that Birmingham didn’t really have a tech scene, or at least not one that collaborated very much.

You see, it doesn’t appear that the Tech Week team did much in the way of actually trying to find out whether there was a tech scene before declaring that there probably wasn’t one. If they had then they’d have probably discovered the calendar which contains all the stuff that’s going on, and can be subscribed to via Google. They’d probably have spoken to the existing language-specific meetups in the city before possibly doing their own instead of rather than in conjunction with. They’d have probably discovered the Brum tech Slack which has 800-odd people in it, or2 CovHack or HackTheMidlands or FusionMeetup or devopsdays or CodeYourFuture_ or yougotthisconf or Tech Wednesday or Django Girls or OWASP or Open Code or any one of a ton of other things that are going on every week.

Birmingham, as anyone who’s decided to be here knows, is a bit special. A person involved in tech in Birmingham is pretty likely to be able to get a similar job in London, and yet they haven’t done so. Why is that? Because Brum’s different. Things are less frantic, here, is why. We’re all in this together. London may have kings and queens: we’re the city of a thousand different trades, all on the same level, all working hand in hand. All collaborating. It’s a grass roots thing, you see. Nobody’s in charge. The calendar mentioned above is open source exactly so that there’s not one person in charge of it and anyone else can pick it up and run with it if we disappear, so the work that’s already gone into it isn’t wasted.

Yiannis goes on to say “I guess we weren’t really banging the drum about some of the successes Birmingham had seen in regards to tech.” And this is correct. Or, more accurately, I don’t personally know whether it’s correct, but I entirely believe it. I’m personally mostly interested in the tech scene in the city being good for people in the city, not about exhibiting it to others… but that doesn’t mean that that shouldn’t be done. Silicon Canal already do some of that, but having more of it can’t be bad. We all want more stuff to happen, there just doesn’t need to be one thing which attempts to subsume any of the others. Birmingham Tech Week’s a great idea. I’d love to see it happen again, and it’s great that Yiannis has taken a lead on this; five thousand people showing up can’t be wrong.

And, to be clear, this is not an attempt to rag on them. I don’t know Yiannis myself, but I’ve been told by people whose opinions I value and who do know him that he’s not intending to be a kingmaker; that what he’s looking to do is to elevate what’s already going on, and add more to it. That’s fantastic. They’ve contacted people I know and trust to ask for opinions and thoughts. I spoke to them when they set up their own events listing and asked people to contribute to theirs specifically and I said, hey, you know there already is one of those, right? If you use that (as Silicon Canal do) and ask people to contribute to that, then we all win, because everyone uses it as the single source and we don’t have fifteen incomplete calendars. And they said, hey, we didn’t know that, soz, but we’ll certainly do that from now on, and indeed they have done so, recommending to event organisers that they add their stuff to the existing calendar, and that’s brilliant. That’s collaboration.

I think of the tech scene in my city like a night out dancing. You go out for the evening to have a dance, to have a laugh. Show up on your own or with a partner or with a group, and then all get out there on the floor together and throw some shapes; be there for one minute or the whole night, nobody minds. And nobody’s directing it. Nobody wins a dance. If someone tries to tell everyone how to dance and when to dance and where to dance… then it stops being fun.

And so there’s a certain amount of resistance, on my side of the fence, to kingmakers. To people who look at the scene, all working together happily, and then say: you people need organising for your own good, because there needs to be someone in charge here. There needs to be hierarchy, otherwise how will journalists know who to ask for opinions? It’s difficult to understand an organisation which doesn’t have any organisation. W. L. Gore and Patagonia and Valve are companies that work a similar way, without direct hierarchy, in a way that the management theorist Frédéric Laloux calls a “teal organisation” and others call “open allocation”, and they baffle people the world over too; half the managers and consultants in the world look at them and say, but that can’t work, if you don’t have bosses, nobody will do anything. But it works for them. And it seems to me to be a peculiarly Brum approach to things. If we were in this for the fame and the glory we’d have gone down to London where everyone’s terribly serious and in a rush all the time. Everyone works with everyone else; BrumPHP talks about BrumJS, Fusion talks about School of Code; one meetup directs people to others that they’ll find interesting; if the devopsdays team want a speaker about JavaScript they’ll ping BrumJS to ask about who’d be good. That’s collaboration. Everyone does their bit, and tries to elevate everyone else at the same time.

So I really hope that the newspaper article was a misquote; that the journalist involved could have looked more into what’s going on in the city and then written something about all of that, too. It’s certainly easy to just report on one thing that’s going on, but exactly what makes the Birmingham tech scene different from others is that it’s rich and deep and there isn’t one convenient person who knows all of it. I’d love to see Birmingham journalism talking more about the Birmingham scene. Let’s hope there’s more of that.

  1. That link describes the 2019 Birmingham tech week at time of writing in February 2020. I do not know whether they’ll keep the 2019 schedule around (and I hope they do and don’t just overwrite it).
  2. to quote Jim

February 15, 2020

Getting a new phone by Stuart Langridge (@sil)

So, I’m getting a new phone. Here’s an insight into my decision-making processes.

I have, repeatedly and irritatedly, complained that phones now are too big. My beloved Sony Xperia Z5 Compact is the right size for a phone, in my opinion. I always, always use my phone one-handed; I never ever hold in one hand and touch the screen with the other. It is a loss to me why this, which was the normal way of using a phone for years, has been reclassified as a thing that nobody wants any more, but c’est la vie, I suppose. Anyway, said beloved Z5C finally threw a seven the other day and decided that it wouldn’t do wifi any more. Or, more accurately, that it was fine doing wifi when within about two feet of the router, and not otherwise.

That’s not ideal, I thought.

I mean, it’s five years old. So I probably did OK out of it. And the battery life is shocking now. So I’ve been vaguely thinking about getting something new for a while. I’m not sure that the wifi thing is sensibly repairable, and I read a forum post about a chap who took his Z5C apart to replace the (not-user-replaceable) battery (a process which involves heating it up to break the glue behind the glass, and a bunch of other stuff that there’s no way I’d be able to do without breaking the phone and possibly burning down the building) and while doing so managed to snap a tiny bit of metal which then broke the wifi antenna and made it exhibit the problems I’m seeing. So that’s probably what happened; it got jolted or something. No chance of me fixing that; if I have to solder anything, I’ll screw it up. This is the universe telling me to get a new phone, I thought.

Consequently, it’s off to GSM Arena’s phone finder. I don’t actually have much in the way of requirements for a phone. My original list of needs was:

  • not too big (for what exactly qualifies as not too big, read on)
  • not too expensive (flagship phones are now a thousand pounds! even non-flagship ones are £500! I don’t have a monkey just lying around)
  • NFC (for Google Pay, which I use all the time)
  • a headphone jack (because wireless headphones are pointless and expensive and worse in every conceivable way other than “the cable doesn’t get tangled up”, and I don’t like them and don’t want to buy any)
  • made in the last couple of years, since if I’m spending money on a phone I want it to last a while; there’s not a lot of point replacing my 2015 Z5C with a phone of similar vintage
  • and I like pretty things. Design is important to me. Beauty, vitality, and openness are all important.

This is not much of a strenuous list of requirements, to be honest. Or so I thought. I did some searches, and quickly established that I’d have to get something bigger than the Z5C; there isn’t anything at all that size, these days. So I wandered into town with the intention of picking up some actual phones to get a sense of what was too big.

This was harder than it looks, because basically every phone shop now bolts all their phones to the table so they can’t be picked up. All you can do is jab at the screen like a bloody caveman. This is pretty goddamn annoying when the point of the test is to see what a phone feels like in the hand. The O2 shop had a bunch of plastic models of phones and even those had a massive thing glued on the back with a retracting wire cable in it, as if I’m going to steal a non-functional plastic box, O2, for god’s sake, stop treating your customers like criminals, this is almost as bad as hotels giving you those crap two-part hangers like I’m going to spend £150 on a night in the Premier Inn and then nick the hangers, what’s wrong with you… but it did at least let me establish that the absolute outside maximum size for a phone that I’m able to tolerate is the Samsung Galaxy S10e. Anything bigger than that is just too big; I can’t reach the top of the screen without using my other hand.

A search on gsmarena for phones less than 143mm in height, with NFC and 3.5mm jack, from 2018 onwards lists three phones. The S10e as mentioned, the Sony Xperia XA2, and the Sharp Aquos R2 Compact. Now, I quite like the look of the Aquos (despite all the reviews saying “it’s got two notches! not even the Nazis did that!”) but as far as I can tell it just was flat never made available in the UK at all; getting hold of one is hard. And the S10e, while it seems OK, is a Samsung (which I’m not fond of) and more importantly is £450. This left me looking at the Xperia XA2, which was a possibility — it’s sort of a grand-nephew of my Z5C. Reviews weren’t very encouraging, but I figured… this might be OK.

Andrew Hutchings pointed out on Twitter (because of course I was bitching about this whole situation on Twitter) that there are USB-to-headphone-jack adaptors. Now, I knew this — my daughter uses one to plug her headphones into her iPhone — but for some reason I hadn’t properly considered that option; I’d just assumed that no headphone jack = stupid wireless headphones. An adaptor wouldn’t be that big a deal; my headphones just get thrown in my coat pocket (I have cheapish in-ear headphones, not posh cans that go ove the ear and need a bag to carry them around in) and so I’d just leave the adaptor attached to them at all times. That wouldn’t be so bad.

Taking the headphone jack requirement away from the search added two more options (and a bunch of smartwatches, unhelpfully): the Sony Xperia XZ2 Compact and the Nokia 8 Sirocco. I liked the sound of the Nokia, but… not for very good reasons. My favourite ever phone from an industrial design perspective was the Nokia N9, which I loved with a passion that was all-encompassing. I like the Nokia brand; it says classy and well-thought-out and well-integrated and thoughtful and elegant. And “Sirocco” is a cool name; I like things with names. I hate that phones are just called a code number, now. So “Sirocco” is much cooler than “S10e”. None of these are good reasons, particularly the ones that revolve around my nostalgia for the Nokia brand considering that it’s been bought by some other company now. And the Sirocco only got fairly average reviews.

Ah, but then I read the reviews. And all the things that reviewers didn’t like, I either didn’t care about or, more worryingly yet, I completely disagreed with. “As the phone has a 16:9 screen rather than the now more popular 18:9 (or even 19:9) style, it already seems dated” says techradar, for which you can just sod off. Why, why would I want a phone a foot long? That’s the opposite of what I want! So reviews that complain that it’s not tall enough (which was a lot of them) got discounted. Complaints that it’s using an older chipset than some of its contemporaries don’t bother me; it’s quite some newer than my current phone, after all. Apparently the camera isn’t perfect, about which I don’t care; it’s got a camera, so I’m good. And they all agreed on two things: it’s Android One, meaning that it’s stock Android and will get updates (which I like, since my Z5C is stuck on Android 7 (!)), and that it’s pretty. I like pretty.

The price tag was off-putting, though. £475 on Amazon. That’s rather too much; I’d have to save up for that, and as noted I have a phone with no wifi, so this problem needs solving sooner rather than later. I don’t mind second-hand, though, so I checked eBay and it was still £250 there, which is on the very utmost outer edge of what I can just drop on a purchase and I’d have to be really convinced of it. I don’t like buying things on the knock-knock, and I am in a 12-month can’t-leave SIM-only contract with Three, so the idea of getting an “upgrade” from my carrier was a no-no even if I wanted to, which I don’t (the SIM-only thing gives me unlimited texts and calls and 6GB of data per month for nine quid. Not forty nine. Nine. I don’t want to lose that).

And then I checked CeX. And CeX had it in stock, online, class A, for £175.

What? A hundred and seventy-five quid for a phone which elsewhere is nearly five hundred?

So I bought it. And now it’s not in stock online any more, so I assume I have the only one they had. This means you can’t do the same. Sorry about that.

It’s due to arrive early next week (which is the problem with buying on a Saturday). I’ll let you know how it goes. I’m rather looking forward to it.

February 14, 2020

Reading List 250 by Bruce Lawson (@brucel)

February 13, 2020

For the longest time I’ve wanted to play with epoxy resin. Watching makers like Peter Brown, Ben’s Worx, and TheCrafsMan on YouTube inspired the desire to use resin in a project, and conversations with my patron, Emma, revealed that she had similar desires, so during the first weekend of February she joined me in my workshop, and powered with nothing more than imagination and ill-gained confidence, we decided to make an epoxy resin river laptop tray for her husband.

The journey to this fated weekend started back in mid-Janurary during a trip to Bristol. Shortly after Christmas, Lucy and I decided we needed new Superdry hoodies, so a trip to Cabot Circus was planned. Little-known to Lucy, Bristol was also home to the Bristol Wood Recycling Project, and there’s no way that I was going to skip visiting a reclamation yard if I was in the neighbourhood.

I walked out £150 poorer with one cherry, and two sycamore, waney edged boards under my arm.

The cherry and £38 sycamore boards were for me, but the £45 sycamore was for Emma, chosen from the vast selection of amazing boards, via WhatsApp consultation and lots of photos.

The reclamation yard had a lot to choose from, with most of the waney edge boards being rough sawn, and over two-and-a-half meters long, but they had a small selection of boards which had been cut down to size, squared off, planed and finished with oil, which they were selling to be used as shelves. These were perfect for my purposes, as I don’t have a planer/thicknesser (something which is going to come back and bite us in the arse shortly).

Next we needed the resin. I’d decided a while ago that I was going to use GlassCast resin because they’re British (I didn’t want to mess about importing stuff), and because of all the helpful tools and information they have on their site, specifically the video tutorials they have for a number of different resin projects, and the resin calculator to work out how much resin you’ll need for the different projects featured in the videos.

I had planned on using my cherry board to make a river table for myself, but the calculator revealed that I’d need just under 5kg of resin at a cost of just over £80 for the resin alone, and as I’d already spend all my money on my new Superdry hoodie, decided I’d shelf the idea temporally.

My cherry board, cut in half, and positioned for resin river measurement – turns out, that gap needs a lot of resin.

Price wasn’t a barrier for Emma, however, and £130 later I was awaiting shipment of 2kg of resin, a selection of metallic pigments, a roll of flash/release tape, a 100x100cm polypropylene sheet, some nitrile gloves, and some mixing cups.

Emma arrived on the Friday, and after a night of catching up (and drinking), we awoke Saturday morning ready to work.

The original plan had been to split the board into three sections, with two of them being individually squared off using resin, but after some thought we decided this was going to be a bit too difficult, mainly due to having three open edges against the resin, and not really being sure how to make a form to contain it all.

So we went with plan B, which was to go for a single piece featuring the more traditional river table approach of two boards facing each other, so after cutting the board down to size, we set about using two offcuts from the door in my basement and some clamps to create a makeshift form on top of the polypropylene sheet, sealed around the edges with (far too much) silicone.

Next on the agenda was preparing the resin. Emma wanted it to be olive green, but that wasn’t available as a pre-mixed colour, so instead she took three parts yellow pigment, one part blue, and a touch of red, and combined it until it was the perfect colour.

Based on our calculations we knew that 1kg of resin should be more than enough to fill the gap, which made mixing the batch easy, so after pouring all the resin from one bottle into the cup, and mixing the pigment into it, we then poured the hardener in, and mixed it some more. I’d picked up a paint stirrer which fits into your drill to the mixing process easy, but we’d decided to use the two-cup method of pouring all the mix from one cup into a second just to be sure everything was thoroughly mixed.

I was given the honour of pouring the mixture into the gap, which reached the top with ease, but after a few minutes, we’d noticed the level had dropped off, so poured in some more. We figured this shrinking was probably due to the bubbles in the resin (the resin has a fairly long open time, so we could have waited a while to let these rise to the surface before pouring), but little did we know the real cause.

We could see the level was still dropping, but had already used the remaining resin mixture and filled a knot in one of my planks, so decided that we’d top it off with clear resin the following day, so after a couple of hours of monitoring the situation to ensure there were no leaks, we called it a day and resumed drinking.

The following morning we were greeted by a few small leaks in the form, but thankfully, the resin had already hardened enough to plug them.

We proceeded to mix the second batch of resin, and as we’d left it clear, we could see all the bubbles slowly rise up and out of the mixture. Having watched lots of videos about epoxy resin, I knew that bubbles could be an issue, and that you can use a pressure pot or vacuum chamber to eliminate them, so to watch them remove themselves from the equation was something special. I don’t know if this is a feature unique to GlassCast, but it’s impressive all the same.

Content that we had done as much as we could, we spent the rest of the day exploring Springfair, before Emma had to head home. If we’d have read the technical sheet sooner, we’d have seen that it takes at least 48 hours for the resin to cure, but I was happy to finish up by myself in the week.

Fast forward to Tuesday and I was ready to de mould. The first thing I did was turn the form over, and discovered where the resin had gone.

As mentioned earlier, I don’t have a planer/thicknesser, meaning we had to use the boards as they came, and it seems they came with some warping in them, enough that neither board sat perfectly flat on the polypropylene sheet, letting the resin seep under them.

Job one was freeing them from the supports. If we’d placed the tape along the full length of supports we could have simply lifted them off, but because we hadn’t, it meant cutting them of with the table saw.

Job two was removing the resin amassed on the bottom. I asked around to see if anyone had a planer/thicknesser, but the only one I had access to was too small, so I had no choice but to sand it off using my belt sander.

I then switched to my random orbit sander and went up to 400 grit. This left the river section of the resin on the bottom cloudy, which I could have continued sanding up to 3000 grid and beyond, then use some polishing compound to make it glossy again, but I don’t have any of those things, and was well aware of the Valentine’s Day deadline, so decided that because it was on the bottom it was good enough for now.

Flipping the board over, the top was pretty good as is, being naturally nice and glossy. There’s a slight drop of less than 1mm, but not enough of a concern to make it worth sanding the wood down at the risk of messing up the gloss, so I carefully gave the wood a light sanding, being sure to avoid the resin at all cost.

And for now, this is where this story must end. I’ve sent the board to Emma, who will give it to Pete on Valentine’s day, to let him decide what happens next. One idea is we maybe trim it down slightly and keep with the idea of a laptop tray, another is we add some handles on either side and make it into a serving tray. Regardless of what happens next, it isn’t the end of the adventure, just a pause, and when we return, we’ll round over the edges with a router, polish the bottom and sides, and reveal it’s final form.

February 11, 2020

Free and open source software has traditionally been defined as the opposite of something else: proprietary (or commercially-licensed) software. That’s particularly obvious in the name of the GNU project, which calls itself “Not UNIX” – a popular AT&T-owned commercial software property of the time. The GNU manifesto goes deeper on the specific ways in which it is Not Unix:

I consider that the Golden Rule requires that if I like a program I must share it with other people who like it. Software sellers want to divide the users and conquer them, making each user agree not to share with others. I refuse to break solidarity with other users in this way. I cannot in good conscience sign a nondisclosure agreement or a software license agreement. For years I worked within the Artificial Intelligence Lab to resist such tendencies and other inhospitalities, but eventually they had gone too far: I could not remain in an institution where such things are done for me against my will.

The focus of this document, and of the various free software licenses, is on the distribution and redistribution rights associated with the software. Thus the focus of the Free Software Foundation, Open Source Initiative, and the other organisations that promote free or open source software is on ensuring appropriate licences are used, and that distributors comply with the licence terms.

Otherwise, free software development is not particularly distinguished from other forms of software development. There are, of course, some outliers, but mostly you’ll see a “core team”, perhaps with a formal structure (component owners, project/release managers, and other roles are common). This team organises its work around proprietary work-allocation tooling like Jira, Github, Slack, Trello, and so on. In many cases, an organisation such as a commercial company or business-interest foundation exists to centralise ownership and decision making, like a good old-fashioned Fordist company. The only visible difference in operations is that it’s possible to read the source code and get changes from outside through the gates and into their repository.

The reason so much work in open source software looks a whole lot like commercial software is that it is work in commercial software. Sometimes the open source project exists exactly to drive adoption of commercially-licensed equivalents, replacements, or upgrades. “Open core” products exist so that you find a need for the commercial features. Developer advocates build open source workflow tools as a sort of loss leading pre-sales activity. And many companies publish open source software “off the money path” as a recruitment activity: do some free work on our pull requests then come here and get paid to reject pull requests from your peers!

Note that I’m not saying all free software or open source software is like this, but that plenty is. Free and open source software development is informed by, and mimics, commercial software engineering to a large extent.

Of course it’s this way, you say, we software engineers need our expensive software engineering lifestyles supported by our high software engineering salaries, so we learn our craft in corporate service and that informs all of our development, including open source. Or that we are only able to contribute to open source when it’s in pursuit of our employers’ goals, because Computering Time is something we do in the office. So it’s no surprise that a lot of open source software development looks like, or is, corporate software development. If only there were proper, sustainable funding for open source software!

To which I say: that is an interesting, and problematic, request, and I wish to put it to one side. Maybe I’ll revisit it in a later post. What I’m more interested in, is what an open source movement that was centered around the Four Freedoms, rather than software-licensing concerns, would look like. One in which you didn’t merely have some abstract legal freedom to do the four activities, but were empowered to do so.

Power Zero: The power to run the program for any purpose.

How much free or open source software cannot directly be used by anyone who isn’t a programmer? Think of all of the things that are only distributed as developer libraries, for developers to incorporate into (commercial or open source) applications. The things that get duplicated as a pod, an egg, a crate, and in whatever new packaging system and programming language comes along. This is the repository namespace as a virtual landgrab, enabling open source as corporate recruitment tool: you should hire me, you’ve heard of me because I wrote the language-your-programmers-use version of library-your-programmers-use.

How much free or open source software is just plain difficult, due to accidental rather than essential complexity? Developers will probably have all sorts of (developer tools) examples here, like GNU autoconf. I find it very hard to make a nice-looking document using open source tools, too. I’ve put enough effort into learning emacs and LaTeX to get somewhat proficient, but still spend a lot of time looking up TeX syntax and getting it wrong. And making (hopefully nice-looking) documents is something I do fairly frequently.

And I’m playing this game on the easy setting. I’ve got years of experience trying to make software work. I am willing (and often paid) to put time into understanding why software doesn’t do what I want. I speak English, the home language of much software, and can use a screen and keyboard without difficulty.

A free software movement in which Freedom 0 is replaced by Empowerment 0 would make getting, trying, and adopting free software trivial. Much simpler than an app store, which has the necessary gatekeeper of payments.

Power One: The power to study how the program works, and change it to make it do what you wish.

Access to the source is a precondition for this. Also, the source being in a readily comprehensible format, amenable to experimentation and adaptation are preconditions. It needs to be possible for a finance person, not a computer person, to look at a finance application like GNUcash, understand its model of finance, and adapt it to their model of finance.

This means elevating automated testing from a thing that developers claim they do sometimes, to the principal mode of hypothesis-driven change in software. Remember when Dan North said that Cucumber would allow business analysts and developers to collaborate on writing the tests? That, but collaborating on writing the software. Currently modes of software development, including free and open source software, are predicated on the division of society into three classes: “developers” who make software, “the business” who sponsor software making, and “users” who do whatever it is they do. An enabling free software movement would erase these distinctions, because it would give the ability (not merely the freedom) to study and change the software to anyone who wanted or needed it.

Software developed with this in mind would have – nay, require – a very clear architecture. If you want a finance person to critique the finance model used in a finance application, everything needs to scream finance. It needs to stop screaming model, view, controller, or memory management, or database transaction, and start shouting credit, debit, accounts receivable.

That doesn’t mean that there isn’t space for experts in memory management or database transactions, but it does mean that you can understand a music score pagesetting application to the point where you can improve its representation of Klezmer modes without needing to understand memory management or database transactions.

Power Two: The power to redistribute and make copies so you can help your neighbour.

An enabling free software movement would make it easy for me to package my computer, or a part of it, and send it to someone else: “here, I find this useful, you give it a go”. So I don’t have to grub around (pardon the pun) for whatever guix, apt, yum, pkcon, brew, pkg or whatever command I had to run to make the software work and tell that person to run the same command, hoping it works. I just give them the thing, and they use it.

Power Three: The power to improve the program, and release your improvements (and modified versions in general) to the public, so that the whole community benefits.

Currently there is a blessed edifice, called “upstream”, the fount of all that is good in software. Any corporate programmer who wants to juice their proprietary github profile longs for their “requests” to be “pulled” by upstream, so that all of those other programmers who are in thrall to upstream finally get to see the fruits of this individual’s labour.

It feels weird to say this in 2020, when the idea was presented as fait accompli in 1997, but an enabling open source software movement would operate more like a bazaar than a cathedral. There wouldn’t be an “upstream”, there would be different people who all had the version of the software that worked best for them. It would be easy to evaluate, compare, combine and modify versions, so that the version you end up with is the one that works best for you, too.

The Four Powers

The combination of these powers points to an open source software movement that erases power dynamics implicit and explicit in our current modes of producing software. It’s as easy for someone who understands the domain of a software system to acquire, understand, improve and share that system as it is for someone who understands the computer it runs on. The infinite malleability of software is deployed to allow people, teams and communities to produce and share their own versions that work best for them.

The antagonism between “the developers” and “the business” documented in the principles behind the agile manifesto is left to commercial software companies. Users, developers, and sponsors are on the same team, and produce software that works better for them than if they worked in other ways.

Number Stations by Bruce Lawson (@brucel)

A new song. It’s inspired by numbers stations, “a shortwave radio station characterized by broadcasts of formatted numbers, which are believed to be addressed to intelligence officers operating in foreign countries. Most identified stations use speech synthesis to vocalize numbers”. This got me thinking about clandestine communication and betrayal.

I heard chatter on the network.
But I couldn’t crack your code.
I was waiting defenceless
for your bombshells to explode.

If you’re here, there is a reason.
Your ciphers are all known.
To everything there is a season.
Now you’re here, your cover’s blown.

I don’t recall why we are enemies.
I don’t understand what we are fighting for.
I forgot my ideology,
half way across the bridge
in this cold, cold war.

You walked down to the checkpoint.
I saw graffiti on the wall.
You presented your false papers,
and the wall began to fall.

Words and music © Bruce Lawson 2020, all rights reserved.
Production and bass guitar: Shez of @silverlakemusic.

February 08, 2020

Here’s another old song that my band The Lucies used to gig, mixed last Wednesday. I’ve no idea what it’s about—I was in a “special state of mind” when I wrote it. “Yakamoz” is a Turkish word which is used when the moonlight shines on the sea, ocean etc.

Candyfloss moon
there is only half an hour til daybreak
You leave me too soon
Stay a while and I’ll watch your heart break

Through all the tears and the rage
This is our golden age
Through the silver rain
I see you wax and wane

Candyfloss moon
I’ve been torn apart and reassembled
Here in this room
I can see the stars that you resemble

Turn off your mind
turn down your radio
I hear angels singing all the time
Shut down your shadow
slow down your heartbeat
Why do your eyes shine?

Yakamoz moon
I see you glow on tranquil seas
Your flowers are in bloom
lilies, fuchsia, rosemary

Words and music © Bruce Lawson 2020, all rights reserved.
Production: Shez of @silverlakemusic.

February 07, 2020

This morning I was introduced to Roam Research by Blair Wadman who kindly spent an hour talking through his setup. I’ve since spent some time playing with it and I’m impressed.

Roam is hard to explain. It’s a note-taking tool that uses an outline structure (think Workflowy), with powerful cross-linking capabilities making it easy to organise and find information. It’s setup like a journal, with today’s date at the top, which makes the concept even more appealing.

Nat Eliason has an excellent article on how he’s using Roam that would make a great starting point if you’re interested in learning more.

Reading List 249 by Bruce Lawson (@brucel)

I figured it might be fun to talk about some of my earliest memories of being a maker.

I think my current interest started with issue 40 of MagPi magazine in December 2015, famous for being the first magazine to give a computer (the Raspberry Pi Zero) for free as a cover gift. I’d picked up a couple of the original Raspberry Pi models in 2012, but it wasn’t until the Zero that my imagination took off, and lead me down this path.

But from an early age, I think I was always destined to be a maker, as I think some of these memories will highlight.

Robotic clone

I remember having a fascination with robots from an early age. Back when we lived in Hoo (near Rochester), I used to talk with my friend about making robot substitutes that we could send to school in our place. They’d look exactly like us, and be powered by control panels in our bedroom, letting us skip school.

When we moved to Bexleyheath this fascination continued, as I recall checking out and reading various books about robots from the primary school library. I also remember being fascinated by a programmable robot the school had, which could be programmed to move forward and backward, as well as turning in either direction, and could draw images with a pencil placed in it’s body. I have no idea what it was called, but I’m sure there’s someone out there that knows what I’m talking about.

Interestingly, robotics isn’t currently as much of an interest to me as you might imagine. I have a couple of beginner robotics kits which Lucy got for me, including a really cool robotic arm which I built one Christmas, but I’m currently lacking the interest in exploring any further than this, I think partly because of the reliance on computers for robotics, and the fact I’m trying to get away from using computers all the time.


Also while in primary school, I remember making a whirlpool experiment I’d seen on a TV program (it might have been How 2) and taking it to show my teacher (I think his name was Mr March). The experiment consisted of two plastic cola bottles, joined at the lid with the screw facing out, and a hole melted through the middle of the join. The idea was to fill one of the bottles with water, then screw both bottles into either side of the joined cap. As the water filtered from the upper bottle down into the lower one, you could rapidly shake the bottle in a round motion, which would cause the water in the upper bottle to form into a whirlpool.

Beyond looking pretty, I’m sure there was a lesson in among the explanation featured on thee TV show, but I probably didn’t pay much attention to that, I just thought it would be fun to make.

Quiz circuitry

When moving to secondary school (age 11-16), I had the opportunity to apply for a technical collage, but had to make and present a project as part of the application interview. At the time, the best I could come up with was the classic tin-can telephone, which I’m sure would have been fine, if I had been able to explain why it works, but as I wasn’t really able to, I failed the application.

What I should have done instead is make another project that I’d seen on TV, an electronic quiz game. This was a simple exercise in circuitry which featured a number of metallic contact points running down either side of a sheet of box cardboard, which were connected one side to the other in a random order on the back via jump wires. The player of the game had two metallic probes connected to a small battery and an LED, and would play by using the two probes to connect the question contact with the appropriate answer contact, thus completing the circuit and illuminating the LED. This something I understood well, and I’m sure I’d have been able to explain it fully.

I’m not sure why I didn’t make this, but I do remember talking with my parents about it shortly after the interview (it was definitely something I’d seen before the interview), and them asking me why I hadn’t done that instead, but I guess 11-year-old Daniel was being a typical 11-year-old.

As an adult, electronics has some interest to me, and I’ve spent a fair amount of time learning the basics, but I don’t think I’m very good at it. I know enough to wire up some LEDs and other basic circuits to an Arduino, which is more than enough for now.

Ornamental display box

The last thing I remember is a woodworking project I made for CDT (Craft, Design, and Technology) while at secondary school. I had an interest in collecting miniature figures and wanted something I could store and display them on.

The design was a simple plywood box with removable lid, maybe around 20cm wide and tall. Sticking out the top of the lid was a thick dowel, onto which another sheet of plywood was attached, cut into an interesting shape, and designed to act as a platform to display the figures. I remember having plans to cover it with fake grass (the type used on miniature train sets) but I don’t think this ever happened.

In any case, anyone that’s read even a few pages of this blog know that I’m very much into woodworking, and have the great fortune of having my very own workshop for this very purpose.

What about you?

I’ve shared some of my memories, what are your earliest memories of being a maker? Post a comment below and let me know.

February 06, 2020

A very old song that I wrote when I was about 17, inspired by melodic pop-punk of Buzzcocks and The Undertones. Shez and I gigged it in a school band, then I forgot it. When Pete Shelley of Buzzcocks died, I remembered it, so recorded it. My old chum Shez played bass when we were in a school band, and mixed it yesterday, 37 years later!

She just loves to be loved.
She just needs to feel needed
And you know she will tear you in half in the end.

She just likes to feel liked
And it doesn’t really matter who by
And you know she will break your heart, my friend.

Don’t ask her does she love you?
You’ll get a vague reply.
So what, she said she needs you?
Would she look you in the eye?
And when she upsets you
Don’t let her see you cry.
She feeds on your emotions
She’s gonna bleed you dry.

You thought that you’d got her to keep.
She says the novelty wore off after a week.
And you know she just loves to be loved.

She’ll love you for ten days
and then she won’t remember your face
And you know she just loves to be loved.

And now that you are just her ex,
and you see she’s moved on to her next.
And you know she just loves to be loved.

Everyone knows she just loves to be loved.

Words and music © Bruce Lawson 1983, all rights reserved.

January 31, 2020

Reading List 248 by Bruce Lawson (@brucel)

Came across this quote from It Doesn’t Have to Be Crazy at Work today and it resonated with me:

Happiness is shipping: finishing good work, sending it off, and then moving on to the next idea.

I’ve not shipped as much as I’d have liked over the past few years, so this feels like a good mantra.

January 30, 2020

Newsletter reboot by Marc Jenkins (@marcjenkins)

I’m relaunching my newsletter this week. If you want to get a monthly email from me that includes links to the latest articles I’ve written, as well as recommendations for interesting articles, books or tools I’ve come across, then sign up today.

I’ve just published some updates to my /Uses page. I cover the hardware and software I’m currently using and my current desk setup. Hat tip to Harry Roberts, Wes Bos and the excellent Uses This site for inspiration.

Suits you? by Andy Wootton (@WooTube)

Last night I went to a ‘Product Tank Birmingham’ workshop on ‘Empathy Mapping’. As an exercise, we looked at ‘a product meeting group’ and tried to identify its customers. There was a brief discussion about ‘Product Owners’ (from agile software development) and ‘Product Managers’ who often have a more marketing-led approach. Someone then commented on what ‘Product people’ think. I found I didn’t agree. I reflected on the difference between Product Owners (in this context: me), who care about giving people the product they want and Product Managers, who seem to care more about people’s relationship with the product.

I realised there is a half-way house and I have not, to date, worked in it. My experience in agile software development has been about “custom” development of software products for small teams with a shared view of what they want. I’ve realised for a while that my experience is very different to those Product Owners who have to develop a more generic product to ‘optimise’ across a set of potential or actual customers who have differing needs. There is an extra role there which is far more like my understanding of Product Management. I think the key difference is the need to correctly judge the closeness of fit needed to achieve mass market appeal vs the bespoke tailoring trade that I’ve worked in.

Early in my career, I worked as a programmer on a software package for pharmaceutical companies. We coded to specifications provided by 2 people, a salesman and our technical manager, who both travelled the world visiting customers’ sites. Looking back, I think the salesman was much better at identifying the features that would be valued by most customers. Is marketing USEFUL?

Being that this is a .44 Magnum, the most powerful handgun in the world, and would blow your head clean off…
You’ve got to ask yourself one question: do I feel lucky?
— “Dirty” Harry Callaghan

Kinda, Harry.

I am pretty lucky, after all. I have work I like, friends I like, my daughter, there’s a pie shop within walking distance, I’ve been hanging out ont he web writing these birthday posts for sixteen years now. And 44 is a “happy” number according to Wikipedia, and also the UK’s international dialling code. Internationalism is a lot on my mind, since Brexit happens tomorrow, and now I have to look at government guidelines on what I have to do when “travelling for business”, which speaking at conferences in Europe apparently counts as. I am sure that this will make my life more complicated; any time you have to jump through a bunch of hoops to fill out forms, someone will screw it up, and that someone is usually me. I wish being a metropolitan elite came with the benefits that it’s supposed to so I could counterbalance them.

Anyway, politics aside, let’s leave myself another note for next year. I’m spending some of today writing proposals for work, which is good stuff. Future me, this is the — how shall I describe it so that I know what it is but it remains secret? Let’s call it the Vicious Cabaret project. Looks like that may happen, which is cool. I’ve also made a bunch of progress during January on the top-secret Swordcello project, which shall remain under wraps, but wheels are moving. Things are OK, generally. I got this fantastic envelope around a card: it’s great having friends who are artists; nice one Gaby.

aliens invade, and call me out by name. And there's a Thor stamp.

Interestingly, last year I was at BrumPHP the day after my birthday; this year, I’m there tonight! So pop along; might be a pint or two.

Happy birthday to me.

January 29, 2020

All My Endeavour by Stuart Langridge (@sil)

A discovery.

What a return for all my endeavour—
Not to mention the L. S. D!
I am an atheist now and for ever,
Because this God has afflicted me!

It’s from Rudyard Kipling’s Natural Theology, which I’d never read and which I wholly intend to mine for lines for imploring sympathy next time I’m suffering from manflu or have a hangover or something, after having read Neil Gaiman do the same back in 2004. He was actually ill, though.

Did close friends call Rudyard Kipling “Rudy”? It’s actually short for his name, although it doesn’t sound like it. Maybe I’ve been pronouncing it wrong all these years: is he “Rudy-ard” rather than “Rud-yard”?

In fifty minutes it’s my birthday, although the annual birthday post will have to wait until tomorrow.

Yes, I know he was talking about currency. Albert Hoffman didn’t synthesise LSD for another 19 years. But it’s funny.

Pairing in Github by Graham Lee

In the world of free software, it’s good to appropriately credit contributors to your community for the work they do.

git makes this hard when you pair program. I was at a hackathon recently, and while I didn’t make a single commit, I sat next to a lot of other people who made plenty of commits based on conversations we had, and suggested a lot of things to try to debug problems, and invented solutions that made it into those commits. No highly-nutritious green squares in github for me, no external evidence that I had contributed two days of my time to these free software projects.

When I pair, if I’m committing, I make sure that I acknowledge the contribution my pair makes as equal to my own. In the github UI, it looks like this. You can see that both of us contributed to the commit.

How do I do this? I commit like this:

git commit -m 'We fixed this thing' --author 'Jennifer H. Pair <>'

Now both accounts are linked in the UI, because I’m the committer and my pair is the author. This isn’t perfect, because github doesn’t acknowledge the author in their contribution graph, only the committer. If there’s a more egalitarian way to acknowledge my pair I’d want to follow that, but for the moment I’m happy to at least demonstrate that they authored the change I typed into a text editor.

January 27, 2020

Offset Earth by Marc Jenkins (@marcjenkins)

A small win last week: I signed up for Offset Earth. For a small monthly fee, you can offset your carbon footprint by planting trees.

January 25, 2020

Write more by Stuart Langridge (@sil)

I’ve written a couple of things here recently and I’d forgotten how much I enjoy doing that. I should do more of it.

Most of my creative writing energy goes into D&D, or stuff for work, or talks at conferences, or #sundayroastclub, but I think quite a lot of it is bled away by Twitter; an idea happens, and then while it’s still just an idea I tweet it and then it’s used up. There’s a certain amount of instant gratification involved in this, of course, but I think it’s like a pressure valve; because a tweet is so short, so immediate, it’s easy to release the steam in a hundred tiny bursts rather than one long exhalation. I’m not good at metaphors, but in my head this seems like one of those thermometers for charities: my creative wellspring builds up to the overflow point — call it the value of 50 — and so I tweet something which drops it back down to 48. Then it builds up again to 50 and another tweet drops it back to 48, and so on. In the old days, it’d run up to fifty and then keep going while I was consumed with the desire to write but also consumed with the time required to actually write something, and then there’d be something long and detailed and interesting which would knock me back down to thirty, or ten, or nought.

I kinda miss that. I’m not sure what to do about it, though. Swearing off Twitter isn’t really an option; even ignoring the catastrophic tsunami of FOMO that would ensue, I’d be hugely worried that if I’m not part of the conversation, part of the zeitgeist, I’d just vanish from the public discourse. Not sure my ego could cope with that.

So I’m between the devil and the deep blue sea. Neither of those are nice (which, obviously, is the point) but, like so many people before me, and I suspect me included, I think I’m going to make an effort to turn more thoughts into writing rather than into snide asides or half-finished thoughts where maybe a hundred likes will finish them.

Of course I don’t have comments, so your thoughts on this should be communicated to me via Twitter. The irony hurricane proceeds apace. (Or on your own weblog which then sends me a webmention via the form below, of course, but that’s not all that likely yet.) Check in a month whether I’ve even remotely stuck to this or if I’ve just taken the easy option.

January 24, 2020

New Starter: Andrew Fletcher

Has learning all about Sam left you eagerly wanting more? Never fear, we have you covered. Continuing with our series of posts introducing our new starters we would like to introduce another new member to the super talented Made family.

Next up…

What is your name?
Andrew Fletcher

And Where are You from?
The Venice of the North - Birmingham

Digital Analyst

What is it you do?
My main responsibility is to offer support and expertise to our clients when it comes to their digital marketing endeavours.  This can obviously cover a wide variety of requests, such as producing and delivering SEO plans, problem-solving tracking and analytics issues, advice on digital marketing strategy and managing marketing campaigns.

Tell us a little about your professional journey to Made?
I have over 8 years of digital marketing and data analysis experience, 5 of which was spent at Drayton Manor Park, where my office was opposite the ‘Accelerator’ (Formerly Ben10) rollercoaster.  So I feel I have acquired quite a bit of knowledge and insight into the challenges organisations have, trying to persuade potential customers to purchase tickets to an event. 

Before that, I worked at MobileFun, who sold mobile phone accessories all over the world.  It is here where I found my calling in digital marketing and analytics.

I am passionate about getting actionable insights from data and how this insight can help maximise ROI on marketing activity and digital investment.

I also have a degree in Drama. I felt if I couldn’t have a career on the stage or around the stage, helping those that do was just as good.

What do you like doing when you’re not working?
I used to like doing a wide variety of things, from video gaming to watching sports, but that all seems a distant memory now that I have a 2-year-old son. Now I spend most of my time making sure he hasn’t put the TV remote in the washing machine or the car keys in the bin.

What is your proudest achievement?
I once managed a 12 dart checkout in darts; I’ve called myself Andrew ‘The Archer’ Fletcher ever since.

What is your slogan in life?
Only worry about the things you can actually affect or change.  

What is the best thing you’ve ever seen performed?
Julius Caesar at the RSC. I went on a school trip when I was about 12. Blew me away and gave me a lifelong love of the theatre and togas.

‘Alexa…’ or 'Hey Google…’?
Hey Google…  turn the heating down (I’m sure my wife was raised in a volcano).

If you were an Animated Character, who would you be and why?
Carl (the elderly man) from Up - I’m just a little grumpy and want to be by myself from time to time.

What would the title of your autobiography be?
'Don’t waste your money’… It’s a very short book

What is the best thing you’ve MADE for someone or have had MADE for you?
I made a Star Wars mobile for my son before he was born. X-Wings, TIE-Fighters and Star Wars music — even I was impressed by my handy work.  It was the first thing I did when my wife told me she was pregnant. I think it was my nesting stage.

Reading List 247 by Bruce Lawson (@brucel)

Hello, you divine diplodocus! Here’s the best of my reading from the last 2 weeks. Last week I was sunning myself in Marbella, Spain, at Forum for the Future, as a guest of the Joomla community. (I’m on their Open Source Matters Advisory Board.)

Anyhow, here we go!

January 23, 2020

I’ve been using Goodreads to track the books I’ve read since 2014. Since then, I’ve read on average 18.3 books per year.

I don’t have a reliable way to track how much time I spend reading, but anecdotally it’s around 20 minutes per day. I read in dribs and drabs. On one day I’ll read for hour and then I won’t read a thing for days on end.

Assuming I live to the age of 80 and that I’ll be reading until the day I die, that gives me 47 book-reading-years left.

At my current rate of reading, I have 860 books left to read in my life time.

If I was to increase my reading time to 30 minutes per day, that’ll mean I’ll be getting through 27.5 books per year. That now means I could get through an additional 432 books, a total of 1292 books in my remaining years.

Now, let’s push this further and say I read for an hour a day. It may sound like a lot, but most of us watch far more TV than that in any given day. A few small habit changes and it’s possible to read more.

Reading for an hour daily means I’ll be getting through 55 books in a year. At this rate I could get through 2858 books before the age of 80, 1725 more just from increasing the time I read from 20 to 60 minutes per day.

That’s why I’m going to push myself to read for at least an hour every day.

January 21, 2020

An old Mac Mini server was ‘going in the skip’ because it had been replaced as an office server. It was handed to me instead, due to my reputation as an IT dumpster diver. (server model: 2.66 GHz Core 2 Duo (P8800))

I did MANY upgrades to get it to the latest release, 10.13 High Sierra. A couple of weeks later, Apple announced that they were stopping further updates. I understood at the time this was because this generation of hardware had a 32-bit EFI boot system, despite being a 64-bit processor and that it was only possible to boot Ubuntu by modifying the Ubuntu OSI image. This may have been true at the time. I’ve tried to get to know MacOS but it sometimes feels really sluggish on this hardware and now I’m not seeing the latest features, I decided to consider giving up the struggle.

Today, I tried to boot an Ubuntu 64-bit image from a ‘live’ USB memory stick I’d built on another Ubuntu system. I wanted to see how it would fail. To my surprise, it booted. I had to go into Settings to add a WiFi connections. The only problem I had was that tinny sound came from the Mac Mini’s internal speaker. When I plugged the headphone socket to the TV, rather than being routed by HDMI and the TV’s stereo sound inputs as Mac OS would do, I had no sound. A full install might fix that.

You get (this) Mac to boot from another device by pressing the <Alt> key at startup.
(This didn’t work on a white iMac with a Core 2 Duo processor when I tried months ago but that was probably an earlier version of Ubuntu.)

January 19, 2020

Number word sequences by Stuart Langridge (@sil)

I was idly musing about number sequences, and the Lychrel algorithm. If you don’t know about this, there’s a good Numberphile video on it: basically, take any number, reverse it, add the two, and if you get a palindrome stop, and if you don’t, keep doing it. So start with, say, 57, reverse to get 75, add them to get 57+75=132, which isn’t a palindrome, so do it again; reverse 132 to get 231, add to get 132+231=363, and that’s a palindrome, so stop. There are a bunch of interesting questions that can be asked about this process (which James Grime goes into in the video), among which are: does this always terminate? What’s the longest chain before termination? And so on. 196 famously hasn’t terminated so far and it’s been tried for several billion iterations.

Anyway, I was thinking about another such iterative process. Take a number, express it in words, then add up the values of all the letters in the words, and do it again. So 1 becomes ONE, and ONE is 15, 14, 5 (O is the fifteenth letter of the alphabet, N the fourteenth, and so on), so we add 15+14+5 to get 34, which becomes THIRTY FOUR, and so on. (We skip spaces and dashes; just the letters.)

Take a complete example: let’s start with 4.

  • 4 -> FOUR -> 6+15+21+18 = 60
  • 60 -> SIXTY -> 19+9+24+20+25 = 97
  • 97 -> NINETY-SEVEN -> 14+9+14+5+20+25+19+5+22+5+14 = 152
  • 152 -> ONE HUNDRED AND FIFTY-TWO -> 15+14+5+8+21+14+4+18+5+4+1+14+4+6+9+6+20+25+20+23+15 = 251
  • 251 -> TWO HUNDRED AND FIFTY-ONE -> 20+23+15+8+21+14+4+18+5+4+1+14+4+6+9+6+20+25+15+14+5 = 251

and 251 is a fixed point: it becomes itself. So we stop there, because we’re now in an infinite loop.

A graph of this iterative process, starting at 4

Do all numbers eventually go into a loop? Do all numbers go into the same loop — that is, do they all end up at 251?

It’s hard to tell. (Well, it’s hard to tell for me. Some of you may see some easy way to prove this, in which case do let me know.) Me being me, I wrote a little Python programme to test this out (helped immeasurably by the Python 3 num2words library). As I discovered before, if you’re trying to pick out patterns in a big graph of numbers which all link to one another, it’s a lot easier to have graphviz draw you pretty pictures, so that’s what I did.

I’ve run numbers up to 5000 or so (after that I got a bit bored waiting for answers; it’s not recreational mathematics if I have to wait around, it’s a job for which I’m not getting paid). And it looks like numbers settle out into a tiny island which ends up at 251, a little island which ends up at 285, and a massive island which ends up at 259, all of which become themselves1. (You can see an image of the first 500 numbers and how they end up; extending that up to 5000 just makes the islands larger, it doesn’t create new islands… and the diagrams either get rather unwieldy or they get really big and they’re hard to display.2)

A graph of the first 500 numbers and their connections

I have a theory that (a) yes all numbers end up in a fixed point and (b) there probably aren’t any more fixed points. Warning: dubious mathematical assertions lie ahead.

There can’t be that many numbers that encode to themselves. This is both because I’ve run it up to 5000 and there aren’t, and because it just seems kinda unlikely and coincidental. So, we assume that the fixed points we have are most or all of the fixed points available. Now, every number has to end up somewhere; the process can’t just keep going forever. So, if you keep generating numbers, you’re pretty likely at some point to hit a number you’ve already hit, which ends up at one of the fixed points. And finally, the numbers-to-words process doesn’t grow as fast as actual numbers do. Once you’ve got over a certain limit, you’ll pretty much always end up generating a number smaller than oneself in the next iteration. The reason I think this is that adding more to numbers doesn’t make their word lengths all that much longer. Take, for example, the longest number (in words) up to 100,000, which is (among others) 73,373, or seventy-three thousand, three hundred and seventy-three. This is 47 characters long. Even if they were all Z, which they aren’t, it’d generate 47×26=1222, which is way less than 73,373. And adding lots more doesn’t help much: if we add a million to that number, we put one million on the front of it, which is only another 10 characters, or a maximum added value of 260. There’s no actual ceiling — numbers in words still grow without limit as the number itself grows — but it doesn’t grow anywhere near as fast as the number itself does. So the numbers generally get smaller as they iterate, until they get down below four hundred or so… and all of those numbers terminate in one of the three fixed points already outlined. So I think that all numbers will terminate thus.

The obvious flaw with this argument is that it ought to apply to the reverse-and-add process above too and it doesn’t for 196 (and some others). So it’s possible that my approach will also make a Lychrel-ish number that may not terminate, but I don’t think it will; the argument above seems compelling.

You might be thinking: bloody English imperialist! What about les nombres, eh? Or die Zahlen? Did you check those? Mais oui, I checked (nice one num2words for supporting a zillion languages!) Same thing. There are different fixed points (French has one big island until 177, a very small island to 232, a 258, 436 pair, and 222 which encodes to itself and nothing else encodes to it, for example.Not quite: see the update at the end. Nothing changes about the maths, though. Images of French and German are available, and you can of course use the Python 3 script to make your own; run it as python3 no for Norwegian, etc.) You may also be thinking “what about American English, eh? 101 is ONE HUNDRED ONE, not ONE HUNDRED AND ONE.” I have not tested this, partially because I think the above argument should still hold for it, partially because num2words doesn’t support it, and partially because that’s what you get for throwing a bunch of perfectly good tea into the ocean, but I don’t think it’d be hard to verify if someone wants to try it.

No earth-shattering revelations here, not that it matters anyway because I’m 43 and you can only win a Fields Medal if you’re under forty, but this was a fun little diversion.

Update: Minirop pointed out on Twitter that my code wasn’t correctly highlighting the “end” of a chain, which indeed it was not. I’ve poked the code, and the diagrams, to do this better; it’s apparent that both French and German have most numbers end up in a fairy large loop, rather than at one specific number. I don’t think this alters my argument for why this is likely to happen for all numbers (because a loop of numbers which all encode to one another is about as rare as a single number which encodes to itself, I’d guess), but maybe I haven’t thought about it enough!

  1. Well, 285 is part of a 285, 267, 313, 248, 284, 285 loop.
  2. This is also why the graphs use neato, which is much less pleasing a layout for this than the “tree”-style layout of dot, because the dot images end up being 32,767 pixels across and all is a disaster.

In someone else’s project (which they’ll doubtless tell you about themselves when it’s done) I needed a tiny Python templating engine. That is: I wanted to be able to say, here is a template string, please substitute a bunch of variables into it. Now, Python already does this, in about thirty different ways, and str.format or string.Template do most of it as built-in.

str.format works like this:

"My name is {name} and I am {age} years old".format(name="Stuart", age=43)

and string.Template like this:

    "My name is $name and I am $age years old"
    ).safe_substitute(name="Stuart", age=43)

Both of which are pretty OK.

However, what they’re missing is loops; having more than one of a thing in your template, and looping over a list, substituting it each time. Every even fractionally-more-featureful templating system has this, whether Mustache or Jinja or whatever, of course, but I didn’t want another dependency. All I needed was str.format but with loops. So, I thought, I’ll write one, in about four lines of code, so I can just drop the function in to my Python file and then I’m good.

def LoopTemplate(s, ctx):
    def loophandler(m):
        md = m.groupdict()
        return "".join([LoopTemplate(md["content"], val)
                        for val in ctx[md["var"]]])
    return re.sub(r"\{loop (?P<var>[^}]+)\}(?P<content>.*?)\{endloop\}",
                  loophandler, s, flags=re.DOTALL).format(**ctx)

And lo, twas so. So I can now do

    "I am {name} and my imps' names are: {loop imps}{name}{endloop}",
        "name": "Stuart",
        "imps": [
            {"name": "Pyweazle"}, {"name": "Grimthacket"}, {"name": "Hardebon"}

and it all works. Not revolutionary, of course, but I was mildly pleased with myself.

Much internal debate about whether loophandler() should have been a lambda, but I eventually decided it was more confusing that way, on the grounds that it was confusing me and I knew what it was meant to be doing.

A brief explanation: re.sub lets you pass a function as the thing to replace with, rather than just a string. So we find all examples of {loop something}...{endloop} in the passed string, look up something in the “context”, or the dict of substitution variables you passed to LoopTemplate, and then we call LoopTemplate again, once per item in something (which is expected to be a list), and pass it the ... as its string and the next item in something as its context. So it all works. Of course, there’s no error handling or anything — if something isn’t present in the context, or if it’s not a list, or if you stray in any other way from the path of righteousness, it’ll incomprehensibly blow up. So don’t do that.

January 16, 2020

New Starter: Sam Harper-Wallis

Here at Made, we are always on the look-out for talented and passionate people who can help us on our mission to provide clients with a first-class service. 

Over the past few months, we have been lucky enough to find a few such individuals, so over the coming posts, we wanted to introduce you to them officially,  whilst also welcoming them into the Made family.

We asked our new starters to answer a few questions to try and learn a little more about them and we thought we would share their answers with you. 

First up…

What is your name?
Sam George (only if I am naughty) Harper-Wallis

And where are you from?

Digital Project Manager

What is it you do?
In a sentence…
I facilitate the delivery of the scope of a project for Made Media’s clients.

In a paragraph…
My job as a project manager involves many different functions: cat herder, scope wrangler, delivery man. As a PM it’s my job to watch over and coordinate projects to make sure that we can give the client exactly what they need on time and budget. Day to day this includes project client calls, trello management, testing, SoW writing, sprint briefing, requirement defining, and dependency gathering.

Tell us a little about your professional journey to Made?
In 2010 I went to university in Manchester to study Cellular Molecular Biology. I always had a passion for science, especially biology, so it was an easy choice.

After completing university I started to look for a job so naturally as a newly minted science graduate the obvious choice was to become a recruitment consultant. I did this job for around 6ish months, before being moved into a contracts manager/business manager role to scout out for new business opportunities.

I then fell into a product owner role with a new business being spun out from my company, focusing on supply teachers for the education sector. While working as a product owner, I was also dipping into project management. I really enjoyed this side of the business, so I decided to look for a job with an agency which my mentor at the time suggested would be the best challenge for me.

I moved to a small bespoke agency in Manchester, but I knew I wanted to move back home, so in May 2018 I decided to take an opportunity in Birmingham as a Digital Project Manager, with another agency based in the Jewellery Quarter. During my first year, I worked with some massive clients and really honed my project management skills.

Through this project management work, I started to work with the operations director who helped me implement changes which improved company-wide cohesion. I was then offered a new role that sat between the account and studio team. Here I was the gatekeeper for all things process. The studio process, work request process, support and SLA process. During this time I implemented new processes to improve efficiency. I did this for over half a year but my heart was elsewhere. I wanted to get back in front of clients and deliver great projects which I can be proud of.

In October I had an interview here at Made. We take a really pragmatic approach to development resource and project management which appealed to me. So I was extremely pleased when I was offered the job as a project manager.

I joined in November and so far I am loving every day! 

What do you like doing when you’re not working?
Mostly cooking, gardening, eating, walking the doggo.

What is your proudest achievement?
I completed Bravo Training in the Army Reserves. I started my 16 days of training at Grantham, getting up at 5 am and going to bed, at some times 11 pm.  This wasn’t the hard part, nor the constant exercise or sleeping in the cold or even drills. It was being away from my girlfriend Hannah.

What is your slogan in life?
You can’t control people’s actions but you can control your reactions to them.

What is the best thing you’ve ever seen performed?
Cirque du Soleil.

‘Alexa…’ or 'Hey Google…’?
Hey Google…

If you were an Animated Character, who would you be and why?
My girlfriend helped me answer this as I was struggling - “You’re Jimmy Neutron - You have a massive head, not because you’re clever, you just have a massive head”.

What would the title of your autobiography be?
The man with a massive head.

What is the best thing you’ve MADE for someone or have had MADE for you?
I make the best lasagne - FACT.

January 15, 2020

I loved reading Patrick Collison’s Fast Project. He has compiled a list of ambitious projects that were completed incredibly quickly. Some of my favourite examples include the iPod shipping in 290 days after being started and Amazon Prime being brought to life in 6 weeks.

January 13, 2020

After a few weeks off over the holiday period, I’ve been using The Theme System Journal to help get my habits back on track.

These are the daily habits I’m currently tracking:

  1. Reading (20 mins+)
  2. Writing (20 mins+)
  3. Complete highlight
  4. Deep work (3 hours+)
  5. Meditate
  6. Close activity rings
  7. Go for a walk
  8. No alcohol
  9. Finish work at 5:30pm

January 10, 2020

Reading List 246 by Bruce Lawson (@brucel)

Happy Nude Year, you perfectly pouting porcupine!

January 09, 2020

Last year, I started my review with this:

One of the wonderful benefits of these annual reviews is that it encourages you to look back at the year as a whole. I was reminded that 2018 was actually a really good year.

It’s true: these reviews are a great way to reflect on the year and they help remind you how much you’ve accomplished. I nearly didn’t write a review this year. 2019 was a mixed bag and it didn’t feel like there was much to share. But as this is my fifth annual review (see 2015, 2016, 2017, 2018), I knew I’d regret it if I didn’t publish this.

So, with that said, here was my 2019.

What went well

Completed the house extension. Boy does it feel good to write those words! We started planning the house extension in late 2017 and it has taken up a good amount of our time and energy since then. We’ve added an additional bedroom, doubled the size of an existing bedroom, increased the size of our bathroom, and added a utility room and a garage. It was stressful at times – it often felt like a new problem would present itself daily – but my wife and I worked through each issue together and that has made us closer. It’s the biggest thing we’ve worked on and accomplished together.

Home office improvements. As part of the house extension, my home office got an upgrade. My old office was in a small bedroom which wasn’t even big enough to fit a double bed. The new office is much more spacious. I’ve added additional storage and my favourite new addition: a reading chair. It’s great being able to move from my desk and sit in comfort with my iPad to plan the day, read or just think. I’m looking forward to improving the office further in the coming year.

My current desk setup
My favourite new additional to the office: a reading chair

5 years of self-employment. November marked my 5th anniversary of self-employment. It can’t believe it has been that long. This year has been kind to my business – I’m on track to have my best financial year yet and have signed up new clients that I’m excited to work with. I’m still transitioning from freelancer to consultant, and that has been both challenging and rewarding.

Health & diet. My wife and I switched to a pescatarian diet in November 2017. Throughout the past year, we’ve gradually eaten less fish and dairy and most of the meals we eat are vegan. I’m not sure we’ll ever go completely vegan, but my energy levels have improved and my weight has stabilised from eating a mostly plant-based diet. The Apple Watch continues to play a big role in keeping me active. I try to close my activity rings most days and in November I got my first Perfect Month badge. I’ve also been using Pedometer++ for step counting and managed to complete 10 out of 12 monthly challenges.

Reading. While I only read 16 books in the past year, the amount of books I read outside my usual comfort zone was higher (mostly thanks to the book club I participate in). Books like The Lessons of History, Educated and A Million Miles in a Thousand Years are not books I would have picked to read, but I learnt a lot from them and enjoyed them greatly.

A few other things that I’ve enjoyed or accomplished in 2019

  • I jumped out of a plane for the first time and I can’t wait to do it again. The adrenaline rush is like nothing else I’ve experienced.
  • I started meditating regularly again using the Waking Up app (the 50 day introductory course is incredible, I couldn’t recommend it more highly).
  • I started using the Theme System Journal to track my habits and keep focused during the day (I’ll be writing about this soon).
  • I’ve continued cutting down on my social media usage after deleting my Facebook account in 2018. I’ve only tweeted a handful of times and I finally deleted Instagram in November. It feels great.
  • I went to watch the Allam British Open Squash Championships in Hull. One of the games we saw just so happened to be the game of the season.
  • We had our first vegetarian tasting menu at Carters of Moseley to celebrate our wedding anniversary. It was superb.
  • I upgraded to the iPhone 11 Pro. I’m so pleased with both the camera and battery performance. I’m taking more photos as a result.
  • I travelled to Amsterdam to work with the guys at modmore. It’s a beautiful city and I can’t wait to return so I can explore more of it.
  • We also travelled to Barcelona to celebrate New Years with our good friends Stu and Chloe. The inside of the Sagrada Família was a highlight.
  • And a shout out to my mastermind group for their help and support. It has been amazing to watch and learn from them.

What went badly

Overworking. The house extension was tough. We spent much of our spare time in the first half of the year painting and decorating. As the house extension was nearing completion, I promised myself I’d dedicate all of my energy to my business once it was done. And I did that, but at a cost. I spent too many days and weekends working long hours. It wasn’t all that bad: I rebuilt my emergency savings fund and produced a lot of good work. But it’s not something I want to continue. Getting my work/life balance right is going to be a primary focus for 2020.

Over consumption. Despite cutting back on social media, I still felt I over consumed on media this year… news, politics and too many podcasts. I’m a podcast junky: I fill every spare moment with sound from my AirPods. I can’t remember the last time I took a walk without headphones in. I recognise that I need to change, so 2020 is the year that I allow more silence into my life.

Writing habit. This one is simple: I didn’t prioritise or make time for writing this year. I have started redesigning my blog ready for more writing and publishing. Of all my goals for the coming year, I want “writing” to be in my “what went well” section of my 2020 review.

Relationships. It’s hard to share this one as it’s so personal, but I’ve not invested enough time or effort in my family and friendships this year. Nor have I invested enough in my own marriage. I was distracted by other things, when really relationships are the most important thing I have. I know I can do better.

How I did against my 2019 goals

Complete the house extension. Done. We’re really happy with how this has gone. Score: A

Systems for my business. I’m in a better place with systems than I was this time last year, but there’s still more to do. Score: C

Reading. I only read 2 fiction books (6 was my target). And while I only read 16 books total, the quality and diversity of books I read this year was better than previous years. Score: C

Writing. Ugh. Score: F

Continue with our pescatarian diet, tweaking and finding new healthy recipes. I only stumbled and eat meat once (when I was stuck in Amsterdam airport for 24 hours due to a cancelled flight). We’ve found a bunch of new recipes we like and I enjoy cooking more than ever. Score: B

Improve the quality of my sleep with a better shutdown ritual in the evening. I never got a shutdown ritual to stick, but I have been tracking my sleep and have been going to bed at a consistent time. Score: C

Close the activity rings daily on my Apple Watch. Pretty good year for this, got my first perfect month and closed my activity rings on more days than not. Score: B

Start my daily meditation practice again. I’m not meditating every day, but in the last few months in particular I have been meditating most days. Score: C

Continue playing squash 2-3 times per week. It has been a great year for my squash playing and I’ve enjoyed it a lot. Score: A

Things I’m thinking about for 2020

Setting a yearly theme. I’m a long-time Cortex listener. A recurring topic on the show is yearly themes. Myke explains:

Instead of resolutions, we set an overall idea of how we would like to approach each year or season. This becomes almost like a guiding principle for our work and/or personal lives for that period.

I’m been thinking about my 2020 theme for a while and I’ve decided it’ll be The Year of Calm. Last year was frantic, my calendar was full and I had little down time. I want to change that. I’ll be sharing more about this soon.

Less contract work. In the past year, I’ve done a reasonable amount of contracting for local web development agencies. I’m in the process of shifting my business to focus more on my own clients and projects.

Blogging on my personal website. At the end of December, I spent a week redesigning this site. The feeling of having a new website makes me excited about writing again.

Build and release a product. I’ve been discussing some ideas with a friend. All that is left is the hard part: building and shipping it.

Fitness and health. I want to kit my garage out with some basic gym equipment, making it easier to do a morning workout. I’m also planning to do more hiking and cycling with the goal of increasing my base level of fitness. I’d like to reach my ideal body weight of 70kg (currently 75kg).

Environmental impact. The climate emergency we’re in is one of my biggest concerns. The recent scenes in Australia are heartbreaking. We’ve been taking small steps over the past few years, such as reducing single-use plastics, but I’d like to take that more seriously.

That’s all from me. Happy new decade!

January 07, 2020

When I started redesigning this website a few weeks ago, I started from a blank slate (an empty WordPress theme directory and a couple of Sass files that I use to start new projects). Since then, I’ve built out most of the core components to get the site looking reasonable.

On the surface, a blog design is simple. You have posts and pages and that’s usually about it. But when you dig deeper, you realise there’s lots of little design decisions that need to be made.

One such design decision is how blog posts are displayed. The previous version of my blog listed posts chronologically, like this:

The previous version of my blog listed blog posts by title

No dates, no content, just a list of blog posts. This approach is fine if each post is a self-contained topic, but it doesn’t feel particularly well suited to a ‘weblog’ where each post can vary in size. Clicking through to a post with two or three lines of text doesn’t feel right.

Now take Manton Reece’s blog as example:

Manton Reece’s blog

Manton’s blog has two types of posts: full articles and microposts. This is the approach I decided I wanted to take. Sometimes I just want to a share a thought or a link and several lines of text is all that is required. This smaller bite-size approach to blogging is called microblogging (incidentally, Manton runs

The design as it stands currently

This is the design I’ve ended up with. Very much inspired by Manton, I now have two types of post: a standard post and a note. I’m still experimenting with the format, but I hope that now that a post can be tweet-sized, it’ll make it easier to get back into the habit of publishing.

January 06, 2020

RUNOFF another copy? by Andy Wootton (@WooTube)

I was telling a story about my first job a couple of days ago. I was an ‘applications programmer’ at Cambridgeshire College of Art and Technology. There was an Argentinian lecturer who knew our systems. He asked if his wife could use the computer centre facilities to write up her research thesis during the Summer holidays. We were casual users of a text processing ‘tagging language’ for documentation. It was called DSR, Digital [Equipment Co.] Standard Runoff, so my colleague John suggested she used that. The ‘typing department’ had some fancy new ‘word processors’ (I think they were Wang) but we didn’t have any authority over them and wouldn’t be able to help her with problems. We also had doubts about whether they had the capacity for a whole thesis.

So it was that John and, in his absence, I provided occasional help to a charming, intelligent Argentinian woman during the outbreak of the Falklands War in 1982, while the British press ramped up the hatred of British idiots against the entire Argentinian nation. She was the first Argentinian I’d ever met and it was the first time I had any indication that fascism could also infect the UK or was personally shamed by the state of our newspapers. I remember us scooping up some hate-filled tabloid front page and dumping it, seconds before our guest arrived.

In later jobs I learned of Unix roff, nroff and troff and came to assume that Runoff was DEC’s version of the Unix tools. Today I discovered that isn’t true. DEC’s Runoff came from the common ancestor of the Unix tools, Runoff on CTSS then Multics (1964.)
“types out text segments in manuscript form.”

CTSS was also the original home of LISP, ALGOL and the text editor QED, the predecessor of ed, vi and vim.

January 02, 2020

December 24, 2019

For the 2018 festive season I started what I hoped would become a tradition of making Christmas gifts for my friends and family, by making eight wall-mounted bottle openers. I’d had the idea some time in late Autumn 2018, but it was early December before I started, and with everything else I had going on, that didn’t leave much time to do as good a job as I had wanted.

🎵 Last Christmas, I gave you my heart

In my mind I’d imagined elaborate bottle-shaped designs, with either magnets embedded in them or a little box under the opener, to catch the cap, but what I actually produced was less… good.

Amounting to little more than a cheap bottle opener mounted on a piece of pine, with a bit of chalkboard paint complimented with some chalk-based art by Lucy, and a coat of varnish, it’s hardly my best work. They didn’t even have a way of to attach them to the wall. Still, combined with the hampers Lucy and I made for everyone, I don’t think anyone was too disappointed. Except me.

Anyone who isn’t embarrassed of who they were last year probably isn’t learning enough.

Alain de Botton

This year I had a loftier ambition, and with a brand new workshop ready for use and a far longer lead time, I was going to continue the theme of alcoholic beverages by making everyone beer flight paddles.

🍻 Don’t worry, be hoppy

This was inspired by our holiday to Cyprus in May this year, where we partook in Beer Quest, an ale and cider tasting experience hosted by Aphrodite’s Rock Microbrewery. For just £45 you got transport from the hotel, a flight of home brewed beers or ciders, a huge platter of BBQ food, a tour of the brewery, and (most importantly) an open bar, before being transported back to the hotel again.

There’s a reason it’s listed at the top of things to do in Paphos.

Needless to say, there was very little activity from either Lucy or myself for the rest of that day, as we both opted for an early night.

🎅 Believe in your ‘elf

Fast forward four months, to early August, and I’d made some decisions about the paddles:

  • I wanted to use a wood other than pine
  • I wanted to use a finish other than paint or varnish
  • I wanted each paddle to be different

So, armed with little more than some inspiration from Pinterest, I ventured to Homebase and picked up the largest solid oak hobbyboard they did, and a handful of assorted cabinet handles, then popped next door to Homesense and picked up five sets of glasses, ranging in size from shot to pint.

When I got them home, I laid the board on my workbench, and after matching the handles I wanted to use for each set, I sat them on the board and placed them in different positions to find the best arrangement for each set with the most efficient use of the wood available.

Once I was happy with the layout, I used my table saw to chop the board down, then used a pencil and ruler to work out the exact positions of the holes for the glasses.

⛳ Hole in one

Now that I knew where I wanted the holes, I needed to find a way of making the holes. With one exception, none of the paddles were to have holes going all the way though, instead they were to be hollowed down to about half the thickness of the wood, which meant I’d not be able to use a holesaw, but something like a forstner bit should work well.

People don’t want to buy a quarter-inch drill, they want a quarter-inch hole.

Theodore Levitt

And it’s here that my ambition bit off just a little more than I could chew, as each of the glass sets were different sizes, with each requiring a hole larger than any of the forstner bits I already had. I solved this problem by putting my hand in my pocket and spending £55 buying four sets of bits from Amazon, ranging in size from 10mm right up to 90mm in diameter.

I knew that I’d not be able to use any of the larger bits in my hand drill, so had planned on using the drill press at Cheltenham Hackspace, but because the largest forstner bit had a shaft thicker than the chuck at the space could accommodate (oohh-eerrr), Andy from the space very generously let me use his personal drill press, and gave me some tips on how best to get the best results.

So while Lucy did some shopping at the Cheltenham retail parks, I got to work cutting the rest of the holes.

This went mostly OK, but as I started with the smallest holes, and gradually increased the sizes, I didn’t reduce the RPM on the drill as I increased, resulting in a little bit of burning on one of the flights, which I corrected for the next one. I also slipped a couple of times, resulting in some gouges in the wood, but nothing a bit of sanding can’t fix.

I also made the mistake of trying to go all the way though in one direction, thinking a sacrificial board underneath would help prevent tear-out. It didn’t. So for the other three holes needed for that paddle, I drilled a small hole in the centrer of each so I’d know where to start on the other side, then hollowed out half thickness on one side, then flipped it over and hollowed out the other half.

Two hours later, after having cut all the holes, and using the bandsaw to cut the paddle handle, I rescued Lucy from the rain.

💸 Money talks… but all mine ever says is good-bye

Now, I’m very happy being a member of the Cheltenham Hackspace – I’ve met some really nice people there, and in addition to the tools I’ve got access to, the expertise of the other members, and willingness to share it, is second to none.

But Cheltenham is 40 minutes down the M5, which isn’t exactly accessible, and means that when you find a mistake you’ve made after returning home, you can’t exactly just pop back to fix it.

The mistake in this instance was the size of the holes on two of the flights. After some experiments with the placement of the glasses I decided the holes for the skull glasses weren’t deep enough, and that the holes for the wobble glasses needed to not only go all the way through, but also needed to be slightly wider.

Now, despite it still being August at this point, with plenty of opportunity to get back to the space before Christmas to correct these issues, I’m an impatient person, and knew that waiting wasn’t going to scratch the itch I had.

It’s at this point I decided to buy my own pillar drill, and while I was spending money I might as well buy the tools from Aldi I’d had my eye on as well. Fast forward an amount money which was just a tad more than I could really afford, and I was soon the proud own of a bandsaw, belt and disk sander, a paint gun, a nailgun, and of course, a pillar drill.

🙋🏼‍♂️ Professional sawdust maker

With my new tools in tow, increasing the size of the holes was a doddle (and the new sander made it easy to smooth out the curves on the paddle), letting me move onto the next step of rounding over the edges with my router. My router table (also from Aldi, are you noticing a trend here?) is a bit fiddly to set to the correct depth, so it was important to use a piece of scrap wood to test it, but once this was dialled in, I made quick work of it, replacing all the sharp edges with a nice rounded ones.

More tricky was drilling holes for the handles, which needed precision of placement for any with more than a single screw. I also needed to shorten the screws (which were designed to be attached to far thicker things than my 18mm boards), which I did using a Dremel.

The penultimate step was to sand everything. I started with my random orbit sander for the main surfaces of each board, using 180 grit initially before moving to 240 grit. I was able to use a Rotary Flap Wheel Sander (attached to new pillar drill) to sand the inside of any holes which went all the way through, but in inside of any any partial holes needed regular sandpaper and elbow grease.

⚖ Oil be the judge of that

All that remained was to apply the finish, for which I’d opted to use Danish Oil. Applying three coats of oil, wiping off the excess after 5 minutes, and waiting 24 hours between coats, really brought out the natural beauty of the wood. Apparently it isn’t as protective as Lacquer or Varnish, but I think it should be more than suitable for the flights.

Once dried, I attached the handles, placed the glasses, and took these action shots:


In the time between when I originally wrote this post in late August, and Christmas day when it was published, I locked myself in the workshop and decided to put the remaining wood to good use, producing these additional pieces as gifts:

Oh, and I couldn’t go thought all that without at least making one bottle opener that I could be proud of:

I’m really happy with the way these have turned out, and am ever-so lightly jealous that I have to give them away, but happy to do so – I just hope they bring joy to their recipients – and then when I see them next, they’ll offer me a drink of something nice from them.

Happy Christmahanakwanzika!

December 20, 2019

Reading List 245 by Bruce Lawson (@brucel)

Merry Consumerfest, and a Happy Nude Year!

December 19, 2019

Brum tech pub crawl 2019 by Stuart Langridge (@sil)

It’s time for the Birmingham tech pub crawl! Saturday 28th December 2019.

This is called a pub crawl, but it’s really an excuse to get together, hang out, have a couple of drinks — alcoholic or not, that’s entirely up to you and there’s no pressure — in various places around the Jewellery Quarter. (There was discussion of being in the city centre, or in Digbeth, but since it’s a Saturday and we want to talk rather than scream over the music, the JQ it is.) Get away from the turkey and chill out and meet people. Bring your family and your friends along. Pop in for an hour while you’re in town and say hello, or show up at 12 noon and still be there at midnight, it’s up to you. Lots of people come at various points during the day, and it’s all very friendly, so if you don’t think you know anyone, or you’re on your own, that’s not a problem. Come, chat to people, have a drink, have a laugh. The agenda this year is, roughly, six different places and a couple of hours in each, so we move around a bit, but it’s all in the Jewellery Quarter so there’s not a lot of walking. If you’re feeling unsure do feel free to ping me — @sil on Twitter — and I can tell you where we are, and I’ll try to keep things updated during the day.

Everyone is welcome, and everyone is invited. Bring friends along; drink coffees or soft drinks; pop in for an hour; whatever you fancy. Tell everyone about your pressies, talk about all the tech you thought about over the Christmas period, or don’t talk about technology at all and just enjoy hanging out with your mates. Looking forward to seeing you all.

A rough agenda:

  • The Lord Clifden, 12pm - 2pm (they do food if you fancy lunch)
  • The Church, 2pm - 4pm
  • 1000 Trades, 4pm - 6pm
  • The Rose Villa Tavern, 6pm - 8pm (probably grab a bite to eat here if we haven’t already)
  • The Queen’s Arms, 8pm - 10pm
  • The Actress and Bishop, 10pm - whenever

December 17, 2019

One of my goals for next year is to write and publish more often (as it has been for the past few years and I’ve horrifically failed at). But, as everyone knows, before you can start writing you have to redesign your website.

This week I’ve booked out a chunk of time to redesign and rebuild my site from the ground up. The hope is that a fresh new site will provide the perfect platform to start writing and publishing again in the new year.

Here are a few of my thoughts as I start the project:

  • I’m sticking with WordPress and plan to fully embrace Gutenberg. I know there are lots of great platforms out there to choose from, but it makes sense to stick with what I know given that my business specialises in WordPress development.
  • I want the site to load as fast as possible. It will be minimalist in style and I’ll only include what is absolutely necessary.
  • I plan to use as little Javascript as possible and where I do, I’ll be using vanilla Javascript.
  • I’m going to stick with Sass. While I’ve enjoyed writing vanilla CSS again lately, there’s still a few things that I find useful: mixins, imports, etc.

The tools I’ll be using to build the website look something like this:

I’ll be “live designing” as I go, so the plan is to launch updates throughout the week. I’ll be sharing the process as I go.

December 15, 2019

Pyramid by Stuart Langridge (@sil)

I keep wanting this quotation and not being able to remember half the things in the list, so I’m putting it on my website: this is what websites are for.

It’s from The Official Slacker Handbook by Sarah Dunn, which I painstakingly tracked down and purchased a second-hand paper copy of to find this, and it reads:

Adam Weishaupt, founder of the Order of Illuminati, killed George Washington and served himself as our first president for two terms. The Illuminati are ultimately responsible for the French Revolution, the Bolshevik revolution, the American Revolution, the Pope, the Kennedy assassination, the Manson family, the Rockefeller dynasty, the numbers 5, 17, and 23, the New Age movement, the Nazis, UFO visitations, the Universal Price Code, and the pyramid with the eye on the back of the dollar bill.

No comment on whether I believe any of this, but of course that’s just what they want you to think. Fnord.

December 07, 2019

December 06, 2019

Reading List 244 by Bruce Lawson (@brucel)

December 04, 2019

December 03, 2019

Accessibility made the UK national TV news yesterday, hot on the heels of a report The business case for inclusive design by the UK disability charity Scope, which shows that around 50% of disabled people couldn’t buy something online that they wanted.

An accessible site is therefore a huge business opportunity, given that the latest Purple Pound estimate is £274 billion. (The Purple Pound a proxy for the purchasing power of the disabled community.)

Here’s a 4 minute interview on Channel 5 News to help persuade your bosses/ colleagues of the business case for accessibility.

Most of the problems that Glen talks about are easy to diagnose and solve. In fact, last week I wrote a handy Checklist to avoid the most common accessibility errors. Use it and make more money while being a better person.

Free online course!

If you want to learn more, as it’s International Day of Persons with Disabilities, W3C launched an Introduction to Web Accessibility free online course in cooperation with UNESCO. Enrol from today; the course starts 28 January 2020.

November 30, 2019

I recently had one of those moments where some code failed, but not in the way I expected it to. To create a contrived example, the scenario was basically this:

class LocationsController < ApplicationController
  def update
    my_location = Location.find(params[:id])

This code won’t do what I want it to because I have defined the variable my_location but then passed location to another method. What I initially expected upon finding the bug is that I would have seen a NameError complaining that the local variable location didn’t exist. But I didn’t. As far as I could tell, location existed and it was nil.

It wasn’t referenced anywhere else in LocationsController, nor in ApplicationController. So what is it? Fortunately, Ruby provides a great way to find out.

class LocationsController < ApplicationController
  def update
    puts method(:location).source_location
    # "/usr/local/bundle/gems/actionpack-"
    # 149

That’s that mystery solved. There is a method called location implemented a layer or two up the inheritance hierarchy. We knew it had to come from somewhere, but source_location lets us determine the exact location.

November 27, 2019

Fitness & Motivation

With the year speeding towards an end I wanted to write something about 2019 and how fitness saved my freelance career.

Oh yeah… this article contains pictures of me with my boobs out, apologies in advance.

It’s no secret that I love and hate freelancing in equal measures. I’m the first to admit I’m not always the best at keeping healthy attitude towards myself and my work. Ask any of my online buddies and they’ll probably tell you at least once where I’ve complained to them and commented on wanting to take a “proper job”

Get a “proper” job??

Well 2019 was the first year where I almost did get a proper job. I was talking to several startups about taking a role with them, at first it was a fun flirt with “what ifs” and quickly became real when I was being asked for salary expectation.

Before I really could accept any of these roles I had to remind myself of the 11+ years I’d been working as my own boss and ask myself “Why are you looking for a job?”

The answer was all about Motivation. I had none. 11 years of freelancing had worn me down and you know what, I wasn’t that 26 year old that started freelancing either.

You’re too old!!

Another huge factor was my age. Things were changing, I was struggling with my skin, back pains, anxieties – all sorts.

I assumed taking a role would take away all the stresses of being your own boss and give me that buzz to go to work… I quickly realised I’d still be me… just in another role so had to go deeper to the problem.

I read online that energy levels and motivation can easily be linked with how healthy you are… so I decided to try and get fit.

Let’s start running

My fitness journey started when we moved house. We had moved to lovely Shrewsbury where the River Severn runs through. I had always wanted to run around the river so started slowly by doing the Couch to 5k. It was starting to work – I had hit my 5k target earlier and even worked up to just under 8km and then, BOOM. Injured.

That was mid-late 2018. For 3-6 months I did nothing about it. I had also hurt my back doing manual labour in the garden. I felt like I was falling apart!

So now I had these injuries, this boredom at work and no motivation to get anything done.

Let’s lift some weights

My wife had started going to a ‘Strong Girls’ club that was 1 hour strength training sessions ran by a lovely local couple Simon and Suze. Their company Core Fitness / Studio Four also did mens sessions but I didn’t like the idea… at first.

It took my wife about 6 weeks of suggesting I went to the mens sessions before I finally agreed to go – and I loved it.

It was nice to get out of the house and talk to people that wasn’t my dog. I was working muscles I never knew I had and then BOOM. Injury, the bloody back went again.

Let’s see a professional

This time I took my back injury seriously, booked into 3 Osteopath sessions (which didn’t really work for me) and 3 Chiropractor sessions (Which thankfully did work for me). The diagnosis was a strained butt (not even joking) and a strained neck.

After the 3 sessions I was feeling back to feeling some level of normal and excited to get started on the fitness sessions again.

Let’s seek dietary advice

At the same time I spoke to Suze about my skin, as a nutritionist she quickly got to the bottom of my skin woes. I was eating too much crap, snacking on sugar based foods. Turns out 90% of my foods were bad for people like me with Eczema. Inflammatory! I shouted.

Lets eat clean-ish

I quit sugar, dairy and wheat and my skin slowly retuned to normal. Don’t worry gang, the weekends are fairly full of cheat meals but I’ve never gone back to dairy or wheat.

Sugar is the one area I still struggle with but even now I’ve reduced my sugar LOADS. I’m sure I’ll be rebooting my sugar levels very soon don’t you worry.

Let’s train!

So back to the training. I’ve been going now for a solid 6 months – stronger each session. I’ve even started doing some PT with Simon, the hour a week is great to just focus on my body and not worry about work.

So currently Monday is PT, Tuesday is Strength Training, Thursday is Circuits and Saturday is a home workout. I love it. I’m addicted to working out.

The results are incredible.

Regardless of how I look I was back in the zone, firing on all cylinders. I was fitter than ever and people were noticing that I was looking healthy. Even my mother in Australia notices it via a blurry Skype session.

My productivity was back up, my confidence was up. Even the anxieties I was having before are fading away – leaving the house regularly is good for you… who knew??

The new me has since doubled down on freelancing and began working with startups and tech businesses more long term, less about the 5 day projects and more about the 6-12 month engagements.

My work has improved and honestly enjoy getting to my desk in the mornings. Earnings are up and my accountant is happy.

To avoid future back problems I also treated myself to a Herman Miller Aeron chair and making more use of my standing desk.

So this is my journey in photos below. I wasn’t huge to begin with but you can see how unhealthy I looked.

So TL;DR – Exercising and eating better has helped me focus, gain confidence, reduce anxieties and find love for my job once more.

I’m fairly confident nobody is reading this far down the page but feel free to tweet me with your own fitness-freelance stories. #freelancefit

Cat Photo by FuYong Hua on Unsplash
Hiring Photo by Free To Use Sounds on Unsplash
Photo by Aarón Blanco Tejedor on Unsplash

The post Fitness & Motivation appeared first on .

November 26, 2019

Last week I was moaning about the fact that 63% of developers surveyed don’t test accessibility. And I was banging on about editing a ‘learn HTML’ book which was riddled with basic accessibility errors, when Frederik replied in order to shut my whining and make me do something about it:

This isn’t a comprehensive guide to accessibility, but we’ll look at ways to avoid the most common accessibility errors identified by the WebAIM accessibility analysis of the top 1,000,000 home pages, and the HTTPArchive 2019 Web Almanac analysis of 5.8 million pages. I’m not going to get philosophical; if you’re reading this, I assume you care about why, and just want some tips on how. (But if you need to convince someone else, here’s the 4 minute business case for accessibility.)

Insufficient colour contrast

83% of homepages have low colour contrast. There are several ways to check this. I personally use Ada Rose Cannon’s handy Contrast Checker Widget, which sits in my bookmarks bar like a useful Clippy and goes through the current tab and highlights where there isn’t enough contrast. Or you can use Firefox’s Accessibility Inspector in the devtools to check and tweak the CSS until you get a pass. To check a particular combination of colours, contrastchecker will give you AA and AAA ratings. will tell you which particular types of visual impairments may have difficulty with your chosen colours.

Missing alternative text for images

A whopping 68% of homepages had missing alt text (NOT alt tags). Every <img> must have alternate text. Here are basic rules:

  1. If the image is purely decorative, it must have empty alt text: alt="". But it should probably be in CSS, anyway.
  2. If an image is described in body text it should have empty alt alt="", to avoid repetition. But be careful if it’s an <img> in a <figure> (hat-tip to Mallory).
  3. If an image is the content of a link (for example, your organisation’s logo can be clicked to go to the homepage) the alternate text should describe the destination of the link. For example, alt="home page".

Heydon Pickering’s revenge.css bookmarklet does a quick and easy test to diagnose these, although I feel some of its other warnings are now outdated – I’ve filed an issue.

Empty links, empty buttons

I don’t know why anyone would do this, but apparently 58% of homepages tested had empty links, and 25% had empty buttons. I’m assuming this means they were empty of text, and contained only an image or an image of text. In the case of buttons, HTTPArchive Almanac says “often the reason this confusion occurs is due to the lack of a textual label. For example, a button displaying a left-pointing arrow icon to signify it’s the “Back” button, but containing no actual text”. (They found 75% of pages do this.) If that’s the case, the image needs alternate text that describes the function of the button or destination of the link. And don’t use icon fonts.

Use Heydon’s revenge.css bookmarklet to diagnose these.

Missing form input labels

52% of homepages had missing form labels. I prefer to wrap the label around its input like this:

<label>Email adddress: 
  <input type="email" />

I find it’s more robust than associating a form with a label using the for="id" pattern. If you can’t use an HTML label element, you can label an input for assistive technology using aria-label="useful instruction" or (less useful) a title attribute on the input. Use Heydon’s revenge.css bookmarklet to test these. WebAIM has more advanced form labelling techniques.

Missing document language

23% if homepages didn’t declare the human language of the document. This matters because (for instance) the word “six” is pronounced by a French screen reader very differently from an English screen reader. It’s simple to do: <html lang="en"> tells assistive tech that the main language of this page is English. The codes are defined in BCP47.

Missing <main> elements

The HTTPArchive study of 5.8million pages shows that only 26% of pages have a <main> element and 8.06% of pages erroneously contained more than one main landmark, leaving these users guessing which landmark contains the actual main content.

Solution: wrap your main content, that is, stuff that isn’t header, primary navigation or footer, in a <main> element. All browsers allow you to style it, and assistive technologies know what to do with it.

Happily, more than 50% of pages use <nav> <footer> and <header>. In my opinion, <nav> should go around only your primary navigation (and can be nested inside <header> if that suits you). In its survey of screen reader users, WebAIM found that 26% of screen reader users frequently or always use these landmarks when navigating a page.

Here’s a YouTube video of blind screenreader user Leonie Watson talking through how she navigates this site using the HTML semantics we’ve discussed.

YouTube video

There’s lots more to accessibility, especially if you have lots of JavaScript widgets and single-page application architecture. But my list will help you to avoid the most common accessibility errors and become a web superhero adored by millions. Moritz Gießmann has a nice single-page Accessibility Cheatsheet.

You can also make tagged accessible PDFs from your pages using Prince—it’s free for non-commercial use. If you’re one of the React Kool-Kidz™, I recommend using Tenon-UI: Tenon’s accessible React components library.

Buy me a pint when you see me next. xxx

Dive deeper?

The single source of truth is Web Content Accessibility Guidelines (WCAG) 2.1 from W3C. UK’s Government Digital Service has a good readable Understanding WCAG 2.1 guide. For advanced applications requiring ARIA, I find W3C’s Using ARIA invaluable.

You want tools? The BBC has open-sourced its BBC Accessibility Standards Checker. Google Lighthouse and are also very good. Please note that no automated tool can be completely reliable, as the fun article Building the most inaccessible site possible with a perfect Lighthouse score demonstrates.

If you want a self-paced course, on International Day of Persons with Disabilities, W3C launched an Introduction to Web Accessibility free online course in cooperation with UNESCO. Enrol now; the course starts 28 January 2020.

It’s common in our cooler-than-Agile, post-Agile community to say that Agile teams who “didn’t get it” eschewed good existing practices in their rush to adopt new ways of thinking. We don’t need UML, we’re Agile! Working software over comprehensive documentation!

This short post is a reminder that it ran both ways, and that people used to the earlier ways of thinking also eschewed integrating their tools into the Agile methodology. We don’t need Agile, we’re Model-Driven! Here’s an excerpt from 2004’s UML 2 Toolkit:

Certain object-oriented methods on the market today, such as The Unified Process, might be considered processes. However, other lightweight methods, such as Extreme Programming (XP), are not robust enough to be considered oricesses in the way we use the term here. Although they provide a valuable set of interrelated techniques, they are often referred to as “small m methodologies” rather than as software-engineering processes.

This is in the context of saying that UML supports software-engineering processes in which a sequence of activities produce “documentation…about the system being built” and “a product that solves the initial problems is introduced and delivered”. So XP is not robust enough at doing those things for UML advocates to advocate UML in the context of XP.

So it’s not just that Agilistas abandoned existing practices, but there’s an extent to which existing practitioners abandoned Agilistas too.

November 25, 2019

Stop Playing Yourself

Ten traps that are stalling your digital project, and how to avoid them.

Millennial thought leader DJ Khaled popularized the phrase ‘Congratulations, You Played Yourself’ in 2015, but I like my hip-hop a bit more conscious, so for me the phrase originated in 1996 in a deep cut from Jeru The Damaja’s sophomore album “Wrath of the Math’, that track being, of course, ‘Ya Playin’ Yaself’.

Turning to the Urban Dictionary for a definition we find that to play oneself is to:


I think about that a lot when I think about big digital projects. Projects like designing and building a new website. We all start these projects with huge enthusiasm and strategic intent. And yet so often, by the time we launch, we’re a little bit ‘meh’. Perhaps - after all that money and effort the needle doesn’t move all that much. What we have now is a lot like what we had before, but with more in vogue typography.

Why is that?

In my experience it’s because we just can’t help playing ourselves. On lengthy digital projects, we have far too many opportunities to let instant gratification or bad habits sabotage our strategic goals. We play ourselves. I want to help you to recognize when you’re playing yourself, and to arm you with some tactics so that you can stop.


I’m going to do that, by describing ten traps that I often see cultural organisations fall into, and suggesting some tactics for getting out of them.

Trap #10 Building a Monument
Trap #9 100% Digital Coverage
Trap #8 Divide & Conquer
Trap #7 Designing for your CEO’s smartphone
Trap #6 False Prophets
Trap #5 Post-it Fetishism
Trap #4 Building not Buying
Trap #3 Buying not Bodging
Trap #2 Bogus User Stories
Trap #1 Cutting Against the Grain

Trap #10: Building a monument

In most digital projects we are trying to build services that your patrons want to use. We have known for many years that users interactions on the internet are overwhelmingly task-driven. They have an outcome in mind, whether that’s a ticket, a customer service issue, confirmation of a piece of information, a subscription, whatever. They want to take the shortest route possible to get that task done.

As internal stakeholders though, we really value what we do. Of course - it’s our chosen profession, hopefully the thing we’re most passionate about. And our organizations represent the aggregation of all that passion. So inevitably, whilst we start out trying to design great customer experiences we are liable to overestimate how invested the end user is in our organisation at that moment, and to start believing that the user is here to find out more about us, in an abstract sense.

Before you know it, you’ll see that efforts have subtly shifted from helping our users to succeed, toward building a monument to our organisation. There are certain tell-tale phrases that I look out when I think we might be transitioning into building a monument. One of them is

“There’s so much we do here that we just don’t talk about”.

Do you know what the archetype of this is? It’s that sad Education or In the Community section, where we list all of the programs we run in one place; even though each of those programs is specifically targeted at a different end-user profile, and there are limited opportunities to engage digitally with those programs.


Another way this trap manifests is in redundant top-level navigation. When we start to see our digital assets as monuments to the organisation, navigation becomes about exploring all of the facets of the organization, rather than facilitating the common tasks that users are trying to achieve. This results in navigation where 80% of the traffic is verifiably directed to just one of the seven top-level navigational items. I’ll come back to this.

Congratulations - You Played Yourself

Some tactics to prevent you from building a monument:

  1. At the start of the project as well as agreeing objectives agree those things that are your anti-objectives. We are not setting out to build a monument to the organisation. Every time you’re about to add a requirement to a backlog, ask yourself - are we building a monument? Encourage your team to ask that question, and give kudos for resisting the sentiment.
  2. Find more appropriate outlets for this content. Your organization’s history probably makes for a very worthwhile Wikipedia entry and it’s a better trusted source for people who are genuinely interested. Personally, if I’m researching a topic I skip the official site, and go straight to the Wikipedia entry that is usually to be found at SERPs position 2. Because I know what I’m going to get. Go wild on Wikipedia. No-one’s stopping you. If you need to compile an overview of all the great work you do, because this content is targeted at a very specific end-user - eg, a charitable trust, then create a document, or a video especially and send it to them. There’s nothing to stop you from linking out to both of these assets from your digital project.
  3. Obviously, if you have a heritage lottery fund to fund a digital archive project, building a monument is the objective, so you can cheerfully ignore everything I’ve just said. In fact do the opposite.

Trap #10 Building a Monument
Trap #9 100% Digital Coverage
Trap #8 Divide & Conquer
Trap #7 Designing for your CEO’s smartphone
Trap #6 False Prophets
Trap #5 Post-it Fetishism
Trap #4 Building not Buying
Trap #3 Buying not Bodging
Trap #2 Bogus User Stories
Trap #1 Cutting Against the Grain

Trap #9: 100% digital coverage

Many well-meaning digital and customer service people are of the opinion that if your organisation offers a service to patrons it stands to reason that users should be able to self-serve over digital channels. The phrase it stands to reason is dangerous because it abdicates responsibility for research and for using our resources wisely where they will have the most impact.

I’ll give you a clear example that we come across time and again. You’re two thirds of the way through some major web build, and suddenly someone remembers the scheme. It’s some kind of youth access scheme that the artistic director came up with a few years ago. Twenty young people (or to be more accurate, their parents) took it up last year. Everyone knows that the scheme should be cancelled, but no-one has the authority to make the call, or the desire to plead with the Artistic Director. So now, when you should be QAing your major web build, what you’re actually doing is building a dedicated application that includes identity checking, parent-access accounts, the whole nine yards, to be used by approximately twenty people. It costs £20K to do it. You’re spending £1,000 per user to subsidise 4 tickets each with a total value of £200.

Congratulations - You Played Yourself

Some tactics:

  1. Let’s let go of the idea that everything you do should have a digital interface. Let’s treat our in-demand, hard to recruit and retain digital resource carefully. Before we start considering anything a requirement, let’s ask - how many people are using this service? What’s it costing per user to digitize this service? There’s actually a simple formula you can use: 

    Manual_task_in_hours_per_week * Salary * 1.3 / 38 > Development_cost / Lifespan_in_years ? 
    2 hours per week * 35K * 0.0342 * 5 = £12,082 

    So in this case if a manual task took someone earning £35K two hours per week, you need a development cost well under £12K to make it worthwhile digitizing and it will take five years to earn that value. And guess what - code needs maintaining too, there will be maintenance, hosting, changes to browsers and legislation. So a degree of human intervention will always be required.
  2. By the way - this doesn’t just hold for customer-facing stuff. Your own digital team will instinctively want to automate lots of things that aren’t even customer-facing too. Is it justified on a cost basis? You should check. Digital staffers are kind-of the opposite of luddites, they find manual tasks offensive, even when they’re being paid to do them.
  3. It might be outside of your control to close a scheme with few users. But you might reasonably say that the number of users is too small to justify the digital development. Make that scheme ‘concierge only’. Service it through phone or chat interfaces.
  4. I’d extend that thinking to anything legacy. And you might be surprised by what I’d consider legacy: Direct Debits, Microsoft Edge, Desktop Computers, Paper Tickets

Yes people still use these things now. But are you confident that it’s worth investing in them now for your new digital project, based on a 5 year lifespan?

Trap #10 Building a Monument
Trap #9 100% Digital Coverage
Trap #8 Divide & Conquer
Trap #7 Designing for your CEO’s smartphone
Trap #6 False Prophets
Trap #5 Post-it Fetishism
Trap #4 Building not Buying
Trap #3 Buying not Bodging
Trap #2 Bogus User Stories
Trap #1 Cutting Against the Grain

Trap #8: Divide & conquer

I think by now we’re probably all aware that you’re not supposed to structure your top-level navigation based on your organisations departmental structure. 

And yet - that’s still really common actually, we just swap the department names for their customer-facing equivalent, Fundraising becomes Support Us. That’s why the biggest IA challenge on most projects is deciding what the correct customer-facing term for the Education department section is. Learn? Interact? Dive In? Explore? Go Wild?

But even if we’re not doing that. How do we figure out what our website requirements are?

Usually, we draw together the departments, so that they can take turns reciting their wishlists. This is setting off on the wrong foot for a couple of reasons.

  1. Departmental thinking leads to bad UX. If you ask a fundraising department what they’d like from the website, maybe they think every transaction should be interrupted with a colossal donation ask. Maybe that impacts on ticketing revenue, but why should they care? And vice-versa.. The person responsible for the overall UX needs to look at the total revenue to find the best compromise. They can’t be thinking on behalf of one department.
  2. Not all departments have the same exposure to end-users, revenue or technology. But by treating requirements gathering as a round-robin departmental exercise all are elevated to the same status in digital terms, regardless of the objectives of the project. This process encourages departments to think of elaborate features that their users might like, without necessarily user testing any of this, or without any reference to a cost-per-user or cost-per-revenue calculation.

Often, the department leading the project, has no real intention of delivering these features. However, they never explicitly reject them, so they crowd development backlogs and schedules until they are finally ‘back-burnered’, causing disappointment and distrust. So to get over the trust issues, the disappointed departments are consulted on the next big project and the cycle starts up again.

Congratulations you played yourself.

Here are some tools:

  1. Figure out which department is actually responsible for the project. If it’s a dedicated digital department, answering directly to someone on the board, so much the better.
  2. Be clear about the organizational objectives for the organisation and name them in real, user-focused terms.
  3. Invite departmental heads, and maybe some of their operational people to contribute to requirements gathering. But not as the representative of their department. They are there as domain experts to help refine the overall requirements. Smart people can work for the objectives of the overall organisation, and will have real insight into how things work, things that are easy to contribute, small changes that could have big impacts for them. That’s what we want.

Trap #10 Building a Monument
Trap #9 100% Digital Coverage
Trap #8 Divide & Conquer
Trap #7 Designing for your CEO’s smartphone
Trap #6 False Prophets
Trap #5 Post-it Fetishism
Trap #4 Building not Buying
Trap #3 Buying not Bodging
Trap #2 Bogus User Stories
Trap #1 Cutting Against the Grain

Trap #7: Designing for your CEO

One of our local rivals has a question on their client-engagement survey: “What Smartphone does your CEO use?”. Any digital agency project manager will immediately realize why they do that, and it’s a pretty smart move. You see they’ve seen plenty of carefully-researched, strategic digital projects de-railed at the last moment, because the organization’s CEO took a look at it on their Blackberry Classic Q20.

Everyone on the digital team was clear about which browsers and devices they would be supporting, and this particular model does not represent a rounding error on the end-user analytics, but it doesn’t matter, because this is the only end-user that really counts at this moment in time.

It’s not just devices. I’m a CEO. Do you know how I got to be one? Well I’m not shy in coming forward with opinions. You ask me to feed back on something, I’m ready to go with feedback. Oh you want considered feedback? I don’t have time for that, I’m an executive.

You know what else I’ve got? Ideas - so when you show me your carefully-crafted digital project scheduled for launch next week, I’m not going to pat you on the head for a job well done. I’m more likely to ask you why it’s not Spanish bi-lingual. Oh - you think that’s unreasonable? You don’t get to be CEO by doing what’s reasonable. I’m including Artistic Directors here by the way.

It’s quite easy for digital teams to start high-fiving each other, because they’re being user-centered, using all the latest techniques and jargon, getting lots of validation from their piers, and feeling really good about where they’re going, but totally forgetting to take management with them.

Congratulations you played yourself.

Here’s what you should do:

  1. Engage early and engage often.
    One of the most frustrating things about engaging with upper management, is that they have plenty of opinions, but seem strangely reluctant to take decisions. They seem to sketch out a world of possibilities, and leave you to join the dots. Here’s the secret; management are asked to take decisions all day long and they are tired of it. So stop asking for feedback, but keep management appraised of the decisions you are taking. If one of those decisions is directly in opposition with their strategy they’ll let you know, and you can course correct. I suggest you present monthly if possible. Keep it really quick and top-line. “We’ve decided our top three goals are X”, “We’re aiming to increase Y by Z in-line with our mission”
  2. Take note of feedback.
    When you get opinions and feedback regardless, take note, and think about how you are going to pay lip-service to them in your next presentation. If the CEO said they don’t like dark backgrounds, find a page with a light background and screen-shot that one for your presentation. If the CEO said it needed to be dual-language don’t laugh that off as unattainable, figure out a range of options and coverage, from telling the user to try Google Translate to guesstimating the true cost of doing it properly. Be ready at the next meeting to drop in those considerations, and tie them back to their original request. CEOs might have temporarily forgotten their previous feedback. If you showcase the ways in which you’ve taken it on board, that will help fend off new, entirely contradictory feedback. And whilst CEOs might be ready at all times with ill-founded opinions, they usually respond well to well-researched options. So come back with evidence.

Trap #10 Building a Monument
Trap #9 100% Digital Coverage
Trap #8 Divide & Conquer
Trap #7 Designing for your CEO’s smartphone
Trap #6 False Prophets
Trap #5 Post-it Fetishism
Trap #4 Building not Buying
Trap #3 Buying not Bodging
Trap #2 Bogus User Stories
Trap #1 Cutting Against the Grain

Back to Top