A small number of books, lots of magazines, and simply spending time with machines just trying things and figuring them out.

As a teenager, I had about 2-3 people to talk to about computers, and no-one who could program like I could.

At 10 I got to play with a BBC micro, then at 11, I was lucky to get one of my own. Around the same time, I discovered the BBC Micro Advanced Users Manual, a book which was banned in the school computer room for unclear reasons.

It was chock full of commands for the ROM, things like how to draw, programming the sound controller, how to work with the video chip, the A/D converters, etc. Looking back that was a very good ROM and a very good book for someone like me learning.

In the back was a two page table listing the 6502 mnemonics and opcodes. But it didn't say what any of the instructions did!

It took me a while to guess what things like ADC, LDX, TXA etc. meant and it was really exciting to have the ideas fall into place, as if by magic as the guesses worked out.

The BBC was unusual in having a built-in assembler, embedded into BBC BASIC, so it was easy to try instructions.

This was awesome for learning assembly as a child, and it meant I ended up learning assembly less than a year after touching a computer for the first time.

There were absolutely no books from the local library that helped with computers. And no bookshops. It was that manual (as well as the non-advanced manual), a couple of Ladybird books about the basics of how computers work and logic gates, and... lots and lots of magazines. Computer magazines were almost everything, I had boxes of them by the end. I'm sure I learned a lot from them, especially C++, although I didn't have anything powerful enough to compile C, let alone C++. The low-level technical stuff wasn't really covered; I had to figure that out myself. But there was a lot of game listings you could type in and learn from.

(There was one book from the library about PAL colour TV that I kept taking out though, because PAL encoding is so fascinating and subtle, and it described it both mathematically and in great detail the analogue circuits that implemented it all.)

I wrote a lot of games, clever demos, and several little OSes as a teenager (for different machines). Since there was no internet (that I knew about) and I had no modem, and couldn't have afforded the phone calls if I did anyway, for the most part I'm the only person who used my work at the time, but some of the games, demos and cracks were used by others.

Much of my time was spent cracking games, and some of them had fancy copy protection schemes and strange tape modulations (we loaded things from cassette tape), so there were a lot of puzzles to solve.

I ported a few games from machine to machine, just for interest. But a couple in particular I put a lot of effort into. Starquake was a fun Spectrum game that I reimplemented on the BBC, but ultimately didn't share with anyone. Impossaball nearly earned me some cash, but it didn't work out as the company decided they were leaving the BBC market, shortly after they'd agreed to buy it from me :/

In those days, chips in computers did just what they needed to when programmed just right, and did all sorts of strange things when programmed differently. So another bit of fun, that demoscene folks will recognise, is that if you poke video chips in various "unspecified" ways or at critical times to exact clock cycle, they malfunction in interesting ways.

On the BBC that got me a high-res full-colour display which was "impossible" (therefore good for the Starquake port), smooth scrolling which was also "impossible", and mode 7 multi-colour text without gaps between letters - that's enough to do syntax highlighting which I never saw anyone do on it :-)

One of the most memorable things for me from that time, was printing out the full disassembly of Elite (Disk version) on dot matrix, and poring over it to completely understand how the game worked. I'm not sure how many pages that was, but the stack of paper was about an inch thick and filled my bedroom when unfolded. I learned a lot from that; it was a rich game, full of tricks.

It turns out I couldn't actually play the game properly until I modified it anyway, as I had a "Torch" BBC Micro, which had a different keyboard mapping than the standard BBC, so I had to modify the game before I could play it as it was meant to be played.

My "not quite BBC" machine had a 6502, Z80 and 68000 CPU attached, so in a peculiar way I got to write for all three CPUs and do some things that were, in retrospect, very unusual for their time. At various times I was running ZX Spectrum (Z80) and Atari/Amiga (68000) game code on my BBC (6502), in a way that is akin to emulation, and remarkably for some things it sort of worked. I also built a crude floppy disk controller in discrete logic (74LS devices) on a breadboard so I could read Amiga floppies, because ordinary floppy controllers couldn't read its unusual format.

Then I went to university at 18, and within a month discovered the internet using the Sun machines there.

I say within a month, because it was a secret internet: Undergraduates were not supposed to have access, and we were not even told the internet existed.

I found the internet entirely by accident due to running an Emacs command...

And when administation found out, they took it away.... but felt pity and let me have access again as long as I didn't tell other people. It was read-only, I wasn't allowed to post anything.

That's when I started to learn Lisp, C and Unix on Sun workstations...

The main source of knowledge was Emacs' own built-in documentation, Sun man pages, GNU info, and other people's source code (usually GNU) because I could download packages over FTP, even if I couldn't talk to anyone writing it.

Eventually we were all allowed to use the internet, so Usenet was all the rage, people joined MUDs, and a couple of years later this thing called NCSA Mosaic came out.

About then, some guy called Linus posted on comp.os.minix that he was writing a toy kernel...