I suggest you adopt an engineering viewpoint. Most engineering areas (civil, industrial, aerospace, architecture) are based on solid principles that work. This is especially important if you are concerned about (as Andy Thomas-Cramer suggests) cost, risk, reliability and other issues that lie in the technical-business interface.
Engineering means knowing the stuff that you are dealing with, and I mean knowing it deeply. For example: a civil engineer does not build a bridge in some manner and then refactors it until it passes some pre-designed tests; rather, the bridge is designed with a priori deep knowledge about the properties of the structure and behaviour of the matter that makes it up, and making informed and meditated choices about the best possible design for the existing requirements. Tests are useful to expose defects, not as a replacement for deep knowledge.
Engineering also means repeatability, i.e. having methods that guarantee that you will be able to achieve excellent results all the time, every time.
Engineering also means a high degree of professionalisation of the discipline. Software development is very young as compared to other engineering areas, and this may be beyond our control in many aspects. Still, we can strive to be highly skilled and competent in a wide range of central and peripheral topics that are important to software engineering.
Hope this helps.