I am 62. I programmed my first real computer in high school, a PDP-8 with 12k 12-bit words. I didn't explore assembler language, but spent a lot of time programming BASIC and (when I could get the entire machine to myself), FORTRAN. And before that, I spent a lot of time on programmable calculators.
So when I got to college, and took my first data structure & algorithm class (textbook: Knuth vol. 1, language: Algol-W), heap-based memory and pointers were mind-bending. I had encountered nothing like these ideas in my programming to date. As I remember, it took me a couple of days of intense thinking, reading code, playing with code, until the idea finally crystallized in my mind.
A smaller epiphany had to do with ideas on how to write good code. In the mid 70s, "structured programming" was a hot topic. I prided myself on writing huge functions, with complex control flow, full of gotos, because I didn't know any better. And assignments were graded on correctness only, not on quality of code. In fact, I think the idea of quality as being something other than (apparent) correctness was kind of alien. Then "Goto considered harmful" appeared, and I prided myself on being able to write goto-less code.
And then a professor made the completely outlandish statement that functions should not be more than maybe 20 lines of code. I thought he had completely lost his mind. I don't remember how I came around, but I did, and then it was just so obvious.