Perfect is the enemy of good
Tags: programming, success
Published: 2019-11-07 12:17:25

---
title: Perfect is the enemy of good
published: true
description: 
tags: programming,success
cover_image: https://thepracticaldev.s3.amazonaws.com/i/4ovhkkbx6fg8cgwqfz1n.jpg
series: pragmatic-programmer
---

I've seen this quite a few times. Enough that I feel I need to reiterate it, even though I'm quite sure you've heard this before:

_It's better to release something which is incomplete than to never release it_

I watch people trying to polish the thing they're working on because they're afraid someone isn't going to like it, or that there may be an issue when it's released.

Newsflash: no code is perfect. Issues will arise. You're just going to have to deal with it.

The alternative is to leave our gems hidden away, in the dark. We might as well have not done the work. Well, almost -- I'm sure we learned something from doing the work, and that has value!

_It doesn't matter how awesome your Shiny Thing That You Made is if no-one can use it. The whole point of software is the benefit it brings to the lives of users. Even if it's just a pet project -- if you like it and find value there, I'm sure someone else will; at the very least, if it's open-source, someone might learn from you!_

## Ok, so what do I do?

### 1. Decide on a Minumum Viable Product

What is the bare minimum that would make this useful? If it's already useful to you in its current state, release it as-is and keep updating it as you find issues or want to expand its functionality. If it's not at the _bare minimum_ required to do what you want, figure out what would get you there, do it, and, most importantly: _ship it_.

### 2. Shipping

Open-source is awesome! I can just link you to my GitHub repo, and you can build it, right?

Wrong. Get it up on a package manager like [NPM](https://npmjs.com) or [Nuget](https://nuget.org). Or at least build a zip file for your game! For bonus points, build an installer. [InnoSetup](http://www.jrsoftware.org/isinfo.php) is really good for Windows, and dead easy to use. If you have suggestions for cross-platform installer tools or tools for other platforms, _please post them in the comments_.

You should try to make it easy for someone to try out your new thing. There are so many new, shiny things that surface every day that if people have to struggle to get your tool, site or game running, they will give up.

### 3. Ask some people to check it out

Now that it's released (nuget, npm, website is running, there's a zip file of the game someone can download, whatever you needed to do), ask people to check it out. 

Post about it here, or on Twitter. Talk to your friends and co-workers. If it solves a common need, talk to the people you see having the problem your code solves! 

_Do_ remember to make a list of the things it's supposed to do as well as the things it will do in the future -- this can help prevent unecessary "it's missing feature [X]" responses as well as generate interest: some people are going to say things like "Oh boy! As soon as it has feature [Y] you're making, I'm totally in!"

At the worst, you'll have bugs surfaced, or perhaps some obviously missing features will be brought to light. At best, you'll get feedback -- and feedback feeds the next round of creativity. Without feedback, it's easy to get to a point where the joy goes out of making the thing, because it feels like it has no impact and will _never_ get done.

### 4. Support it

Guaranteed someone is going to find a bug. Or perhaps, if you're lucky, have a feature request. 

On both fronts: _great_! 

That means people are interacting with your work. If they took the time to log a bug or feature request, that means that what you've already done adds enough value to them that they were willing to give up some of their time to reach out to you!

Now go out there and wow people with that cool thing you've been making!