Weeknotes 009

Jun 4 2021

A spending review is main way government departments get allocated money. We have one coming up soon and so work has revolved around planning what we can deliver over the next few years and putting that in writing.

We’ve managed to recruit another backend developer which is wonderful. We still need more people. We’re still trying to iterate our overall recruitment process to make it easier to recruit both for a better experience in house and for candidates applying.

I gave a presentation at our tech fortnightly about recruitment. Most of the developer community only see a small portion of recruitment. The middle piece which involves the actual interviews.

I thought it would be worthwhile showing the whole picture. The work before to set up campaigns, agree headcount, create job descriptions, adverts and questions we’ll ask in the interviews. Also the work after interviews have taken place, writing business cases to justify salaries, offering candidates positions and negotiating start dates, finding teams and line managers for new starters. Not to mention on-boarding people. Our on-boarding is probably rusty. We’ve not had to do it for a while.

My wife and I found some fresh guavas when we were shopping this week. Haven’t really had guavas since my childhood, but it brought back memories of guavas and custard and guava rolls that I used to eat on hikes.

Weeknotes 008

May 8 2021


I was tengentially involved in enabling Brotli compression for our production site this week.

I attended an interesting incident review.

I spent a large portion of the week on recruitment. It was unpleasant.

I do not get on with our applicant tracking system. The interface feels slow and cumbersome. Widgets abound. Navigating into records requires double clicking. A cmd-click to open in new tab doesn’t work because of the widgets. It breaks the web as far as I’m concerned. It reminds me of early desktop inspired web development. I feel punished when using it. Every time I have to log in to it, I feel dread.

In an attempt to make a fair pay scale, GDS and the Cabinet Office has create a complex sytem. Large parts are opaque to me. We have to write pay cases for any candidate we feel is above the minimum pay grade. From what I can tell, these are forwarded from our HR to the Cabinet Office proper for review. At that point, I lose visibility. I have no way of knowing when the case will be reviewed, or by whom. I can chase on my side. In my mind that sends a cascade of emails from person to person to person. Layers. I don’t know how deep. Turnaround is slow. In the order of days to a week to get any sort of report back, and that might just be “nope haven’t got to it yet”.

I try to batch my queries.

Pay cases are written to prove a candidate has the skills required of a software developer. The DDaT framework defines the ten skills required for a software developer. Each skill has a required skill level. For the required level, a person will be working below the level, working at the level or working above the level. A skill can also be “not applicable”. Let’s not get in to that.

With no concrete examples though, justifying a developer’s ability becomes guess work. At the end of the review, we might get back a note informing us that we didn’t not provide enough evidence to place a person in a particular band. Nothing more. No suggestions about what was lacking. Flying blind.

My week ended miserably. After weeks of chasing up some pay cases, some candidates were offered too little money to make it worth their while to change jobs. They’d be taking a pay cut to work for us. I have no idea whether or not we can revise the pay case and offer them more money. Finding out is a joyful event for next week.

I slept poorly on Friday evening while my mind wrestled with all of this.

It is no one person’s fault. We’re all busy. I expect every department is understaffed for the process in place.

We have an aggressive hiring target for the year. With a cumbersome process, I think we’ll lose a lot of good candidates to organisations that are more nible at hiring.

I feel battered by the process.

Weeknotes 007

Mar 1 2021

Missed several weeknotes in a row. I was on holiday for a week and then last week back at work. It went by in a blur.


GOV.UK’s new Head of Tech Himal has started.

My week felt like I was playing catch-up. Probably because I’d been on holiday the week before. Emails were out of control and the first half of the week left me with little time to look through them because of meetings.

In tech fortnightly, we took a detour from the usual tech presentations and Himal introduced himself and we had a general chat. I thought it went well. A few people from the developer community talked about the things we do that are not strictly part of team and mission work. Things like our tech debt meetings and process, our developer tools working group and “conference talks we love” community. These things that people take on are so important. I would love to get to the point that these extras are actually recognised as positions in their own right - perhaps with a head of community leading them, but we don’t have enough people for that at the moment.

Accounts work continues. We’ve spent a fair amount of time workshopping next experiments. I’ve found it a little frustrating and it brought up some thoughts around strategic and tactical work. Long term large fundamental chages vs shorter term MVPs. These require different cadences in their planning, different focus in and around user reseach and different considerations in team size and make up, order of work and what success looks like. I was worried that we would get lost in planning out work and thinking too far ahead. I still don’t think we have a firm grasp of how GOV.UK can and will change when it becomes more of o personalised platform. Random thoughts. I want to find time to explore my thinking around longer/shorter term pieces of work.

