I found this disheartening. Life is complex but its not unknowable.<p>One of those 'life choices' I faced when I entered college was whether or not I wanted to 'program' computers or to 'build' them. These would guide the choice of EE or CS degree. My father asked if people with EE degrees were allowed to program computers, I said of course they were. Then he asked if people with CS degrees were allowed to build them, and the answer was no they were not generally. So if I didn't know what I wanted to do, I should get an EE degree since then I could do either.<p>Turned out to be pretty sage advice and knowing <i>how</i> the computer does what it does really helps program it. Especially if you are trying to wring every erg of performance out of it. When I graduated with my EE degree (and a minor in CS) I was proud of the fact that I could write a database in a languge for which I wrote the compiler on a computer architecture that I designed using circuits that I understood down to the physics of the PN junctions that governed the behavior of semiconductors. (It really is math all the way down sadly)<p>That being said, I firmly believe the human brain has a limit (which may be case by case) of how much stuff it can hold at one time. And the notion of abstraction, especially modularization and testable components, makes complex systems possible.<p>This comes up in a variety of contexts. Sometimes I interview folks who can draw a nice architecture on the white board with boxes and arrows and such. So I ask them do go into one of the boxes, and lets draw that out in detail. And then those sub boxes I want to go into their detail as well. My goal is to understand that the candidate understands that 'boxes' are only a good way of thinking about something if you understand what the box is really modelling.<p>A good example of this is that naive people treat a hard disk drive like a box. It has a port you tell it to read logical block A or write logical block B and it does some magic and makes it happen. But really it screws up now and then, and it has very variable performance. So if you can't explain how you have accounted for these properties of your box then you're not thinking deeply enough about it.<p>Sometimes an 'architect' type (you know the type, Joel called them Architecture Astronauts as I recall) they dismiss your whole area of expertise as a box in their model. This can lead to some pretty dismissive thinking by the 'doers' in the crowd, but it is important to know that without abstracting that thing you're working on, the architect person wouldn't have enough brain capacity left over to see the 'bigger' picture. As long as their picture of your box is accurate, you should cut them some slack.<p>The bottom line for me is that it can be 'amazing' at how the complex system runs but words like 'mystifying' and 'dizzying' make me nervous. If you're a software developer and its 'mystifying' how your program can do what it does that is a problem you should address. There was an excellent pointer to 'what every programmer should know about memory' and there should be equivalents to 'networks', 'processor architecture', and 'disks'.