Books, and subscriptions to things like the ACM (for papers to read). Before the internet I'd go to the corporate library (at Apple) and photocopy a few dozen papers to read every month. In my office I had a couple large bookcases with a few hundred textbooks. Read manuals from various manufacturers (e.g., processor references, chip docs).
(I've still got most of those books, and the papers are largely in boxes, and while many of them are kind of quaint, like the early Unix, Mac and Windows manuals, much of the material is still relevant and worth re-reading).
For learning programming: Read textbooks (e.g., K&R) and do the example exercises. Read kernel, compiler and editor source code for good examples. Find a mentor, ideally a hardass who won't let you get away with even tiny mistakes.
I was thinking earlier today that a lot of the reason why systems are so complicated these days is that we can get away with it because of resources like SO and Google, and in a sense we're creating "complexity we can't lift", but on a global scale now, and at some point this approach won't scale. You need to pretty good at searching for issues and triaging bad advice, and this is only going to get worse.