I have been programming for a long time, and for the last few years I started working on the hardware side of things too. Something that has really come to my attention recently is how much disconnect there is between the “layers” of producer-to-user. I suppose this kind of disconnect might also exist in other areas, but I work with computers so this is where I see it most.
An example is that of a gamer and game developer. In this case I’m talking about a non-technical gamer, i.e. a gamer who does not program. Programmers think about their problems in terms of data, structures, objects, and algorithms. Gamers, on the other hand, see graphics, game levels, hear sounds, and control characters. From a gamer’s perspective, pushing a button causes the character to jump. From a programmer’s perspective, a very complex series of events just took place which had to take into consideration a large amount of information (is the character already jumping? can the character jump here? which way is the character facing? how long has the jump button been pressed? etc.) that results in a change in the character’s motion and internal state.
If you are a programmer then just reading the description above will probably have you thinking about the last game you wrote where the character had to jump, and the code associated with the process. Even if you have never written a game, as a programmer you probably automatically started trying to solve the problem. You started thinking about the data you need to track: xy location, velocity, an algorithm for calculating an arc or trajectory, or possibly using a pre-calculated path, level data representation, etc. Interestingly, the description above also tends to make you think of a 2D platform game, instead of a FPS or other game style. At least it does for me, and I was actually thinking of Mario and Donkey Kong when I wrote it.
To a gamer, they push the button and the character jumps. They have no concept of the decisions that have to take place to make that happen, or how complex such a seemingly simple activity can actually be. A programmer will spend so much time in the code, coming up with clever ways to solve a problem, do something faster, save some memory, etc. that no one ever even knows about. The programmer becomes intimate with the code to which a gamer has no connection. It can leave the programming feeling very isolated from the very thing they created.
Even among programmers there seems to be a lack of interest in other programmer’s projects. No one gives a shit about your project unless they benefit from it in some way. Even trying to get a fellow programmer to take a look at your code is like pulling teeth.
After working on hardware for a few years, it has become clear to me that the same kind of disconnect exists between programmers and the electronic engineers who make the hardware. Just like gamers don’t get code, programmers don’t get hardware. There is a huge gap between how a programmer views the hardware and what is actually going on inside the chips and on the circuit board. Even programmers who go down to the assembly language level still have a software perspective of the system.
Is no one curious any more? Has the desire to learn, tinker, ask questions, or figure something out been sucked out of everyone?
To me the disconnects create problems, expectations, isolation, and perpetuates “more of the same”. The game industry that keeps pumping out yet another FPS. Software companies that keep pumping out yet another glassy-lickable-drippy GUI OS. The computer hardware manufactures who keep pumping out yet another x86 compatible system.
Everyone is a critic and no one seems to care about the human element, the achievements, the failures, or the emotion involved in the creation of the things they are using and consuming.
So the next time you start to complain about that stupid game, computer, phone, OS, software, etc. stop and think about the lower layer, what you might not understand, and if you could have done any better. Find a forum where you can help others without benefit to yourself. Learn something new about a layer supporting you. Be part of a solution, not just more of the same.