"In the same way being an hobbyist programmer will never give you the same skill set than a CS degree." Never? Despite the countless examples, including Torvalds and Carmack? I really disagree on that.
Torvalds has a masters in CS. "Never" is a strong word, but the rest of the paragraph you're harpooning makes a different point than the one you're refuting.
According to Wikipedia, Linux was developed around his second year in university. That would suggest that he did not have a degree during its development and had a formal education, at that time, roughly equivalent to the average university dropout. I think that still supports the parent's claim, even if it is a little misleading as written.
While I'm sure that is true, I'm sure he also learned a lot of lessons from writing that code, which goes against the idea suggested earlier that such things are only learned in the interest of formality. What it really highlights, though, is that anyone can jump in and start writing an OS (or whatever else you want to learn about). You don't need a degree to do that and people without them do.
Operatic systems are very simple creatures fundamentally. They just move bits around. They don't require anything more theoretically complicated than a linked list.
That is not to say you can't learn to do theoretically complex things without school, but when you're learning about DFA's or register allocation or the like, sitting down with a textbook and working through problems is often the best way to learn.
I'm a largely self-taught programmer, and I'm always running up against the theoretical background I don't have. Try writing a compiler for a modern language without understanding type theory, and try learning type theory by doing.
I'm self-taught (I went right to work in industry instead of going to school).
The first genuinely complex system I built in my career, back in the mid-90's, was a scripting language. It did indeed force me up against a lot of background I didn't have; I had a very good mentor though and largely did learn it by doing.
I've since learned-by-doing distributed systems (quorum and 2pc commits and logical timestamps in one sprawling system we built around 2000) and routing, graph theory (for routing and later for analyzing binaries, also graph visualization, which is a tricky problem), code generation for compiler backends, and very large scale data storage (for instance, in order to sample all the flows running over a tier 1 NSP backbone). To that obviously add all the security and cryptography stuff; I've always been involved in security but I consider myself a developer by training.
There are things I have run up against that have been too challenging to just learn. Linear algebra was one of them (although I've been slowly clearing that hurdle). RF and signal processing another. But those things are the exception, not the rule.
I might also contest how simple operating systems are fundamentally. They just move bits around, yes, but they're moving bits to and from a very complicated asynchronous and sometimes distributed system, and bridging it to code that runs under artificially simplified assumptions. It's true that most of it tends not to be interesting from a data structures perspective --- especially back in the 90's, when the whole process list and every TCP TCB were just stored in simple linked lists --- but there are parts, like the virtual memory system, that are much trickier. And all of that code runs in a much more complicated environment than userland.
Of the top 5 developers I've ever worked with -- they are the X when I ask myself "what would X do?" when faced with a really hard problem -- 5 of them have PhDs in Computer Science.
Now, a PhD in CS is a bit of a double-edged sword. It's often a danger sign that someone has spent too much time on just one theory. I wouldn't recommend getting or using a PhD as a signal of being a good developer since there is way too much variance.
(Ob: I have also worked with great developers with no formal education.)