Many things in life come with limitations -- often because we don't have unlimited time, energy, or other resources. But software often feels like it should be an exception, because it's immaterial and weightless, built from scratch out of logic. It doesn't literally rust or rot. So idealistic software developers have consistently envisioned software systems that will escape the shortcomings that frustrate users.

Meanwhile, researchers keep discovering kinds of tradeoffs that seem to be built into the very structure of certain problems; as the Rolling Stones said, "You can't always get what you want." Inherent tradeoffs have popped up in political science, computer science, and even ethical philosophy, with conjectures and often formal proofs that, in various regards, can't be wedged into any system that will give people all that they want out of it. Limitative theorems are now a major research theme, and more are being found all the time.

These tradeoffs seem to have very practical consequences, among other things, for privacy and anonymity software, and for social networks: each design may have to give up things some users value in order to achieve other goals.

Thinking about these limitations and what they do or don't mean can help inform discussions of software design, especially for communications tools whose value depends on broad adoption. And we're having to get used to the idea that in some ways, we'll never create perfect software.