I've been arguing for a while that the biggest obstacle to wider adoption of higher-level programming techniques is the near-impossibility of debugging things that go wrong. Ned Batchelder's recent post about unhelpful magic makes the same point: if you can't figure out why your helpful genie has given you a toad instead of a horse, it's not really a very helpful genie. For my money, this is the real Grand Challenge in computing today.