Everything is a Draft
Do you think you are capable of doing something perfectly in your first attempt?
Do you think anyone does?
Do you think perfection exists?
My answer to all of those questions is: NO.
My View on Perfection
Before beginning, let me tell you that yes, of course this is about your work. I am not referring to perfection in the overall sense of the word. I am referring to having something 100% finished with no room for improvement. Be it a piece of code, a graphic design, a business model or anything in between.
When I start something from scratch, if it is some area where I have a lot of experience and I am used to (for example, programming), I always have the feeling that the solution is already in my head. I only need to spend the time to actually do it. But many times, I find there is something I was assuming which is not true. Or maybe I believe something is “finished”, but later I take a second look and something obvious is wrong or could be improved. It is easy to think of something as perfect or finished, but it always turns out not to be. That's why I don't think perfection exists. Even in big projects, with thousands of hours spent in development, something (if not everything) can be improved.
That can happen to problems whose optimality is measurable (how fast an algorithm is, how many users clicked on an ad), but most of the time the problem with perfection is that it is something subjective. Usability, context and personal experience come into place.
And that is why I think everything is a draft.
Why it matters
Ok, nothing is perfect or finished, so what? I would like to use this reasoning to reflect on some behavior I have observed in many individuals (myself included). And by doing that I hope to improve it.
Fear of deleting
There is generally an aversion against deleting work done. I guess the main reason is feeling that the time spent doing the work has been wasted. To be frank, sometimes that is the case. But most of the time something has been learned in the process and it may be worth it to delete everything and redo it with the new knowledge and experience.
Some quotes related to this:
Bruce Lee – “One does not accumulate but eliminate. It is not daily increase, but daily decrease. The height of cultivation always runs to simplicity.”
David Heinemeier Hansson (Creator of Ruby on Rails) – “The delete key, my favorite key.”
Paul W. Homer in 97 Things Every Programmer Should Know – "More time gets wasted in trying to salvage bad work than it should."
William Zinsser in On Writing Well - "I especially like to cut: to press the DELETE key and see an unnecessary word or phrase or sentence vanish into the electricity."
Nonacceptance of critiques
This point is more widely accepted: You should accept critique. Still, there is so many people who don't take feedback well. First, I think I made my point clear when I said that nobody does something perfectly in their first attempt (or ever). But sometimes, people think because they are experienced, opinion from less experienced individuals is not worth listening to. There is something dangerous about experience, we take shortcuts instead of using reasoning and common sense, because we use layers of assumptions. Most of the time that is good because you don't have to reason everything you do, but that also means you're less thorough and it can be easy to miss something.
Following that, that's why I give feedback and expect to be criticized on my work. Of course, constructive criticism. I specially like to present a problem I'm working on in a simplified version to someone with no experience on the topic, because the new point of view can be something completely different. Sometimes, it can result in something that makes no sense, but at least give it a thought instead of rejecting it (see Ad Hominem Fallacy).
Simplicity is not King
There is this saying that Simplicity is King, as well as the KISS principle. And I actually agree for the most part. But don't be fooled into thinking that if something is really really simple, it is perfect. “If it cannot be simplified, it cannot be improved” is wrong. Even if a wheel is the embodiment of simplicity, maybe you'd been better of using a lever instead.
Simplicity is King always it goes hand in hand with context.
Mark something as Finished
For practical purposes, we need to mark some things as finished to move on to new tasks. But be aware of that. We live in a Draft, every system, product or service you use is a draft. And that's why everything can be hacked some way or another. Have you ever heard this expression? “90% of the projects are 90% finished”. It is spot on.
Also, the idea that if we had infinite time to work on something it would eventualy be finished is completely wrong. It is similar to Zeno's Paradox of the Tortoise and Achiles; every step you take will take you half of the remaining closer to the goal, but you'll never reach it.
All of that was food for thought, so I would like to finish this post with some practical applications of these ideas.
First, I think this is the root explanation of why Copy & Paste Programming is so wrong. The whole point of doing something is to learn from it, so if you're going to copy/paste a piece of code, you better understand exactly what you are adding to your project.
From the fact that everything you do is a draft, it can be infered that the probability of doing your best at first is not 100%. That's why it is important, at the start, to think different solutions to a problem. Or said differently, it is important to make different drafts before choosing which one to go on with. One technique that leverages this concept is Brainstorming, and I would recommend to use it quite often.
Every time you want to improve something, maybe you should start by deleting unnecessary parts. If the project is old, it's likely that some things that were important at the time are not relevant anymore. It is then an improvement to remove the unessential. And it helps you to understand the problem better if you have clarity on what is there. For example, every time I start something from a template or boilerplate, my first step is to check everything that has been included and delete whatever I think is not necessary for my project.
And of course, this post is a draft. So let me know if you think that something could be improved!