Do you know what the best part of a project is?
Its the beginning. In the beginning the project is bold, wonderful, exciting, challenging, intellectually stimulating. It's a new thing that barely exists except in your mind. You sit in your chair and you can see the whole complete picture buzzing along doing all the things you want it to do. Think of the users! Their lives will be made so much better by it! People will be impressed at this technological miracle you have birthed.
This fantasy is made possible by a combination of energy and excitement brought on by a change to your status quo and the blind faith that what you make will be as wonderful in reality as it is in your head.
You break open your trusty text editor, fire up a new repo, and file new project that idea right into existence. Now your idea has become a little more concrete and now instead of being purely in your head some of it is real and tangible. Sure there's not much there but its something you can point to as proof it is more than just an idea. It even has the name you've given it.
Now a feeling of invincibility is sweeping over you. You think to yourself "I'm going to do this the right way. I'm not going to take all of those short cuts in the name of deadlines. I am going to make something that I am proud of."
And so you do...
Tests are written. Well designed interfaces and models are drawn up on your whiteboard. Levels of abstraction seem so clear and obvious.
Now reality begins to creep into your project, and reality is a cruel mistress. She brings with her a cold, bright light that follows her illuminating every dark dirty corner of everything she touches.
A test is failing.
Good! The tests are supposed to fail at first. A failing test is like a to-do. It tells you that you need to write some code to make that test pass, no problem.
Ten minutes go by and you have made no progress. This is difficult. You think to yourself, "I have good momentum that I don't want to break. I'll come back to this." Your momentum seems unprecedented. You could easily graph the number of tests you need to get this working and see the rate at which you are making the tests pass and you will have this whole project done in record time. A genius you are! Everyone else are such lazy fools to not complete all of their projects at the rate you are finishing.
The next day comes, starry eyed and barely able to sleep because your mind is racing with thoughts and energy to pour into the project. But that test is still failing.
Progress continues, but it doesn't seem to be at the rate it was yesterday. Yesterday you were invincible. Today suddenly frustration seems close at hand.
Come to think of it that interface isn't going to work out like you hoped.
And your models aren't as pure and well thought out as they seemed yesterday. You are violating some clear design principles but it would mean so much extra code to make them conform and work "the right way." If it wasn't enough, Super Awesome Framework you are using to build this with has some abstraction leakage and quirks that force you to write ugly work arounds.
Soon you are left questioning why you are working on this. The enthusiasm and intrigue towards the project are sapped. Problems with the interface keep coming up. There are use cases that no one seemed to think through that have the potential to clutter your interface just to get it working.
After awhile, the deadline, real or imposed, is rearing its ugly head.
This function is so simple and obvious, it must work right? Certainly you will save yourself some time by not writing tests against this obviously working code. After all, you're a genius remember? One of those 10x programmers?
Shortcut after shortcut is taken. Ideals are traded for pragmatism. Technical debt is accrued and you are left wondering just how proud you really are of this creation. Is this something you want to point to and have people remember you by? Would you forever engrave your name into this?
As reality takes its toll on the project, the weight and burden of the project on you personally begins to grow. It will cause you to constantly reevaluate what you are doing and how you are spending your time. Is it really worth it? Is it really worth all the time and energy you are putting into it? If you put it off for a week will it still be as important and worth a continued time investment?
Will it ever be complete?
The stakes of the project have the greatest impact on whether or not it will. If you are doing this for a business that is counting on increased customer satisfaction and/or improved revenue, that business will ensure that one way or another this project will be completed no matter how late it is.
For personal projects it may never get this far. Was this an interesting academic exercise you wanted to show off on Github? Was this something you were trying to make for your own personal use, or were you making it with the intent that someone else could directly benefit? Is this something that you know quite well will most likely never see the face of a real user?
Of course everyone says to just start. Starting is the hard part right? Once you start the hard part is over isn't it? Not so Kimosabe.
Starting a project is easy. Starting just means showing up and taking one step. Finishing means taking thousands of steps, mile after mile, pounding the pavement until your feet are blistered, your body aches, and sweat drips from every pore in your skin. Starting is easy. Finishing can be the most difficult thing you've ever done.