And then, mid-week, pay happened. I achieved a Tom Sawyer moment of negative pay. I literally paid the Cabinet Office for the privelidge of working. I spent far too much time finding the right person to talk to about this over the course of a few days. It was frustrating and stressful and ruined my week. It made me far too curt with other people as well. I’m very grateful to Tom though. He helped me even though he’s no longer in the same organisation as me.


Schools are going back to real life lessons from the 8th March. This week, COVID tests for the kids start. My daughter has been doing well at home. We’ll see how the return goes.

February and March are full of family birthdays. I find serendipitous present shopping difficult online.

Over the weekend I made a shelf for our breadboards and my daughter and I fixed a marble table that had cracked in two with some epoxy resin. We coloured it blue with some glitter as an experiment.

I’ve renumbered my weeknotes. The old Season/Episode thing wasn’t working for me. Sequential numbers are simpler.

Listening, Reading

Reading David Foster Wallace: This is Water

Reading A Vim Guide for Advanced Users

Wrangling dates in html files with 11ty

Mar 1 2021

11ty supports an array of template languages and like many static site generators, it also allows you to inject data from your front matter into your templates.

If your template engine is using Nunjucks, then you have access to JavaScript methods in your template and you can format a date quite quickly with .toDateString(). If you are using an HTML template, then the default template engine is liquid and you’ll need to use a date filter.

An alternative is to explicitly set the default template engine for HTML templates.

For per-template control, you can set an option in the front matter of your template:

templateEngineOverride: njk

For a global setting, you can set the config in your .eleventy.js file:

module.exports = {
  htmlTemplateEngine: "njk"

If you find changing the default template engine causes HTML tag soup in your rendered pages, you probably need apply a safe filter to your content. Keep in mind that the safe filter is a potential security risk if you’re rendering untrusted data.

Weeknotes 006

Feb 7 2021


Felt a bit like I was treading water this week. Quite a few one to ones, some discussions about people who want to move teams and how we could facilitate that and slow progress on setting up interview panels.

I spent a good chunk of the week going through DDaT again and discussing it with one of our senior developers. The framework is very light on practical examples of the skills it sets out. This makes it difficult for line managers to assess their line reports’ submissions. That in turn means much is left to the line manager’s judgement and I think that will lead to inconsistency across scoring.

GOV.UK Accounts feels slightly uncertain at the moment. We are moveming away from creating an authorisation solution to thinking about personalisation on GOV.UK. The personalisation work is very broad and we haven’t focussed on a tangible experiment yet. I’m finding it frustrating.

In the meantime, we do have tech work to think about. How we’ll handle GOV.UK wide session cookies is up for thought.

Towards the end of the week, several of the longer serving tech folk on GOV.UK met with Himal who will be taking on the role of Head of Tech soon.

I attended some Race Equality workshops as well. It’s often uncomfortable to talk about, and I’ve still lots to learn.


Discovered a handy google docs tip - if you append /copy instead of /edit to the doc, it asks if you wish to make a copy. Very handy for our GOV.UK Tech Weeknotes where we copy a template each week. Added extra tip - you can choose the location the copy will save to with a handy query param: ?copyDestination=<folder_id>


Image showing 22975 unread emails

Unread email sneaks up on you. I did some tidying. It’s better. Not 0, but better.

Listening, Reading

Listened to From Climate Crisis to Real Prosperity.

Read What I Learned in Avalanche School

Weeknotes 005

Jan 31 2021


I managed to crack a tooth. Not pleasant. I’ve had a temporary repair rather than a full scale drill and filling. A full scale drill and filling would require a longer appointment and more space between me and the next person because of all the water used and the resulting aerosol.

I spent some of Saturday taking the group head on the espresso machine apart. It has started dripping a little while I’m pulling a shot. It looks like I need a new infusion valve.

I hacked together some code to crawl a few sites to pull together the urls of around 400 coffee roasters in the UK.


A series of “leads” meetings this week. In the senior technologists meeting there was a good discussion around how we help people find opportunities that will give them skills and experiences they can use as evidence for promotions and skills assessment.

Our digital identity and accounts based work is a little slower this week. We’re in the process of figuring out which team builds which pieces. Mostly things going on at a level above me.

Discussed the people survey results with some of our senior devs and tech leads. It’s clear the last year has been hard on everyone. People have changed teams often and we’ve developed lots of new products very speedily. People are tired. We are worried about how we support all the new things with no new people yet.

Recruitment. So very slow. I’m sure it is a horrid experience for people who have applied for a role with us. We’ve done the telephone sift though. Next up we have to organise the panel interviews.


I glanced over Steve’s Product Manager Induction trello.

Weeknotes 004

Jan 24 2021


A fairly prosaic week this week.

I bumped into a phrase “met his Thermidor” this week and ended up learning about the Thermidorian Reaction.


Work felt bitty this week and it seemed to lack cohesion. I bounced between discussions and meetings and community events. Lots of one to ones this week.

We had a long session with a large group of people to discuss what and how we see working at GDS. The session was well run and it was interesting to hear others’ perspectives about their work.

I conducted a couple of telephone interviews for developer positions we have open.

Probably the most interesting for me was a half hour with one of our fraud experts, discussing some typical indicators and patterns of web based fraud in the context of accounts.

A Ruby benchmark snippet out of idle curiosity:

require 'benchmark'

n = 5000000

Benchmark.bm do |x|
  x.report {n.times do; (n1 + n2).sort; end}
  x.report {n.times do; (n1 + n2).sort!; end}

    user     system      total        real
4.002936   0.003981   4.006917 (  4.010948)
3.734065   0.004691   3.738756 (  3.742245)


Strengthening Security Configurations to Defend Against Attackers Targeting Cloud Services which has a big list of bullet points. Putting in place many of their suggestions is a large upfront task for any system launch.

Bypassing MFA with pass-the-cookie.

Mutation testing and related Ruby library mutant.

Weeknotes 003

Jan 17 2021

Non work

Kept up a fair bit of exercise this week.

Spent Tuesday evening making pizza with my daughter as part of her school work. We actually started on Monday evening because we made a sourdough pizza dough and we wanted a slow bulk fermentation. The pizzas came out well.

Some boring bits of life-admin.

I closed my old web hosting account at last. I moved a some old domains and personal blogs that I maintain for friends and family over to static sites using eleventy. I tidied up an old blog of mine and did some housekeeping on old posts. There’s a bit more to do, but most of the content I want live is live. I’ll address the various pieces of broken formatting and design as I get time and inclination. None of the sites get any traffic to speak of.

I spent far too much time trying to plot my weeknotes title and numbering style. Ultimately, it doesn’t matter, just me trying to bring a small sense of order.


The week started with a deadline. GDS is starting to use a new framework to assess the skills of people working in “digital data and technology” professions. We had a submission deadline and the early part of the week was spent checking all the submissions for my line reports. There’s a new tool to submit the assessments. It’s not the most user friendly; there’s no proper feedback on past submissions and line reports cannot see when their line manager has validated their assessments. Slightly annoying because I really want to make sure my line reports have their assessments correctly submitted because it can affect their pay.

I spent much of the rest of the week in meetings. The routine meetings included senior tech and leads planning sessions as well as GOV.UK’s developer community tech fortnightly. Ad hoc meetings centred around digital identity. A good overview with tech colleagues on the digital identity team and another longer half day session which was more general and included different disciplines.

Tech fortnightly was interesting - Richard showed us how he had repurposed one of our publishing apps as a personal blog.

I spent some time going through some threat modelling for one of our services and did a little research on MITM attacks.

Worked with one of the developers on the team to explore autoscaling a little.

I also looked into our current special leave policies and shared it around with some people at work. Several people in the developer community are finding it difficult to balance work and life at the moment. Parents are, anecdotally, finding it difficult being both a full time employee and teacher.

I started reading 97 Things Every Engineering Manager Should Know because Dean has started a book club.

I started to think a bit more about how to onboard developers.

How to view the raw commit data on GitHub

Sep 11 2020

Today I learned that you can view the raw commit data for any commit on GitHub by appending .patch to the commit’s url. For example, https://github.com/octocat/Spoon-Knife/commit/d0dd1f61b33d64e29d8bc1372a94ef6a2fee76a9.patch

This includes the author’s email address. I know you can easily view the git log if you pull a repo down, but I didn’t know it was easily visible on GitHub.

Deleting all docker containers and images quickly

Jul 17 2020

For when you really want to blat everything.

docker rm (docker ps -a -q) && docker rmi -f (docker image ls -q)

I’m using fish so the command substitution is a little different to the usual bash syntax. If you’re running a more standard shell, you’ll probably need some $s in there:

docker rm $(docker ps -a -q) && docker rmi -f $(docker image ls -q)

docker rm removes containers by container Id. docker ps -a -q lists all containers in quiet mode - so just the container Ids.

The logic is the same for removing images - I’ve thrown in the force flag for good measure, and I’ve used && to concatenate two commands onto one line.

This will error out if you have no containers.

It’s also very destructive. A nuclear option as it were.

Next Page