The structural issue is the lack of a curriculum, a list of things you must know. Like any developer, my skills are a mix of things I’ve been told and things I’ve found out. We are all self taught to some extent, the question is how to get it done well and quickly.
The issue is that when you learn on the job you pick up the things you need and rarely have the time to work out why things are the way they are. When you learn out of interest you follow a path of going to the next node in the interesting thing graph that your current skills enable.
And so things like graph theory get missed.
Yes, you can go a whole career and never have that as a problem. But when you need it, you often need it bad.
A longer term issue that can undermine your career is that languages, frameworks, methodologies, O/Ses etc go out of fashion, sometimes very quickly and brutally since if there is good money (as there was in PowerBuilder, JSP, OS/2 and even VB as well as many other buzzwords) then others rush in and bring down the price.
Theory helps you be more nimble or as I guess I have to say, more agile, you can more quickly pick up and understand the fashionable tech when it is hot and you are less likely to be trapped when it cools down. That has happened to me, it was not nice.
Theory is stuff like how compilers, O/Ses work , hardware execution of your code, architectures for things you can’t ever think of a reason to use, obsolete but interesting languages, logic, a chunk of maths etc. These have value decades after you graduate.
Also, if you’ve read my other posts, you will see I talk of the Superior Programmer who thinks in a rich mixture of different programming languages and paradigms even if he codes in only one simple language environment. The more ways you have to think about a problem and the more experience you have in choosing between them, the better you will be. That’s harder to achieve if you are purely self taught.
It is likely that no one forced you to think about X86 Assembler (horrible), Cobol, (old) Fortran, Algo 68, C, C++, Pascal, Lisp, F#, Haskell, SmallTalk. And if you only know Python, it may be good news in the job market for you now, but be clear that it will fade, all languages do.
You may say that every one of these things can be learned by yourself and I 100% agree. The question is whether, over a period of 30 years, you will do that if there is not someone making you. If you have that level of self discipline and the brains to understand then you’re going to succeed anyway.
Also some things are hard, you need someone to sit down with you and debug the way you think. We all have them, your learning bugs will be different to mine, but just as real.
A good example for many is regular expressions. Most of us wander into them with command line arguments and some simple grepping. But they are an important part of deeper CompSci and serious programming. If no one has pointed out FSMs it will be hard for you, so you will be a user, not a developer.
As a headhunter I will share that aside from specific questions like “how would you…” and “what is wrong with…” we look for a form of confidence and ability to articulate what you know. A CS degree is a shortcut to that, again it is something you can build yourself but it is harder.
Finally, let me point out something that it is better to be told than learn from experience. If the firm has a reasonably efficient recruitment process you end up with a lot of people who, on paper, look pretty much the same. You and I both know that if I have 30 identical resume/CVs that their actual ability varies by at least a factor of 10 by any measure and most likely by 50 from top to bottom of “identical” developers.
However some people can do things that others can not. That makes them stand out and a CS degree can help you get some of those skills.