As a result, I developed a blame hierarchy that I normally mandate to my team before the start of a project and ask them to follow the hierarchy before raising the issue further. While it's true that there are some exceptions where the hierarchy fails, it works more often than not.
As per the hierarchy, if a developer finds an issue, the blame should be placed at a step only after clearing all the previous steps.
- Your module
- Your automated tests (especially if you didn't update the tests when the logic changed)
- Your team mate's module
- Stable custom framework
- 3rd party framework
- 3rd party libraries
- Network connectivity/Firewall rules
- Database
- JVM / Virtual Machine
- Operating System
- Infrastructure / Environment
Also note that the hierarchy should be followed only after due diligence has been performed, such as checking logs and looking for error messages.