When making software, sometimes we want everything we can imagine at once. We want the software to be perfect -- then we'll ship it. Learn to procrastintate. You might ship more, and you might like the the eventual outcome better.
Software that sits inside of your git repo, unreleased, is worthless software. You're not going to get paid for it. You're not going to make someone's life better. You're not going to attract any new business. It provides no utility.
When does software return any value? At the very soonest, software provides value when it ships -- when it's released to the public or your customers.
So why do we wait so long to ship?
Excuses for Not Shipping
It Must Do More
Software has a fair bit of built-in or essential complexity. Making software is challenging. Sometimes we make it worse and introduce our own accidental complexity. How? We don't ship.
We iterate on unreleased software, expand it, and pretend to fully understand what we're trying to solve. The software gets bigger and more complex. We want our (unshipped) software to somehow solve even more problems before it's solved any. And any problem we attempt to solve without actually testing it (in production), is still just a guess at how to solve it.
It's Not Awesome Yet
Sometimes in an attempt to create a (hopefully) great initial impression, we wait to release anything. This makes sense to some degree, but it can easily be taken to a less useful extreme. Once we have a feature set that we judge is sufficiently awesome to blow a potential client's socks off, we'll release it in a big bang. Boom! Now the world can see my software in all the glory I have bequeathed it.
Just as we have been guessing as to how may problems the software will solve, we have been guessing as to how warm people will be to the idea of actually using what we've created.
What to Procrastinate
So obviously there are problems with procrastinating. There are definitely things that you don't want to procrastintate: working, shipping, asking for payment. What should you procrastinate?
Little Things that are Hard
At first glance, this just looks like a cop out. You should do the important things that are hard. Even the small things can add a nice touch. But in an effort to ship, these are often the little things that don't add too much but take an inordinate amount of time to figure out or complete. Skip these things and come back to them later to add the polish.
Things that are not Core Functionality
You're trying to ship a small, cohesive feature set as fast as you can. There will be many features on the perephery that you'll be tempted to work in as well. Fight the temptation. Get used to cutting out good features in order to ship the ones you need. In this way, you'll help ensure that all of your valuable time is used creating the most value for your customers.
Things that Create Little Tech Debt
When you start skipping things, this can create problems for you later. This can be technical debt. If you want your product to evolve and grow over time, you can't afford large amounts of technical debt. But watch out! You can use very large lengths of time doing things that add little value in the name of avoiding technical debt. Be willing to take on some tech debt. Do this on a case-by-case basis, because this trade-off requires thinking.
Why You'll Like Procrastinating
Your satisfaction will sky-rocket when you feel like shipping is within reach. Break down the barriers to getting there.
Focus on the most valuable features, and you'll feel like you add maximum value every day -- because you are!
You'll be able to move faster because you aren't getting bogged down in munitia. By not taking tangents, your flow time will increase. You won't need to context switch to solve small, hard problems. You can focus on the important, hard problems for contiguous lengths of time.
You'll have something to show a lot faster. You'll have a vertical of working features that are fun to use and are useful -- when shipped, that is.
Different Paths Converge at Shipping
Of course there are as many different ways to make software as there are types of software and types of software teams. That's one of the things that makes software creation insanely fun and rewarding. Find what works for you, and ship lots and lots of awesome software.
In the end, shipping should be a common goal, and we shouldn't procrastinate that.