Developing software is both about balancing competing forces and optimizing numerous goals. Down in the trenches all of this happens within the craft of describing to the computer what to do by using a programming language or development tools, but it is still beneficial to keep in mind at a much higher level what should be the general objectives of /any/ large software system:
+ Validity
Your software must meet its functional requirements
+ Parsimony
Keep it simple, avoid bloatware, use a declarative approach that saves intermediate values
+ Incrementality
Plan from the start to make your software readily extensible by incorporating real-world modeling
+ Perspicuity
Strive for clarity and aesthetics; make both the use and the maintainability of your software intuitive
+ Modularity
Remember the advantage of being maintainable and reusable, stay functionally focused, but loosely coupled
+ Resiliency
You need to be tolerant of system faults and provide excellent error recovery
+ Adaptable
Hardware can change -- be flexible for changing environments
+ Performance
Strive to be both efficient and fast
... and yes, these are in precise order of importance.