Start simple. Get it running. Learn what you're trying to do. Add complexity gradually, as needed to fit the requirements and constraints. Don't be afraid to restart from scratch.
Plan for change (by designing components that can be changed).
First, and most importantly, the conceptual model should describe the system's interfaces.
Factor the fruit. (Don't confuse apples with oranges).
You don't underestand a problem until you can simplify it.
Decide on error and exception-handling early as part of defining the intarface.
Generality usually involves complexity. Don't generalize your solution any more than will be required; instead, keep it changeable.
To simplify, take advantage of what's available.
The mean time for making "two-hour" addition to an application is aproximatelly 12 hours.