Remember trying to install a modem or network card into your PC in 1995?
First, you had to grab your screwdriver to deconstruct and open up that machine like you were performing open-heart surgery. Once laid bare, you’d insert the new card, being careful not to zap it with ESD and render it useless, into an open ISA or PCI slot on the motherboard. Once the new board was installed, you’d reconstruct it and hope you got everything back in the proper spots. Oh shit, I forgot to put this screw back somewhere…
But that was just the beginning because the real fight was still before you. You had to come to blows with the system software to get it to recognize what you just put in there. Boot into the BIOS. Now, which PC manufacturer is this? What was the key sequence? Oh shit, I didn’t hit it fast enough. Once into the esoteric BIOS screen, you had to hunt around for the ISA/PCI settings to configure the address range and interrupt. Address range? What’s that even mean? Which interrupt? What’s an interrupt? How many times will I have to reboot? Oh shit, I must have the interrupt wrong because now it won’t even start up.
You were poking and praying. It was trial and error. Sometimes, it took an hour. Sometimes, you never got it to work.
Even my colleagues and I, who knew and understood what this all meant, struggled mightily to make it all work.
Then along came USB.
I worked on the development of USB technology in its infancy. I wasn’t the inventor or a contributor to the specs or working group, but I was part of a team inside Lucent Technologies working to implement it. We were developing a USB chip and low-level software to sell to PC manufacturers.
USB was the first PC technology during that era that said, “OK, enough! This is stupid. There’s gotta be a better way.”
The whole point of it was to make it dumb-simple for a user to use. Therefore, the part that the user sees and interacts with has to be easy to understand, robust, and “just work.” No opening up the computer. No connector mismatch. No “is this a Dell or a Compaq?” And, most importantly, no f’n software configuration. When I plug it in, the system sees it, and it just works. Let’s go.
But, like it is with so much in this world, a pile of complexity under the covers is required to make it simple on the outside.
We call this the conservation of complexity — every application has an inherent amount of complexity that cannot be removed. You can move it around to different areas of the system — hide it here, deal with it there — but the complexity inherently exists.
So, who gets exposed to that complexity? Who has to deal with it?
As an engineer or anybody who makes something for someone else to use, your goal is to deal with the complexity and keep it away from your users.
Ask yourself, “Who is my user and how can I make the right thing to do the easy thing for them to do?”