On finishing things

Finishing projects is surprisingly difficult for me.

I've started and restarted this essay several times over the course of the last three months, trying to figure out what I want to say, trying to make it a little less crappy. The only reason I've persisted is because the unbearable irony of not finishing would probably kill me.

Similarly, I've been hacking on Booper on and off for over a year now. I started it because I wanted to dip my toes into mobile development and learn more about push notifications, but I keep uncovering new issues that prevent me from launching.

Part of the difficulty stems from the fact that it's not always obvious what it means to be "finished". When is an essay, or a piece of software, truly finished? An essay can always be edited more; an app can always be further refactored, redesigned, enhanced.

Being useful?

Maybe it's safe to say a project is "finished" when it's good or useful enough that I'm comfortable sharing it with other people. This makes it simple to test if something is finished or not: have I shared it publicly? Have I even asked my friends for feedback? If this is the criteria, 95% of the projects I've started fail to pass it.

Maybe this was fine earlier in my career. Back then, a lot of projects started by wondering, "is this even possible?" Or, more often, "I know this is possible, but am I capable of doing this?" The "finishing" part felt less important than learning, growing, and building confidence in my ability as a programmer.

But at this point in my career, I feel much more confident in my own competence. Most ideas feel possible (or at the very least, figure-out-able). So testing myself for its own sake is much less interesting now than it used to be.

Because of this, most of the projects I jump into these days are things that I imagine other people might find useful. So if I'm not even getting to the point where I can put my work in front of people and actually test that hypothesis, what am I even doing?!

I don't think my experience is uncommon. The lifecycle of a project usually follows the same pattern: I have an idea, I get excited, I start building it. I get it mostly done; I finish the most "technically interesting" part.

But then I have to do the "boring" work: maybe I have to set up a landing page. Maybe I need to write documentation. Maybe I need to remove some hardcoded API key and set up an OAuth integration flow. Ugh.

At this point, I start to think: maybe this app kinda sucks. Even if I did finish up the schlep work and launch it, most likely no one would care. So why bother putting in the extra effort?

Why is it important?

This begs the question: why is it important to share your work with the world?

First, because there's practically no downside, and very, very high potential upside. Unless the work is particularly egregious or provocative, the worst thing that happens is people ignore it.

On the other hand, if even just one person finds your work useful or inspiring in some way, you've just made the world a slightly better place. Or maybe you make a new connection with someone who changes your life. Or maybe your software blows up and turns into a gazillion dollar company.

Second, because it's weirdly therapeutic. In the same way that journaling can alleviate anxiety by externalizing it, writing publicly encourages you to process your thoughts more rigorously, and launching an app forces you to find out if your idea has legs or not. You can stop wondering, "what if?" It clears your head of all those little thoughts and ideas rattling around in an annoying loop. It can be cathartic.

Third, because it's hard. And doing hard things builds character! It's an exercise in discipline and willpower that makes us more likely to push through difficult work in the future.

It builds character

Why is it difficult?

But why is it so difficult to get past the metaphorical finish line? I think there are a few of reasons.

First of all, more often than not, the end goal is neither clear nor concrete. It's not obvious where the "finish line" even is. When this is the case, it's easy to procrastinate by nitpicking the design, adding little flourishes, or using "perfectionism" as an excuse.

Similarly, if I'm working by myself, there's no real accountability or deadline. Without a cofounder, or colleague, or customer, there's no one I need to worry about disappointing.

And finally, sharing things publicly takes a bit of courage. By sharing a piece of writing, you're implying that it's something worth reading. By sharing a piece of software, you're implying that it's something worth using.

How do I get better?

So how do I get better at doing this?

I think there are two strategies that would help a lot: 1) writing a spec (i.e. a plan) upfront, and 2) timeboxing the project by giving myself a deadline.

Writing a product spec helps me clarify my ideas and anticipate where I might struggle. It forces me to think through some important questions. Why am I building what I'm building? What the smallest thing I can ship that will be useful or compelling? What is my launch plan?

When I was hacking for the sake of learning, writing a technical spec helped me think through the problem. But when I'm hacking for the sake of building things that people want, a product spec seems much more important.

To anyone who has worked in the industry, this feels so stupidly obvious. And yet for whatever reason, I struggle to do this when I'm working on my own because it feels like overkill.

Next, timeboxing. A deadline forces the end goal to be concrete and measurable. Ideally, I should be able to finish a project in 2 to 4 weeks. Timeboxing helps me stay focused and removes the temptation to spend too much time on solved problems like implementing auth or designing a landing page.

As much as I'd love to uncover a step-by-step recipe for success here, I do think it takes a certain degree of discipline and willpower to get better at launching projects. I can't just rely on excitement and inspiration to spur me to the finish line. Fortunately, I do think that "finishing" things is a muscle that can be built up with more and more "good reps".

Waiting for inspiration

What's next?

The first thing I want to do is start writing more about the projects I've worked on.

I've started setting up a projects page, where I plan to share the specs, demos, and retrospectives of my personal projects. Even for the "unfinished" ones, sharing them here gives me a small sense of closure.

Though I don't plan to publicly share all of these proactively, just knowing that they're publicly viewable helps give me a stronger sense of accountability. I'm curious if it will make a difference.


August 20, 2024: Discuss on Hacker News