Designing systems that survive contact with real users

Every system looks clean on the whiteboard. The real test is what happens six months after launch, when real users, real load, and real edge cases show up.
In this post I walk through the principles I use when designing systems I expect to outlive my own assumptions about how they'll be used.