Thursday, 31. January 2008, 10:03:01
... is that we are working with ideas, not with material items.
The relation between people and ideas is fundamentally different from the relation between people and material items. For one thing, material items are perceived in the same way by different people (unless some of the participants are under the influence of some perception-altering substances). Material items can be described completely by diagrams and numbers.
The IT industry has gone to a great length of defining ways that would allow completely describing ideas. We have UML diagrams, templates for writing technical documentation and so on. We have ways to describe data and the transformation it suffers. We also have ways to describe the user interface.
The problem with the description methods we're using to describe ideas in IT is that:
- It's really difficult and time consuming to completely describe an idea (try to read Kant or Hegel to realize how difficult it is)
- Different people understand the description differently
- It's difficult for people to understand the description completely, to take into account all the details
Besides this, ideas evolve, and the people who need the application expect them to be easily included in the implementation.
It's very difficult to dissociate an idea from its programmatic representation. Ideas are easy to modify; the implementation is itself immaterial; so why is the implementation so much difficult to change than the idea itself?
In order to prevent misunderstandings from happening, we are testing the "materialization" of the ideas; in other words, the implementation.
But how do you test an idea? It's not a matter of fitting a mechanical piece in a mechanism. It's about comparing the mental image of the idea with the actual implementation. But you can't actually touch it, move it, look at it from all angles; at least not physically.
And then, there's the relation between users and their applications.
The computer is different from any other tool known to man because of a few key characteristics:
- It processes information and the result is information
- It gives good results only when given good input
- It gives wrong results in any other situation
- The user cannot touch an application
Therefore, the user has to form a mental model of the application and of how it works. So we are back to the same problem of perception of ideas.
The user's mental model about the application is not bound to be the same as the one of the developer, of the producer and so on.This essential difficulty is responsible for the most problems we face in software development. And, because it's an essential difficulty, there are no ways to avoid it, only to alleviate its effects.
The first solution that comes into mind is to minimize the communication chain. If the mental model gets more corrupted the more it travels then make it travel less.
Open source is a succesful model because the people writing the software are the same people who need it, and they can take decisions regarding it. In other words,
they are bound to have a similar mental model because they need the same thing, and they are free to adapt the ideas.
Agile methodologies are succesful because the communication chain is the shortest possible. The customer is part of the team and he is the one explaining the mental model directly to the people responsible with materializing it.
All the other methodologies have proven in time to be impractical. Completely documenting an application in UML is less productive than writing the application and adapting it as it goes. In fact,
completely defining an application means that we are creating a complete representation of the application in another language, and isn't that exactly what programming does? Except that you can run a program and you can, with some extent, use your senses with a program. That's impossible with another abstract representation of the same idea.
The other way to alleviate the difficulty is to use the right people for the job. Since defining a mental model for the application is a human problem, it's dependent on the individual. People with the right mindsets and with a certain mental agility that allows them to adapt to exotic mental models manage to form a mental image that's much closer to the one that's transmitted to them. And, with experience, they come to the point where the fill in the missing parts with the correct pieces of the puzzle (for a very interesting discussion on the expert mind, see
this article).
To summarize, if you want your software project to be succesful, do the following:
- Minimize the communication chain between the vision and the implementer
- Use the right people in your team
I believe this to be the basis for any succesful software project.
Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu
