An analysis and design should be as simple as it needs to be but no simpler. Does each requirement gloss over (computationally) complex concepts or does it decorate an essentially simple concept?
80% of the value is delivered by 20% of the system. So which part are we making sure we get right?
Change is inevitable. We can test the design for robustness. Suggest a plausible change and estimate what effort would be needed to implement it.
If there are actual constraints that must be satified for the system to operate correctly, then design them in to the system. A human with a pencil and a calculator is a very flexible system, do you need so much flexibility? Remember that you have already tested for robustness.
Small is beautiful. Think before you implement. Use fewer people, deliver fewer features, re-use implementation. Measure the code. Is the size reasonable given its function?
Use matching components. An object oriented design must sometimes use existing components which may present an inappropriate interface. Interface adaptors must be implemented to avoid pollution of the design model.
Object Oriented Analysis and Design is the best know technique for managing complexity. Use it and mean it.
Review everything and everyone regularly, including the requirements, the business case, the budget, the tools, the people, the outputs, the plan, the design decisions. Errors must be caught at the earliest opportunity. Reviewers must include anyone capable of detecting an error, regardless of status.
Meet with users and team members to inform and exchange ideas. Document all significant thoughts (that thought cost money!) and place the result in a searchable repository. This will save people re-thinking that thought. Deliver prototypes. Walk though use cases.