Axiom 1 - Software is Never Done
All software that is still in use is never done and will continue to be enhanced. The concept is simple, if the software product or system is providing any value to people it always needs to be worked on. Many people outside of the software industry do not understand this. I have had to explain that software is mutable to its core to management and clients many times. The problem exposes itself when your software is competing in the marketplace; your competitors fully grasp the concept of “software is never done” and they continue to improve their product, making it a better fit within the marketplace. Next thing you know, your competition has over run your product offer.
Axiom 2 - All Software Has Bugs
If the software product or system is being used by people then it is always being updated and modified per Axiom #1, above. Therefore, it will always have bugs. What do you do about it?
Properly test your code. There are multiple levels of testing and all must be undertaken to be as bug free as possible.
- As engineers write the code they must use “debugger-based code walkthroughs”, where the engineer uses modern debuggers to set breakpoints and “walk” through the code live. This method will eliminate the vast majority of bugs in the system.
- Write unit tests. This can be expensive, so targeting cost effective unit tests is key.
- Full system integration testing. Test the system end to end. These are usually human driven tests, but parts can be unit test driven. Very expensive to setup and execute.
- Simulate high-capacity usage to conduct performance testing. See Axiom #4, below.
Axiom 3 - Software Developers will always want to rewrite other developers code, no matter what
This is some of the most wasteful expenditure of human capital when building software system. When new developers adopt an already existing code base they do not understand the philosophy, architecture, and design of already existing code. It is natural to simply claim the code is no good and demand to rewrite it, even if the code is functioning properly in production. Engineers are often asked to extend the functionality of a working system to advance the goals of the organization, not waste time, energy, money, or opportunity on rewriting functioning code. My message to engineers: “Get over it!” Your code is not that much better then the code you are rewriting. Just ask the next guy who takes over your code.
Axiom 4 - Performance is a characteristic of a functioning system
I love this one. It is soon forgotten that the only way to measure performance, or demand better performance, is for that system to be functionally working as designed. The system works! That is a huge accomplishment. With that said, performance is critical to the ultimate success of a system. But there is no possibility of performance tuning if the system doesn’t work. It may be the case that portions of the system have to be re-architected or rewritten to improve performance, but that is all built on the knowledge obtained while constructing a functioning system.