How does quality assurance fit into the design phase of software development?
What (if any) quality assurance activities are done in the design phase?
How does quality assurance fit into the design phase of software development?
What (if any) quality assurance activities are done in the design phase?
A good design is a testable design. IMO, one needs to always be thinking of how one would test the software even during the design phase. Of course, the level of attention required would depend on whether you are doing detailed design or a high-level architecture. Using a methodology, such as TDD, will force the focus on the importance of testing during design. Of course, one shouldn't overlook other aspects of QA such as usability testing, performance testing, etc. These too are important factors to consider during design -- both how to achieve your goals and how to evaluate whether the goals are achieved.
The most useful thing that QA can do during the design phase is make sure that the supplied spec has a set of clear, testable goals. And use those goals to come up with a test plan.
This is so that they can answer two very important questions "Can this be tested" and "How long will it take to test". The first is important to ensure that everyone knows the criteria fro when a project can be considered completed. And the second is neccesary as it forms a part of the overall cost of implementation.
Quality Assurance does not really fit into the design phase at all. QA is about fixing defects after they occured, something that was common practice in the last millenium. Of course there may be defects in the specification documents produced during desing, but aside from those you have no product yet, therefore no defects to find.
Quality Management on the other hand is the way to go in the 21st century. It is an integrated approach to defect prevention. It is crucial to integrate it into your project from the very beginning, so it definitely must fit into design.
There are thousands of books and webpages about this subject, but IMO the most important things are:
There's rougly an Architectural Design phase and a detailed design phase.
QA activities during these phases may include:
This is sometimes referred to as 'Software Qualiy Critical Design Reviews'. You can see an example checklist here.
To understand how it fits in your particular development process, you have to consider:
Design phase: A lack of quality in the design process can invalidate good requirements specification and can make correct implementation impossible. Industry practice shows that use of checklist during design helps improve design quality
Have we addressed all the requirements mentioned in the SRS? Has the SRS been put under document control? Have the requirements related to the following features been addressed during the design? Performance, security, concurrency, usability, portability, testability, language/DB/OS/hardware requirements, development environment, compatibility, adherence to industry standards, scalability, exception handling
Is the design methodology chosen appropriate for the type of software project to be developed. Clarity: Is the design documentation clear/unambiguous? Can he design be technically justified Compatibility with existing Software Have the effect of this design on existing software been identified Have we done the impact analysis Does this design rely on the side effects of other software? Does this design have any dependency on any other related design?
Component Level: Are the interfaces well defined? Are the main data structures defined Are the main algorithms defined Is the data/control flow defined Data Structure and Algorithms Are the data structures defined Are the access methods to the data structures defined? Are the algorithms defined? Do the data structures and algorithms solve the problems
Error/Exception Handling Are data type errors handled? Does the software validate user input? Does the software give explicit, non-threatening messages if error occurs? (Quality of error messages). Can the software be restarted from any point after an error? Does the software gracefully handle exception conditions such as access violations and floating point errors.
Procedure Interfaces Does the number of actual parameters match the number for formal parameters? Do the type and size of actual parameters match the type and size of formal parameters? Have we specified the local and global functions correctly? Are global variables defined and used consistently across modules? Is all communication documented (i.e. parameters and shared data)?
Procedure Level Does the procedure do something very similar to an existing procedure? Is there a library procedure that will do the same thing? Is the procedure excessively complex Could the procedure be broken into separate, more logical pieces. Is the procedure of acceptable size?
Does the procedure do only one logical thing? Does the procedure rely on procedure scope static variable? Is the procedure easily maintained and cocrrectly referenced? Can the procedure be easily tested? Are the side-effect described?
Quality Are the goals of design stated (reliability, flexibility, maintainability, performance etc)? Does the design satisfy its stated goals? (Traceability to Requirements) Is there evidence that more than one design option was considered? Are several design options listed along with the reason for their adoption or rejection? Are the design assumptions stated Are the design trade-offs stated Is the design efficient? Is the design maintainable? Is the design portable? Can the design handle changes to the external environment with minimum modifications? Is the design parameter driven or are the values hard coded in the programes.
Requirements Does the design satisfy every requirements? Is there traceability between the design and the system specifications? Can the design meet development cost requirements? Can the be completed in the given time frame? Does the design stay within the requirement memory constraints Does the design stay within the required disk usage constraints Does the design satisfy the response time requirements? Will the design handle the expected rate of transactions? Will the design handle the expected data flow volumes?