All Posts

Creating ephemeral preview apps with Argo CD

February 20, 2023

It’s pretty wild that Heroku introduced review apps in 2015, and yet it’s still not a standard feature of CI/CD systems! Put simply, the idea is that every time your team opens a pull request, an instance of the app is provisioned which reflects the changes made in the PR. When the PR is closed, the app is destroyed. We use Argo CD; it has good support for this pattern but it’s not particularly…
Keep Reading →

AI Safety Needs Great Product Builders

September 02, 2022

In his AI Safety Needs Great Engineers post, Andy Jones explains how software engineers can reduce the risks of unfriendly artificial intelligence. Even without deep ML knowledge, these developers can work effectively on the challenges involved in building and understanding large language models. I would broaden the claim: AI safety doesn’t need only great engineers – it needs great product…
Keep Reading →

Joining Ought

January 15, 2022

In mid-December, I left Spring, and about a month later I joined Ought as their head of engineering. It was a momentous change to a leave a job, a company, and my team after so long, but there are so many aspects to Ought that I’m incredibly excited for that in the end it was a move I had to make. Here are some of the reasons it was not only easy but essential for me to join Ought. If any of these…
Keep Reading →

How to quit like a boss

December 12, 2021

On December 15th, 2021, I will leave Spring – the company I have been with for almost seven years. Along the way, I’ve seen quite a few people quit, fired a few people, and made some pretty big mis-steps when planning my own departure. The goal of this post is to summarise some patterns and anti-patterns, so that in the future you or I can leave our roles in the most professional and positive way…
Keep Reading →

Does more automation mean less control?

July 02, 2021

In a recent post on LessWrong, Andrew Critch imagines scenarios in which networks of seemingly well-behaved AI systems nonetheless results in humanity’s demise. In it, he mentions: … [both stories] follow a progression from less automation to more, and correspondingly from more human control to less … The comment is only made in passing, but it seems (a) interesting and (b) important: is this…
Keep Reading →

Synaesthetic music visualisation with CycleGANs

February 04, 2021

About a decade ago, a friend and I were talking over dinner about our shared passion for electronic music. Our burning question was: how can we convince the world to love techno as much as we do? A common—and not always unfair—criticism is that electronic music can be repetitive, lacking an overall arc, or overly simplistic: especially when compared to something like a classical concerto. However…
Keep Reading →

Will we share a moral landscape with artificial intelligence?

January 07, 2021

In The Moral Landscape, Sam Harris describes a framework which allows for strictly rational conversations about morality. It is based on the idea that ethical questions are eventually decomposable into objective questions about suffering and flourishing: … in the moral sphere, it is safe to begin with the premise that it is good to avoid behaving in such a way as to produce the worst possible…
Keep Reading →

A future cancelled: existential risk deserves more of your attention – and our altruism

October 13, 2020

Bring to mind the person you care about most in the world. Now imagine sitting across from them, watching them play Russian roulette with a loaded revolver. If we found ourselves in that situation we’d jump out of our seat, rush over to them, grab the gun from their hand, and attempt to unload it. However, in The Precipice, Toby Ord estimates there is a 1-in-6 chance of humans wiping themselves…
Keep Reading →

The Modern CTO podcast

September 17, 2020

Is training a neural network like forming a habit?

July 05, 2020

When training an artificial neural network, a simplified version of the classic workflow is: Set up an neural network with randomly-weighted neurons Feed an example from the training set into the network Calculate the difference between the actual and expected output Use backpropagation to update the weights of all the neurons in the network Go to #2 until you have processed the entire training…
Keep Reading →

A referendum on metrics we care about as a society

June 22, 2020

Being fixated on planning at the moment, the truism of how important it is to carefully pick the metrics by which you define success lingers in the back of my mind. You get what you measure It strikes me that the only measurable metric which we can be assured will be discussed, extrapolated, and prioritised during every election cycle is that of economic growth: normally – but not always…
Keep Reading →

Are roadmaps useful any more?

June 21, 2020

Does anyone actually do product roadmaps any more? If so: how? And why? At university, we discussed the launch of a space shuttle as a classic example of where iterative software development wouldn’t work, and waterfall reigned supreme: there’s no such thing as an MVP and you don’t really get to do a bug fix update if your V1 didn’t work. But today, even NASA is doing Agile. What should a medium…
Keep Reading →

Atomic Habits for organisations

June 18, 2020

As described in an earlier post, I’ve been using James Clear’s Atomic Habits as a tool over the last few months. The focus on process and incremental gains has been useful, and leaves one with a fairly clear set of steps to work through – unlike many self-improvement books. It got me to thinking, though, how could the same approach be applied to a team or company? The core principles of the book…
Keep Reading →

