Solo Developer

5 Reasons Your Side Project Never Became a Product

Do you have side projects sitting idle in folders or git repositories, untouched for months or years? How many are 80% complete? Functional and occasionally used by you but not in a fit state to sell or to give away? How many seemed like great ideas at the time?

The sorry state of the side project is the bane of every hacker’s life. We have an idea. We get stuck in after work or at the weekend, all eager and filled with passion. Weeks or even months pass, progress is made and then we stop or we move on.

Sound familiar?

I’ve worked on a dozen side projects that I’ve polished and released. Some have been commercial desktop products, some free online apps, but all reached a state of completeness that allowed me to release them to real users.

Every time, I’ve had to fight with myself to cross the finish line, to get the project into a state where it’s no longer a project but a product. Crunch time usually hits at the 80% mark when it’s usable by me with a little manual configuration. The UI might be a bit embarrassing, important things might be missing, it may be a long way from being release ready.

It’s at this point that my inner demons (and yours) do their damnedest to de-rail the project and prevent it from ever becoming a product.

Here are five reasons your side project stayed a project and never became a product.

1. The boring bits at the end

The early stages of a side project are fun. You and only you get to choose the tech stack — no more libraries that are six years old, no more antiquated IDEs and database clients. It’s new and fresh all the way.

But as the project grows and gets closer and closer to becoming an actual product, the fun gives way to the mundane. It all starts to feel like the day job.

Is the wording right on the menus and buttons? Is everything enabled or disabled when it should be? Have you built the installer, code signed the EXE files? How do you even get hold of a code signing certificate?

It’s a list that never seems to end, filled with annoying little jobs that take all the fun out of building your own app. But they have to be done, otherwise your project stays a project, gathering dust and reminding you every day of your failure.

How do you fix this?

You fix it one task at a time. But first you need to define those tasks, to build a list. Everything goes on the list: the bugs, the cosmetic changes, the missing features, the installer, the website, the user forum, even the code signing certificate.

I know what you’re thinking: “I don’t need Jira for my little side project.” You’re right, you don’t need it for your side project. But you do need it — or something similar — for your product.

As I was building the first version of Atomic Scribbler back in 2017 it was at the 80% stage that I introduced Jira. Atomic worked — for me. But it was nowhere near ready for the wider world.

At 7 AM one weekday morning, sitting in Starbucks on the Quays in Dublin, I built my first Atomic Scribbler Jira list. Everything was on that list — over 100 tasks, bugs and user stories. Some would prove to be a ten-minute job, others would take me days to complete. I listed them all and then I set up my first sprint: seven days, twenty tasks.

That afternoon I was working in another coffee shop and dragged two tasks to the Done list. Each day I repeated the process. One or two tasks in the morning, drag and drop, one or two in the afternoon, rinse and repeat. At the end of that week all 20 tasks were completed and I set up the following week’s sprint.

When you feel the momentum, when you watch as tasks get knocked down each day, the end becomes real. You start to see release day just around the corner. A product, not a project.

2. You lost your focus and drive

We’ve all been there. When passion is not enough, when Netflix or Facebook or shiny new things pull at us, tearing us away from our project. Procrastination can make us lose days, weeks, even months. For many of us it’s the end — we never find our way back to our project and our product dies before it’s even born.

How do you fix this?

There’s an entire industry out there selling answers to this question. Self-help guides whose sole purpose is to help us kill procrastination, motivational speakers who fly into stadiums by helicopter to rescue us from ourselves, not-quite-academic books that talk about Grit and Mindset and Deep Work. All answering the same question in different ways: how we can work better.

I find the most useful approach is to work my side project the way I work the day job. Give myself a boss and do what he tells me to do, just like at work.

What do you do when your boss assigns you a list of small, uninteresting tasks? You grumble, you tap the keyboard aggressively, and then you start work. You keep working, day after day until the list is complete. What do you do when he asks you to write 1,000 words describing some new functionality? You may hate writing, it might not be your thing, but you sit down at 10 AM and you get stuck in regardless.

It’s not the money that makes you do the work, it’s the instruction from a guy you see as being entitled to instruct you.

That final 20% — those tasks that are stopping your project from becoming a product — these are just the sort of tasks you dislike doing in the day job but do nonetheless.

Treat your side project like a job — a couple of hours OT each day. Be the boss. Write up those Jiras and assign them to yourself. Start a weekly sprint and hold yourself as accountable as your boss at work holds you. It won’t be long before that product starts to take shape.

3. It has to be perfect

How often in the day job are you asked to build something quickly, to cut corners, to keep it simple. “It doesn’t have to be perfect, it just has to work. There’s a demo on Tuesday.

