This is a blog about Effective Software Design, so it is important to first make clear what do we mean by “effective”.
Peter Drucker defined the difference between being efficient and being effective:
• Efficiency is the capacity to do things right.
• Effectiveness is the capacity to do the right thing.
A manual worker is expected to be efficient. He must perform his task following the orders he was given by his superiors. His work is judged in terms of the quantity and quality of items he is able to produce in some unit of time. The manual worker must do things right.
A knowledge worker is expected to be effective. His work includes making decisions, and therefore he cannot be directly instructed by others about how to perform his task. He produces knowledge, ideas and information that must then be applied to become products. The knowledge worker must do the right thing.
In the past, programmers were more like manual workers. The programming languages were very simple, with just a few elementary constructs. The programmer’s task was to assemble instructions in order to obtain the desired effect. Programmers had to be efficient, and the efficiency of the programmer could be measured by the number of lines of code (LOC) that he could produce in some unit of time.
Today, with the advent of object-oriented programming languages, the nature of programming tasks has changed. For any possible problem being resolved there are certainly libraries of classes that can be easily reused. For many complex systems there are frameworks that already provide most of the required functionality, and that need only be extended with a relatively small development effort.
In this new reality, measuring the LOC produced by the programmer is most likely the wrong thing. Because if he is writing too much, he is probably reusing too few. It is common to see less experienced programmers constantly “reinventing the wheel”, creating again classes that are ready to use in some library. As Peter Drucker said:
“There is nothing so useless as doing efficiently that which should not be done at all.”
Therefore, programmers today should be expected to be effective. They should know about the available frameworks and class libraries, and their work should consist mainly in deciding how to extend and reuse them. These decisions are design decisions, and the effective programmer must be able to compare design alternatives and select “the right one”.
For example, Design Patterns can be described as effective software design decisions for several abstract problems that were exhaustively studied and classified.
I hope the articles in this blog will help you develop your skills and make you more effective as a software designer, so that you will be able to “do the right thing”.