On the other hand, unlike most engineering disciplines, software is abstract. The things we build are computer instructions – no flavor, no shape. Car is complex, but open the engine hood and you see something real. When the complexity gets higher, the difference between abstract and physical form is amplified exponentially. Physical existence forces engineers to build objects in a logical way, preventing you from going astray. The kitchen needs a sink; the door needs a knob. Craftsmanship (quality) is also tangible in the final product. However, software is as abstract as mathematical formula. Who can easily understand multiple pages of mathematical formula? Who may quickly see through the quality of numerous symbols? That’s why coders tend to rewrite others’ code (and why we should strive for code readability).
Coders may write programs in virtually any form. Common sense does not apply because software does not “exist” in the real world. After reading a beginner’s guide, anyone can write some code, while it takes years for a coder to realize how to write good code. Two programs may behave the same, and you feel the difference only when you work closely on them. Coding is a process of myriad free decisions ranging from variables, statements, functions, classes, modules to architectures as long as it runs correctly. The code reflects the author’s mind. No wonder working on the existing code is painful! Because you have to read someone’s mind, or your mind months/years ago.
The abstract nature of software results in another big challenge: its real complexity is too difficult to comprehend with common sense for non-engineers. Even you are a coder, unless you do related hands-on work day-to-day, you can hardly realize all the issues and complexities behind the scene. Hence software-related decision makers often have to base their decision on a small, vague fraction of the truth from what they’ve been told. This may lead to inferior decisions and engineers’ frustration.
We cannot change the abstract nature of software. Even worse, the software industry moves so fast that the technology you acquired a few years ago become obsolete. Coding is hard. Face it! That’s why we got paid.
That said, you can do your code reader (yourself and/or your colleague) a favor: write good code. Be conscious when coding; measure twice, cut once.