I began as self-taugh like you, but I went from Basic to Assembler in 1 year. I gained a lot by understanding what the compiler was trying to make work, so I agree with you that understanding of lower levels goes a long way into what you produce at a higher level
Then I went to college, and math forced in me a more abstract thinking. I had to make it work in my head, because writing the symbols will not make sense if I could not conceptualize it first. I honestly hated differential equations, but in retrospective, it help me a lot to write functions that create new functions in return, and this is in C# (I don't like the mess that C++ became, but I respect other people that do)
Then I went to college, and math forced in me a more abstract thinking. I had to make it work in my head, because writing the symbols will not make sense if I could not conceptualize it first. I honestly hated differential equations, but in retrospective, it help me a lot to write functions that create new functions in return, and this is in C# (I don't like the mess that C++ became, but I respect other people that do)