I have a Computer Science degree and would like to comment.

The points you make are excellent. I had a EE professor in college who got the class a discount at a local electronics store so it would be easier to experiment with real circuits. I also interned for a year or so, and that practical experience was quite helpful.

Yet there's something that people who writes on this subject seems to miss. The purpose of an actual Computer Science degree (or even Software Engineering) is not to teach programming languages. That's certainly a part of the degree program, but it's only a means to an end.

A Computer Science degree gives you a core foundation for the entire field. People who don't have a degree typically don't realize they're missing it, but I've seen it manifest every so often. The first time was while I was an intern. One of the programmers described how they'd had a severe problem using fork/exec to spawn another process. They didn't fully understand how fork() worked, and it brought the system to a standstill. As she explained how they discovered and fixed the problem, my thought was I'd learned about that in my Systems Programming class and I wondered how they hadn't known.

I was trained on sorting, linked lists, hashes, curve fitting, recursion, grammars, and data structures. While these aren't nearly as important as they used to be, due to the extensive libraries of modern programming languages, that knowledge gives me an understanding of what's actually going on in the code and helps with debugging, optimization, etc. I once decreased the execution speed of an I/O-bound program by 90%, simply by increasing the size of the fwrite() buffer (run time went from 45 minutes to 4½ minutes). Not sure I'd have been able to figure that out without the solid understanding of I/O fundamentals I'd received from my classes.

Also, since I was trained in programming language fundamentals, learning a new language is trivial. I can be up and running just by reading a book, and sometimes even without that. As you noted in the article, of course, such knowledge is useless unless it's refined and expanded by actual coding. And modifying someone else's code is a great way to learn. But it baffles me when people think that learning a new language is a difficult task. Note: let me make it very clear that I do not consider myself superior to non-degree programmers; rather, it's that many things are easier because I received the foundational skills in college. People who learn programming in a specific language, environment, or project often have a partial foundation. How this foundation manifests in me is that I consider all the major modern programming languages (C++, C#, Java, Python, JavaScript, etc.) to be essentially the same — a variant of C with some differences in syntax and library functions.

Another thing that baffles me is front-end vs. back-end specialization. It's all just programming. I'm as comfortable with database normalization as I am with CSS3. Again, it's that foundation.

I have a sense of ease and comfort regarding computer skills that seems to be less prevalent in those without a degree. Anyone with a Computer Science degree who is reading this is probably nodding their head in agreement and smiling.

I've seen a number of articles like this one, and they're always written by people who don't have have a Computer Science degree and are explaining how a degree isn't necessary. And in many cases the non-degree folks are very, very good. But my experience is that the lack of foundational knowledge tends to manifest in subtle ways. I've noticed it over the course of my career. I don't think non-degree people can really see it, because to them it's normal.

I wholeheartedly agree it's not necessary to have a Computer Science degree in order to be an excellent programmer, nor is a degree suitable or preferable for everyone. But it certainly makes things easier and enhances your versatility and flexibility. I think this is why some larger companies still place value on a degree and ask interviewees how to do things like invert a binary tree.

I believe the optimal situation is to have both a degree and the practical open-source experience discussed in this article. I got my PHP chops, for instance, by heavily customizing the open source osCommerce program. I learned HTML and CSS by creating websites. I learned SQL by creating and manipulating MySQL databases and working on existing database projects. I learned WordPress by creating my own theme and serving as webmaster for a couple WordPress sites. I was thrown into the deep end of the C# pool and managed to keep my head above water as I learned to swim.

Anyway, thanks for letting me talk. Hope this helps you understand where we degree folks are coming from.