How to Think like a Programmer