Quality
Aspects of software quality
- Functionality: This relates to how well the software performs its intended tasks. Does it meet the functional requirements, and do those functions work correctly and reliably?
- Reliability: A reliable software system is one that operates without unexpected failures. It should consistently produce accurate results and handle errors gracefully.
- Performance: This measures how efficiently the software performs its tasks. It includes factors like response time, throughput, and resource utilization.
- Usability: Usable software is designed with the user in mind. It should be intuitive, easy to navigate, and provide a positive user experience.
- Maintainability: A high-quality software system should be easy to maintain and update. This includes clean and well-documented code that allows for future modifications without introducing errors.
- Scalability: Scalable software can handle increased workloads or user demands without significant performance degradation. It should be designed to accommodate growth.
- Security: Security is crucial for protecting data and preventing unauthorized access. Software quality includes robust security measures to safeguard against threats.
- Compatibility: Quality software should work well on various platforms, devices, and browsers, ensuring a broad user base can access and use it.
- Testing: Rigorous testing, including unit testing, integration testing, and user acceptance testing, is essential to ensure the software meets quality standards.
- Documentation: Comprehensive documentation helps users, developers, and maintainers understand how the software works, making it easier to use and troubleshoot.
- Compliance: Depending on the domain, software may need to adhere to specific regulations or industry standards, such as HIPAA for healthcare or ISO 27001 for information security.
- Error Handling: Effective error handling and reporting are crucial for identifying issues promptly and providing useful feedback to users and developers.
- Adaptability: Software quality also involves the ability to adapt to changing requirements and technologies over time.
Test-driven design/development (TDD)
Software built using TDD tends to be more modular, and appropriately coupled. It also forces us as developers to think more carefully about the interfaces we expose in our code. Using TDD, we can more easily control the creeping complexity of our systems, by virtue of the fact that the tests get harder to write the more complex the code is. - Me
- baby steps - what is the simplest possible test case?
- descriptive and consistent test names
- Arrange, Act, Assert
- Assert on whole objects, not just counts or attributes
- Red → green → refactor (refactoring usually comes after 4 or 5 tests, give or take. Not too early, not too late)
TDD: Balancing Progress with Stability
Shift Left - Move quality activities earlier in the development lifecycle to catch and fix defects when they’re cheapest to address