My snarky side upon reading this:
immediately thought “Oh, you got better, when did that happen?”
I was about 10 and a half when I first learned to program in machine code. I have to be very clear about the age because when you are that young, those few extra months matter! Did you ever have an argument when you were six or seven, with your friends over who was the oldest and you were comparing mere weeks? Yeah, just like that.
Anyway, to continue the long, old-fart, rambling story, it has been 34 years since I learned to program, and I forget sometimes what it was like to not be able to write code without thinking about writing code. A bit like not being able to read or write, or walk, you just forget you can do it. I show obvious impatience when people who aren’t good programmers, or are just learning to code, ask what appears on the surface to be an inane question and they don’t seem to be “getting it” or “just not trying” and I scream inside my head “What is your problem? Why don’t you get this? It’s so trivial!” Sometimes the screaming isn’t contained to just my head, sometimes it leaks on to the forums.
In a cathartic way I have to admit I’ve made some of those stupid noob mistakes. My first programming language was machine code, a variant of 6502, then proper 6502, then on to Z80 and 6809, then Forth, and finally, two or three years later, BASIC. The computers I used came with BASIC, but BASIC was for people who were just learning or weren’t “real programmers.” If you were serious, you wrote assembly language or machine code directly. I had a little bit of experience with basic. I knew how to PEEK and POKE memory addresses, and that was pretty much it. After two or three years of writing software, and getting my games sold, I finally started to learn BASIC thinking I could speed up development by writing all the graphics code in assembler and the game logic in BASIC. I had just bought a shiny new Acorn Atom and I to call up a friend, who was intimately familiar with the Atom dialect of BASIC, and my question was “How do I add one to a variable in BASIC? Like, if I have a variable called A, how do I increment it?” It wasn’t that I didn’t know how to increment memory locations or load and store data to a labeled memory address, but the concept of typing:
LET A=A+1
was completely foreign to me when I was used to writing:
E6 85 D0 02 E6 86
Or in long-hand:
INC $85; BNE $2; INC $86
A couple of years later I learned about this thing called “scope” when writing an adventure game for the BBC and discovered the LOCAL statement that would declare a variable local to a procedure.
Woah!
Mind!
Officially blown!
Up until that point everything I had written was in a global scope, all data was accessible, and the only time some piece of code or data was not in global scope was if I was using various disk paging mechanisms to dynamically load code and data into memory.
I forget some days what it is like to be introduced to these concepts, but I’ve often repeated this statement, usually to players in MMORPGs when they are talking about how uber-leet they are and how that hunter in the party is useless.
“Everyone starts at level 1. Even you.”