Rubber-Duck Development

by tdmm on

I have ideas. Grand visions for how things should work. Most of my ideas revolve around rebuilding systems from scratch, in order to fix fundamental issues that can’t be otherwise addressed due to backward compatibility. For example, I want to write my own system interface (i.e. how programs tell the OS to do stuff - system calls, on Linux) inspired by io_uring and Wayland. Another project is a custom instruction set architecture (Forist), which should be easier for CPUs to execute efficiently. These ideas have incredibly large scopes and require a great deal of work – something I’m not so good at.

I’m bad at fleshing out ideas. Scope creep is my kryptonite: I enjoy exploring what an idea would look like in a perfect world more than what it would look like if I tried to develop it here and now. But the only way to develop such large ideas is incrementally. Although I’m aware of this, I don’t enjoy addressing the constraints that come with a realistic approach, so I tend to procrastinate on fleshing out ideas by coming up with new ones. I’ve been stuck in this loop for a few years, and it’s been really frustrating.

The degree to which I manage to develop ideas has been slowly increasing. In particular, I’ve discovered that whiteboards are really useful for brainstorming. To flesh out an idea, I sit for a few hours and think about the interesting facets of the problem in question. For example, I spent an hour or so thinking about the different ways in which processes would communicate under my system interface. During these sessions, I often follow trails of ideas to dead ends, and recovering my train of thought can be really difficult. Having a whiteboard where I can track everything I’m thinking about is really, really helpful. But even with a whiteboard on hand, I tend to avoid problems where I need to compromise on my vision, and even my more-developed ideas remain lacking.

I’ve always found sharing my ideas with friends very productive. Not only are their insights helpful to better understanding the problems I’m trying to solve, but I find myself (more) able to compromise on my vision when I argue out ideas with them. I think this is because I feel held responsible during these arguments – held responsible to give an adequate response to a critique or counterargument. When I’m fleshing out ideas alone, I’m only responsible to myself, and that’s not enough. But I want to be able to bring my ideas to fruition, and I can’t wholly depend upon my friends for this. So I’ve been looking for an alternative way to becoming responsible to my ideas.

This is where “rubber-duck development” comes in. Inspired by rubber-duck debugging (wiki), I’ve begun recording myself talking about and fleshing out my ideas. I know that I will listen back to these at some point in the future, and that knowledge is enough to make me feel responsible for my ideas. A few days ago, for example, I fleshed out an idea for a tracing logging system for C this way. It’s surprisingly nice – it feels like talking to someone who understands my point of view and is content to listen quietly. I found myself able to compromise on perfection and to aim for something that I could potentially implement. I’m happy with how this is working out, and I’m excited to see how much this will help me with some of my bigger ideas.

I’ve always struggled with developing my ideas to any useful degree. It’s the reason I’ve never finished any project of decent complexity, even though I’ve worked on more than thirty. But I think I’m making some progress. Procrastination is a tough beast.