Published on: 01.05.2019
Let me start with a personal true story.
In 2014 I was working on a personal project of making IOS card game called Tablic, I spend more than 200 work hours on did 80% of the original plan and never finished it.
Do you know why?
Because of software scope creep.
Originally I had the idea to make a game with one player vs. computer.
As I was near completing that goal I started adding additional features: I could add 4 players, a user could select AI difficulty.
Each additional features meant more development time: new code and changes to an existing one.
And after all this, I decided to add multiplayer support over local WiFi and over the internet.
This last decision has truly killed the project completely.
In order to implement multiplayer, I had to write a lot of additional code and to change existing architecture, it was at least an additional 300 hours and after more than 200 hours already spend I decided to take a small break (like a week) but later never continued.
The reason why I did not want to release it without multiplayer was that I was thinking it is not good enough, other games had multiplayer, how can I make one without it.
I was always thinking that I will continue and finish it one day, but that day never came, today I am thinking that it is probably better to rewrite it to Unity than to continue in Objective-C (but that is a discussion for another time).
Years later when I was analyzing why I never finished that IOS game, I came to the conclusion that the original problem was because I did not have a specification of the first version.
By specification, I just mean a list of feature, with dependencies between them, basic UI scatch and time estimates.
As I was completing some features I continue adding new ones indefinitely.
I am pretty sure if I did implement multiplayer I would add some other features also.
Today I am wiser or I just think so.
Now I have a process for writing software.
Before I write code I decide what is MVP that I will make, without even thinking about additional features.
The reason why I do not even want to write addition features is that I have learned that even when I make software for myself, software what I make is not software that I need.
Define what kind of minimal features you need to have in your software, make dependencies between them and time estimates how long it will take to make them.
I do time estimates in pomodoros (25 minutes increments) but other time units can be used.