Hacker News new | ask | show | jobs
by rayiner 4959 days ago
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.

1 comments

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.