Overcorrection is OK when righting historical wrongs

June 14, 2020

In Can we pull back from the brink?, Sam Harris talks about the importance of level-headed and open-minded conversation as perhaps our only tool to acknowledge historical evils and find the best way to move forwards to a fairer society. Despite being a huge admirer of Sam’s work, and my genuine belief that in tackling this fraught topic he is doing his best to help in an extremely complex and…
Keep Reading →

Deploying a Gatsby site to GitHub Pages using Actions and Cloudflare

June 01, 2020

I recently converted this site to be built using Gatsby rather than Hugo. I’ll write about that conversion process separately: this post only concerns the deployment and delivery of the built site. These phases can be basically identical between Hugo, Gatsby, or any other static site generator: at the most basic level it boils down to making a folder of HTML, CSS, and JS available at a URL, 199…
Keep Reading →

Using Athena, S3, and Tableau to quickly extract and visualise inaccessible data

May 28, 2020

We use Fivetran and Snowflake for our ETL system and data warehouse at Teespring. They work well for the vast majority of our use cases, but we recently ran into an urgent problem where those tools couldn’t help. This is the story of how we solved the issue with Athena and S3. Telemetry data in our production facilities We gather a large amount of data about the flow of work through our production…
Keep Reading →

Diversity as a superpower, and the madness of monocultures

May 10, 2020

In the second essay of Women & Power, Mary Beard puts forward the idea that in order to treat women fairly in the workplace (and elsewhere), our priority shouldn’t be to figure out how women can shoulder their way forward and achieve success in the same way as your stereotypical man should. Instead, we should work on reshaping our companies, organisations, and societies to be a place where a…
Keep Reading →

Atomic Habits: what habits do you actually want?

May 08, 2020

Atomic Habits is chock-full of stories of people making transformative changes through the purposeful adoption of new habits: losing weight, professional success, creative output. After reading the book, I was sold: the approach uses what we know about behaviour patterns to hack our brains, aligning the basic urges of our Id with the lofty goals of our Superego. However, what wasn’t obvious was…
Keep Reading →

ynabadell: connect your Sabadell bank account with YNAB

February 04, 2019

We’ve recently started using You Need A Budget (YNAB) to plan our finances. Unfortunately, like most finance apps it’s focussed squarely on the north american market: its automatic transaction importing only works for some US and Canadian banks – and we live and bank in Spain… YNAB does support a manual process, where you upload QFX or OFX files – or CSVs (in their required format). However, our…
Keep Reading →

Enabling automatic "skip-to-next-scene" in videos

December 06, 2018

Don’t video player controls seem dumb? Desktop and web-based players alike allow the user to jump forwards or backwards by 5 or 10 seconds, or possibly speed up and slow down playback. These controls operate identically no matter what the user is watching – there’s no connection between the content of the video, and the controls. DVDs were the first format I know of that allowed you to skip via…
Keep Reading →

InnoDB and Table-level Locking

March 29, 2018

One of the main reasons InnoDB is the go-to choice for our MySQL tables is that it supports row-level locking. This means that as we’re reading from and writing to a table, we don’t need to wait for all the other processes to finish up their work before we can get access to that table. For larger tables, this ability to have multiple processes working on the same table at the same time is almost…
Keep Reading →

Elixir on Google Cloud Platform: hot code reloading?

February 04, 2018

I stepped through this guide for a Hello World app running on Google Cloud Platform. How quickly can you get something working, and how convenient would it be to use longer-term? In doing so, I confirmed GCP doesn’t make use of Erlang’s hot code reloading when re-deploying apps, but how important is that? How long does it take to get started? Starting point: OS X machine with Python installed…
Keep Reading →

Life coaches hate this one crazy trick to stave off burn-out and increase motivation!

February 02, 2018

I’m fortunate to enjoy my job. I hope you do too. Figuring out clever solutions to difficult problems is innately satisfying. However, I’ve always felt a yearning for various hobbies and side projects to augment the gratification I get from my work. I recently gained some clarity about this yearning: what it is we are looking for, and why it’s important. Hopefully there’s something here that…
Keep Reading →

Take Home Tests

January 24, 2018

I recently came across a discussion on Reddit concerning take-home tests as part of an interview process. It basically boiled down to: Is it acceptable for companies to ask candidates to work on a problem in their own time, so that their submitted solution helps decide whether to move forwards to an on-site interview? The level of antipathy towards take-home tests in that discussion was an…
Keep Reading →

It it possible to guess Catalan words?

August 25, 2017

I’m currently learning Catalan and Spanish, and am reminded every day of the languages’ shared ancestor by how often they share similar (or identical) words. For example, it’s easy to deduce that introducción (in Spanish) means the same as introducció (in Catalan), or that respuesta and resposta are the same thing. In fact, when you look at the Spanish and Catalan words next to each other, it…
Keep Reading →

