While doing doing a project properly from the start is a fine goal, there’s something to be said for just shipping. It’s pretty rare that that you have all of the requirements from the get-go and you certainly can’t predict every problem that’s going to arise while your project is in production. If you attempt to anticipate every feature you could need it’s likely that the project will never be finished, it’s certain they you’ll waste a lot of time on uneeded features, and it’s still possible that you’ll miss features and bugs that are important. In fact, it’s more likely that you’ll miss things as many issues don’t arrise or make themselves apparent until you reach production
It’s best to ship early and iterate regularly. Remain light and don’t invest too much in any particular iteration and you’ll be much more able to address issues as they arrise. Ship early, ship often, adjust as you go. Simple. So simple, it’s common knowledge, really.
I used to have a bad habit where I generally wouldn’t take this advice. I’d think I was taking it but I’d eventually realize that my 1.0 was really way more complicated than it needed to be. This was a mistake because I ended up wasting time but it was a mistake doubly so because sometimes the project when nowhere. Wasting two or three weeks on a dead end project is a horrible waste, especially when a two day mockup would be enough to test the feasibility of the project.
I remember one project I worked on for months. Technically, I’m still working on it but it’s not any closer to release than it was a year ago. It could have been a lot simpler than I made it but my ambition got in the way and now it’s nothing. If you look at the projects listed here on my site however, you’ll notice that they all are very simple, some are even half-baked, but they’ve proven more successful than any overly ambitious project.
So, my goal these days is to keep things simple and iterate if necessary. The simplest thing that could possibly work, works at least and most of the time that’s all that’s necessary.