Start out with finding the right problem to solve. This is a combination of “what customers are asking for”, “what customers don’t even know they want yet” and “what can be solved with something simple to understand and manage”
Like designers, if you give a programmer a problem with parameters, they’ll apply every bit of genius they have to solve it in the best possible way. If you tell them how to do it, you’ll suffer the wrath of an angry God.
The secret to building large apps is never build large apps. Break your applications into small pieces. Then, assemble those testable, bite-sized pieces into your big application.
The cardinal rule of writing unmaintainable code is to specify each fact in as many places as possible and in as many ways as possible.
In software, we rarely have meaningful requirements. Even if we do, the only measure of success that matters is whether our solution solves the customer's shifting idea of what their problem is.
Correctness is clearly the prime quality. If a system does not do what it is supposed to do, then everything else about it matters little.
It's not at all important to get it right the first time. It's vitally important to get it right the last time.