Programming Challenges and How to Conquer Them