This short 1994 paper is worth a read for computer science practitioners.

It discusses fundamental problems of distributed systems, and in particular criticizes that field’s tendency to focus on the simple problems rather than the hard ones.

While some recent frameworks try to deal more with the harder problems of distributed systems (say, J2EE), the similar gloat-about-solving-the-nonproblem comes up all the time in other areas. We solve the GUI widget problem (reinventing a hundred APIs), but as far as rich and complex graphical applications are concerned, those are ant-sized problems. In compilers, we add an optimization, but often lack the procedural safeguards and testing methods to prove that these are worth the cost. In the OS, we take delight in a fancy new CPU or I/O scheduling algorithm, and (why not?) invent pluggable interfaces for them, but then lack any clear statement about why it’s better; if pluggable, which any particular sysadmin should use. “Try each of them.”

What these cases have in common is the disproportional focus on the relatively easy problems, while failing to address, or sometimes even to recognize, the hard ones.