I am writing this post to document the learnings & best practices that have either worked for me in my past or I strongly believe that these would work in practical circumstances and help replicate demonstrated success.
Design and Development:
1. Good, detailed requirements (Functional and Non Functional) help writing better deisgn, code and better test cases.
2. Keep the Design Simple.
3. Perform peer reviews.
- Provide training to ensure that your team members share a common understanding of the review process. Adopt some written procedures, checklists and forms for documentation of formal reviews.
- Keep time for code reviews in the project plan
- Only people who would contribute to the review should participate. Big review teams are often not as productive as a small team. Keep it 3 -7
- Give ample time to the reviwers to review individually before coming for the meeting
- Reviewers Critique the Product, not the Producer
- Focus on the substance not the style of the code being reviewed
- Review meetings should not drift into problem solving
4. Keeping a threshold for open bug assigned to all individual (developers) help curb the hassles of the End game of a product release.
5. Test the code before Check-in.
Configuration Management:
1. Continuous commit and Integration by all developers to the mainline with Self Testing code i.e. Unit Test cases. I have not worked on Test Driven Development(TDD) but having a strong unit test case framework is the least that is required for continuous integration. A continuous integration server can also be used which acts a monitor to the repository. Every time a commit against the repository finishes the server automatically checks out the sources onto the integration machine, initiates a build, and notifies the committer of the result of the build. Many organizations do regular builds on a timed schedule, such as every night. This is not the same thing as a continuous build and isn't enough for continuous integration. The whole point of continuous integration is to find problems as soon as you can. Nightly builds mean that bugs lie undetected for a whole day before anyone discovers them. Once they are in the system that long, it takes a long time to find and remove them.
TDD is a design technique that drives the development process through testing. In essence you follow three simple steps repeatedly: Write a test for the next bit of functionality you want to add; Write the functional code until the test passes; Refactor both new and old code to make it well structure.
2. Maintain a single source repository for all developers (CVS, VSS, Subversion, Perforce etc.) and keep the branches to a minimum.
3. Automate the build process. Keeping it manual can be a a breeding ground for mistakes. A common mistake is not to include everything in the automated build. You can use a smart tool to check the dates of the source and object files and only compile the module if the source date is later.
4. Daily Build and Smoke Test helps keeping the build stable.
5. A strong BVT (Build Verification Test) before build release to QE, can help save a lot of effort later. Usage of Virtualized machines can reduce the cost of your test labs drastically.
If you have build problems quite common, put a calendar on the wall that shows a full year with a small square for each day. Every day the QA group would put a green sticker on the day if they had received one stable build that passed the commit tests, otherwise a red square.
6. Keep a standard place/server location to keep the build for usage. It makes it easy to find and backup.
Testing:
1. Use functional requirements to write test cases and test design at the same time that the developer is performing the low level design and coding. This will help in refinement of the requirements and hence the implementation before the build is provided for testing.
2. Have formal Entry and Exit Criteria for SDLC phases and milestones.
3. Understand and implement in your test design how to write variations (different input, expected output) of a test to gain code coverage.
4. Create a sound plan for multiple platform testing by periodic rotation of the platforms being tested.
5. Plan Internal Beta testing leveraging on existing resources of your company. Dependent on the product, you may use the product within your organization at a production level.
6. Plan External Beta or Prerelease programs.
7. Develop User Scenarios where exhaustive testing is not possible. It also helps in reducing the complexities of the test cases.
8. Pay attention on usalibity, it was be the first factor for a user to define Quality. See what is the latest happening in Human Computer Interface.
9. Teaming testers with Developers. Form the right team where the skills of various team members compliment each other.
10. Use Code coverage to see the efficiency of the test cases and minimizing regression tests.
11. Automated Environment Generator: Go in for automated deployment and rollback of the build to the QA machines or servers.
12. Instrument the code for MTTF: You can implement a reporting back of failures and failure data which can help in diagnosing the problem.
13. Get the test plans reviewed by peers before getting it reviewd by the Product Management and Development teams.
14. Do not automate without optimizing the test cases eg. for functional and code coverage. Automating Junk helps creating junk faster.
15. It is important to analyze the results (predominately the Failures) of an automation run as soon as the results are provided.
16. Replication of user environment would help in replication of non-reproducible defects in house.
17. Usage of Virtualized machines can reduce the cost of your test labs drastically.
Project Management:
1. Do not create reports that are not required.
2. Perform post mortems and document the learnings while they are fresh.
3. A Plan is only as good as its implementation.
4. If you fail to plan, you plan to fail.
Further Reading:
http://www.ibm.com/developerworks/websphere/library/techarticles/0306_perks/perks2.html
http://www.construx.com/
http://www.sdbestpractices.com/
http://www.martinfowler.com/articles/continuousIntegration.html (ThoughtWorks)
http://www.processimpact.com/articles/revu_sins.html
http://www.belizenorth.com/articles/TIMEBOX.htm
http://www.spmn.com/lessons.html
http://www.ddj.com/architect/184415753
http://www.perforce.com/perforce/bestpractices.html
http://testing.com/
http://www.chillarege.com/authwork/TestingBestPractice.pdf