Software’s Complexity Complex
Software, like any other technology, has an intrinsic tendency to become more and more complex. In response to market forces, software developers struggle to differentiate products from those of their competitors by making them more and more functionally sophisticated. This has become a major problem for software vendors.
What are the dimensions of simplicity in software technology? Can those attributes be engineered? What do we mean by simplifying technology? What is simplicity?
Technology, unlike science, must be understood in light of its usage elements. To understand technology, we need to understand the individuals who use it. We cannot define complexity in technology solely in terms of objective physical parameters. If we accept the assumption that technology intrinsically involves human endeavor, we must accept the ergonomic, social, and mental agents that both build it and consume it. We must accept that its makers construct the complexity in technology.
The impact on technology of the physical and biomechanical properties of our bodies is well understood. The physical characteristics and limitations of our bodies constrain the optimization of users’ sitting postures and hand/arm alignment while physically interacting with hardware devices. For the most part, however, when it comes to information technology, complexity is in the mind.
Since the advent of constructivism in Cognitive Psychology, we have come to recognize the role of the mind in constructing reality.  The mind constructs reality for human beings, literally. This is not simply a matter of interpreting what we perceive—its significance or its meaning. The very perceptual systems through which we see, hear, and feel do more than mirror reality. Perception builds reality from external as well as internal elements. A constructivist view does not imply disassociation between the external world and the way we perceive it. Evolutionary psychology has eloquently made the case that our brains have evolved to meet the challenges of our physical and social surroundings.  The human mind constructs our world, but it doesn’t do it arbitrarily. Its building tools and methods have evolved to keep us alive and adapted to an environment that is subject to physical laws and social covenants. Nonetheless, our minds use the internal elements that are at their disposal. They build current outputs upon previous ones. Human minds project the past into the present, which they then recycle, abstract, categorize, and put to use at every opportunity. We call this knowledge.
The most important factor determining simplicity in software technology is users’ knowledge—at multiple levels:
- common knowledge of the world users have inherited or absorbed in childhood
- conceptual knowledge users have learned through schooling
- semantic networks and categorization schemes users have acquired through secondary and higher education
- facts, generalizations, and abstractions users have accumulated in their professional lives and through specialized training
Software pioneers in the early 1980s used world knowledge their contemporaries commonly shared as their metaphors for the first software user interface designs. The technological transformations personal computers brought to us took place under the impetus of a major leap in simplification: People’s interactions with personal computers became predictable by inference from their well-known behaviors with everyday, common objects such as folders, windows, drawers, pens, boxes, buttons, and so on. By relying on the physical gestures people make when interacting with three-dimensional physical objects such as notebook tabs, calendars, and menus, the tasks of locating, browsing, and changing the properties of complex virtual elements became simpler.
Technological complexity is relative. Although we can describe and measure the complexity of certain chaotic, adaptive systems independently of the observer, we can understand the complexity of any technology only in relation to the user—in the case of information technology, in relation to a user’s information-processing ability.
What a user either knows or ignores is the raw material from which we can engineer technological simplicity or complexity. This becomes even more obvious beyond the realm of the common, knowledge-based metaphors graphic user interfaces exploit. Higher knowledge requirements in specialized domains result in more complex software. For example, what a marketing analyst must know about the productivity applications he routinely uses involves less sophistication than the business-oriented knowledge he has acquired on the job—such as knowledge about procedural and scripting languages, architecture, and the programming models and tools with which he crafts business applications. This knowledge, in turn, is less advanced than the knowledge an object-oriented software developer has accumulated after earning a Masters in Computer Science and polished by working on advanced projects in the research and development division of a multinational software company.
If complexity is in the mind, does that mean it is beyond the realm of software engineering?
A relativistic view of complexity does not mean that we cannot address simplicity objectively, and ultimately, engineer it as part of software design and development. It just means we need to take into account a user's knowledge system.
Cognitive psychology draws a distinction between declarative and procedural knowledge, as follows: 
- declarative knowledge—knowing that—Stores facts, or declarations that we know to be true knowledge; knowledge of semantic structures that we relate and enrich with facts and instances, and categorize, abstract, and enrich through learning and experience.
- procedural knowledge—knowing how—Takes knowledge beyond the realm of the higher mental processes by involving the organism as a whole.
For example, athletes train by making a particular movement over and over, in the hope of instilling muscle memory that will automatically optimize a movement or position without thought—that is, without bringing attention to the task. We can safely leverage this procedural aspect of knowledge. Business users of productivity applications who are skilled at using word processing or email applications can accomplish goal-oriented tasks without necessarily comprehending what it is they are doing. As technology becomes more sophisticated, skills require a more disciplined combination of declarative understanding —in the form of computing architecture, data structures, algorithms, and so on—with arduous practical training. Computer analysts, software developers and architects, and network administrators and designers have learned the conceptual underpinnings of those technologies, but they must also acquire the specific procedures that let them put the technology to work to solve a particular business, application, or system problem. Computer scientists spend many hours solving problems in the classroom or the lab to achieve a level of skill that is similar to that which a gymnast attains after long hours of practice at the rings or parallel bars or a surgical resident gains at a teaching hospital.
The level of knowledge and skills an IT professional must possess has increased dramatically over the last 20 years. The skills today’s professional computer programmers with five years of experience have accumulated are an aggregation of knowledge about operating systems, computer-science architecture, computer-language syntax, data structures, algorithms, tools, and best practices. It also demands skills managing the life cycle of the code produced, its compilation, change, integration, and performance optimization. Moreover, given the incomparable dynamism of information technology, those skills need continuous updates through life-long learning. New APIs (Application Programming Interfaces), languages, architectures, frameworks, tools, and coding practices appear in rapid succession. New technologies supersede existing ones without completely replacing them, resulting in legacy layers of coexisting technologies that interrelate in intricate patterns very few fully understand. The resulting technology is complex because of the knowledge and skill using it requires.
Technology is simple only to the extent that we can efficiently develop and manage the skills to operate it. Are 21st-century automobiles complex? Not to drivers, who need to know only a limited set of skills to operate most of their functions—at least the critical ones that let them get from one point to another. Today’s automotive technology is reliable enough to become transparent to users. How about for the mechanic? Fixing an air conditioning unit or a carburetor failure often requires just a simple turn of a screw. Behind such a seemingly simple maneuver often lies a body of knowledge that guides the skilled professional to the right screw to turn.
We are astonished at the ease with which athletes, artists, surgeons, or craftsmen can accomplish tasks that would be insurmountably complex to the inexperienced. Skills forge simplicity. We can automate cognitive and sensomotor routines as a result of practice. [6, 7] The trained eye can transform complex stimuli into meaningful, easily recognizable patterns whose meaning and significance an experienced person can not only quickly assign, but also include call-to-action routines. Like chess patterns to a master player, x-rays to a diagnostician, or java code to a professional software developer, knowledge informs its possessor what to do next.