Build in quality. Design for testability from the start
Quality issues in software systems result in all sorts of waste – high development, testing and maintenance costs, missed delivery dates, lost sales and angry users to name a few. Taking an approach to creating software where quality is a primary objective can help eliminate waste. But given that programmers are human, and humans are prone to error, there will be mistakes made even if quality is a chief concern. To combat this, you need to employ techniques to build quality into your system and to your development process from the very beginning, so that you can get feedback as soon as possible when faults are introduced.
Design for testability
Testability is a relative measure of how easy or difficult it is to find faults that may exist within the system. There is a strong correlation between good design principles and a highly testable system. Applying SOLID object-oriented design principles within your code can make testing easier… and adding a healthy amount of test automation can make it fast too. Having a good test bed in place enables refactoring of the functional code to further improve system design and intrinsic quality without impacting the external function of the system when needed.
Test at every level
There is no one-size-fits-all approach to testing that guarantees quality of your system. Rather, there are many types of testing, performed at various levels that will give you the best chance of success of building a high-quality system that is relatively easy to change, grow and maintain. Testing only at the user interface(s) of the system can provide broad test coverage, but is often brittle and time-consuming. Fine-grained tests of the smallest units of a system are fast and powerful but are n
ot sufficient to ensure that the entire system works as expected. Employ a testing strategy that has a thoughtful distribution of fine-grained and course-grained tests to provide high confidence in the quality of the system while minimizing time and effort.
Reinforce quality through agile development practices
Most agile methodologies such as Scrum and Extreme Programming (XP) have various practices that guide teams to build quality into systems. Firstly, they encourage open collaboration of development team members with end-users so that everyone is aligned to the goals and intentions of the effort and can gain clarity about end-user needs. Secondly, these methodologies promote getting fast feedback from users as well as from the system itself to ensure that everyone knows how things are working and how close to meeting the requirements the system really is. XP, in particular, prescribes engineering practices that help drive quality into the implementation. Test Driven Development (TDD), Pair Programming, Refactoring and Continuous Integration are all practices that promote quality. Couple those practices with the generally held principle of automate (nearly) everything, particularly in the area of testing, and you have a recipe for creating high-quality, sustainable solutions.