At my public library we had a teletypewriter, with an attached paper tape punch and reader, and a phone-cradle modem, with which you could connect to the the PDP-8 at the local high school.
Between this book https://www.amazon.com/Illustrating-Basic-Simple-Programming... and "BASIC Computer Games" my friend and I taught ourselves BASIC programming.
It was about 42 years ago, but I remember to this day the initial astonishing joy of making the computer do something new that I had thought of.
I recently bought an Osbourne "portable" -- seeing my children's delight as we booted up that ancient machine (from actual 5.25" floppy discs, no less) reminded me of own own sense of wonder at the same age, 40 years ago. Of course my middle-aged eyes didn't tolerate a 7" amber screen as well as they once did, but we proceeded to create an adventure type game, in MicroSoft Basic. The kids actually squabbled over who would get to play that simple game, very unlike them, such was their enthusiasm. And play they did, for many, many hours!
We had a bug where the player's "hit points/HP" could go negative. I loved watching my children deduce where the problem must lie, and debugging the problem. (comparison of <, rather than a <= )
They had lots of ideas for additions, some of which we implemented (others were very ambitious, bordering on Dwarf Fortress!) And even though what we created was very simple and crude, their pride in ownership was clear.
Many of my very first "lessons" in programming were from taking programs in that book and then translating them to BASIC as found on the VIC-20 and, a little later, the C-64.
I still often do that (just after "Hello World") when I'm first learning a new programming language... though these days it looks much more like just getting the requirements from the book than any sort of actual direct code level conversion.