Heard this before?

A side project is different. No one can tell us to rush new features, to leave stuff out, to park the unit tests and come back to them later. We’re determined to do everything just right. No shortcuts.

The trouble with seeking perfection is you never get there. Like the writer who keeps revising each paragraph and never types “The End”, you keep finding improvements that just have to be made.

If your app gets a mention in the New York Times you need to be able to scale quickly — better put that in place now, just in case. And what about those French users? They might not be there for version 1, but they’ll be along soon enough — better implement that multi-language support right at the beginning, it’ll save time later. Windows 12 is due out next year — I’ll install the early release candidate and ensure my app is compatible, nip any issues in the bud while the code is fresh in my mind.

This reads like a joke, but it’s not. This kind of perfectionism kills your project before it has a chance to become a product.

How do you fix this?

You need to trim features, not add them. Your version 1 should be the product that is good enough for a tiny proportion of your potential users, not for all of them.

Draw up a list of features and scenarios that you think you have to handle in version 1. Park Jira for now, do this on paper. Write it all down — export options, backups, multi-user support, tags (tags always turn up on these lists), printing, Google and Facebook login, whatever.

Then take out the red pen and go through the list. The question you should ask for each item on that list is: “If I leave this out, can a user still use my product?

That’s it. Not “Will it be perfect?” If one user can use your product without that feature, cross it out. Park it until version 2.

This approach has an advantage beyond helping you get version 1 out the door. Half the items you crossed out will never be mentioned by your early users. It won’t be that they can live without them for now, it will be that they have no interest in them at all.

My red pen list for Atomic Scribbler was huge. I’m on version 6 now and I still haven’t implemented some of the items on that early list — not even the tags. Why? Because a year and a half later with many thousands of users, no one has asked for them.

An imperfect product is still a product, but a project is always just a project.

4. You got bogged down and didn’t know where to go

Like a writer at 30,000 words whose plot has fallen off a cliff, you coded yourself into a wall. Everything was going well, the project was coming together, then you found yourself stuck with no idea where to go next.

You lost your vision for what the project was, or you never had a vision to begin with. You never saw the product.

How can you possibly fix this?

It’s easy to mistake this inability to move forwards for procrastination, but it’s not, it’s worse. Something is wrong with your project. You don’t know where to go next because you haven’t defined your product-to-be or your target user. You’re building something for a generic user when you should be building a product for the smallest niche possible.

With Atomic Scribbler that niche was creative writers writing novels. Not writers in general, not bloggers, not journalists, not poets or academics. Sure, they could all use the app, but it wasn’t for them. A single developer can’t build a generic app filled with features for a multitude of different users.

Once you have this user, look at your product from his perspective. What’s in there that he doesn’t need and what’s not in there that he has to have or he won’t touch version 1? Draw up a plan to tidy up your project, to trim features he doesn’t need and to add the lightest possible features that he must have. Forget about future scaling or delivering version 6 out of the gate. This is version 1 for a specific user.

Build a vision for your product around this one niche user and hold onto that vision.

5. You didn’t move outside your comfort zone

My first two jobs I wrote desktop apps in C++. My first project that turned into a product — PageFour — was a desktop app written in C++. I was a C++ guy who built desktop products.

It was only later as I jumped from company to company as a contractor that I realised how quickly I could pick up new technologies and how valuable that skill was. Different companies, different tech stacks, everywhere different ideas and ways of doing things. Suddenly anything was possible.

Most of us live in a bubble defined by our history and experience. We code in Java or Python, we’re back-end or front-end. We’re tech guys or customer facing. This inability to put on different hats can kill our side projects before they ever become products.

How can you fix this?

You have to step outside the bubble, work in areas that you’re not familiar with or that you think you’re not good at. This means learning new technologies when your project calls for it and stepping into sales and marketing roles as well as writing code. Not a database guy? Start learning. Never built a web service? If your app needs it, you need to learn it. Never talked to customers? Start now.

You need to meet people who populate these other fields, who work and live in the areas you’re weakest. Don’t go to the hacker meetup group, give the marketing group a try. Instead of connecting on LinkedIn with fellow devs in your home city, connect with non-tech start-up founders, with sales and customer centered people, with writers and bloggers.

Take meetings, have lunch. Everyone wants to meet up. Everyone who’s worth the time at least. Talk to them, share ideas, and above all listen and learn.

For your project to become a product it needs more than code. You need to step into other worlds and learn new things. You need to realise that none of these other skills that are required to build a product are any more difficult to learn than the languages and frameworks that you pick up with ease.

To hear more from me, you can follow me on Twitter or on LinkedIn.