How do software development teams make sure the products they release are of high quality?
Not so long ago, a cynical answer to this question would have been something like, “Since when did software development teams care about quality?” It’s unfair, but it’s rooted in perceived quality issues from all types of development teams, from “lone wolf” contract developers to giant software conglomerates.
Before we can answer how quality development occurs, we need to know exactly what “software quality” is. As it turns out, the term means different things to various stakeholders.
5 Components of Software Quality
Five aspects of software quality must be addressed in every software project:
1. Functional quality
This is the most straightforward component because it’s based on clear, objective criteria derived from functional requirements of the application. Does the software meet each requirement? If it does, it passes; if not, it fails. Functional requirements must be written in a way that satisfies clear, “testable” criteria.
This component tends to be more subjective, and essentially revolves around two questions: “Do users like it?” and “Does it look good?” Various methods can be used to check usability, from checklists to full-fledged usability tests involving actual users.
This is another component that is often subjective and based on arbitrary criteria, such as “complete processing within a few seconds” or “load page under 1 second.” Some applications (such as software that automatically executes foreign-exchange transactions in overseas markets) have very strict performance requirements and are subject to rigorous performance testing.
Security has become increasingly important in recent years. It’s critical need has created an entire sub-specialty of software quality.
This aspect affects the development team more than end-users, but it’s important; especially for whoever is paying the bills. Poorly designed applications are expensive to update when the underlying architecture has to be redesigned. A high-quality application will be “future-proofed;” that is, designed in anticipation of being modified at some point.
It’s helpful to have some idea of the product roadmap so the developers know what modifications to expect. They can then design accordingly.
How Quality is Built into an Application
Quality begins by ensuring development and QA teams understand the requirements of the software, its intended use, characteristics of the expected users, and the environment in which users operate. By keeping these in mind, the development team can make appropriate design choices.
The team can rely on several techniques to maintain a high level of quality throughout the development project:
- Code reviews – Developers examine each other’s codes, to spot any potential functional, performance, or security issues. This also ensures the developers are following the software architecture and other conventions.
- Coding to the test – This is a relatively recent addition to the development toolbox. The project starts with the QA team designing test cases on the basis of the requirements. Then the developers code with the goal of passing these pre-written test cases.
- Tandem coding – In this technique, two developers work side-by-side on the same part of the code. One does the actual coding while the other observes; they periodically switch roles. This approach is similar to code review but in real-time.
There are many others. How well each one works depends on the size and scope of the project as well as the availability of resources, the project schedule, and the type of software being developed (mobile app, web app, firmware, and so on).
The agile development methodology is quite well-suited for ensuring product quality. The software is constantly subjected to testing and evaluation by both the QA team and the customer. It also improves quality when the entire team, including the customer, is involved in the project from beginning to end. There is ongoing communication and transparency among all stakeholders and problems are managed as they are identified instead of waiting.
Here’s an obviously important component of quality assurance in software is testing: You can’t know whether the code works until you try it out. Several types of testing are now used in most development projects depending on size, scope, and software type:
- Exploratory testing – This type of testing may not have a prescribed test case or script, but instead a checklist of things to look for. In exploratory testing, the tester pokes around in the software to check for glaring errors, look-and-feel issues, system crashes, and more.
- Integration testing – The QA team normally performs integration testing, which involves different software modules tested together as an integrated system. The test cases are written on the basis of documented requirements.
- Performance testing – Performance testing checks whether the software runs efficiently and doesn’t get bogged down when checking IF conditions that will never occur or uselessly looping through irrelevant data.
For systems implemented in the cloud, performance testing can include checking network throughput and latency. Finally, for multi-user systems such as web applications, performance can be tested by simulating a large number of users accessing the system simultaneously. This reveals at what point system performance becomes unacceptable.
- Regression testing – This testing ensures that what was working previously didn’t break when the code was updated. This is especially important in an agile regime, where code is being updated every sprint.
- Security testing – Security testing employs experts familiar with current hacking techniques checking for vulnerabilities. Security isn’t just about requiring “strong” passwords; security testing runs the full gamut to see if credentials are left exposed in accessible files or memory, whether the system is vulnerable to side-channel attacks, and more. Security-critical software that deals in sensitive data should be subject to more rigorous and comprehensive security testing.
- Unit testing – This is the testing developers perform on their own (or each other’s) codes. The scope of the testing is limited to a particular chunk of code being worked on. This is usually less rigorous or comprehensive than higher-level testing.
- Some development teams have a rule: Developers cannot add their code into the code repository until it passes a unit test.
Many types of testing can be automated to at least some degree. Automated testing makes the testing process more efficient, comprehensive, and repeatable; all of which are important in a fast-paced agile environment.
Quality: A Journey, Not a Destination
Quality is a product of continuous improvement. Good development teams constantly seek better, more effective ways to build quality into their software and provide the best possible product to their customers.
Even with the best testing methods, the most rigorous coding standards, and the most thorough testers, no software of any appreciable complexity is going to be “bug-free.” But with a sound development methodology, open communication, and a high level of discipline among all stakeholders, QA can minimize trouble and release a quality product.