I wouldn’t consider concepts like threading and access modifiers to be the most basic concepts. How confident are you with concepts like objects, functions, data types, recursion, etc? To me, those are the most basic concepts.
Depending on where you are at with these basic concepts, you might find it beneficial to take a step back and spend a lot of time really practicing and building with the basics.
I may work at GitHub, but I’m from a non-tech background myself and long saw coding as “out of reach.” For me, a lot of this was myself seeing modern, incredibly complex software as “the basics.” I think people who learned in the early 90s and before had a huge benefit in terms of the wide array of very basic, DIY, home computing available then.
One thing I found very helpful for me was playing with microcontrollers like Arduino and similar.
For me, this had two main benefits:
- It enabled me to physically see and play with my code in the real world and apply it to real world objects that excited me and let me build and play in both the physical and virtual worlds simultaneously.
- It brought the really, really overwhelming world of modern software down to a much more constrained, limited environment. Often in life, especially when we are learning, constraints actually help us grow by challenging our imagination to work within the constraints.
If you’re interested in getting started in the world of microcontroller boards, I personally really like the Adafruit Metro M4. It comes preloaded with CircuitPython so when you first plug it in to your computer, it will show up as a USB flash drive and you can edit the Python code in any text editor (I use Visual Studio Code).
I also recommend, however, trying PlatformIO. It’s available as a plugin for several text editors, and lets you program microcontrollers using C++ and many frameworks (including Arduino). I find C++ easier than Python to learn, but I know that’s not a widely-held view, so I suggest trying both!
Programming a microcontroller will give you many constraints. You generally aren’t going to try and implement true multithreading, for example. But it will force you to think about what the most absolutely essential elements of programming are, and to learn how much you can do with a few basic building blocks and a tiny amount of memory (but still, far more memory than those who learned on a Commodore 64 had available…).