Object-oriented design, with the latest refinements in theory.
Good design plus good code equals a good product.
Bad design OR bad code equals bugware.
Bad design AND bad code equals complete garbage.
I would add that folks should be learning more about formal testing methods and sensible project management techniques. Documentation is a fact of life, yet few people can write even mediocre material.
It seems that the object-oriented design approach is taught by language rather than concept. It surprises me how many folks just plain fail to "containerize" functionality. Global variables, indeed!
Yes, but....how do you get good design? You have to start before that point.
(1) Understand what is the real business problem. What is the quantifiable cost of the problem? What is the cost if it is not fixed? What is the project cost of the solution? What is the operational cost of the solution?
(2) Correctly extract the solution requirements. Properly scope the solution. What's in and what's out. Document the requirements. Correctly determine the non-functional requirements.
(3) Document as use cases. Elaborate as UML.
(4) Iterate, iterate, iterate. The requirements will evolve. The prototyping will suggest alternative solutions. Priorities for feature sets will change.
And guess what -- that stuff is not done well by being outsourced to people from another culture, where cheating to pass university exams is the norm, where English is a 2nd language, where companies here have little legal recourse if the outsourced company blows the project, steals the company data and intellectual property, and sells it to industrial competitors, organized crime, and international terrorists.
Other than that, outsourcing is a great idea.
Object-oriented is so 90s. Aspect-Oriented Programming, now that's the ticket!!!