Start Small, Grow Big
The idea here is that all systems no matter how big starts small. I want to talk about
- not starting out with a database even if you think you will need it
- always doing the simplest thing that might possibly work
- starting with the simplest requirement for the most important functionality
- keep it simple and refactor as you go to grow the full system
I subscribe to the idea that software development is more like new product development than manufacturing. What does that mean? Well, to me the main point is that most software development projects are custom jobs, that has not been done before, at least not by you. Granted, there are times that we develop systems we have done before or more commonly variants of past systems, but most commonly we are in new territory.
So whenever I start a new development I will start with very little code or no code at all. I think that most well written systems should start small and grow big. Now, what do I mean by starting small? In it's extreme this means starting with no dependencies and a unit test (of course you would have one dependency - your unit testing framework). This is to me the ideal start for a new project. Why? Because of the fact that when you start a project you know as little as you ever will about the requirements. This is a central tenet of agile development. Don't put stuff in until you actually have a requirement for it.
This goes for everything in your system with perhaps two exceptions. The first is that you will need a unit testing framework, and the second is some kind of logging functionality. I have yet to develop a system that didn't need some form of logging, and it would make sense using a framework for this from the start.
What is really important is to postpone as many decisions as you can for as long as you can. Don't decide until you have an actual bonafide user requirement that force you to decide. Don't add a server component, a database or other technical infrastructure components to your project until you know you need it.