David R. MacIver's Blog
April 2026
- How I've been using Claude Code
I've been using Claude Code a lot recently, and having a pretty good time of it. This is my report on that, and what I've found does and doesn't work well. - Hello
Here comes the new blog, same as the old blog. Welcome back.
February 2026
- On Mediocrity
One of the harshest words in my vocabulary is "mediocre". Let me tell you what I mean by it. - The hard problem with hard problems
Many problems are legitimately hard, but that isn't necessarily the reason you're struggling with them. - How to be less box-shaped
C Thi Nguyen wrote a great book called "The Score". You should read it. If you want, you can also read this review of it.
November 2025
- Making connections
If two people seem like they should know each other and don't, maybe you should fix that. - Reduce the need for active stabilisation
If you can do anything, it's much harder to focus on doing one thing in particular. When you can, make it so that focus happens by default.
October 2025
- How to find things (an intro to binary search)
I think binary search is worth understanding, and I think you probably don't understand it, or don't understand it in the most helpful way. Here, let me fix that. - How pen caps work
So, I recently learned how pen caps work. - COVID is doing the rounds again
Lots of people are getting COVID right now, here are some things I think you should know and do.
September 2025
- Yes you can hum while holding your nose
An essay about curiosity, experimentation, and humming. - How to say what you're good at
I'm good at explaining how to articulate things. - Have you tried not having the problem?
“Doctor, doctor, it hurts when I do this.” "Well, don't do that then."
May 2025
- How I clean my kitchen at the end of the day
This is a guide on how to clean my kitchen. - Behaving as if you were trying to succeed
People have a weird habit of acting without caring if their actions work. They should stop doing that.
November 2024
- Setting up my new blogging engine
I have a typewriter! Hear me typewrite. It goes click clickclickclickclickclickclickclickclickclickBING. KACHUNK! SHUNK click click click click click click click click ... - Meditations on taste
Allow me, if I may, to introduce you to a novel meditative practice. - How to read more books
If you want to read more books, stop making excuses and just figure out more ways to read books. Here are some that work for me.
September 2024
- Using what you're given
Sometimes the universe hands you fruit and you've got to use it somehow.
August 2024
- Losing yourself in an audiobook
I've been listening to a lot of audiobooks recently. This is both good and bad. - Looking for new projects
I'm looking for short-term technical projects. Think of me as a Solver type staff engineer for hire, with an interesting collection of technical specialisations and a general focus on producing quality software that solves hard problems.
July 2024
- Creative fury
The easiest way to make something is to be angry that it doesn't exist - Larger selves
Self is complicated and fractal, and happens every scale. If you squint hard, this begins to look a bit like a religion. - Nice problems to have
Not all problems are created equal. Some of them are actually fine. - How to rest
Here's a spell I use to have a good rest when I'm not able or willing to nap. - Using a list to manage executive function
The Day Plan system - Words and bodies
I've been exploring the physical side of journalling recently and it turns out there's a whole lot of weird stuff going on. - Carving up clouds
Why are things nebulous? What do we do about it? What is that squirrel up to?
June 2024
- Aesthetics, identity, and Real objects
In which I try to articulate an aesthetic quality that I call Realness, and talk a little bit about my relationship to it. - This is important
It sounds mundane, or like I'm joking, but what I'm talking about is important and I want you to understand that. - The mundanity of magical practice
My idea of magical practice is pretty contiguous with other common experiences, and looks a lot more like what "real" magical practitioners do than it seems like. - Turning paid subscriptions back on
This is just a courtesy email to let previous paid subscribers know that they're paid subscribers again. - My (no-longer-)secret magical practice
In which I explain the esoteric magical discipline I practice, and invite you to join me in it. I also teach you a neat trick for avoiding writer's block, and tell you a mostly pointless story about an orange tree and a hamster. - The Manual that solves all your problems
(It doesn't exist, sorry)
May 2024
- Emotional and physical therapy
Therapy should integrate exercise better than it does, and exercise should integrate therapy better than it does. If you're not moving as much as you'd like, that's a problem. Have you tried solving it? - Heterogeneity
This probably doesn't make much sense. Don't worry about it.
September 2023
- Why to explain things you already know
Explanations of things you already know help you fit your different understandings of the world together.
August 2023
- Decisions depend on the decision maker
As a beginner, it's tempting to copy what the experts do, but experts make decisions knowing that the consequences will be handled by an expert. As a beginner you need to systematically err in the direction of safety because the consequences will be handled by a beginner. - Completing completable projects
I finished a project recently. This is actually unusual for me. Here are some notes on what it was like. - Two types of work
Crunchy work is hard because reality fights back. Squishy work is hard because people are complicated. The experience of doing each is more different than its practitioners tend to treat it as and this is important.
July 2023
- You can't "solve" procrastination
Those who fail to learn from procrastination are doomed to repeat it.
June 2023
- In praise of turning people into dinosaurs
The beginning of my supervillain arc. - What's stopping you?
Every time you discover something you want hurts, and learn not to do it as a result, you become smaller. This is bad for you. Stop it.
May 2023
- Why do you do the things that you do?
Human flourishing requires embracing the specific. You must follow the inscrutable exhortations of your soul. - Starting from where you are
If you want to get better, you need to start by being honest about your current level.
February 2023
- Reading philosophy for the examples
Philosophy books often have really good examples. Here are a few of my favourites. - How things come to be as they are
I basically look at everything through the lens of evolution. You should too. - The problem shows you how to solve the problem
When trying to solve a problem, it is often better to start from the specific resources that the problem grants you than it is to fall back on general problem-solving techniques, as illustrated by me telling you about some not actually very difficult DIY tasks. - Cohering and decohering
There's a noticeable experience of being more or less cohered around a single focus at a given point in time, and it's interesting and useful to tease out the boundaries of that experience.
November 2022
- Learning to exercise agency
What is agency? How does agency work? Can you get better at it? It's actually doing stuff that gets you what you want, IDK, and maybe respectively. Here are some useful distinctions and observations that might help.
September 2022
- How to think about estimation strategy
I like to think of estimations as moves in a game. The rules of the game are simple once you've picked the scoring system, but unfortunately the real world provides a lot of uncertainty in what the best move is. Your job is to learn how to play the game the best you can. - What is it like to read LitRPG?
LitRPG is a particular genre of escapist fiction, which combines the appeal of both trashy fiction and computer games. Understanding its appeal is interesting in its own right, and also helps illustrate some helpful tools for understanding what people like in general. - Estimation is inseparable from planning
Estimation is hard! Especially when you don't do enough of it. Some tales from my recent flat move and all the ways in which I got estimation wrong (mostly by not doing it).
July 2022
- How to pick a number for any purpose
Estimation should often start with coming up with a range of plausible values for the true value. In this article I show how that works. - How to think about task estimation
Task estimation is hard because you don't actually know what task estimation is. Let me fix that for you.
June 2022
- Learning and teaching practical wisdom
Practical wisdom is the quality of knowing what to do is in a particular practical contexts. We all have some of it, and we could all benefit from learning more of it. I talk about how this newsletter is primarily a place where I try to teach practical wisdom, and provide some theory of how it works and how to get better at it. - A good start
Some parables about practical wisdom and the meaning of life. - Parts of you haven't grown up yet
We don't grow up all at once, and growing up fully requires us to acknowledge the parts of ourselves that aren't there yet, and help them grow up at whatever pace they're comfortable with.
May 2022
- How do we treat unique talents?
Some people are a mix of too odd to fit in and too useful to ignore. I worry that we don't treat those people very well. - Quick fixes to your code review workflow
Code review is usually done ad hoc and it shows. Here are some easy fixes that actually help. - Learning to walk through walls
It's easier to become good at restricted ways of interacting with the world than it is to grasp it in its full complexity. This is fine and good, but sometimes leads to limiting conceptions of the world that we need to be able to break out of.
April 2022
- Learning from others' stories
One of the best things you can do to improve at a skill is have a community of people you swap stories about it with, and to extract discrete tactics that you can practice yourself from those stories. - Delight in the imperfect
The world is a mess, and we can feel upset about that but at the same time notice that it's hilarious. Here's how. - Describing imaginary experiences
It seems to be very hard to describe the experience of visualisation and other imagination. Here's my attempt at doing so. - Education by punishment
Being part of society requires certain skills. Unfortunately, while we are happy to require these skills of people, we often completely fail to teach them and instead just punish people for lacking them. - Ubj gb ernq EBG13 (How to read ROT13)
Would you like to learn to read ROT13? Of course you would! Let me tell you all about it.
March 2022
- Looking for dragons drives progress
What sorts of problems create innovations? Bell Labs seems like a pretty central example, and I argue that a lot of why they were as successful as they were is because of the pretty mundane reason that they wanted to build a telephone network.
February 2022
- How to understand groups of people
You can't just think of people as rational actors responding to incentives, but you also you can't ignore incentives. The solution is to think in terms of collections of user personas who respond to incentives in different ways.
January 2022
- People don't work as much as you think
There is a persistent idea that people work 40 hours a week. They don't, and if you try to do this it will break you. Here are some more reasonable guidelines. - Peer one-on-ones
Group coaching is great, but sometimes you don't need the coach part. - Daily writing in January
I'm not writing my newsletter this month because I'm writing on my notebook instead. This is just a pointer in that direction.
November 2021
- Labelling Feelings 101
Would you like to know about how feelings work? Because this is a long piece about how feelings work and how to recognise yours. - The first hard choice
Sometimes you just start writing a newsletter about a neat little metaphor and end up screaming onto the page. Sorry.
October 2021
- Whoops, email is hard
I clicked the wrong button. Some of you got an email you weren't supposed to. - Discontinuing paid subscriptions
I'm stopping paid subscriptions. Here's the honest strategic reasoning behind that. - How to make easy decisions
Many decisions we have to make on a day to day basis are much easier than we treat them as. This is a partial guide to how you can recognise that and start lowering the cost of decision making.
September 2021
- Why is it hard to choose what to do?
You know how hard it is to do whatever you want when you're given the free time to do so? What's up with that and how do we fix it?
August 2021
- Current thinking: Play and self-improvement
On singing classes, practice avoidance, and the uncomfortable relationship between play and getting better at things. - Current thinking 2021-08-22
I'm experimenting with writing a weekly paid newsletter which is just "here's some stuff I'm thinking about right now". This is the first of hopefully many. - If you're stuck, try something different
If you're trying to get better at something and you've hit a point where you're stuck, try changing it up by switching to something that is like it but different so you can break your habitual patterns and learn the skill afresh.
July 2021
- How to give good advice
Most people don't give very good advice. Here is my advice on how to give better advice. - How does good taste work?
I have pretty bad taste in some things, and I'd like to have better taste in some of them, so I'm interested in the question of how one goes about doing that and thought I'd talk through some of my thoughts on the subject. - Telegraph your moves
It's often good to be predictable and to tell people what you're going to do before you do it, and people underestimate this.
June 2021
- Relaxing the newsletter schedule
I'm going to be writing on a more free form schedule during July. - Unscheduled Hiatus
Due to heat and other reasons, no newsletter this week or next. Normal service will resume. - Some thoughts on ethics and narrative
We construct a lot of our sense of ethics out of narrative, which works very well for us if we're the characters in a work of fiction. Unfortunately, we're not. - How to use thought experiments
Ethics is famous for weird and pointless thought experiments. This is mostly bad, but what would happen if we could think of a contrived scenario in which it was actually good? - Ethical decision-making and life patterns
Ethics is not just about individual decisions, because the entire sequence of events leading up to those decisions is also something we're ethically accountable for. - Communities construct a sense of purpose
There is a useful distinction to be made between the norms learned in a community and the norms learned in a society, and perhaps part of why we feel bad is the lack of the former.
May 2021
- Parts of you haven't grown up yet
We're all composed of many different parts, and some of them are more grown up than others, and we may need to work to help those parts out in ways we're not currently prepared to do. - How to teach the local style
Every organisation has a distinctive "style", which can be hard to learn. I discuss lessons from Vaughn Tan's "Uncertainty Mindset" and connect it up to some related ideas. - Some notes from behind the scenes
Some thoughts about directions the newsletter is going in and questions I'm thinking about right now. - How to triage your inboxes
When processing large inboxes we often adopt an item-first approach, but we should actually adopt a stage-first approach where we allocate the same maximum amount of time to making a decision about each item - Notes towards planning the future
Trying to figure out more about how to plan the future, I conclude that we need to start by thinking about how we relate to our past selves. - Record yourself to coach yourself
If you want to get better at something, recording yourself doing it while talking out loud about what you're doing is a good approach. - How do we treat unique talents?
Some people don't fit. We're happy to take advantage of that, but that doesn't lead to them being accepted. - How to do everything
Many things that seem hard you actually just lack an easy insight into, and it's worth spending some time investigating what those insights might be. - Understanding your health is hard
Today didn’t quite gel into a coherent narrative, so here are a bunch of loosely related fragments about the intersection between physical and mental health, the nature of knowledge, and the difficulty of doing science to everything we’d like to.
April 2021
- Life is a Series of Events
One way to improve our life is to think of it in terms of discrete events that we want to do more or less of. Here are some tools that can help us do that. - How to be weird
I have a lot of experience of being weird. Eventually this became a positive for me. - Being Disappointed in People
Being disappointed in people for not living up to the best versions of themselves is uncomfortable, for both you and for them, but is a necessary and healthy part of life. - Returning to the World
Emerging from depression is like returning to the world. Let me tell you some of my experiences of that. - Stop Telling People What To Do
Everyone seems really into backseating other people's lives, and I think you're being an ass when you do this and I would like you to stop. - Choosing what to do
How do you decide what to do with your life when it turns out all your very clever decision making strategies rely on avoiding decisions that matter? Beats me! Maybe reading some existentialists will help? - Mathematical Cranks, Information Overload, and Predicting the Pandemic
What do we do when there is way more information than we can possibly hope to deal with, most of it wrong, but also we still need to learn true things?
March 2021
- I Quit my PhD
Big news, as the title suggests. Here's why it took so long to get there. - Difficult Problems and Hard Work
A collection of fragments that might also be an essay — it's hard to say, really. - Intellectual DIY
Knowledge is better thought of as a set of intellectual tools we learn through practice than a body of memorised facts. We end up learning a great deal of "intellectual DIY" in our daily lives. - Pandemic Moods
Short fragments in lieu of a full essay, because the pandemic continues to have opinions about what I can write. - Unplanned Break
The newsletter didn't happen last week. This week isn't going much better.
February 2021
- A Fractal of Lies
On the problem of lies that have lies inside them, and what to do about it. - Believing That You Can Stop
On why it matters to believe you're allowed to stop doing a thing, even while you're still doing it. - Starting Again
Back from the hiatus, and attempting something radical: actually editing my writing.
January 2021
- Temporary Hiatus
Skipping a couple of weeks to keep my PhD from falling apart. Back in February. - A Few Book Recommendations
Three failed essay drafts later, here are some book recommendations instead. - The Habit Cycle
I'm very good at starting habits, and extremely good at noticing when they've collapsed in retrospect. - Reflections on 2020
So, 2020. Strange year, wasn't it. Here are some thoughts, written on new year's eve.
December 2020
- Life-Complete Problems
Some problems aren't really problems to be solved — they're just the shape of a life. - Trust
A hundred-tweet thread about trust, slightly better formatted. - Decoupling
When you have too many tasks, the problem usually isn't what you think it is. - Shameless Self-Promotion
I wrote a book. Here's the pitch.
November 2020
- Emotional Health
What does emotional health actually look like as a goal, rather than just an absence of dysfunction? - Have you tried just being good at it?
Sometimes the best way to deal with something we don't want to do is to just become really good at it so it's a non-issue. - Costing Up Solutions
Curiosity about a problem only gets you so far if you don't have tools to actually make progress on it. - Don't just try harder
When something is hard, the instinct to push harder is often exactly the wrong move.
October 2020
- Common Knowledge of Feelings
Something interesting happens when feelings become not just shared, but known to be shared. - How to Become Smarter
(With many weird tricks) - Monocropping
An agricultural metaphor for the risks of over-specialising your life. - Self Curiosity
On why not knowing what you're feeling shouldn't feel like failure.
September 2020
- A Brief Introduction to Shadow Work
A gentle introduction to the parts of yourself you've been pretending aren't there. - Refusing to Learn
On the ways people (and maybe you) actively resist learning things that might help them. - In Defence of Half-Arsing
Sometimes doing something badly is much better than not doing it at all. - Overthinking Overthinking
I sat down to write about one thing, ended up somewhere completely different, and now I'm writing about that. - Overthinking Overthinking (Resend)
Sorry, messed up the last send—the actual post is at the link below. - Positively Deviant
Positive deviance: the idea that the people doing unusually well might be worth paying attention to.
August 2020
- Distributing blame
On the unexpected relief of having only yourself to blame when things go wrong. - The Usefulness of Bad People
On the mildly uncomfortable observation that social groups often coalesce around people who are a bit of a jerk. - Being, Acting, and Feeling Responsible
There are three quite different things that all get called responsibility, and mixing them up causes problems. - Here's Some I Made Earlier
No post this week, just some links to past things worth rereading.
July 2020
- Writing to Understand
You’ve probably picked up by now that I’m a big fan of writing. - Fascination Procrastination
On the particular hell of being unable to do the thing you're most excited about. - Being Deep in an Abstraction Stack
On the discomfort of caring about things most people don't, and whether that's their problem or yours. - Maintaining Niche Interests
Having niche interests is easy; actually maintaining them is the problem nobody talks about.
June 2020
- What do you do?
A discussion of the distinction between Job and Work in Thomas F. Green's early writing, and how this can help us set boundaries with our employers. - No Newsletter This Week, AMA
Skipping this week; ask me anything instead. - Unusual Foundations
It is often worth looking for expertise you have that others around you lack, because it gives you options that their advice might ignore. - You should complain about it
Mondays, am I right? This is a letter about why you should complain about your problems to your coworkers. - Why am I not working on my PhD?
A worked example of some of the tools in my emotional toolkit, asking why I'm not working on my PhD.
May 2020
- Burnout as Acedia
In this letter I introduce the concept of acedia, a felt inability to care, and use it to help understand why and how burnout might occur. - Life as Nonproductive Act
I would like not to become a productivity guru, so here is a newsletter entry about why we need to reject the very idea of productivity. - How to do hard things
Welcome to How to do hard things by me, David R. MacIver, where I develop some additional ideas as part of a weekly newsletter. - Writing Elsewhere
This blog is on hiatus; here's where to find me instead.
February 2020
- There's no single error rate
There is no such thing as just 'making a mistake'—error rates depend on what you're trading them off against.
January 2020
- A Crash Course in Having Feelings
Basic skills for people who want to get better at the whole feelings business.
November 2019
- Open to Interpretation
On the gap between what's communicated and what's understood, told through a few stories.
October 2019
- Advice to new speakers
New public speakers try to play it safe. They're usually wrong about what 'safe' means. - Vocabulary Building: Satisficing
A word worth knowing: satisficing. Good enough is sometimes exactly right.
September 2019
- Being an example to others
You know how you hold yourself to standards you'd never dream of applying to anyone else? Let's talk about that. - Gendering
Not quite a post about what gender is — more about what categorising people by gender does to how we think about them.
August 2019
- Jiminy Cricket Must Die
On the little voice that insists on correct grammar, and why it should probably be ignored. - The missing social technology sector
There's an entire industry that should exist and, as far as I can tell, doesn't.
June 2019
- The Ethics of False Negatives in Interviewing
There's an ethical dimension to hiring decisions that almost nobody makes explicit, and almost everybody gets wrong.
May 2019
- How to do hard things
A fully general system for learning to do things you currently find difficult, only somewhat tongue-in-cheek. - The One Weird Word Rule
A useful writing rule: you only get one strange new word per piece. Use it wisely. - The Inner Sense of Gender
A cis person's perspective on gender identity, offered in case it's useful to anyone wondering if they're 'trans enough'.
March 2019
- Two types of viewpoint
Let me introduce you to two made-up words that are actually quite useful. - How do you nurture your imagination?
Imagination isn't something you either have or don't — it's something you feed.
February 2019
- You should be stockpiling food for Brexit
Yes, really. Here's why, and how. - Conferences Should Publish Menus
An entirely reasonable request that somehow remains controversial: tell people what they'll be eating before they show up.
January 2019
- Notes on Test-Case Reduction
Four years of hard-won knowledge about test-case reduction, much of which exists nowhere else. Niche, but if you need it, you really need it.
November 2018
- Situated Software
Most software tries to be reusable. Some software is better off not bothering. - Nonspecifically Neurodivergent
What do you call it when you have subclinical manifestations of about six different conditions? Very annoying, mostly. - FAQ: How do you read so many books?
The answer is very simple, which is not the same as easy. - Reaching into the Whirlwind
A personal metaphor for something I don't have better words for. Use it if it helps. - Local Goal Setting
How to set goals you can actually make progress on, illustrated with a breath-holding exercise you probably don't expect.
October 2018
- How to Explain Anything to Anyone
There are exactly three things you need to do to explain things well, and most people skip one of them.
September 2018
- My Position on Functional Programming
People keep citing me as someone who abandoned functional programming. Here's what I actually think. - More blogging over there
Most of my writing has migrated to the notebook blog. Here's a signpost.
August 2018
- The Can Opener Principle
On whether it's ethical to explain things to people who didn't ask. - Research Is A Lot Like Sex
A facetious rebuttal written while avoiding a paper deadline. Surprisingly safe for work. - Quieting your Dell XPS 13's Loud Fan
My new laptop was trying to achieve liftoff. Here's how I fixed that.
July 2018
- D&D Characters I Have Known And Loved
A nostalgic tour through past D&D characters, mostly chaotic. - Test-Case Selection and Choice Theory
Test-case reduction turns out to connect to social choice theory. I find this interesting; your mileage may vary. - Notes On Eating More Vegetables
I'm trying to eat more vegetables. Here's what I've learned so far, with appropriate epistemic humility about it.
June 2018
- DFA Minimization as a Fixed Point
DFA minimization reimagined as a fixed point computation. Theoretical curiosity, not practical technique. - Dis-Integrating the (Public) Self
On the strange pressure to be one coherent, globally accessible version of yourself online. - On Not Quite Fitting
On the particular experience of being someone who doesn't quite slot into the expected categories. - Doing the Two-Step for Efficient Reversible Deletes
I read a Knuth paper, didn't entirely understand it, rewrote it in my own words, and then had thoughts about data structures. - Cooking on Easy Mode
Sometimes the secret to good cooking is just knowing which cheats are worth it.
May 2018
- Statistical vs actual lives and ethical intuitions
A trolley problem I couldn't resolve, presented with appropriate annoyance at myself for caring. - Taking (Part Of) My Self Offline
On the experience of being unable to stop doing something, and what that tells you about how the mind works. - Monads as an interface for composition
Yes, it's a monad post, but the real subject is why QuickCheck-style testing became so widespread when better alternatives existed. - Block First, Ask Questions Later
Blocking someone on Twitter is not a moral judgment. It's just noticing that you don't want to talk to them. - Trashy Fiction Recommendations
My taste in fiction is not highbrow. Here are some books I liked anyway.
April 2018
- (Some of) my problems with correctness research
Following up on a post that got a mixed reception, with more careful arguments about why software correctness research often fails to matter. - An Unkind Question about Software Correctness Research
A lot of software correctness research follows a predictable pattern: the software is broken, we are doomed, here is our tool that nobody will use.
February 2018
- Refining L* search
Some fine-grained improvements to L* for inferring regular languages. You already know if this is for you. - Novelty Requires Explanation
If some simple solution to a long-standing problem were actually correct, experts would have found it already. This keeps not occurring to people. - Times to exhaust finite distributions when sampling with replacement
A maths problem hijacked my brain for a weekend. I eventually solved it. Here's how. - Can you write correct software in a statically typed language?
Epistemic status: mostly trolling. Mostly.
January 2018
- Why does everybody in the galaxy speak English?
A Stargate headcanon. The nerdiest thing I have written, possibly ever. - Selection pressures on company behaviour
Evolution doesn't care what's evolving. Companies are not exempt. - An algorithmic puzzle
A combinatorics problem I posted on Twitter, with a solution that follows. - A pathological example for test-case reduction
A worst-case example for test-case reduction that got cut from a paper. Nobody except me cares about this, but here it is. - Lazy fisher-yates shuffling for precise rejection sampling
A neat trick that probably isn't worth using. I'm going to tell you about it anyway. - The Clarke Gap
A term I coined on Twitter and found immediately useful: how distinguishable is a technology from magic?
December 2017
- The Great Asshole Filter
Patreon did something awful, and it turns out there's a theory for why platforms reliably do this sort of thing. - Lets talk about sets
The word 'set' means something different to mathematicians, programmers, and apparently everyone I talk to. - Non-fiction
An experiment: what happens if I give up fiction for a month?
November 2017
- Shaping the World
The unedited script from a PyCon UK keynote about 'Seeing Like A State' and what software developers might want to learn from it — delivered, apparently, in a state of mild panic.
October 2017
- Reality is a countably infinite Sierpiński cube
My philosophical positions turned out to be rather banal, so I had to go looking for weirder beliefs. I found one. - A statement of philosophical principles
Here is my philosophy. It is not especially unusual, which is itself a little unusual to admit. - The politics of "I don't know"
Having opinions about complex systems you don't understand is very normal, and I'm trying to do it less. - Truth and/or Justice
On the tension between wanting things to be true and wanting things to be just, and why that tension matters more than most people seem to think.
September 2017
- Python Coverage could be fast
Coverage.py is great. It is also, under certain conditions, quite slow. Here's an approach to fixing that. - Programmer at Large progress report
A brief, technically Beeminder-compliant update on why Programmer at Large has been quiet lately.
August 2017
- Surgery recovery update
I had surgery. I'm not dead. Recovery is, predictably, not pleasant. - Programmer at Large: Why aren't you laughing?
The next chapter of Programmer at Large, in which things presumably fail to be funny. - A trick for getting to sleep
When your brain won't stop, here's one way to convince it to. - Dispatches from the War on Sleep
An update from the ongoing campaign against my own sleep problems, including a surgery.
July 2017
- Programmer at Large: Why didn't they see this coming?
The latest chapter of the web serial. Bugs get triaged; questions get asked. - On Efficiency
Optimising for one thing tends to make everything else worse. This is not a coincidence.
June 2017
- There are no hidden rules
The feeling that everyone else knows rules you weren't told? That feeling is real, and it matters. - New Fiction
I wrote a story about Vicky Frankenstein and Ada Lovelace being gay, and I have some thoughts about that. - Shutting down my Patreon
The Patreon experiment didn't work out. Here's a postmortem. - A time and a place for work
Flexible working hours sound great until you notice who they leave behind. - Talking to people at conferences
I'm bad at this, but I used to be much worse. Some notes on how to be less terrible at talking to strangers at conferences. - Thoughts on the election
Beeminder made me write this. I was too depressed about the UK election to write anything good. Apologies. - Adaptive delta debugging
Delta debugging is good. It can be made better by being smarter about how you choose your deletion sizes.
May 2017
- Older women as protagonists in SFF
A crowdsourced reading list of SFF with older women as protagonists, prompted by a Twitter question. - Programmer at Large: Can we speed that up?
A chapter fragment of Programmer at Large. - Auction Update
The time auction worked out. Here's what happened. - A hybrid voting system for scheduling
Group scheduling has the same structural problems as democracy. Here's one way to fix it. - Programmer at Large: Does that work?
A chapter of Programmer at Large, featuring companionable silence and then, eventually, conversation. - The other half of binary search
Most people think binary search is about sorted arrays. It isn't, really. - Linear time (ish) test case reduction
Test case reduction is the problem of making failing examples small; this is a faster way to do it. - Startup Life
A short story about Dr Vicky Frankenstein, Vampire Ada Lovelace, and a cybernetics startup. It makes sense in context.
April 2017
- Life Changes Announcement: Academia Edition
The PhD plans from a few weeks ago turned into an actual PhD rather faster than expected. - Programmer at Large: Can we not?
A chapter of Programmer at Large, in which something goes badly and nobody is very happy about it. - Ordering and mapping regular languages
The problem of treating regular expressions as keys in a map — harder than it sounds, solved more cleanly than you'd expect. - An epistemic vicious circle
A pattern worth noticing, described entirely without examples — intentionally. - A worked example of designing an unusual data structure
Walking through the design of a random sampler with some non-obvious requirements — a rare look at how data structures actually get built. - Programmer at Large: Didn't you notice?
A chapter of Programmer at Large. - The Easy Way to Compile Automata to Regular Expressions
Turns out converting a finite automaton back to a regular expression is easier than it looks, once you sit down and actually work it out. - My time: Now available to the highest bidder
An experiment: auctioning off one day of work to whoever wants it most.
March 2017
- Fully Automated Luxury Boltzmann Sampling for Regular Languages
How to generate random instances of a regular language, with a detour through some nice combinatorics. - Programmer at Large: How old is this?
A chapter of Programmer at Large, featuring a morning routine with rather more software patches than usual. - How and why to learn about data structures
The common wisdom says most programmers don't need to know data structures. The common wisdom is not quite right. - An untapped family of board game mechanics
Board games have been running plurality voting this whole time, and nobody noticed. - Programmer at Large: Who wrote this?
A chapter of Programmer at Large, in which sleeping face-down in a hot tub is apparently a concern. - Looking into doing a PhD
Thinking out loud about possibly doing a PhD, for someone who already does research for fun. - Laziness is better when it's visible
A trick for making laziness explicit — and why that turns out to matter more than you'd expect. - How likely are Condorcet cycles in supermajorities?
Turns out supermajorities don't solve the Condorcet problem as cleanly as you might hope.
February 2017
- Programmer at large: How did people come up with this?
A chapter of Programmer at Large, in which someone tries to explain gender to a person who has genuinely never encountered the concept. - Adding a threshold to random ballot
Everyone's first objection to random ballot is 'but what about the fringe candidates?' Here's what happens when you take that seriously. - Coin tossing and adversary resistant priors
The genie is back, and this time he wants to play a coin-flipping game with your pile of gold. Things get philosophically interesting from there. - Rigging elections with integer linear programming
Not what you're thinking, but yes, the title is exactly what the post is about. - Programmer at Large: How do you do?
A chapter of Programmer at Large, featuring an exercise regime that involves counter-rotating rings. - Thinking through the implications
Maslow's hammer is a real phenomenon, but the way people invoke it is a bit of a hammer in itself. - Avoiding conferences in the USA for now
A political note: not going to US conferences for a while, and why.
January 2017
- Programmer at Large: Are you serious?
There's a bug that should have been caught earlier. The protagonist is not pleased about this. - Determinism is topologically impossible
A surprising result from some recreational topology: even in a deterministic universe, you can't run a truly deterministic experiment. - Programmer at Large: What's that noise?
A bug report about a mysterious noise leads somewhere unexpected. - Upcoming reduced publishing rate and Patreon
It turns out you can write a post and then not immediately publish it. I'm embarrassed it took me this long to realise. - Programmer at Large: What's your name?
Our programmer settles in and starts meeting people. The second chapter. - How to make good things
There's a pattern to how I make things that work. Here's my attempt to write it down. - Programmer at Large: What is this?
The first chapter of a web serial set several hundred years in the future, where a programmer investigates a bug report in a very unfamiliar environment. - Convergence of alternating sums
A curious formula for pi turns up on Twitter and leads down a pleasant mathematical rabbit hole. - Faster random sampling by handling rejection well
You almost certainly don't have this problem. The solution is nice anyway.
December 2016
- On persuasion and anger
There's one almost-universal rule of persuasion. Most people know it. Almost nobody manages to act on it. - Proving or refuting regular expression equivalence
Given two regular expressions, how do you either prove they're equivalent or find the smallest string that distinguishes them? - Randomized exhaustive exploration of a many branching tree
An obvious-in-retrospect solution to an obscure problem, written up because the wrong solutions took a surprisingly long time to discard. - Aligning incentives
Turning a tacit Patreon promise into an explicit system, because I like systems. - A simple purely functional data structure for append and forward traversal
A data structure problem with specific constraints that rules out all the obvious answers, and the surprisingly simple thing that works. - Randomly productive
A Beeminder-based productivity experiment involving a deck of index cards and a commitment to let randomness break the procrastination loop. - Voting theory and practice infodump
A link dump about voting systems, including the delightful discovery that ranked ballots are trivially deanonymizable. - Updating in favour of two-round delayed runoffs
IRV isn't great, but it turns out there are simple variants that are strictly better in the same way approval voting is strictly better than plurality. - The worst election
No, not that one. Using linear programming to construct a provably minimal election where four common voting systems each elect a different candidate. - Small elections comparing Majority Judgement, Range Voting and Condorcet winners
Range voting, majority judgement, and Condorcet winners: how do they interact? Perhaps unsurprisingly, they're fairly orthogonal.
November 2016
- 2017 Goal: Recurring Revenue
Setting concrete, honest criteria for when to give up on self-employment — before the goal posts move again. - The littlest infinity
First-year maths degree material about the natural numbers, chewed on slowly for the pleasure of seeing how it fits together. - Democracy for lunch
The question 'where shall we have lunch?' turns out to have some interesting voting-theoretic structure. - Metric space completeness is a restricted form of topological compactness
One of those facts that's obvious once you've seen it: metric space completeness is just compactness with sequences instead of open covers. - Generalized Single Transferable Vote
It turns out you can take any ranked voting system and use it as the basis for an STV variant. I'm not sure how useful this is, but it's interesting. - Deterministic Hare-Clarke STV voting, take 2
A revised and improved deterministic variant of Hare-Clarke STV, developed across several hundred miles of road trip. - A deterministic improvement to Hare-Clark Single Transferable Vote
A work-in-progress idea for making Hare-Clarke STV deterministic. Consider this a sketch, not a finished proposal. - A Small STV Election for Meek's Method
A small constructed election that shows exactly where Meek's method and Gregory counting diverge. - A failure mode of single transferable vote
Electing more seats can cause previously-elected candidates to lose. Here's a small election that demonstrates this. - I still believe in democracy
A dual citizen's affirmation of democratic values, written in a bad year for both of his countries. - Road Trip Day 5
Road trip dispatches: London, a friend's new bar, and the emotional aftermath of a US election. - Road Trip Day 2
Day two of a road trip: Penzance, rain, no pirates, and broken WiFi. - A reset protocol for my body
A personal checklist of things that help when I'm generally out of sorts. N=1, not medical advice. - I like short books
Short books are often better books — or so I thought until I actually checked my shelves. - Dividend paying sovereign wealth funds and decoupling effects
A speculative idea about sovereign wealth funds as a way to decouple welfare from work. Probably not politically feasible. - Review of a book that reviews (code) reviewing
I claimed code review wasn't good at finding bugs. The literature disagrees. I updated.
October 2016
- Road trip!
Taking a break from not writing code by driving around a country I've somehow never actually explored. - Why you should use a single repository for all your company's projects
Monorepos are good at everything you think they're bad at, and multi-repo is bad at everything you think it's good at. - Underestimating the inductive step
The base case is usually fine. It's the part where you assume things will keep working that tends to go wrong. - Some things that might help you make better software
Assuming you're in the unusual position of actually having budget for quality, here's what to spend it on. - Giving up on giving up on caffeine
I paid £75 to a stranger on the internet for the privilege of drinking coffee again. A post-mortem. - Static typing will not save us from broken software
Said by someone who actually likes static typing: the type system is not why your software is broken. - Declaring code bankruptcy for the rest of 2016
2016 broke a lot of people; here's a small PSA about what that looked like from the inside, and what I'm doing about it. - Some small single transferable vote elections
Stamp collecting among voting systems: small constructed elections to build intuition for what STV's many dials actually do. - On racist intermediaries in hiring processes
On how the hiring pipeline produces racially homogeneous results before bias even gets a chance to operate. - Two extremes of problem solving
Two ways of solving problems — one that needs the key idea first, one that bulldozes through — and what you can learn from the difference.
September 2016
- A Conference Survival Kit
The things I've learned to pack that make conferences feel slightly less like a physical ordeal. - My standard dinner meta-recipe
A Japanese-ish framework for dinner that is easy, healthy, and can be made actually good with modest effort. - Nasal experiments
Turns out I more or less can't breathe through my nose. I decided to find out if this was normal. - The Caffeine Alarm Clock
A simple trick for waking up on time that people find slightly too honest about the nature of caffeine dependence.
August 2016
- Better Sleep Data through pulse oximetry
A cheap pulse oximeter and some open source software turn out to be a surprisingly effective sleep lab. - What makes someone real?
A fictional band that performs real music raises some genuinely awkward questions about what it means to be a person. - Against Dutch Book Arguments
The Dutch book argument for transitive preferences is the argument I find most compelling — and I still don't think it works. - Why I'm in favour of proportional representation
The real trick to winning a vote is controlling which options people get to vote on. Everything else follows from that. - Ain't nobody here but us survivors
The people who will tell you you'll get used to something are, by definition, people who got used to it. - Trading influence: A half-baked parliamentary design
A voting system for parliaments that lets representatives trade influence on votes — probably a bad idea, possibly an interesting one. - How to not be late
Being on time is simple, if not easy: aim to arrive early.
July 2016
- Making taxes progressive through redistribution
Sin taxes are regressive, but there's a simple fix that I independently invented and then discovered already existed. - It might be worth learning an ML-family language
Not because it reshapes how you think, but because it teaches a specific and surprisingly transferable skill. - First Past The Post is not the problem, districts are
First past the post is bad, but it's not the part of the system that's actually killing you. - Seeking recommendations for better sleep data
My sleep tracker is worse than a Ouija board, my heart rate spikes to 100bpm in the night, and I would like to know why. - Contributors do not save time
Open source contributors are great, but not for the reason people usually think. - Against Virtue Environmentalism
On people who drive nowhere and eat meat lecturing carbon-negative vegans about hypocrisy. - Fuzzing through multi-objective shrinking
Using a test case reducer as a fuzzer, by building minimal examples for every branch ever observed. - Doing less by doing more
The counterintuitive trick that actually works: never try to do less of something, try to do more of something else. - An experiment in breaking a caffeine addiction
Cold turkey hasn't worked; here's what I'm trying instead. - Occasional Reading Post #8
Links: libertarian sea cities, the emotional cost of open source maintainership, the Cascadia subduction zone, and more. - How to navigate goal directed learning
Goal-directed learning is good, but picking the right goal turns out to matter quite a lot.
June 2016
- Weekly Reading Post #7
A small week's worth of links, courtesy of being in Mexico for most of it. - Three thought experiments on majority voting
Three small thought experiments about majority voting. You can and should infer the obvious context. - Weekly Reading Post #6 (Bi-Weekly Edition)
Two weeks of links in one, because last week was too thin to bother with. - Windows Progress Report
A month into switching to Windows, and it turns out some things don't work correctly not because of weird life choices, but just because they don't work correctly. - Weekly reading post #5
- L* Search and Inference of Deterministic Finite Automata
It turns out that if you can ask the right two questions about a language, you can learn its minimal DFA in polynomial time.
May 2016
- How to read a mathematics textbook
Reading maths textbooks linearly doesn't work; here's what to do instead. - Weekly reading post #4
Links and books, now with slightly more editorial structure than before. - The Derivative as an Alternative Minimal Deterministic Automaton
Another route to the minimal deterministic automaton, this time via Brzozowski derivatives — often nicer in practice. - The Myhill–Nerode theorem and the Minimal Deterministic Automaton
A gentle tour of the Myhill-Nerode theorem and why it gives you the minimal deterministic automaton for free. - Weekly reading post #3
This week's random sample of reading, minus the hour counts. - You're now all on commission
I need more customers and am bad at sales, so I've outsourced the problem to everyone else at 20%. - Weekly reading post #2
The second weekly reading post, published a day late because I forgot. - Charitable donations
I've been meaning to sort out my charitable giving for a while. I've sorted it out. - Hello from Windows
I switched to Windows for the first time in 15 years. I'm not happy about it. It's fine. - The Borda Count as a Randomized Limit of Approval Voting
A small observation about voting theory: approval voting, under sufficiently naive voter behaviour, quietly turns into the Borda count. - Randomizing Lean Coffee
Lean Coffee is nice. It could be nicer with a little randomization. This is my attempt at the latter. - Filibuster, the game
A party game about the art of interrupting people politely, requiring one piece of equipment you almost certainly don't own. - Weekly reading post #1
What I've been reading this week, tracked stochastically. - New group: "Making Work Better"
A talk proposal about changing things at work, and the group that grew out of it. - A random sample of what I read last week
A literally random sample of my non-fiction reading, weighted by time spent.
April 2016
- An estimation game for sprint planning
A technique for sprint planning that I haven't tried personally, for the obvious reason that I work alone. - Buy me books, redux
The book experiment worked, so now I'm asking for more. - Writing libraries is terrible
The talk, the video, and the full transcript of why writing open source libraries is not what it's cracked up to be. - In defence of developer exceptionalism
Thinking through whether software developers really are special, with the conclusion held at arm's length. - Brand split
Hypothesis content is moving to hypothesis.works; this blog is going back to being everything else. - Language reconstruction based fuzzing without reconstructing languages
An idea that clicked on a walk in Paris and got written down before it could escape. - Self-optimizing boolean expressions
A trick that might be a well-known idea with a name I don't know, or might just be a fun toy. - Shrinking failing input using a SAT solver
A SAT-solver approach to shrinking that works fine but not better than the simpler thing, which is a negative result worth writing up. - Delta debugging with inferred separators
Delta debugging works better when you let the data tell you where to split it.
March 2016
- Gerrymandering take two
Z3 was the wrong tool; a MILP solver handles 1000 districts where Z3 struggled with 20. - Optimal gerrymandering with Z3
Using a constraint solver to find out just how bad gerrymandering can get, before concluding this was the wrong tool. - Buy me books!
Not quite a donation page, but close: a request for books instead of money, with a principled reason behind it. - Augmenting shrinkers by inducing regular languages
An idea that might work, probably too slowly to matter — written up anyway. - The easy way to get started with property based testing
Property-based testing isn't just for beautiful algebraic code — the bar to get started is lower than you think.
February 2016
- Hypothesis progress is alarming
Live IRC transcript of me talking myself through a bug in Hypothesis's shrinking logic in real time. - Superposition values for testing
An attempt to help fuzz test a complex protocol ran into some fundamental difficulties. Here's what went wrong and what might work instead.
January 2016
- Commons: A board game
A half-arsed board game design about the tragedy of the commons, posted while half asleep. It may not be fun, but it contains the seed of a fun game. - Automated patch minimization for bug origin finding
git bisect is great if you have commit discipline. For the rest of us, there's another way.
December 2015
- 2015 in review
2015: I moved country, earned precisely £0, and somehow it was fine. - On criticizing programming languages (without criticizing their users)
You can think a programming language is bad without thinking its users are idiots. This is worth doing. - Mentors as a service
An idea I keep returning to: what if mentorship for junior developers was an actual service? - Effectiveness of personal greenhouse reduction vs donation
Running the numbers on whether changing your own behaviour or donating to the right places does more for the climate. - How to help your favourite open source project
You want to give back to open source. I can tell you exactly what open source developers want. It's money. - Direct proofs from the well ordering theorem
A neat direct proof that every vector space has a basis, spotted while writing about Zorn's lemma. - Zorn's lemma is what happens when you get bored of transfinite induction
Zorn's lemma, the well-ordering principle, and the axiom of choice are all secretly the same thing. You just have to look at them right. - Let's help people go to PyCon Namibia
PyCon Namibia needs funding, I need income, and I have a plan that addresses both.
November 2015
- The DRMacIver survival kit
Things I carry around with me that have proved surprisingly useful, in case you want to steal any of it. - Anyone want a speaker?
I have talks ready to go. You have an event. Let's talk. - Conjecture, parametrization and data distribution
Inside baseball notes on rewriting Hypothesis's internals, shared mostly because writing things down helps me think. - Services that won't buzz off
Beeminder's best property is that it doesn't let you quietly give up. It turns out you can give other services the same property. - Free work is hard work
Paying for software doesn't guarantee quality. Turns out the problem is harder than just adding money. - Notes on headache self-care
I get a lot of headaches. I've developed opinions about what helps. - My favourite language feature
Named arguments with defaults: the feature I didn't realise I'd miss until I had to write something without them. - So who wants a Hypothesis port?
Conjecture is a radically simpler take on property-based testing. Who wants to port it to their language? - Let Hypothesis making your choices for you
A new strategy that hands control of random choices to Hypothesis, solving a problem I previously needed a long post to explain.
October 2015
- Having another go at a vanity IRC channel
I tried this once before and it faded away. Let's see if a second attempt goes better. - A whirlwind tour of the Hypothesis build
Hypothesis has a ludicrously complicated build setup. Here are the highlights, in case any of it is useful to you. - New improved development experience for Hypothesis
Lowering the barrier to contributing to Hypothesis, for people who don't have my exact setup. - In praise of incremental approaches to software quality
The best design decision in Hypothesis wasn't clever or principled. I was just lazy. - The economics of software correctness
You have probably never written a significant piece of correct software. Neither have I. Here's why that's not quite as bad as it sounds. - Mergeable compressed lists of integers
A purely functional data structure that does both generation and shrinking without needing two separate representations.
September 2015
- There is no single acceptable defect rate
The claim that any real business knows its acceptable defect rate and is operating at it is, on reflection, not true. - Future directions for Hypothesis
Hypothesis is getting contributions from people who aren't me, which is both exciting and a little terrifying. - Finding more bugs with less work
PyCon UK talk on Hypothesis is now on video, if you'd rather watch than read. - Hypothesis: Staying on brand
I used to think brand consistency was fussy nonsense. Then I became responsible for one. - The repr thing
The repr output for Hypothesis strategies is pedantic beyond the ken of mortal man, and I'm a little proud of that. - Designing a feature auction
Stretch goals are bad and I have a better idea for crowdfunding Conjecture work. - Soliciting advice: Bindings, Conjecture, and error handling
Asking for advice on error handling in C, then promptly getting talked out of my original plan. The update is right there at the top. - Structure aware simplification for Conjecture
Letting data generation provide structure hints to the shrinker, so it knows where to focus. - Conjecture WIP: Simplification isn't simple
Prototyping Conjecture against Hypothesis's test suite. It is not going well, which is actually useful information. - A new approach to property based testing
One of those thought processes where each step seems obvious and then suddenly you've invented something. - A survey of Quickchecks
This post moved. Nothing to see here.
August 2015
- Mighty morphing power strategies
The Hypothesis API looks simple. It's mostly a distraction from how strange the internals actually are. - The two voices of progress
There's the voice that says how to make something happen, and the voice that says what will happen if you do. You need both. - Apparently I'm still doing this fanfic thing
I got talked into writing Aladdin fanfic about wishing mechanics. The plot holes kept solving themselves. - Notes on London flat hunting
I found a flat in four hours. Apparently this is not how it usually goes. - Hypothesis 1.10.2 and 1.10.3 are out
Two patch releases in quick succession, because I am extremely good at shipping one fix and immediately noticing another bug. - What if we had more finished libraries?
What if a library could just be... done? Not abandoned, done. - Fuzzing examples from the ground up
Some experiments with coverage-guided fuzzing for purely generative test data. This is what I do for fun. - How to generate a list plus an element of it
There are several ways to generate a list and one of its elements in Hypothesis. Here's which one to use. - A vague roadmap for Hypothesis 2.0
Here are all the Hypothesis features I want to build and probably won't. You're welcome. - New release of hypothesis-pytest
Two small but useful additions to the pytest plugin, both contributed by people who aren't me. - Book review: Smarter than you think, by Clive Thompson
One sentence: go read it. Several more sentences explaining why I feel compelled to say more than that. - Throwing in the towel
I'm stopping feature development on Hypothesis for the foreseeable future. This is not the end. - Hypothesis 1.10.0 is out
1.10.0 is out. No new user-facing features, but the internals got considerably less embarrassing. - New Patreon page for work on Hypothesis
I have a Patreon now, if you'd like to fund the open source work directly.
July 2015
- Massive performance boosts with judicious applications of laziness
I spotted a massive performance bug about two hours after shipping. The fix turned out to be surprisingly interesting. - Hypothesis 1.9.0 is out
My favourite kind of release: the one where I stop having to look embarrassed in response to common questions. - A terrible/genius idea
Compile errors are confusing in predictable ways. A classifier could probably help more than better error messages. - Two new Hypothesis releases and continuous deployment of libraries
Two bug-fix releases, one of which was written mid-Atlantic. Continuous deployment is genuinely useful even for small fixes. - Notes on Hypothesis performance tuning
How fast is Hypothesis? It's N times as slow as your code. Here's what to do about that. - Making Hypothesis sustainable
Six months of full-time work and very little money. Something has to change. - Heuristics are for learning, not for teaching
Rules of thumb are useful shortcuts until they're not. The problem is that we forget which situation we're in. - Hypothesis 1.8.0 is out
Mostly internal refactoring, but with some nice quality-of-life improvements if you've been annoyed by confusing reprs. - A wish list for programming languages
A list of language features I actually want, from someone who has mostly stopped caring about language wars. - Hypothesis 1.7.2 is out
A small release with some non-trivial bugs fixed, in case you've been seeing weird behaviour. - Properties for testing optimisation
There are really only two properties worth checking when testing an optimisation problem. Here's what they are. - Using z3 to try to solve Feedback Arc Set for Tournaments
I wanted to try Z3, so I pointed it at a problem I already cared about. Results were interesting. - Want to take a weekend to write tests?
A proposal: gather in London, write Hypothesis tests for open source software, fix bugs. You in? - Hypothesis 1.7.1 is out
Hypothesis 1.7.1 is out — there was no 1.7.0 — with Python 2.6 support and some useful new strategies.
June 2015
- Back-pedalling on Python 2.6
I said I wouldn't support Python 2.6 without being paid. Then business reality happened. - Some stuff on example simplification in Hypothesis
The part of Hypothesis everyone takes for granted and nobody thanks you for until it breaks. - Thinking with the machine
On what it means to think when so much of thinking has been outsourced to a small glass oblong. - Pydata London 2015
I attended PyData London, gave a lightning talk, and am told people liked it. - Hypothesis continues to teach me
Hypothesis has been teaching me things about software, and now it's teaching me things about running a business. - We made this
The thing I should have said in a debate about the existence of God, two years later. - Hypothesis for Django
I gave my first real public talk. It went unreasonably well. - Using Hypothesis with Factory Boy
It turns out integrating Hypothesis with Factory Boy is so easy I'm slightly embarrassed it needed a blog post. - Thoughts on Strangeloop and Moldbug
On the Strange Loop / Moldbug situation, and why the debate everyone's having is the wrong one. - Large scale utilitarianism and dust motes
A careful look at a classic utilitarian thought experiment and what it actually implies.
May 2015
- Using tmux to test your console applications
It turns out tmux is a surprisingly decent substrate for testing terminal applications. Here's how we ended up there. - The era of rapid Hypothesis development is coming to an end
Don't panic. The project isn't dying, I just need to eat. - New discussion groups for randomized testing
I reinvented a lot of things building Hypothesis because I had nobody to ask. Let's fix that for the next person. - Constraint based fixtures with Hypothesis
Test fixtures have a way of quietly accumulating details until nobody knows which ones actually matter. Hypothesis can help with that. - If you want Python 2.6 support, pay me
A modest proposal for how open source maintainers should handle version support requests. - Speeding up Hypothesis simplification by warming up
A small implementation trick that made example simplification considerably faster, in case you like that sort of thing. - Notes on the implementation of Hypothesis stateful testing
A year and a half of wanting to build this, and it's finally done. Here's how it works.
April 2015
- On Haskell, Ruby, and Cards Against Humanity
Cards Against Humanity is a game about convincing yourself you're funnier than you are. This has implications for programming languages. - The #1 reason I don't write Haskell
It's not the type system. It's not the monads. It's something that hits you the moment you sit down to write any Haskell at all. - Getting Google Analytics on readthedocs
I spent a morning not finding a working solution, so here's the one that actually works. - How to improve your Quickcheck implementation with this one weird trick
Three things that make Hypothesis novel all turn out to be the same thing. - Some empirically derived testing principles
Not universal truths, just things that have repeatedly saved me from myself. - Why I am no longer #YesToAV
Four years on from the AV referendum, I've realised we were arguing about which bad option to pick while the real problem went unaddressed. - Tests are a license to delete
Good tests don't just tell you when things break — they give you permission to rip out the kludges you were too scared to touch. - Notes on pilling a cat
Dexter is a lovely cat. Dexter does not want his pills. - Things that are not documentation
The code is not documentation. The tests are not documentation. The comments are definitely not documentation. Here's what's actually on that list. - Important things I have learned about Twitter on Android today
Twitter's Android app has opinions about your privacy. They are not your opinions. - Revising some thoughts on test driven development
I used to think TDD was mostly cargo cult. I still mostly think that, but with a more interesting exception than before. - The war cannot be won, yet still we must fight our little battles
I am not going to win the war against bad software. I'm going to fight it anyway. - Surprise! Feminism.
A post about open source went viral, and then the comments happened. - Interviewing: Test, don't sample
Asking for a code sample is a bad interview technique. Here's what to do instead. - It's OK for your open source library to be a bit shitty
That half-finished thing you threw on PyPI and forgot about? The world is genuinely slightly better for it existing. - Stargate physics 101
Stargate fan fiction that apparently works even if you've never seen Stargate, because it's mostly a comedy about physics. - Honey I shrunk the clones: List simplification in Hypothesis
Making shrunk examples look nice is a vanity project, but it's my vanity project.
March 2015
- How to make other people seem like humans
A technique for noticing that the people you disagree with are, in fact, people. - Hypothesis 1.0 is out
Hypothesis 1.0 is out. Here's what it does and why you should care. - What I would do with the Stargate program
Season 2 of my competent Stargate AU, written while not entirely sober. You were warned. - A sketch of a new simplify API for Hypothesis
An API design I'm already planning to break before the ink is dry. - 27 bugs in 24 hours
I tried a new code formatter and filed 27 bugs in a day. I am, as ever, a delight to have as a user. - I can dream, right?
A programmer ends up in hell. The reason may surprise you. - Simplify starts from the wrong end
I've been doing shrinking backwards this whole time, and the right way was staring at me from the Quickcheck API. - ##computer-enthusiasm, an experiment in liking things again
A channel for people exhausted by how terrible everything is, which turns out to also be about how terrible everything is. - Stable serialization and cryptographic hashing for tracking seen objects
A moderately obvious trick that took Hypothesis's example tracking from O(who knows) to O(n). - An alternate timeline for Stargate SG1
What if Stargate SG-1 were run by competent people? A thought experiment. - The downside of making accurate inferences about people
Sometimes good epistemics and good politics pull in opposite directions. I don't have a solution. - Topological compactness is an induction principle
Compactness is one of those concepts that seems mysterious until you see it the right way. - Continuous functions are those which preserve approximate measurements
Continuous functions in point-set topology make a lot more sense if you think about what 'approximate' means. - Software I actually like
Yes, there is software I actually like. It's a short list, but it exists. - Commodity futures trading! In space!
A game idea I find genuinely compelling and will never implement. - The beginning of a novel that I'll doubtless never write
A fragment of something that will almost certainly never get finished. You've been warned. - How to stop Hipchat beeping at you.
Hipchat makes a noise at you for every message and won't let guests turn it off. There is, fortunately, a workaround.
February 2015
- Triangular Beeminding; Or, Drink Less, Using the Power of Triangles
I used geometry to make a better Beeminder goal for drinking less. It worked better than I expected. - Monadic data generation strategies and why you should care
Hypothesis strategies are now monads. I promise this is interesting even if you don't care about burritos. - What are developer adjacent skills?
The skills that make you good at your job aren't always the ones in the job description. - The three stage value pipeline for Hypothesis generation
A design document written partly to think through the problem and partly to procrastinate on fixing the test suite I just broke. - What is the testmachine?
I wrote this code a year ago and then forgot how it worked, so here's the documentation I promised to write. - Some books I have enjoyed recently
The good bits from a recent reading binge. - Some thoughts on open source
I've mostly used permissive licenses by default, but I've started thinking harder about why. - Revised Hypothesis 1.0 plan
Some things I said would be in 1.0 won't be. The important ones still will. - Changes to the Hypothesis example database
The example database used to be a bit naive about what counted as 'the same test'. It's better now.
January 2015
- Better prediction of probabilities through auctions
Not about Hypothesis. About prediction markets, scoring rules, and ideas I couldn't find written down anywhere else. - A plan for Hypothesis 1.0
Two weeks in, a lot done, time to think about what Hypothesis 1.0 should actually look like. - On taking the ideas in Hypothesis
Please steal my ideas. I'm serious. - Using multi-armed bandits to satisfy property based tests
Hypothesis's data generation is more sophisticated than any other property based testing system I'm aware of. Here's why. - Anatomy of a bug hunt
A bug that's been lurking in Hypothesis since the beginning — and why I'm relieved I found it before users did. - The things you forget to test
100% coverage is a floor, not a ceiling. Here's what it doesn't catch. - The pain of randomized testing
As the author of a randomized testing library, I have some opinions about the pain of randomized testing. They're not what you'd expect. - I just want to brag a bit about the Hypothesis test suite
Look at how awesome my test suite is. - Hypothesis now has a mailing list
Hypothesis now has a mailing list. Come say hello. - Testing the installer for your python library
Hypothesis had 100% branch coverage, and I still shipped a version that couldn't run. Test your installer. - On the new data generation in hypothesis
The classic QuickCheck size parameter has some problems. Here's what I did about it. - Hypothesis short term road map
Where Hypothesis is going next, from the person who wrote it while still learning Python. - Extending a preorder efficiently and correctly
I get this wrong every single time, so I wrote it down. Maybe it'll help you too. - It turns out integer linear programming solvers are really good
I reinvented branch and bound, noticed I'd done it, and then found out the proper tools are much better at it than I am. - Optimal solutions to FAST
Finding exact solutions to a combinatorial optimisation problem I probably should have just Googled. - Using voting systems for combinatorial optimisation problems
Curing a New Year's hangover with ibuprofen, coffee, and NP-hard optimisation problems.
December 2014
- A genie brokers a deal
A trolley problem in disguise, with a genie. - Punishing people for improving the situation
Price gouging in a crisis is apparently fine because it was a rational transaction. Let's think about that. - A new plan for Christmas 2015
The best Christmas present my family gave each other was not doing Christmas presents. - Field notes from last night's recipe
Delicious but twice the work and two-thirds the result. Notes, not a recipe. - The questions you should ask when starting a project
It turns out I mostly reinvented the Heilmeier Catechism. Still useful questions. - So what happens now?
I quit Google. The plan is mostly to figure out what the plan is. - A small tactical voting example
A minimal election showing that strategic voting can produce worse outcomes for the voter who games the system. - Should you join Google?
Yes, probably. But here are some things I wish I'd known first. - Some more small elections
More small elections demonstrating that popular voting systems are not Condorcet. - An interesting hypothetical election
The same eleven votes, three different Condorcet methods, three different winners. - A patch for quadratic voting
Quadratic voting is a nice idea with one obvious flaw. Here's a fix. - Well that didn't last long
Six months at Google. That's that, then.
November 2014
- So you want to read some Fantasy
A guide to fantasy for people who like the idea of fantasy but have a Tolkien allergy. - Fallacies programmers believe about credit cards
Just one fallacy, but it's one that's cost me real money. - Asymptotic behaviour of max(Z_n)
It grows without bound, but 'without bound' is doing a lot of heavy lifting when we're talking about less than 7 after ten billion samples. - Another take on high variance strategies
A case I missed in my earlier post on high-variance strategies: sometimes you don't care how good the best solution is, just whether it clears a bar.
October 2014
- A Martian makes a bet
A logically omniscient Martian invades Earth and immediately gets dragged into a philosophy argument. - Order dependence in preference elicitation
It turns out the order you ask people what they want changes what they say they want. This is a problem. - A game concept for learning about SPRs
Simple linear rules beat human experts. This is uncomfortable. Here's a game to help you sit with that. - Relaxing some assumptions from the "high variance strategies" post
The previous post was a ludicrously over-simplified model. This one is a slightly less ludicrously over-simplified model. - The virtue of high variance approaches
When you're not trying to win on average, playing it safe might be exactly wrong.
September 2014
- What I'm doing to improve my sleep
My sleep isn't great, but it's a lot better than it used to be, and here's what actually helped. - Reading code without running it
Good advice about reading code turns out to be situational. C++ and enormous datasets are the situations where it breaks down. - The role of certainty in behaviour change
Trolley problems and Beeminder are secretly the same thing. - Majority judgement by hand
Note-and-vote is a decent decision process, but there's a better voting rule you could use for it.
August 2014
- I don't trust motivation
Relying on being in the right mood to do the right thing is not a plan. - Strategies, not promises
Willpower is not a strategy. Here's what to do instead. - Definitely not a Mexican recipe
A recipe that is emphatically not claiming to be Mexican, for reasons of friendship. - A satisfying resolution to trolley problems
Trolley problems are annoying because people treat them as thought experiments about ethics rather than about decision procedures. - David seeks app for fun and exercise logging
I want to log my workouts. Here is a precise spec. Surely this is a solved problem.
July 2014
- Exercise for people like me
I hate exercise but I've found something that works anyway, which is annoying. - Backpressure 2: Backpressure harder
The backpressure Beeminder experiment needed some tinkering. Here's how the tinkering went. - I should edit more
My editing process is basically 'click publish'. I'm going to try harder. - You should write more
Purely selfish advocacy for you having a blog and updating it. - Why mathematics makes you better at programming (and so does everything else)
There's a hot take debate about maths and programming. Here are four separate questions people are conflating, and what I actually think about them. - A system for coordinating groups
Having flatmates again has prompted some thoughts about coordination mechanisms. PRECISE ALGORITHMIC RITUALS may be involved. - Playing beeminder on hard mode by adding backpressure
I like Beeminder but hate eep days. Here's a scheme to make them less terrible.
June 2014
- Richman Scrabble: A play report
I proposed Richman Scrabble a year ago and finally got around to actually playing it. - A mod for a large class of board games
The most consequential strategic decision in many board games is made before anyone's even looked at their hand. - Gnocchi with Courgettes and Sundried tomatoes
A recipe produced by laziness, a food processor, a pressure cooker, and whatever was in the kitchen. - Another example of a compact convex set
I made a claim in my last maths post that was stronger than I could actually prove. Here's the counterexample I owe you. - Some examples of compact convex sets
I had some misconceptions about the Krein-Milman theorem that turned out to be obviously false once I thought about them. - How to learn a new city
I moved to Zürich and had to figure out how to navigate it. This is what worked, more or less. - My algorithm for deciding what to cook
I don't follow recipes. It turns out I'm running a greedy algorithm instead.
May 2014
- GO. VOTE. DAMMIT.
Someone told me the expected utility of voting is infinitesimal. They were wrong. - Go vote, dammit
Vote. Tomorrow. Yes, you. - How hard can it be?
Developers have a habit of assuming that jobs they don't do are easy. They're usually wrong. - Correlation does not imply correlation
Correlation doesn't imply causation, but it turns out it doesn't even imply correlation. - How UK MEP elections work
I didn't really know how MEP elections worked. Apparently neither does most of the available literature. - Putting word counts into beeminder
I'm using Beeminder to make myself keep blogging. Here's how I set it up. - Printing, a status report
Moving countries requires an absurd amount of printing. Here's my reluctant journey to owning a printer. - MacIver: A pronunciation and spelling guide
My name causes problems. Here's how to not cause them.
April 2014
- The man who named the stars
A fairy tale that's been sitting in my head for a few years, finally written down. - A culinary option you may have overlooked
Za'atar exists and you should probably be eating a lot more of it. - We are borg
I'm joining Google. Here's why, and why some people aren't happy about it. - Locally compact Hausdorff spaces and the Riesz Representation Theorem
Working through why the Riesz Representation Theorem actually needs locally compact Hausdorff spaces. - Paying attention to sigma-algebras
There's a point about sigma-algebras that took me embarrassingly long to notice.
March 2014
- I think I might have a book problem
I found an entire statistics book on my shelf that I have no memory of purchasing. It looks pretty good. - Write libraries, not services
Please stop turning everything into a service. A library will do. - Chickpea and vegetable stew
A "what can I make without leaving the house" meal that actually turned out well. - Sketch design for a sort of housing co-operative
A rough sketch of a housing cooperative idea I had, which I freely admit may be obviously terrible for reasons I've missed. - What is good code?
Good code is code that's easy to change when you need to and that you rarely need to change. - More book recommendations
More books I've read recently and thought were worth your time. - Notes on a randomized variant of majority judgement
I worked out a natural randomized version of majority judgement. It's elegant as a design and disappointing as a voting system. - A two person agreement protocol
Sure, you could just talk it out. But wouldn't a little structured democracy be more fun? - A class of games I wonder if exists
There's a gap in board game design space that I'm surprised no one has filled. - My kitchen has a new toy
One conversation about onions later, I owned a pressure cooker. - Open data and fair elections are incompatible
Turns out that making your voting data open and making your elections fair are goals that work against each other.
February 2014
- Etiquette for the devil's advocates
Devil's advocacy is a useful tool that most people use badly. Here's how to use it well. - New testmachine release
testmachine development was stalled on a thorny subprocess problem. It's unstalled now. - How to write good software
A thesis on how to write good software that I have, to my shame, never successfully followed.
January 2014
- Different types of overheads in software projects
A quadratic theory of why software projects get expensive, and why it's not just about the code. - Reading code by asking questions
Code you can't modify is code you don't really understand. Here's how I actually read codebases. - Revisiting an old voting system design
A second look at applying random ballot to multi-member elections, with some new concerns. - Coinpocalypse
The Oyster card top-up machine is a masterclass in how to make a simple task genuinely terrible. - Now you too can have a magic bug-finding machine
I turned the bug-finding thing into a Python library. You can use it now. - Improving code coverage with testmachine
Nyah nyah, my magic bug-finding machine automatically generated fifty test cases. - Compressed ranges for intmap
Thinking about whether you can make a patricia trie smarter about contiguous ranges. - Introducing THE TEST MACHINE
I wrote a programming language to test my data structure. This is either brilliant or ludicrous; possibly both.
December 2013
- A potentially fun game mechanic
A game mechanic in search of a game: what if how often you get to move was itself something you could bid on? - Report on a scrabble variation
I've been playing a Scrabble variant over the holidays. Field report: it's actually pretty good. - A personal history of interest in programming
Someone wrong on the internet claimed you have to start programming young to be good at it. Here's my counterexample. - Reevaluating some testing philosophy
I've changed my mind about some things I used to believe pretty strongly about testing. This is me working through why. - Domain specific evaluation orders
I found a neat trick for speeding up my C code that I'm perhaps unreasonably pleased with. - Updates to intmap
I said the API would be stable, and then I changed the entire memory ownership model. Programmers, eh? - New project: IntMap implementation in C
I implemented a fast integer map in C, which mostly involved learning things I didn't know about C and memory allocation. - Experimenting with python bindings to jq
I wrote Python bindings for jq this weekend. It's still ugly, but it's my ugly baby and I want to tell you about it.
November 2013
- A sketch-design for a type of non-profit organisation
A design for getting people to pool money toward a goal without having to commit it until there's something worth spending it on. - Binary tournaments
The standard kind of tournament—split into two halves, winners meet in the middle—turns out to need special treatment. - The geometry and optimisation of tournaments
Some actual maths about the shape of the space of tournaments and how to find good ones. - Lets play a game
A game that isn't very fun, designed as a starting point for thinking about tournaments. (Some of the optimisation claims later turned out to be wrong.)
October 2013
- Consider the tournament
Given a tournament with known win probabilities, how much can you influence who wins by choosing the order of play? - Chicken breasts in red wine and caramelized onion sauce
An improvised recipe that turned out well enough to be worth writing down. - It's like Intrade meets OKCupid
Online dating is bad. Here's a slightly strange idea for making it less bad. - Examining bias in non-majoritarian random pair
A look at whether a particular probabilistic voting system has the proportionality properties you might hope for. - Stating the probabilistic Gibbard-Sattherthwaite Theorem
I trusted a third-party summary of a theorem. It was wrong. Now I'm reading the actual paper. - A technical lemma I am finding surprisingly useful
A small, clean result about probability distributions that keeps showing up in unexpected places. - The other randomized voting system
There are surprisingly few voting systems immune to tactical voting, and the maths behind why is genuinely interesting. - Ordinal and cardinal numbers
What are cardinal numbers, actually? Part of a series on infinity that is trying to be honest about what these things mean. - Well orderings, comparability of cardinals and aleph_1
A slightly out-of-order instalment in the infinity series, covering well-orderings and why aleph_1 is what it is.
September 2013
- Maybe I'm doing it wrong
A family trait, a battle cry, and a question about whether correcting people is a virtue or a compulsion. - An amusing problem to solve
A coding interview question too evil to actually use, which means I had to implement it anyway. - The false proxies of mirror images
Hiring for 'culture fit' is often just hiring people who look like you. This is bad, and worth saying clearly. - Designing a tech meet-up for inclusiveness
Tech meetups could be more welcoming. Here's what that might actually look like in practice. - How learning Scala made me a better programmer
Not because of the functional programming. Well, not only because of that. - Some things that are the same size as each other
Infinity is full of things that seem like they should be different sizes but aren't. Let's look at some of them. - An introduction to infinity
A maths degree's worth of set theory distilled down to the point where aleph-one makes sense to you. - How to submit a decent bug report
There is a correct format for a bug report. This is it. - I think I don't think like I think I think. I think
I was going to teach you how I think. It turns out I have no idea how I think. - Notes on instrumentalist reasoning
Philosophy without a licence. The question: should you try to believe true things, or useful things? - Other ways to improve democracy by picking your politicians at random
Random ballot is just the beginning. Here are two and a half more ways randomisation could fix your democracy. - Notes on aspirational mental models
Some thoughts on the gap between where you are and where you're trying to get to, prompted by writing recommender systems. - Warning: This blog has secret mind control powers
A confession: I do manipulate you when I write. Here's how. - How to get free tea from Pret a Manger
A story about mild anger, customer service, and getting what you want by being very specific about what you want. - Blog editorial guidelines
The informal rules I've accumulated for what this blog is and isn't for. - I am angry too
I said I'd try not to swear. I am trying. It is difficult. - With enough context, everything makes sense
There is ice hidden in a towel under a bowl, and yes, it makes total sense. - Towards a more perfect democracy
A rewrite of my most popular post, which was badly written the first time. The voting system is still a good idea; it's still a political nonstarter.
August 2013
- Valid arguments from my opponent believes something
If someone holds demonstrably false beliefs, should that make you trust their other arguments less? Yes, actually. - Best of drmaciver.com
A curated self-indulgent tour through the archives, filtered by what I actually think is worth reading rather than what the internet decided. - Hammer Principle back online
Hammer Principle is back up after some long-neglected dependency rot. Sorry about that. - More tinkering with auction games
Scrabble ideas collided with a failed auction game design, and now I have a new game design that I suspect is overcomplicated. - How to quickly become effective when joining a new company
I was shipping features on day three at a new job. A colleague asked how. Here's the answer. - Thesis: Job hopping is good for companies
Everyone talks about why job-hopping is good for employees. It's also good for the companies they leave. - More on labels and identity
Written while avoiding packing for a convention full of near-strangers. Some follow-up thoughts on labels and who we are. - Things you can do to scrabble
Scrabble is fine, but what if each turn were an auction? What if it weren't turn-based at all? A collection of variations.
July 2013
- Some webcomic recommendations
A list of webcomics I actually like, for my cousin Alex and anyone else who might find it useful. - A curated feed of stuff I found interesting
RSS is not a curation tool; it's a sippy cup for the information firehose. Anyway, here's a link blog. - A case study in bad error messages
Python's error messages are often unhelpful in very specific, fixable ways. Here's an example. - You are not your labels
I have a complicated relationship with labels. Possibly weirder than most people's.
June 2013
- I suppose it's not terribly surprising that Wordpress are bad at security
Wordpress will happily ask you to enter your password into a third-party domain. Just because it says it's fine. - Venison stew
Wild venison stew that technically obeys all my dietary rules, even if it feels like it shouldn't. - Report on some initial playtesting of the auction game
The auction game was playtested. The verdict: there's something there, but it definitely needs work. - Updating my dietary policy
My dietary policy needed updating: it was missing some areas and wasn't hardcore enough. - Arguments I am unlikely to listen to
A list of argument forms that reliably don't work on me, for your reference. - Boycotting kickstarter
A rape-advocating pickup artist got funded on Kickstarter. Kickstarter shrugged. I stopped using Kickstarter. - More linux wifi hilarity
I thought I'd fixed the wifi. I had not fixed the wifi. - The long RSS winter may be over
Feedbin works on desktop. Newsblur works on Android. Neither is good. But one is slightly less bad. - The cult of the giant global brain on moral philosophy
A series of observations about moral responsibility and scale, leading up to a question I don't answer. - Problems with Linux wifi on an Intel network card
I don't fully understand why this fixed my wifi, but it did, so here it is for anyone else googling this problem. - Customers who read this blog might also like...
Amazon's book recommendations are terrible, and thinking about why reveals something interesting about how recommendations actually work. - But enough about me...
An open thread, because apparently I talk about myself quite a lot on my personal blog. - How to hard "boil" an egg, redux
My seven-step egg method has been superseded. The new method has one step. - A refinement to the auction game
Some second thoughts on a game design, with the benefit of actually thinking it through a bit more carefully. - Problem solving when you can't handle the truth
A far-future detective novel raised some questions about how we solve problems when the answer might be something we don't want to know. - Bayesian reasoners shouldn't believe logical arguments
If you believe logical arguments, you might be doing Bayesian reasoning wrong. This may be hazardous to your health. - An amusing financial instrument for creating a common currency
What if you could have a common currency without giving up your own? A modest financial instrument proposal. - Collaborative coin flipping
How do you flip a fair coin when neither party trusts the other's coin? Turns out it's simple, and the math is neat. - A manifesto
What would happen if the Queen dissolved parliament and put me in charge? I've given this more thought than is probably healthy.
May 2013
- Chesterton's patch
Chesterton's Fence is a good principle. Here's an extension of it that I think is even more useful. - A crude voting simulation
Running ranked voting systems through a simulation to see how often they agree with each other. - When does one normal distribution dominate another?
A small excursion into probability theory that turns out to have a surprisingly clean answer. - Come join the cult of the giant global brain
A post that escaped the draft pile three times. Make of that what you will. - Another group interaction experiment I'd like someone to perform
An experiment about how much two people end up agreeing after talking—and whether agreement is even the right thing to measure. - An auction game design
Apparently Monopoly is supposed to have auctions. This still sounds bad, but it did make me want to design a better auction game. - Terra: A brief review
Terra is either a new programming language or a very nice C-code-generation library for Lua, depending on how you look at it. - A simple example of non-VNM total orders
A very common and natural way of ordering distributions that violates the VNM axioms. You probably use it all the time. - A theorem on dominance of random variables
A characterisation of a dominance relation on random variables, because apparently this is the kind of thing I think about. - A sketchy and overly simplistic theory of moral change
A left-wing, hippy theory of morality—disclaimed as such upfront—that has strong opinions about trolley problems. - Another model for bribing MPs
Flattr, but for bribing politicians. Let's call it Bribr. - Comment moderation
Akismet gave up, so now comments are moderated. Sorry. - How to legally(?) and efficiently bribe a democracy
Crowdsourcing political bribes is obviously illegal. But what if we found a workaround? - Some simple theorems about dominance of probability distributions
On a partial order of probability distributions that I think is the right one, and why. - More on infinitary decision strategies
Brief notes on what happens when you try to extend decision strategies to uncountable sets. The short version: it gets complicated. - Using two level discourse as a tool of thought
A game for exploring ideas with a partner, using two levels of discourse. I haven't tried it yet, but I think it might work. - The moral argument for rationality
First, hit yourself with a hammer. Then we'll talk about why rationality is a moral obligation. - A theorem about certain families of random variables
Some pure mathematics I worked out for decision-theoretic reasons and then found useful for nothing—but it's still a nice result. - An infinitary extension to the previous theorem about random variables
Extending the finite strategy theorem to infinite sets, where things get messier and the classification mostly breaks down. - An amusing conceit for a sci-fi story
A short story premise: interstellar travel is easy, humans evolved it naturally, and this has predictable consequences. - On vegetarians who eat chicken
People who eat chicken but call themselves vegetarian aren't confused — they're just using a word differently than you are. - On the Von Neumann Morgenstern Utility Theorem, Part 1
You asked what I have against the VNM utility theorem. Well, it would be faster to list what I agree with. - Objections to the VNM utility theorem, part 2
Part two of my ongoing quarrel with the VNM axioms, this time on the question of whether your preferences have to be complete.
April 2013
- A magic system with consistency and depth
What I actually want from a magic system: consistency, depth, and consequences. - An interesting experiment that no one seems to have performed
An experiment on group intelligence and problem solving that, as far as I can tell, nobody has run. - An announcement and a brief retrospective
I got a new job. Here's what I learned from the process of looking for one. - The winning strategy for random ballot is not what I thought it was
Turns out my previous theorem was wrong. Here's the correct one. - How to stop Android's fucking profanity policing bullshit
Android kept autocorrecting my swearing. I found a fix. - Percentages of the popular vote in UK elections
Thatcher's 43% looked low. It was not low. This is depressing. - Value functions lead to non-transitive preferences
On why trying to reduce preferences to a single value function might be a mistake. - Book review: What The Best College Teachers Do
A book about teaching that mostly confirmed what I already suspected, but said it well. - Some ill thought out musings about identity
Some genuinely half-baked thoughts about personal identity, prompted by an unusually high jump as a child. - I've been stealing recipes from my mother: Ice cream pie
A deeply 70s dessert that is, against all odds, a good thing. - Deterministic voting is just too random
People worry random ballot means lunatics could seize power by luck. Here's why that's unlikely. - Now with added Flattr
I signed up for Flattr. Here's what that means and why. - A bugfix for my queuing business model
I found a flaw in my scheduling model. Fixing it made the model better. - A freemium model for scheduling
A queuing algorithm, a business model, and the NHS walk into a blog post. - A proposal for electoral reform
My preferred voting system has no chance of being adopted, so here's what I'd actually push for.
March 2013
- The horror lurking at the heart of the new hypothesis
I rewrote Hypothesis and in doing so made something deeply weird explicit. It works, though. - Another new hypothesis feature: flags
A Hypothesis feature for adjusting input distributions, blatantly stolen from someone other than who I thought. - A possible more principled approach to generation and simplification in hypothesis
Thinking through how Hypothesis should actually handle generation and simplification in a more principled way. - Stateful testing with hypothesis
Quickcheck-style testing, but for mutable data structures that can be broken by a sequence of operations. - You probably shouldn't do this, but it works really well
Disabling the garbage collector between tests is terrible in principle and embarrassingly effective in practice. - My personal dietary policy
I eat meat, I have thought about it, and I have opinions about people who haven't. - Nontransitive dice are unsurprising
Nontransitive dice are only surprising if you expected the universe to be helpful. - Yesterday Was Change Everything Day
Google Reader died, and somehow that turned into me overhauling my entire digital life. - Quickcheck style testing in python with hypothesis
An early look at Hypothesis, back when it was version 0.0.4 and I was cautiously optimistic. - Blasting patents for fun and profit
A friend made a game about shooting patents. It's exactly as good as it sounds. - Falsifying hypotheses in python
I missed Scalacheck, so I built something like it for Python. This is how it works. - An interview question
A coding challenge that turned out to be substantially harder than intended. Consider yourself warned. - An audible experiment
My writing sounds better out loud. I have data. - A (rewritten) manifesto for error reporting
Same manifesto as before, less anger, clearer presentation. - A parable about problem solving in software development
A parable about solving the wrong problem with great dedication, based on a mostly true story. - A manifesto for error reporting
Bad error messages don't just slow you down — they make me angry. Let me tell you why. - A meta-recipe
An oriental supermarket opened a minute from my flat and I've been improvising Asian cooking with mixed results. - Now syndicating drmaciver.com to twitter
I've decided to toot my own horn more efficiently. - A heuristic for problem solving
A formal-ish heuristic for debugging that's probably too expensive to run in your head but interesting anyway. - Exploring your twitter archive with unix
I had a Twitter archive for a month and hadn't looked at it. Time to fix that. - What are developers bad at?
I'm a developer trying to figure out what developers are bad at, which is a bit of a blind spot problem. - A file that should exist in all your ruby projects
If you're using Ruby and Bundler and git, there's a file you're probably missing.
February 2013
- So I accidentally designed a voting system
I wasn't trying to design a voting system. I was just thinking about multi-winner elections. One thing led to another. - Different ways of defining topologies
Open sets are not the most intuitive way into topology. Here's a different approach that might work better. - Update on voice recording in interviews
It turns out job interviews are not very amenable to structured experiment design. Who knew. - A discussion on free time and hiring and employment practices
A long Twitter thread about hiring, free time, and working hours, left here without further comment. - Questions for prospective employers
The refined, field-ready version of my list of questions to ask employers during interviews. - An election protocol for implementing random ballot in an accountable manner
Random ballot is a genuinely good idea for electing representatives. Here's how to actually implement it. - Why random ballot is a good idea
A concise list of reasons why random ballot is actually a pretty good way to elect representatives. - New blog look
The old theme was embarrassing. The new one is minimal and not embarrassing. - Implementing find_or_create correctly is impossible
find_or_create looks simple. It is not simple. It is, in a precise sense, impossible to get right. - Interviewing companies
Interviews go both ways. Here's what I actually want to know when I'm on the other side of the table. - Majority Judgement implementation in python
A Python implementation of majority judgement voting. Useful if you happen to need one, which is admittedly unlikely. - Update on resampling voting systems
A partial answer to a question I asked last time, for a certain class of voting systems. - A resampling statistic for voting systems
What happens if you rerun an election on a random sample of voters? I define a number to capture this, and suspect it might be interesting.
December 2012
- Twitter as the death of blogging
It turns out I've written more words on Twitter than on my blog. This seems wrong. - Ignorance is bliss for whom?
A defence against Christmas earworms, courtesy of Jonathan Coulton. - So I accidentally wrote a monad tutorial
It's a monad tutorial. I'm not proud of it, but here we are. - How do you interview people without a programming background?
Hiring someone without a programming background into a programming role is an interesting problem, and I'm not sure I have the answer. - Constructing the negative numbers
You know how negative numbers work. Here's how they actually work. - Hello there, who are you?
I write this blog for myself, but apparently several hundred of you didn't get that memo. - Calvin and Hobbes, gocomics and dotjs
Calvin and Hobbes is online now, which is great, except for the part that isn't. - If Programming Language Articles Were People
Calling out sexism is uncomfortable. Doing it anyway.
November 2012
- Committing to calling out sexism
A friend called out some sexist behaviour and then turned the mirror on himself. I found that admirable, and it got me thinking. - Gluten and dairy free brownies
Adapting my brownie recipe for a friend who can't have gluten or dairy. It took two attempts, but it worked. - Teach me how to hire a diverse team, please
My team is good. It's also entirely male. I'd like to fix that next time, and I'm asking for help. - A non-transitive tournament
Rock-paper-scissors turns out to be more interesting than you'd think when you run an actual tournament with it. - Saturday night madness
I spent a Saturday night writing C. There were chat logs. No regrets. - Playing to your strengths can be a weakness
Being bad at things you don't do is fine. Being bad at things that are adjacent to your job is more of a problem. - Two column morality
Harm and good don't cancel out neatly. Treating them as if they do is probably a mistake.
August 2012
- Sieving out prime factorizations
Instead of factorizing each number individually, you can sieve them all at once. It's obvious in retrospect.
July 2012
- Come work with me!
We're hiring a backend developer. Come work with me, and some other people I suppose. - Randomly exploring github
I built a little toy for wandering around GitHub at random. Popular repos come up more often, which seems right.
June 2012
- How to do expertise search without NLP
Finding the right person in a large organisation turns out to be a tractable problem, even if you don't speak machine learning. - How to hard "boil" an egg
Boiling an egg is not actually easy. Here's how to do it consistently without ruining it. - A heuristic for detecting expertise
Real experts care about details you think are irrelevant. That's actually how you spot them. - Salad for breakfast
I went to a wedding in Israel and came back with a new breakfast habit.
May 2012
- Against Human Readability, Part 2 of Many: The toolchain argument
The Unix toolchain argument for text formats sounds good until you think about what the Unix toolchain is actually good at. - Against human readability, ongoing discussion
The IRC channel is up. Come argue about human readability with me. - An interesting game mechanic
A combat mechanic that came out of a conversation about RPGs and went somewhere the original conversation didn't. - Against human readability (part 1 of many?)
I think human readability is overrated. I can't fully defend that yet, but here's a start. - The proper approach to fixing bugs
A bug is a symptom of misunderstanding. Fix the misunderstanding, not just the bug. - OpenVPN repeatedly losing connections with inactivity timeout
Debugging OpenVPN inactivity timeouts: what caused them and how we fixed it. - The DDGHF policy on prostitution
A careful, caveated attempt at thinking through what a sensible policy on prostitution might look like. - Turning deterministic strategy games into nondeterministic games of voting
How to turn a board game into a voting system experiment without needing to coordinate a large group of people. - Greetings from the Ministry for Dancing, Getting High and Fucking
A megalomaniacal policy proposal for a government ministry whose remit is exactly what it sounds like. - An interesting experiment in social choice
An experiment I thought of but probably won't run: using a strategy game to figure out which voting system actually works best.
April 2012
- pageme: A gem for invoking pagers from ruby
There was no Ruby gem for piping output to a pager. So I wrote one. - Feeling tired? You should read this
If you've been tired for a long time, there might be a physical reason. Please go find out what it is. - Constraints inspire creativity
Constraints don't limit creativity — they often provoke it. Counterintuitive, but it keeps turning out to be true.
March 2012
- Converse results: Approximability implies certain topological properties
If approximability implies topological properties, what topological properties does approximability imply? Some of the answer, at least. - The odd topology of uncountable cardinals
A standard result about continuous functions on uncountable cardinals, presented with a slightly tidier proof than usual. - Generalizing local approximations to global ones
What happens when you replace real-valued functions with arbitrary normed spaces? This is the heart of the thing.
February 2012
- Advance warning of advanced mathematics
A paper I started six years ago, never finished, and keep coming back to. This time I might actually do something with it. - Radii in function spaces
Some results about radii in metric spaces, where the center is constrained to a subset. - A nicer way to complete metric spaces
The standard construction for completing a metric space is fiddly and annoying. Here's a cleaner way. - The power of fixed point theorems in Set Theory
Fixed point theorems do a surprising amount of heavy lifting in set theory, and the proofs are nicer than you'd expect. - New, more principled, hammers
Hammer Principle still exists and we've been shamefully ignoring it. That's about to change. - "Agda is now mainstream"
Turns out if you ask people vague questions you get vague answers. Agda being 'mainstream' is a case in point. - A green build on my weighted FAS solver
My test suite has always been aspirational rather than descriptive. Today, for the first time, reality caught up.
January 2012
- Integer sets with O(1) range allocation and O(log(n)) deletion
A data structure I should have remembered existed. I didn't, so here it is written down. - An algorithm for incrementally building separation graphs
An algorithm I haven't tested yet, posted mostly to get the ideas straight in my head. - Butternut squash, coconut and chickpea curry
One of my standards, finally written down. Details subject to change. - A cute algorithm for a problem you've never cared to solve
I needed to partition a metric space to minimize diameter. It turned out to have an exact polynomial-time solution, which surprised me. - Story concept: Dead man walking
A story concept I won't write, so I'm posting it here in case someone else wants to. - I don't write Scala
Many Scala people follow me. I am not one of them. - Really simple spatial indices
Spatial indices don't have to be clever. Sometimes the dumbest thing that could work is actually fast enough.
December 2011
- And now for something completely different
A post about shaving. I also hate having a beard. This is an unsatisfying situation. - Keeping track of the Kth smallest element
A small algorithmic observation that seemed obvious until I looked at the details. - A Vantage Point Tree implementation in (shudder) Java
A friend needed a vantage point tree implementation in Java. I provided one, while making my feelings about Java clear. - A cute lower bound for weighted FAS tournaments
A lower bound result for weighted feedback arc sets, with a proof that's actually kind of elegant.
November 2011
- PeCoWriMo derail
I got slightly distracted from my PeCoWriMo project. In my defence, I ended up writing C. - Notes on design of a Haskell API
Working through what a good Haskell API for metric space search actually looks like, one iteration at a time. - Personal Code Writing Month (PeCoWriMo)
NaNoWriMo but for code, because the thing I actually want to write right now is not a novel. - Generating random spheres
A shower thought about generating random points on an N-sphere, and why the two obvious solutions are respectively wrong and slow.
October 2011
- Constraints for wish construction
On the proper engineering of three wishes, with careful attention to the loopholes. - Ethical Calculus
Half-formed ideas about how to actually reason about ethics in a way that takes tradeoffs seriously. - New Blog: Imbibliotech
I've started a separate blog about drinking so I can stop polluting this one with cocktail posts.
August 2011
- Gin!
A systematic investigation into which gin and tonic combinations are actually worth drinking. - Miso-Sake Quinoa with Tofu and Vegetables in a Peanut-Sesame Sauce
An improvised vegan dinner that came out extremely well and definitely needs to be made again.
July 2011
- Hey guys, we're hiring!
We're hiring at Aframe, if you want to work on interesting problems in video production.
June 2011
- If This Then That, a neat little service
A useful service that does exactly what you'd expect from the name, and I find it genuinely handy. - The (Programming Language) Hat
What kind of hat does each programming language make you wear? A deeply important question. - Dietary rearrangement
I was trying to eat more normally. Then I read a Guardian piece about fish stocks and said some words. - The Other Hammer Principle
We made a Hammer Principle for martial arts, because apparently that's a thing we do now. - World, whim, etc. Part 2
Continuing to fill in the policy details from the last post, mostly about government structure. - The World as I Would Make It
A detailed account of what I would do if I were in charge of everything, which I'm aware is a worrying document.
May 2011
- Judgement and Asymmetric Errors
Lower error rates sound good until you notice that not all errors cost the same. - Sleep as an Droid export data
Possibly the most niche piece of software I've ever written, but if you also use Sleep as Android and want your data in a sensible format, here you go. - Drinks from the weekend
Birthday party cocktail science, including one drink named for its complete lack of medicinal properties. - Maximum entropy methods for single-winner elections?
A paper about applying maximum entropy principles to voting systems, and why it's an interesting idea with a computationally annoying problem. - On the value of helpful error messages
A smart scale that didn't work, a useless error message, and what eventually saved the day. - My Brownie Recipe
The best brownie recipe in the entire world, easy to make, and almost entirely dependent on the quality of your cocoa. - Ha ha, only serious
12,640,417 people voted no to AV, and now we get to find out what that means. - (Runtime) Cost-free abstractions in clay
Building a comparators API in Clay that lets you sort by anything without paying for the abstraction at runtime. - New Comment Policy
Comments are back, and here's how they're going to work this time. - What books have made you a better person?
I asked Twitter what books had made them better people. Here's what they said. - A plan for not failing
A post about cooking, despite all the politics I've been writing lately. I promise there will be programming eventually.
April 2011
- I'm mentioned (and misrepresented) in the New Scientist
The New Scientist mentioned my voting article. Unfortunately they missed the scare quotes around "perfect". - How to turn AV into a Condorcet system
A randomized AV variant with preferential voting that reliably elects sensible winners. Not about the referendum, despite the timing. - Some yes2av links
A collection of links making the case for AV, including a cat video that is, apparently, also a good explanation. - A less perfect system for which I will nevertheless be voting
Random ballot is a lovely idea. AV is not. I'm still voting yes. - A "perfect" voting system
A voting system that sidesteps Arrow's theorem entirely. The scare quotes around "perfect" are doing a lot of work. - An open letter to thames clippers
A complaint to Thames Clippers about being subjected to a tourist commentary on a commute.
January 2011
- Because ten just wasn't enough
We built a random commandment generator at work and it somehow became a team project. These things happen. - Playing with a new language: Clay
I've been window shopping for new languages again. This time it's Clay.
December 2010
- Reading video frame by frame with ffmpeg
A probably unnecessary but genuinely interesting detour into reading video frame by frame with ffmpeg, in pursuit of scene detection. - Dear Commenters: Frankly, I'm tired of you
A letter to people who comment on blog posts without reading them. - Removing silent tracks from a video: A bug and the hack that killed it
A bug in video processing, a hack to kill it, and a crash course in video from someone who had to learn it on the job.
October 2010
- When you have a hammer: Squish usage example
A worked example of using Squish for frequent item set mining. - An interesting idea for authentication
A thought experiment about authentication that might actually be better than passwords. - A possibly new unix-style utility
A small utility for collapsing consecutive lines with the same key—probably exists already, but here's one anyway.
August 2010
- On hiring (developers)
What happened when the job spec was written by one person instead of by committee. - Northpaw, part 1
Building a haptic compass that buzzes north—part one, in which it mostly works but assembly was a disaster.
July 2010
- Teaching
An IRC conversation about whether software design intuition can be made explicit. - The role of a CTO
An IRC conversation about what a CTO actually does, with the usual IRC caveats. - Sweet and spicy roast aubergine
Very simple, very good. The marinade does most of the work. - What did you study?
Collecting the stereotypical responses people get when they mention their university subject. - Irrelevant alternatives aren't
Arrow's Impossibility Theorem is interesting, but it probably doesn't mean what you think it means.
June 2010
- Rank aggregation basics: Local Kemeny optimisation
The technical details behind aggregating many rankings into one, as used by Hammer Principle. - Chakchouka, of sorts
Not quite chakchouka, but close enough, and the post-gym protein craving didn't leave much room for strict authenticity.
May 2010
- Databases for cooccurrences?
A lazy web request: does anyone have a good solution for storing and querying co-occurrence data? - The Right Data
The data from The Right Tool is now available for download, if you want to do your own analysis. - Rank Aggregation in The Right Tool
The Right Tool now has result pages, and here's how the ranking actually works. - The right tool for the job
An attempt to gather actual data on how people describe programming languages, instead of just asserting things that sound plausible.
April 2010
- The best way to handle exceptions
Swallowing exceptions is bad. Catching them and quietly doing something wrong is worse. - DataMapper: A (partial) retraction
The DataMapper people were pleasant about it, and they've fixed the worst of it. Partial credit given. - DataMapper is inherently broken
A post written in anger at being proven right one too many times.
March 2010
- Roasted Gnocchi with Butternut Squash and Cashews
A simple roasting recipe that earned gratuitous seconds. - On the perils of PostgreSQL rules
The #postgresql channel was right. I was wrong. Rules are bad, actually. - Sequential compactness and the splitting number
Correcting an old post about sequential compactness, because it turns out I was confusing the splitting number with the reaping number. - Dark Lord
A short story about what happens when the heroes keep losing and someone finally decides to think practically about the whole dark lord situation.
February 2010
- You Might Not Know...
A project to surface the useful little tricks everyone has but nobody shares.
January 2010
- Understanding timsort, Part 1: Adaptive Mergesort
Timsort is just mergesort with a pile of clever variations. Here's how to arrive at it from first principles.
December 2009
- I want ONE MEELYUN sentences
I need a million sentences for a machine learning project. This is the story of trying to find them. - Shaving yaks and finding feeds
I wanted to do something interesting with RSS feeds, which first required having RSS feeds, which required a whole other thing.
November 2009
- Filtering deleted documents with PostgreSQL rules
A neat PostgreSQL trick for hiding spam without actually deleting it. - Potato and butternut squash "pizza"
Not quite a pizza, not quite a gratin, but definitely quite good.
October 2009
- Dear lazyweb: A problem on cached string searching
Thinking out loud about a string search and term indexing problem — answers welcome. - Experiments on the theme of cauliflower and cheese
Cauliflower cheese: not the most exciting dish, but worth doing properly at least once. - Am I being boring?
Writing advice: if you're wondering whether a bit is boring, it probably is.
September 2009
- Creative cooking on half a brain
A real-time account of cooking dinner while unable to think, which somehow works out. - It's all the same, really
Good advice at the general level tends to transfer across fields more than people expect.
August 2009
- Join me on IRC
One-way broadcasting is fine, but occasionally it would be nice to talk back. - Rube Goldberg 2.0
Tracing the improbable chain of events that follows clicking upvote. - A story, and an oft overlooked point
A story about my father falling out of a tree, and everything that had to go right afterwards. - Open source term extraction
We open sourced our term extraction library, which separates the 'what is a term' question from the 'is it significant' one. - A delicious way to use up stale bread
Stale bread fried in tomatoes and balsamic vinegar: better than it has any right to be. - How to start the week
Monday decided to see how much it could throw at me before I noticed. - Open source nostalgia
Most of my open source code has never been used by anyone, and that's fine.
July 2009
- Crowding the trampoline
My employer is crowdfunding their Series B, which is either innovative or a sign of the times. - How packages work in Scala
How Scala packages used to work, preserved for posterity and clearly labelled as lies. - reddilicous: Automatically import your links from other sites into delicious
I made something purely useful, which is quite unlike me.
June 2009
- Axioms, definitions and agreement
Most arguments aren't really about the thing they're ostensibly about. They're about definitions nobody bothered to agree on first. - Making my life more difficult
I don't do things the hard way for its own sake. I do it because the easy way is usually wrong. - Some useful scripts
The problem with bookmarking things is that you already have them somewhere else. A few scripts to sort that out. - Lessons learned: Are you solving the right problem?
The problem you think you have and the problem you actually need to solve are frequently not the same problem.
May 2009
- Many eyes make heavy work
A late-night experiment in visualising which Twitter hashtags get used together. - Food discovery of the day
Fried polenta goes really well in Greek salad. - Cashew and butterbean non-mous
I kept failing at homemade hummus, so I tried something different instead. - A problem of language
I don't care about language wars, but I do care about bad arguments, and this one is bad. - Interest bandwidth
The more interesting your actual work is, the less you find yourself caring about programming language debates. - Hug the frog
Hector is a frog. He lives on my desk and has a Twitter account. This seemed normal at the time. - A hectnical digression
A technical explanation of how @HectorTheFrog decides when to hect.
April 2009
- Command line tools for NLP and Machine Learning
I am late to the Unix philosophy party but I'm very enthusiastic about it now. - Determining logical project structure from commit logs
What if you could figure out which files belong together just by looking at which commits touched them? - A reminder: Planet Scala move
The old Planet Scala URL stops working in a few days. Yes, really. - Open sourcing Pearson’s Correlation calculations
Doing Pearson's correlation in SQL is, it turns out, a hilariously bad idea. - Gates
A brief account of what I remembered after I used to be a superintelligence. - Pulling the plug on old planet scala feeds
The old Planet Scala feeds are going away at the end of the month. Update your readers. - More kittens: Improving edge weight calculations
The kitten clustering was producing a chaotic rainbow inside the dark bits. Fixed. - Segmenting kittens: Experiments with clustering image contents
What happens when you run Markov clustering on an image of a kitten? Amusingly bad things, mostly. - More fun with xsel
One command to dump your selection to a pastebin and get the URL back. Bind it to a key. - Scala trivia of the day: Traits can extend classes
Most Scala self-type usage I've seen exists because people don't know this one thing. - planet scala now on github
I don't care about web frontends. Here's how to take the Planet Scala frontend off my hands. - A workaround for misbehaving X citizens
Firefox and Pidgin don't handle paste properly; here's a workaround involving xsel.
March 2009
- From Objects to Agents
I apparently gave a talk at BarCamp London about a subject I know nothing about. The slides are online if you want them. - Exceptions for control flow considered perfectly acceptable, thanks very much
I was told to write a post defending exceptions for control flow. Fine. Here it is. - Left folds with early termination
The JVM is mean to us, and folds are the morally correct abstraction anyway. - We don't need anonymous inner classes? Bollocks to that.
Someone is wrong on the internet about anonymous inner classes, and I am obliged to do something about it. - Planet Scala gets its own domain
Planet Scala has a real URL now. Please use it. - Filtered feed to Planet Scala
I've stopped spamming Planet Scala with my recipes and fiction. You're welcome.
February 2009
- How do you talk about Scala?
A talk about Scala that somehow never actually got to talking about Scala. - Spam
A spam message arrived, and one thing led to another. - Planet Scala now running on venus
Maintenance update for Planet Scala, plus one extremely bad planet joke. - New site design
The sidebar was annoying me, so I did something about it. - Not really LÖVING it
LÖVE made it easy enough to start making games, which is how I discovered all the reasons to stop.
January 2009
- Criticizing programming languages
I don't have a 'Scala is one of the few languages worth criticising' stance. I criticise all sorts of languages. - Porting Pearsons to Postgres. Performance?
PostgreSQL's default configuration is ridiculous, but once you fix it, the performance story is relatively happy. - Cleaning up a set of tags, part 1
User-generated tags are a mess. Here's an attempt to do something about that. - Importing work posts
Now auto-importing work blog posts, which may be slightly confusing out of context. - Yet another MySQL Fail
MySQL will helpfully delete your strings if they look a bit like zero. Just something to be aware of. - Old mathematics posts
Imported an old maths blog; the LaTeX is broken, but it should be readable anyway. - Computational linguistics and Me
Apparently I'm a computational linguistics blogger now, which is news to me. - Writing things right
The most important innovation of OO is that functions go after their arguments. No, really. - Planet Scala: By Scala programmers, usually about Scala
Experimenting with including full feeds on Planet Scala, on the theory that most of it will be relevant anyway. - Planet Just Scala
A filtered Planet Scala feed containing only the Scala bits, hacked together with Yahoo Pipes.
December 2008
- Living on the edge of academia
I'm not an academic, but I need to read papers. Here's how I manage that. - Pearsons in the database, part 2
That SQL query for Pearson's correlation that worked fine at small scale? Turns out a million rows is a different problem.
November 2008
- Calculating Pearson’s correlation coefficient in SQL
Apparently computing Pearson correlation in SQL is crazy. I did it anyway. - Posting elsewhere
I've been posting about SQL elsewhere. Links within. - Computing connected graph components via SQL
Sometimes you have graph problems and only a relational database to solve them with.
September 2008
- A cute Scala hack
A small Scala trick for references that gracefully handle exceptions.
August 2008
- A curious fact about overloading in Scala
Scala's array overloads hide a quiet WTF. Here it is. - A glorified to do list
I've set up a Trac instance to keep track of things I need to do. Very exciting. - New collections in Scala 2.7.2
I got my name on a Scala release note — not for anything glamorous, but for some new collection implementations. - A follow up to yesterday's article
A lot of people missed the point of yesterday's post, so here it is in a more accessible format. - Functional code != Good code
Functional code can be bad code. I know, I know. Let me show you. - Reusing Java's tools: Cobertura and Scala
Getting Java's coverage tool Cobertura to work with Scala turns out to be surprisingly easy. - Unsigned comparison in Java/Scala
Java doesn't have unsigned integers, and most of the time that's fine. This is about the times it isn't.
July 2008
- They called me mad
A piece of microfiction featuring an operating table, a man in a lab coat, and the classic setup. - Removing myself from planet haskell
There's too little Haskell on this blog these days to justify the listing. - java.lang.String#hashCode
Java's String hashCode is, as suspected, not very well distributed. Here are the numbers.
June 2008
- Lessons learned in class
A half-asleep post-mortem on porting a Java bytecode library that turned into more than I bargained for. - Planet Scala
The Scala aggregation sites are bad. Setting up a good one is easy. So I did. - Code generation for structural proxies
Scala uses reflection for structural types, which is slow. I went off and reinvented something to fix that. - Scala arrays
Scala arrays look inefficient and are confusing. They're less inefficient than they look, and this post explains why. - Random linear algebra hackery in Scala
A rough-and-ready linear algebra API for Scala, because wrapping Colt seemed like a good idea at the time. - SBinary 0.2
SBinary 0.2 is out. Documentation is not, but you can still play with it.
May 2008
- Book Review: The Art of Assembly Language
A review of a book I liked, which is also mostly a rant about the book. - A cute hack: Changing the scope of System.out
System.out is a global variable, which is a problem when you need multiple interpreters. Here's a thread-local solution. - GUI interpreter frontend coming along nicely
Progress update on the Scala interpreter GUI — it's getting there. - Trampoline Systems and Scala
We're dropping Scala at work. Not because of anything Scala did wrong. - Code move
Moving my hg repos to my own domain because freehg.org is flaky. - Request for help: Numerical linear algebra
I have a maths degree and a programming job and somehow ended up knowing almost nothing about numerical linear algebra. Someone please help. - Not really an announcement: GUI frontend to Scala Interpreter
The Scala command-line interpreter on Windows is a horror, so I built a GUI for it. - A reminder of how Wordpress handles RSS feeds
If you came here for the Scala and got polenta instead, or vice versa, you're in luck — RSS category feeds exist. - Removing myself from Artima Scala Buzz
A minor housekeeping announcement dressed up as a fake dramatic revelation. - Baked parmesan and tomato polenta
I bought polenta because of its colour, a book scene, and never having tried it. A perfectly sound basis for a recipe.
April 2008
- Make your menu definitions less irritating
Swing menu definitions are extremely verbose. Here's a Scala DSL that makes them merely verbose. - QDBM Bindings
Learning the Haskell FFI by writing C bindings, which is certainly one way to do it. - Code for you to play with
Several Scala and Haskell projects, moved to freehg.org so they can be quietly ignored in one place. - SBinary progress
SBinary is not dead, just waiting on Scala 2.7.1 and some implementation decisions. - Monadic card shuffling
How do you shuffle a pack of cards? Literate Haskell has opinions. - "Object Main extends Application" considered harmful
The Application trait in Scala looks like a neat trick. It has a subtle problem with threads. - New Blog
Consolidating several blogs into one. A fresh start, a better name, and probably still the same content.
March 2008
- Scala syntax change proposal
A syntax proposal for call-by-name parameters that turned out to be a reversion to an older syntax, which then acquired a life of its own. - Sbinary performance and Buffered IO
Reading 900kb of data was taking two seconds. The fix was embarrassingly obvious in retrospect. - SBinary backends
I said SBinary would remain minimal and focused. I may have changed my mind. - An introduction to implicit arguments
Implicit arguments in Scala are extremely useful and not well understood. Let me fix that. - Existential types in Scala
Scala's existential types confuse everyone, including me until recently. Here's a brief introduction.
February 2008
- Hector's Reminder Service: QT Jambi and Scala
I built a little taskbar app that pings you with configurable reminder messages at configurable intervals. It's called Hector. - Open source project breakdown.
Turns out I have a lot of open source projects, some of which are totally defunct. Here's an honest accounting. - Formatting
Blogger was mangling my posts with rogue br tags, so I fixed it, which broke everything else. - Wait, you believed them when they said "Write once, run anywhere"? That's so cute.
A tiny cross-platform Java app that turned out not to be cross-platform. Surprise. - Anyone willing to put a word in for Groovy?
Every time someone advocates Groovy at me I feel nothing. Someone tell me if I'm wrong. - Tell us why your language sucks
Not a rant about languages you hate — a request for honest criticism of languages you love. - Easy binary serialization of Scala types
Java serialization gives me the heebie jeebies, so I ported Haskell's Data.Binary to Scala instead. - More penne and cheese
A follow-up baked pasta experiment that shares nothing with its predecessor except pasta and cheese. - Food hacks
On the programmer's instinct to solve cooking problems with whatever's to hand.
January 2008
- Learning Scala
Scala is hard for some people and easy for others. I have a theory about why, and I'd like to test it. - Java collections and concurrency
Don't use synchronizedList. Don't use synchronizedMap. Just... don't. - More Asus hilarity
The ongoing saga of trying to get Asus to fix my laptop, featuring ever more creative forms of unhelpfulness. - Minor revelation about Scala existential types
A small but satisfying realisation about why Scala's existential types are more useful than Java's wildcards. - Dereferencing operators
The surprisingly contentious question of what to call the dereferencing operator in a Scala library. - Why not Scala?
I like Scala. That doesn't mean it doesn't have problems. Here are the ones that actually matter. - Variance of type parameters in Scala
Covariance and contravariance sound scary. They're not, really. Here's what they actually mean.
December 2007
- Amusing discovery of the day
Java the language and Java the bytecode are not quite the same language. - Hardware vendor shit list
Some hardware companies have seriously pissed me off and I would like the record to reflect this. - Random thoughts on OO
OO is supposed to separate concerns. It does not separate behaviour from data. Think about that. - Type classes in Scala
It turns out Scala can do Haskell type classes, once you track down the bug in the compiler and wait for a fix. - No, seriously, why Scala?
An article called 'Why Scala?' failed to answer its own question. I'll have a go. - Open sourced range types
The range types now have a home on the internet. - Statically checked range types in Scala
Someone asked if Scala supports range types. The answer was no, then I spent time making it yes. - Minor irritations
Java's flow analysis for final variables is slightly wrong in a specific and mildly annoying way.
November 2007
- Don't forget to fly
A comic, a Haskell user group, and a rant that had been building for a while. - Dependency injection in Scala
Thinking out loud about dependency injection in Scala, and why the Java frameworks mostly don't quite fit.
October 2007
- Java performance tip: Think about your container sizes
The default HashMap constructor isn't free, and if you're creating thousands of them you might want to think about that. - Turn your toString methods inside out
There's a better way to write toString, and once you see it you won't go back.
September 2007
- Best error message ever
A truly special error message from apt. - Ooooooh. Shiny!
Two monitors, one reinstall, and the discovery that nvidia-settings exists. - I Aten't Dead
Still here. New job, less posting, more Haskell. - Lisp tutorial
Practical Common Lisp is available online for free. Worth mentioning. - How to create sealed classes in Java
A trick for getting sealed classes in Java before Java had sealed classes. - Tail call optimisation in Scala
A quick test of what tail call optimisations Scala actually performs. The answer is: not many. - Good APIs
Good APIs in Java are rare. Here's what a few of the actually good ones look like. - Testing, testing. Is this thing on? (Also, Cheesebread)
The blog still exists. Also, cheesebread at 2:30AM — there's an explanation for this. - Looking through other peoples' code is fun
Poking around the Guice source and finding one comment that really shouldn't still be there.
August 2007
- Birds of a Feather and AMQP
A heads-up for anyone in London: there's an AMQP talk happening next week. - The world has gone mad
Java generics: exhibiting symptoms. - Data structures in Java
Implementing data structures from scratch in Java, only to find the standard library does it better. A humbling experience. - Playing with Arrows
I don't understand arrows either, which puts me in a good position to explain why that's fine.
June 2007
- Where lies the problem?
At some point you have to start wondering whether the problem is you. I have ruled that out. - Perversity
There comes a moment when the indirection stack gets tall enough that you have to suspect someone has made an error. - A quick check
Nothing to see here. - Beating StringBuilder? Hell no.
Turns out StringBuilder is embarrassingly fast. The benchmark has spoken. - I fail miserably at performance testing
The numbers are in. They are not especially illuminating. - Lazy strings for Java
Java strings are bad, so I wrote better ones. Performance results: mixed.
May 2007
- Javascript
Javascript the language is fine, actually. The browser, on the other hand, is a different matter entirely. - What's a monad?
Another monad tutorial, yes, but this one aims to demystify rather than enlighten — which turns out to be a more useful goal. - Functional programming lies
I like functional programming. Some of the things people say about it, though, are just not true. - JTypeBuilder and APT
A quick update on swapping out the parser for an annotation processing tool. It compiles now, which is good enough for the moment.
April 2007
- Equal opportunities oriented programming
If it's not a first-class citizen in your language, you'll eventually find yourself wishing it were. - Tail call optimisation in Javascript
There's a surprisingly elegant way to get tail call optimisation in JavaScript. It has some caveats. - Viral XKCDing
Maliciously subverting a viral marketing campaign. No further explanation needed. - Blatant and malicious evil
Sometimes working around Java's type system requires approaches that are difficult to defend in polite company. - More JTypeBuilder
Rethinking JTypeBuilder's architecture before writing more of it. - Job applications
Yes, potential employers can find this blog. No, I'm not going to hide it. - Static vs. Dynamic Typing
Static vs. dynamic typing is one of those arguments I wish would just go away. Here's why. - Concision
Java culture treats concision as a vice. I disagree, and this is me disagreeing about it briefly. - Yet more JTypeBuilder
Progress on JTypeBuilder, including the minor indignity of having to edit generated code by hand. - Baby's first open source project
I've started an open source project for generating Java boilerplate. Someone has to.
March 2007
- re·cur·sion –noun: See recursion
Three loosely related discoveries, the third of which explains why I'm posting about the first two. - What's in a syntax?
Java's lack of first-class functions leads to a particular kind of suffering. Witness it here. - Unexpectedly popular
My throwaway Parsec example is somehow third on Google for 'haskell parsec'. I'm not sure how to feel about that. - From the jargon file: Bogosort
The canonical example of a truly awful algorithm, for when 'bad' isn't quite strong enough a word. - fix f = let x = f x in x
Haskell's fixed-point operator is a single line of code, and that line is doing a lot of work. Let me walk through it. - Speling is important
The HTTP spec spells 'referrer' wrong, and you have to too. - Cool Gadget of the Day: JTidy Servlet
JSP produces unreadable markup. JTidy Servlet fixes that with about four lines of XML. - Javascript 'with' clause
JavaScript's 'with' clause does something slightly different from what you'd expect. Here's what's actually going on. - Cool gadget of the day: Chickenfoot
Chickenfoot is a Firefox extension for writing user scripts, and it's significantly better than Greasemonkey. - Enforce your invariants damnit
Most bugs come from things that should be true but aren't, because nobody enforced them. Enforce your invariants. - Parsers, Parsec and Haskell
I couldn't figure out parsers, so I decided to learn Haskell and Parsec simultaneously. This went better than expected. - Build scripts
Build scripts are not actually scary. Here's how I figured that out.
February 2007
- Whoops, there goes another one
CMU says no. Harvard is now the last hope, which is an odd sentence to type. - Factoid of the day: Javascript command line
Firebug gives you a JavaScript command line in the browser. Handy. - It's Groun... err. Pancake Day!
It's pancake day, and it turns out growing up means learning your parents' cooking secrets — for better or worse. - Factoid of the day - CSS trivia
What happens if you set font-size to 0.96em on every element? Nothing good. - Goto
Java bytecode has a goto, and goto is a reserved keyword. This raises an obvious and entirely malicious question. - Word definitions
A precise definition of overengineering. - Testing, testing
Not the blog, the code. Specifically, the FlatteningIterator, and what happens when you actually try to test it. - Code Snippets
Found a site for sharing code snippets. Expect more of them soon. - Java Packages
Java's package hierarchy looks hierarchical but isn't. This is annoying, and it takes a surprisingly long time to remember that. - Coding standards
Coding standards at work are designed, seemingly, to create more work. A weekend project made this very clear. - Desperately Unenterprise
A year in, time to start writing about programming. Let's see where this goes.
January 2007
- What don't you eat? (How to feed anyone)
A Saturday morning brain dump about food preferences, triggered by squid avoidance and a cooking blog. - What do you eat? (How to feed a vegan)
A talk about feeding vegans, now in slide form for those who weren't there for the (obviously fantastic) live version. - Guacamole and playing with new toys
New kitchen implements, a food processor with impractical ambitions, and the obvious solution.
November 2006
- Quick American style pancakes
A pancake recipe. Measurements approximate, results good.
September 2006
- Sweet and Spicy Peppers with Bulgur Wheat
A good meal assembled on a low-energy night, when simple and satisfying were the only requirements.
July 2006
- Silly Proofs 3
A proof that continuous functions on the first uncountable ordinal are eventually constant — using more machinery than strictly necessary, which is rather the point.
June 2006
- A New Theorem?
A theorem on normal topological spaces — my conjecture, my friend's proof, and my independent proof of sufficiency.
May 2006
- Mushroom and Chickpea Balti
A recipe loosely inspired by a cookbook I'm not very impressed with. - Brown rice in an egg and tomato sauce
An improvised dinner from fridge leftovers, written during a lunch break. It worked out.
April 2006
- Journal of Obscure Results 1: Nedoma's Pathology
The product of Borel algebras is not the Borel algebra of the product. Here is why, and here is why you should care.
March 2006
- Quick update
A maths conference, some Boolean algebras, and a follow-up email to send. - I suck
An apology for not posting, with explanation. The food writing has been happening elsewhere. - Boolean to C* algebras II: The Noncommutative Version
What happens when you try to extend the Boolean algebra construction to the noncommutative case? Interesting things, mostly. - Boolean to C* Algebras
A cool functorial factoid connecting Boolean algebras to C* algebras — possibly new, definitely not publishable. - Sequential compactness and minors
Some point-set topology in the absence of full choice, and what compact-but-not-sequentially-compact spaces might or might not exist.
February 2006
- More finite topological spaces
A short proof that finite topological spaces have weight equal to their cardinality, with a pointer to more details. - Topology, Separation and finite combinatorics
Self-described rambling about finite topological spaces and why non-Hausdorff spaces might be interesting after all. - A Mathematician's Scratchpad
The blog has moved. Again. At least now the maths is readable. - The pressing down lemma
A technical lemma from set theory that punches well above its weight in topology. - Silly proofs 2
A Fourier inversion theorem proof that isn't actually that silly. - Silly proofs 2
A Fourier inversion theorem proof that isn't actually that silly. - The Glory of Salads
Salads are not boring. This post will tell you why, at some length, with citations.
January 2006
- Cooking lessons 3
Spice shopping in London, with an honest assessment of the selection available. - Cooking lessons 2
Teaching a friend to cook, starting from the constraint that he owns no spices whatsoever. - Cooking lessons 1
My friend thought five pounds at McDonald's was good value for a meal. I disagreed. Thus: cooking lessons. - Stone duality rocks
Stone duality says Boolean algebras and certain topological spaces are secretly the same thing. The title is not an apology. - Sweet carrots and chickpeas
Someone told me all curries taste the same once you add the spices. I had thoughts about this. - Latkes
Soul-crushing boredom is a powerful motivator. In this case, it motivated latkes. - Spicy pumpkin and bean stew
I still haven't learned how much water pumpkins release. This time it became a soup. - Silly proofs 1
I enjoy proving things with far more machinery than necessary. Here's the first installment. - Chains of null sets
An observation by Noam Elkies about chains of null sets leads to a question about how large their union can get. Cardinal invariants ensue.
December 2005
- Badass garlic lentils
Sometimes the real culinary achievement is admitting you can't be bothered. - Pseudo-malaysian rice and lentils
A reconstruction of a dish someone once made for me, with the details approximated and the modifications all my own. - Spicy Egg and Potatoes
A conversation with oneself that ends, inevitably, in curry at 10:30am.
November 2005
- Persian Rice and Lentils
Basmati rice with lentils, raisins, dates, and a frankly alarming amount of olive oil.
October 2005
- Announcement
A brief note on reprioritising which mathematical rabbit holes to go down first. - Vegetarian Mole
Chocolate and chilli as a main course: best served before revealing what's in it. - Pseudo-African Peanut and carrot stew
A peanut and carrot stew that is loosely African in the way a map is loosely a territory. - Mombasa Pumpkin Desert
A pumpkin dessert recipe, learned the hard way that pumpkins contain a lot of water already. - Butternut squash risotto
A simple risotto that manages to be neither boring nor much work, which is the real achievement. - Super-real fields 3: Artin-Schreier theory of ordered fields
A detour into Artin-Schreier theory before getting to the gaps, plus a correction to an earlier mistake. - David's Mole Brownies
Brownies with chilli and ginger, named for the sauce, not the animal. - A Mathematician's Scratchpad
The inaugural post: a mathematician sets up a place to think out loud about super-real fields. - Super-real fields 1: Basic background material
The foundations for studying ordered field extensions of R, approached for its own sake rather than any grand justification. - Super-real fields 2: Hyperreals and Ultrapowers
Where the maths gets more analysis-flavoured and the hyperreals show up, as they tend to. - Fried Pasta
A pasta recipe weird enough to overcome a deeply held personal hangup about pasta. - "Playing with your food" begins
A cooking blog begins. Recipes to follow. - Roast pumpkin with a spicy potato and squash filling
A recipe that started as 'based on' a classic and ended up somewhere rather different, mostly due to laziness.