I've always been amazed how different hardware and software are. Electrical engineers and computer engineers design and build transistors, integrated circuits, circuit boards, etc. Fascinating stuff, and I've always envied the regularity of their world and the fact that principles of physics underlay what they do. Electrons are whizzing around in a lattice created by the conductor, and both electrons and 'holes' are moving around a transistor.
But magically those electrons and the state of a transistor correspond to zeroes and ones, to bytes, to megabytes of data and programs.
Like there are layers to hardware, there are layers to software.
Data are stored at the bit and byte level, but software resides above them, changing their values and moving them around. Like the Greek gods manipulating the affairs of men (and women) on earth. But good software is part of a larger system. Software applications, including iPhone apps, depend on the underlying operating system – Mac OS Lion, Windows 7, iOS, Linux. It all seems so symbiotic.
But conceptually, good software is also the result of a good process, a methodology attuned to the needs of the users, the capabilities of the developers, and the needs of the business. Let us not forget the functionality of the underlying hardware and software. Modern iPhone apps were impossible with the vacuum tube hardware of the 1960's.
So we've seen three layered systems, each with their own layers. Hardware is layered, starting with principles of physics. Software is layered, starting with bits and bytes and instructions. But systems are layered, too, based on good IT project management. Really good engineers understand and accommodate the abilities and needs of the software developers and the project managers. And the best software developers similarly know and understand the other players within their discipline and in related disciplines.
During my doctoral program, the professors all thought they could admit anyone into the program in management information systems (MIS) who was bright enough. Fred T. was one such student, with a great liberal arts education and a few years of experience but no technical training. They discovered the hard way that admitting students with little or no software development experience were dooming those students to failure. Class discussions on systems analysis and database management inevitably returned to issues of software and hardware. Fred was soon lost. He tried to work conceptually, but the layers below him (of which he knew nothing) always commanded his attention. Disheartened, he escaped with an MBA and never finished his PhD.
Let's not mistake horizontal layers with vertical layers. Software developers and computer engineers work in disciplines that are more horizontal neighbors than vertical neighbors. In an apartment building, the proper functioning of my heat and sewer and Internet connectivity depends less on my neighbor than it does on the infrastructure in the basement and under the streets. When my sink stops draining, I can fix it faster with a deeper understanding of the pipes that are hidden in the walls and underground. So it is with software. If I can't reliably backup my website's data, vertical knowledge leads me to fixing bad sectors on the drive.
But that is still relatively superficial knowledge about deeper layers. Deeper layers are more powerful if they are more fundamental. Try designing new software for a living. Here's where the real power comes in. Deeply creative minds will have a broader understanding of the underlying principles and be able to use the right principles at the right time. First, understand the users' needs. That requires a whole set of skills involving contextual inquiry, usability testing, prototyping, and information architecture. Second, understand the business needs. That requires a different set of skills, such as interviewing and verbal communications and project planning. Third, develop the software. Enter skills in programming languages, data structures, and database management. And managing the people who do these tasks requires deep insights into who works well with whom and how to manage them effectively.
Fundamentally, people create software. Make them individually more insightful and more dynamic, and they will be both more productive and more fulfilled in their work. Teach them to dive within their own minds and discover their own conscious as a giant reservoir of new ideas and satisfying achievements.
Layers can be a lot of fun, and not just efficient and effective.