Think Like a Programmer: An Introduction to Creative Problem Solving