Simulating Software Failure to Produce Software Success
Sometimes, we as humans, frame failure a negative word and experience. However it doesn't have to be that way. Failure is one of the greatest teachers! In the world of software engineering, which involves software quality testing, we have concepts such as "Negative Testing" to help find failure ahead of time. Essentially negative testing insures that the software can gracefully handle unexpected user inputs. We can easily make the assumption and mistake that we know exactly how the customer will input data.
In contrast, "Positive Testing" tests for the expected user input and evaluates if the output meets acceptance criteria. For example, we can expect a user to put in their phone number in this format "1-800-123-1234" however the reality is the user will input the data however they wish and assume is correct. We can resolve this by writing Javascript to insure it gets formatted correctly or indicate a suggested format.
We can insure there are server environments for testing. This typically includes having a development environment, Quality assurance environment, and production environment. Some companies choose to also have a staging environment for functional testing. In some cases, an additional stage environment is used for load testing and cyber security testing.
Plan a Code & Data Revert Strategy
Prior to deploying out new code to a production environment, it is crucial to have a revert strategy, despite having done extensive regression testing on the lower environments (Development, QA, Stage). This involves going back to previous software functional acceptance criteria, already tested, and testing it again. Since there is a possibility you may not have entire code proofs evaluated, environmental variables considered, and user input possibilities evaluated prior to a release, there is a chance of a bug being released to production. Because of this possibility we need to insure there is a revert strategy for both code and data. This can be done by taking a snapshot of all of your servers, including your database.
One thing I have learned as a developer and system administrator is to put myself in the shoes of the end users and essentially all stakeholders of the software and insure you are seeing the software from their perspective. Their intended ways of using the software and experiences are different than yours as the software engineer, QA engineer, or systems engineer. By understanding their intended "User Journey" and actual user journey experience through the graphical user interfaces of the software, you can help insure software success.
Be the person to try different inputs and navigation through the software interfaces. Be that person to look objectively at the user experience to insure a successful software product. As a software engineer you can insure success by thinking in terms of failure. This doesn't mean "think pessimistically", it means thinking of all possible user inputs and possible user experiences. Think of the common expectations users have when first encountering your software application and insure that their expectations are met.
As a Software Engineer, be the one to fail early within the software development process. Be willing to learn and keep track of failures. This is how you will learn to plan for success in future software projects using your experienced checklists. - James D. Jenkins