In developing a computing system, two different issues need to be considered: Competence and Performance. Competence addresses the functionality of the system and directly relates to what could or could not be done by the system. Thus the effectiveness and efficacy of the system are part of the competence issues. Performance deals with how efficiently the system works – how much time it takes to solve the problem and what resources it requires. The success of the system is determined by the combination of the competence and performance issues addressed by the system.
In too many cases, computer scientists start worrying about the performance issues way too soon. The first thing in the design of a system is to consider competence of the system carefully. One should target the system to have at least the minimal amount of competence that will be acceptable to users. Then only performance issues should be considered in the design of the system.
A major problem in considering performance issues too early is that designers start defining system functionality by considering what could be done efficiently rather than what will be acceptable to users. This has an obvious problem. In an extreme case, one may design a system that is most efficient, but does nothing. Clearly such a system is of no use to anybody, except possibly to satisfy the ego of the designer that he could solve a (non)problem very efficiently. On the other hand, if a system functionality can not be solved efficiently by current means, but is really useful to people, then many researchers will work on developing efficient solutions and in due course one will have a good solution to the problem.
Abstraction and organizational issues related to unstructured and structured data have similar issues.