Becoming a better Programmer / Computer Scientist
(source: some website I stumbled across , let me know if you know which one)
I think it would be a mistake to restrict the “logical and analytical thinking skills” that make “an awesome programmer” to logical puzzles and math problems. Sure math and logical skills are important, but analytical thinking and great programming entails much more than that. Great programmers are creative people with an insatiable curiosity. Creativity and curiosity are cultivated when programming is contextualized in a historical and philosophical framework.
Here are my suggestions on how to do this:
1. Read Hofstadter’s Godel Escher Bach . The book gives a great sense of the philosophical questions and meta-questions that are fundamental to the fields of computer science, information technology and programming. Hofstadter also does a great job of bringing concepts to life with examples from literature, music and art.
2. Get a sense of the history of information technology. This is important to understand the significance of the generation that we are working in today and to anticipate the future of the field. Read up on Moore’s law and its many corollaries . How can this exponential growth be explained? Why is it that the field of information technology has been blessed with exponential growth whereas other technological fields such as husbandry have not? Once you’ve explained the exponential growth, how long will this growth carry on for? What will the near future look like if these trends continue?
3. Understand design patterns. Don’t just be able to do object oriented programming but make sure you understand its methodological and historical importance as a breakthrough programming methodology. Make sure you can appreciate the elegance of the different design patterns. Try to invent your own design pattern. Determine on your own what types of projects would be best suited for a given design pattern.
4. Why is parallel processing such an important breakthrough in computer science? What will the next breakthrough be?
5. Try to tackle the biggest and best algorithmic problems in computing today. Start designing your very own natural language programming language or a machine that can pass the turing test .
6. Master the art of outlining and detailing software development projects. Invent new and betters ways to do this.
7. Understand why the waterfall method of software development fails so often and why agile methods are a major improvement. Invent your own programming methodology.
8. Understand the P versus NP problem of computer science (a millennium problem ) to the best of your ability. Whenever you have spare second in an elevator or before you go to sleep at night you should be working on that problem trying solving it. Is it or is it not theoretically possible to solve the seemingly endless amount of important NP-hard problems out there? Can the human mind solve these problems? What is the computational analog for human creativity and intellectual insight?
9. Make new questions to think about and add them to this list.