I enjoyed a great discussion yesterday with my neighbor about how we live in a modern Fairyland. During the industrial revolution, we were able to - for the most part, describe how most of the things in our world work. The idea that magic was an inherent part of the fabric of life on earth mostly vanished. Things were and became mechanic. When you pried something open, you would (or could) get a good hunch of how it (once) worked until you broke it. Today, most people engage with what seems like magic - every day. Created by wizards conjuring up new spells that enacts evermore potent and exhuberant imaginary creations, all available through evermore immersive user interfaces.
Digital wizardry is more than anything about the tools and body of work - the internet - at the magician’s disposal. Inspiration that can be used creatively to make simple interfaces for new ideas. Society and the community of wizards holds huge responsibilities to inspire more people to try, explore and learn the magic of building digital “machines”.
As a kid, my father kept me a steady feed of mechanical things, and later software listings in magazines, to explore, decompose and usually break in the process. They’d let me tinker with them, with all tools available: the hammer and a set of screwdriver were the most used ones. It created was a great source of understanding things. Mostly the fine-tuned mechanics, springs and joints were far beyond what I could understand, which did not stop me from trying, quite the contrary. My parents did not buy me videogames, but made sure computers were there to program on when that interest took hold - oh do I remember typing in BASIC listings by hand on the TI-99 4a home computer…
This way of deconstructing the parts of the world lead me to later construct new things and learning how to modularize and encapsulate complexity. In brief: to make manageable simple parts out of complex machinery. Doing that through software, electronics and computers was so much easier than mechanics and LEGO, leading me to learn BASIC, assembler and Pascal programming well before the age of thirteen. I hung out with friends, played videogames and did what most kids did, but very few in my vicinity were as interested in the experimentation with software.
Most people today lack the intuitive understanding of data structures and their manipulation. Values, arrays, linked lists, and more, and to make them come alive in programs. The joy of a running increment of your latest creation, and the lack of joy and frustration in the debugging of the same code. Each of these small coding experiments teaches us a lesson. We reuse the code and patterns we learn over and over again, as these form layers of us understanding what the craft looks like. We can think of these pieces of code an ways of coding as independent modules or machines.
Machines, whether mechanical or digital, hide a lot of complexity behind fairly simple interfaces. The higher the gap between the inherent complexity/architecture and the simplicity of it’s [user] interface, the better the overall design. Good architecture supporting a simple design usually employs many smaller and well-designed parts. Smaller and encapsulated machines that are made to function extremely well together and with very specific areas of specialization. Sidenote: when interfaces between internal machines are hard to understand, the design and architecture usually needs to be revisited.
The software that powers our phones, medical equipment, cars, megawebsites and every other 7th magical wonder of our world, can be broken down into these building blocks. How they fit together can often be described in part in hierarchical form and in part in network/web/mesh/cluster diagrams. Clusters of “machines” (running code/algorithms) work together to produce interfaces to the external world, from the minuscule to the mega structures. We can to some extent liken it to biological systems whom often follows similar patterns of nested encapsulation.
Like all magic, the simplicity and beauty of the polished user interfaces for all these amazing products, is a good visual illusion of magic happening. Software is easy to duplicate and to use, and all the scaffolding is easy to hide behind a polished facade/user interface. Scaffolding includes such things as networks, other services at a distance, algorithms, internal states, servers, datacenters, monitoring and more.
Open source packaged libraries makes enormeous amounts of code and complex algorithms available in easy to use formats for programmers. You want to build a good-looking Twitter-like user interface to your new mobile web app? Use the Twitter Bootstrap libraries. The creators made all their painstakingly hard design and coding work available to anyone who would like to use it, and hopefully contribute back some improvements for Twitter to use to improve their user experience.
The same goes for all other parts of the software creation: identify good software, use it and contribute back your improvements. Not all code is publically shared, but internal code sharing platforms makes it easy to collaborate on code and libraries within the enterprise as well.
The result of the use and reuse of code, architectural patterns, and software design within and across enterprises is what enables our digital magicians to do their sorcery. It is how great creations can be conjured up from what seems to be nothing but stardust (electrons), wands (keyboards and mice) and spells (code).