How to think like a programmer