This post is a short response to the following blog post:
http://simpledeveloper.com/important-skills-self-taught-programmers-lack/#comment-275
This blog post probably shouldn't be considered a rebuttal to the above post, because I actually agree with his post. However, I believe that many school taught people are also missing some very essential skills as well, which I point out in this blog post.
So, like many things in life, there is almost always a cost and a benefit to going one route or another.
Background
I think I have a fairly unbiased view to this article because when it comes to computer science I'm partially self taught and partially school educated. I started programming by taking a very basic programming course in High School and began to code and learn on my own for a few years after that. I've taken several CS courses such as some basic programming courses, system analysis and design, interface design, and computer architecture. Now I was programming for a couple of years before I took any of these classes, and to be quite frank, when I took programming in college, I'd always hand in an assignment with the thing that he was going to teach the next week. For instance, the first assignment everyone was taught to write a program all in the main function. I broke mine out into separate functions. The next assignment he showed them how to break their code into functions, so I broke mine out into classes, etc... My professor asked if I ever thought about tutoring people (in which case I actually had already, haha). The reason why I'm telling you this is to point out the fact that I only took the class to get the credit, I didn't actually learn anything new in the class. The only class I ever really learned programming skills from was from the intro class I took in High School.
Here are a few of the avenues that I use to learn by outside of a school environment: Reading articles, listening to Podcasts, watching recordings of school courses, listening to lectures such as the Google Tech Talks, Working on client projects, and working on my own experimental projects.
Here are some of the skills that many students will probably not learn in school anytime soon:
Parallel Programming, Test Driven Development, Clean Code, Using the best tool / methodology for the job, and probably several more.
While I do believe you can learn some great skills in school, I do believe that there are skills that a school taught person misses out on as well. I may be wrong, but the following points are from things that I personally have observed as well as what I have commonly heard of industry professionals from major companies like Intel and from many university professors.
My whole argument will really boil down to this, Universities only teach what universities know, everything else you're probably going to have to spend time and learn on your own.
Here are just a few examples:
1. Parallel Programming
I'm really glad that universities teach the things they teach such as the basics of syntax, inheritance, data types, etc. I'm equally annoyed by what they don't teach. They don't teach modern essential skills like parallel programming. If you haven't realized this already, this may be an eye opener... high end desktop computers are typically maxed out at 4 cores, which is the same number of cores a high end desktop was maxed out at 8 years ago. The secret is that it's not a limitation of companies like Intel and AMD to produce these products. Intel has their "Manycore Testing Lab" which has 40 cores in it. You can build an AMD server machine that has 64 cores in it. Why have the number of cores not increased int he modern desktop in the last 8 years? Simple. Because there isn't a market for them. Why is there no market for them? Because there isn't much software that uses more than one core, which in turn is because students don't have the skills to write parallel software, because schools don't teach their students parallel programming. Does this get remedied by self-taught programmers? I can't really say with 100% certainty, but most self taught people I know are curious by nature and are far more likely to dabble into the unknown and say "I wonder if I can do that" than people who tend to need outside motivation to learn something.
2. Test Driven Development
About a year and a half ago while I was surfing the web looking for interesting programming related topics (IE. teaching myself), I stumbled upon Test Driven Development. I'm in the game industry and believe me, if you think there are neigh sayers in typical business application development about TDD, all I have to say is come take a look at the game industry and you'll find out why it takes some studios millions of dollars to make a buggy game. The last I checked, there are hardly any universities who at the very least teach the importance and benefit of programmers to write there own automated checks and not just leave it to the QA department.
3. The Best Way?
People who go to school tend to assume what they were taught is the best way or even the only way to do things. If you start coding using point 1 or 2 above, you will start to design your code very differently than if you use what's typically taught in schools and you'll be coding quite differently than how most people in the industry code, and you'll be better off for doing so. Sometimes the project you're working on requires you to code very differently than what you're taught, even leaving what you were told were fundamentals. I was watching a class from MIT on iTunes University where a student was debating a little bit with one of the lead game engine designers for a company that was writing a game engine for the PS3. Since it's for the console, their trying to squeeze every ounce of processing out of the system as possible. So, what the student was offended by is that the guest speaker was telling them that the first thing they tell new people coming out of school that they need to forget everything they ever learned, because it'll be almost 100% useless. Wherefore? Because the #1 objective is performance and all others are not even secondary, they just don't exist. He said that if making your code perform better means that it's unreadable, do it. If it means you can't reuse any of your code, do it. Don't use any abstractions, don't use inheritance, because it slows the engine down. He said if it means you write it in assembly, do it.
Conclusion
In summary, I believe there are essential things to be learned in school, but you will miss many things if you think you will get all or even most of your tools and skills from school. This is the advice I give younger people quite often for almost any career, "If you you don't have the motivation to learn on your own what you're going to school for, then you picked the wrong career path. School is not the means to an end, it's a springboard to start from." Again, this is coming from someone who has spent time on both sides of the fence. I can honestly tell you that I've learned most of what I know outside of the classroom, and very little inside the classroom. I hope you have a great day!