Recently, a family friend gave my two children disc guns. The boys were thrilled; what could be possibly more fun than shooting your sibling? Our friend handed one gun to Blaine and one to Larrabee. Both found the on switch, pointed their guns at one another, and pulled their respective triggers. The guns made satisfying electronic beeping noises. The children felt the vibration of small electric motors. And, almost immediately, the guns sent foam discs flying at surprisingly high speed from their muzzles.
At least, that’s what Blaine’s gun did. Larrabee’s gun made the beeping noise. Larrabee could feel the motor whirring. But, to his great disappointment, no disc emerged from the gun. So, while Blaine could fire a steady stream of discs at his younger brother, Larrabee was completely unable to return fire. While I would have been unafraid to face a steady simultaneous barrage from both disc guns, I was now petrified; two brothers with only one disc gun between them seemed unlikely to lead to a happy, relaxing afternoon.
Fortunately, I am an engineer. True, as a computer scientist, I dealt mostly with abstractions (zeros, ones, algorithmic complexity, category theory, etc.), but as a software developer I dealt with slightly less abstract abstractions. After all, I have crafted real actual software used by real actual people. Software may be intangible, but, still, we call it software engineering, don’t we? The mere fact that the system in question was physical, rather than logical, did not dissuade me from debugging it.
By which, of course, I mean “taking it apart.”