Something I've been thinking about a lot recently is this curious aspect of the profession of programming---what is it that makes some programmers better than others? Obviously this is a complicated question, and a full analysis is outside of the scope of a short blog post (not that I have all the answers anyway).
However, one thing I've been thinking about recently is this weird thing about programming which is that it is almost entirely self-taught. A lot of the people I work with, including many of the brightest ones working on the hardest problems, don't have a formal training in "computer science". Most of them have college degrees in other disciplines. But by the same token, a lot of them don't have college degrees at all.
From talking to peple who actually did pursue a degree in "computer science" from a university, frequently they did not learn at all in a classroom about any of the following things:
- how to do anything on a Unix system other than list directories and cat or grep files
- how to use ssh to log into a remote host
- how to use version control to collaborate with others
- how to use a debugger, or how to think about and approach the task of debugging
- how to use analyze a process that is stuck or wedged
- how to do cpu or heap profiling
- how to write unit tests, or why that might be important
- how to structure or think about structuring a large project (say one with more than a thousand lines of code)
- how to learn about about the structure of a large project that someone else wrote... for instance the task of joining a company at one's first job and discovering that the code base is hundreds of thousands or millions of lines in size
To be successful in the field as a programmer you have to know how to do most or all of the above.
The thing that's really interesting to me is that despite this, it's hard for me to think of any profession that's easier to get into. In fact, it's probably more correct to say: because of this it's hard for me to think of any profession that's easier to get into. Everyone in this field is primarily self-taught.
There is more content on the internet about programming than almost any other field I can think of. If you browse the front page of Hacker News regularly you will find a constant stream of new and high quality content about interesting programming related articles. Stack Overflow is full of what I can only guess must be millions of questions and answers, and if you have a new question you can ask it. For those who take it upon themselves to learn how to use an IRC client, there are hundreds or thousands of public programming-related IRC channels where you can ask questions and get feedback from people in real time.
I frequently get questions from people who asked me how I learned about X. How did I learn what the difference is between a character device and a block device? How did I learn about how virtual memory systems work? How did I learn about databases? The answer is the same as how almost every programmer learned what they know: it's mostly self taught, I spent a ton of time reading things on the internet, and I've spent a lot of time in front of a computer writing code and analyzing the runtime behavior of programs.
Another important and related observation to this is that while there is definitely a correlation between intelligence and programming ability and success, from what I have seen the correlation is a lot weaker than you might think. There are a ton of exceptionally brilliant people that I know who work in the field of computer programming who are poor programmers or who aren't successful in their career. Usually these are people who have decided to focus their interests on something else, who have settled down into a particular niche and haven't branched out of it, or who aren't interested in putting in the hard work that it would take to improve as a programmer-at-large.
It definitely helps a lot to work with smart people. It definitely helps a lot to talk and interact with other people, and to get code reviews and feedback from them. But in my estimation, the lion's share of what there is to learn comes from the amount of work that a person spends alone in front of a computer with a web browser, a text editor, and a terminal. I hope that more people who want to become computer programmers or who want to improve take this into consideration.