Programming and Mathematical Thinking