One of the first things I remember learning about testing is the repeating nature of it. Test results are like milk and stay fresh only a limited time, so we keep replenishing our tests. We write code and it stays and does the same (even if wrong) thing until changes, but testing repeats. It's not just the code changing that breaks systems, it's also the dependencies and platform changing, people and expectations changing.
There's corrective, adaptive, perfective and preventive maintenance. There's the project and then there's "maintenance". And maintenance is 80% of products lifecycle costs since maintenance starts with first time you put the system in production.
- Corrective maintenance is when we had problems and need to fix them.
- Adaptive maintenance is when we will have problems if we allow for world around us to change and we really can't stop it, but we emphasize that everything was FINE before the law changes, the new operating system emerged or that 3rd party vendor figured out they had a security bug that we have to react to because of a dependency we have.
- Perfective maintenance is when we add new features while maintaining, because customers learn what they really need when they use systems.
- Preventive maintenance is when we foresee adaptive maintenance and change our structures so that we wouldn't always be needing to adapt individually.
It's all change, and in a lot of cases it matters that only the first one is defects and implying work you complete without invoicing for the work.
The thing about change is that it is small development work, and large testing work. This can be true considering the traditional expectations of projects:
- Code, components and architecture are spaghetti
- Systems are designed, delivered and updated as integrated end-to-end tested monoliths
- Infrastructure and dependencies are not version controlled
- Code is clean, components are microservices and architecture creates clear domain-driven architecture where tech and business concepts meet
- Systems are designed, delivered and updated incrementally, but also per service basis
- Infrastructure and dependencies are code