Dec 19th, 2007 | Concepts
We can consider software development as the translation of our theories, concepts and ideas into the machine code. Therefore, how we gain, evolve and verify this knowledge is very important for building successful software. There are two main views how we gain the knowledge: Rationalism and Empiricism.
Rationalists appeal to reason as a source of knowledge or justification. They claim that our concepts and knowledge are gained a priori, independently of experience. Empiricists claim that experience is the ultimate source of all our concepts and knowledge. Rationalists come up with a theory and look for the evidence to support it. Empiricists assembles evidence, and builds on the evidence to form a theory.
The main question for the both camps: How do we know that our theory is true knowledge and not a guess?
Rationalism and empiricism have various success in different areas:
- Mathematics is triumph of rationalists – all the complex branches and theories are deducted logically from few intuitive basic premises.
- Natural sciences, which are dealing with dynamic complex systems combine rationalism and empiricism using scientific method: empirical observations and experiments with rational hypotheses and predictions. However, empiricism has the main emphasis – observational experiments are necessary to understand the physical universe.
- Social sciences, politics, economics show inability to come up with reliable rational theories. However, empiricism in these areas has own limitations as it is difficult to make comprehensive social experiments and deduct from them (and history) any true knowledge and theory about human groups and their societies. Human groups are complex, unpredictable and often irrational systems. They don’t behave consistently and don’t submit to permanent laws as physical world does.
What view does work better for software development?
How do these views show up in software development? Pure rationalists would prefer developing complete concepts and knowledge behind the software system using intuition, logic and creative insights before start of programming. Pure empiricists would immediately dive into experiments, programming and getting early practical results and build their knowledge based on this experience.
I believe that software development is mostly empirical in nature. We are dealing with complex systems, environments and many factors. But what is most important we are dealing with difficult to rationalize humans, their ideas, needs and perceptions. Pure rational approach will be speculative and too risky.
Many non-coding software architects and business analysts are rationalists. In overall, more people are distant from the direct experience of developers and end-users, more they are inclined to rationalism. In absence of direct experience from building or using the system, they have to rely on assumptions, logic and intuition, which could be far from reality.
Rationalism is useful in narrow areas of the system development, e.g. algorithms where system input and output are well defined. Within these boundaries developers can use power of their intellect to find rational and logical solution. More complex area, perspectives and relations will need more and more empirical approach.
Often people rely on experience from development of the previous software systems and use rationalism to define a new system. But this rationalism has limits. Experience could be applied directly only if the new software project uses the same technologies and solves the same problems with the same people. But doesn’t it sounds wrong if we build the identical system again?
Intuition, creativity and logic are very powerful tools in any intellectual human activity. Human creative ideas (and even ivory towers) are moving force in many of them. But only experience could prove if these rational and creative insights are correct. In addition to reality check against the real world, experience is irreplaceable source of the new ideas, theories and concepts.
Therefore, any effective software team should adopt empirical view on building software:
- Strive for immediate and early experience to confirm ideas behind a software project.
- Expect to adjust these ideas according to experience.
- Open for discovering new ideas down the road.
The only source of knowledge is experience. – Albert Einstein