I agree with Aaron Skonnard's thoughts on the contract-driven approach to SO development. I especially enjoyed Joel Spolsky's comments on leaky abstractions. He's right that in some sense, being a proficient programmer is becoming more and more difficult (especially in terms of troubleshooting/debugging) with the increasing number of leaking abstractions we're building on top of.
I've often struggled with how to address all of the various abstraction boundaries when I've taught programming classes (ASP.NET being the king-of-abstractions). How many layers down do the students really need to grasp in order to become good developers (really all the way down to the TCP/IP stack, but there's never enough time).
Anyway...Aaron, nice comments on the much belabored "contract-first/code-first" debate.