This may sound like vaguely inane advice, but I've found it useful. And it applies whether you're writing from scratch or adapting existing code. The cycle goes like this
- Pick the most important part.
- Make it run.
- Make it right.
- Go to step 1.
Don't overcomplicate things. Keep it as simple as possible, but no simpler. Whatever you do, don't ever
skimp on making it right. Code that isn't easy to understand is hard to extend. And the extended code will be even harder to extend. And the cruft will kill you.
There's another important step that I haven't put in there, 'Write tests'. Some say they should go before step 2, some say after. But not having them is a recipe for disaster. Every time you get a bug report, write a test that fails because of the bug; the process of doing this will often give you the information you need to make fixing it easy. And it's one more test.