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.