Swamp cooler: experimenting with airflow

August 19, 2017

The first step of my swamp cooler project is to figure out the construction of the evaporative cooling vessel. I’d like to use an upturned terracotta pot for the vessel itself, with air entering at the bottom, passing up the inside and out the drainage hole at the top. Unlike the Cold Pot – which pushes air through a dry aluminium sleeve – I’m trying to maximise the surface area of wet terracotta…
Keep Reading →

Injecting into transient FactoryBot attributes

August 01, 2017

I was just writing some code which parses a URL in order to extract a piece of the path. When working correctly, the code under test takes a URL something like this: … and returns just the hash-like part of the path: . Creating factories to effectively test it was surprisingly fiddly! Here are the options I considered and what worked for me – in the hope it’s of some use to you. Static value The…
Keep Reading →

Swamp coolers for the house?

August 01, 2017

It has been hot here recently in Catalunya. Like 40°C and forest-fires-covering-our-patio-in-ash hot. Luckily, the house is traditionally constructed with extremely thick, solid stone walls which means the worst of the heat doesn’t make it inside – so long as we remember to shut the windows. Even so, a little extra help to keep the temperature down during the day would be very welcome. Why not air…
Keep Reading →

Deploying a static site to Github Pages using Travis and Cloudflare

July 12, 2017

Update June 2020: I am no longer using this infrastructure for my site. See Deploying a Gatsby site to GitHub Pages using Actions and Cloudflare. A quick and easy way to use these 3rd party services to deliver your site: Cloudflare speeds up your site and gives you HTTPS for free. Github Pages is basically zero-configuration, free hosting. Travis CI glues the pieces together. And it’s free. The…
Keep Reading →

Queues, Culture, and Computer Science

December 19, 2016

Much has been written about the deep cultural significance that orderly queueing holds for the Briton. The opportunities it offers to display impeccable manners – and scowl at interlopers – are so rich that I’ve lost count of the number of serious, extended conversations I’ve had about the do’s and don’ts, the Ps and Qs, of waiting for service. As a programmer, though, it’s also interesting that…
Keep Reading →

Are dotfiles meant to be forked?

September 18, 2016

Tl;dr: I don’t think so, so I created Full Stop as a way for us to share dotfile tooling while staying agnostic about the content. In “Dotfiles Are Meant to Be Forked”, Zach Holman points out that we all benefit through sharing the efficiency-boosting tips, tricks, and tools many of us have in our dotfiles, and I completely agree. However, I think it’s important to draw a distinction between the…
Keep Reading →

Prototype: Virtual Reality e-commerce

June 06, 2015

At Teespring we have quarterly hackathons. We all throw suggestions into a melting-pot of ideas in the run-up to the event, with the most promising, most interesting, and most popular suggestions graduating to be hacked upon by a small team for a couple of days. A friend of mine at DODOcase had given me a couple of Google Cardboard-based virtual reality viewers that I hadn’t gotten around to…
Keep Reading →

Why exploding job offers don't work for senior hires

February 11, 2015

At the moment – and for the foreseeable future – the power balance of hiring negotiations favours the engineering candidates rather than with the hiring company. One consequence of this is that any attempt to hurry, strong-arm, or manipulate candidates will likely be ineffective, and could potentially backfire horribly. This is how I became one such backfire. The offer I had been lucky enough to…
Keep Reading →

Google Bollocks: their seminal new product

January 16, 2015

Spectacles, Testicles, Wallet and Watch. We think of it as the tongue-in-cheek mnemonic for recalling the sign of the cross. But is this all that it signifies? I think not. It’s become clear to me that infamous technophile, Pope Francis, has leveraged his position as head of the Catholic church to inflect the product roadmap of everyone’s favourite search behemoth: Google. Let’s look at news…
Keep Reading →

The worst project I ever worked on

July 05, 2013

I was recently asked: what’s the worst project you ever worked on? After a quick scan through my mental graveyard of half-finished, half-assed ideas too embarrassing for me to dignify with a link here, I settled upon my first job out of university. The company I was hired as a Software Engineer by IBM, to work out of their main UK development laboratory, Hursley Park, home of the mighty CICS…
Keep Reading →

Home-made present: how to make a punch box

March 17, 2013

I was always told to prize gifts that people had put time and effort into. Hoping my SO shared the same view, I decided to make her a little something for her birthday. Being creatively barren, I attempted plagiarism. I remembered seeing this Kickstarter project ages ago. It’s based on an old parlour game: the idea is to conceal little messages inside a nice-looking block, to be popped out with a…
Keep Reading →