I learnt programming at the deep end. As a teenager I taught myself assembler for the Motorola 68000 that was at the heart of my Atari ST (my parents couldn’t afford an Amiga - or perhaps they were just fed up with buying me computers!)
I loved the challenge of assembly language, it was eccentric, obtuse and difficult. But what I really got a kick out of, and what I now miss from the high-level programming I do for a living and computer use in general, is the sense that I was manipulating the hardware directly and that there were few layers of abstraction between me and what the computer was doing.
Obviously it’s horses for courses and nobody would want to program something like a GUI based operating system in assembler! But for throwing stuff around the screen it was awesome.
Whilst the Arduino IDE is of course a fairly high level of abstraction and simple projects require little in the way of manipulating hardware (which is the whole point of Arduino, making tangible computing accessible to all) what I love about Arduino is that, as my projects increase in complexity, it’s placing me back in that world of hardware. I’m looking up data sheets again, using interrupts, thinking about clock cycles Etc.