The built-in BASIC made the Spectrum very accessible. But it was also quite limited, mostly due to being very slow. But: the great thing was, all the machine code that processed said BASIC was right there, in the ROM, just waiting to be examined.
I still remember disassembling the machine code responsible for handling the "LOAD" and "SAVE" commands, which were an interface between memory and the tape deck (the only long-term storage available). It was surprisingly small and elegant, and easily modified to perform certain tricks, such as varying the baud rate of the cassette interface, the order in which bytes were loaded (allowing for cool effects like "the screen is populated, but not from top-to-bottom, but the other way around), and many other things.
And this was all waaaaay before the Internet, relying on (photocopies of) library books about the Z80 and magazine articles, which arrived late-if-at-all. At some point, I'm pretty sure I had memorized the purpose of every "OS-related" memory location of the Spectrum (all 16384 bytes of it).
The complexity of today's systems makes all of that impossible. But that's mostly nostalgia talking: the capabilities of the Spectrum would be laughed away (and rightfully so) these days.