Hi!
Thanks for reaching out. First, some specific prior posts of mine with resources that you may or may not have found as you looked back
#13
#4
I've mostly focused on Swift here since that's what people tend to ask about, but in a more general sense I will also recommend a YouTuber named Jacob Sorber. He's a university professor and makes high quality videos. His focus is generally C. Sometimes things are very C specific, but his general topics are very educational.
I also want to clarify that while I often say to focus on the general concepts, that doesn't mean you shouldn't be making things in a specific language, that you should be jumping between languages or, especially at first, explicitly search out abstract learning material instead of the specific.
I don't know if you know much about learning music, but I will use it as an analogue.
If you want to learn music, there's a lot of music theory that can help you be a better musician. But to apply any of it you also do need to get some familiarity with playing an instrument. And as you go, getting better with one will improve the other in tandem. You get better at playing your instrument and internalise note positions on the instrument, well your theoretical learning can now use that concrete understanding as an anchor for learning about how those notes go together in harmonic structures. Likewise, learning about that you can explore the instrument more. But once you learn all of this, it also becomes applicable to other instruments that you can then more quickly show some level of competence with.
Programming is fairly similar in that respect. Focus on the general, yes, but don't skip to it. I don't know what level of knowledge you are currently at, but trying to abstractly learn about design patterns, closure capture reference cycles, algorithms, etc. won't help if you're not familiar enough with the basic of a language to where you can formulate simple programs with it and use it as a testing platform for the new things you learn, at least when they are applicable.
Building your own things away from a tutorial guiding step by step is a necessary part of the learning process. Don't be afraid to look up "How to x" for individual steps, but try and do as much as you can away from tutorials. Start simple. Very, very simple. Make a program that takes a list of inputs and sorts them or something. You can test ideas here. Instead of reading the list from args, read it from stdin. Now read it from a file. Now also allow a flag to change the sorting order. Add a flag that sums numerical values instead and remember to handle errors if it's not numbers, and do dispatching. But iterate. Don't do it all at once, but do something then the next. Get into the habit of writing tests at some point so you can ensure nothing new breaks the old stuff quickly.
Programming is both a craft, and art and a mathematical field. Knowledge, skil and creativity all parts of it.
I don't know about the Stanford course, but for design patterns the so-called "Gang of Four" has a book titled "Design Patterns. Elements of Reusable Object Oriented Design" - If you learn by reading well then that's a very referenced book in design patterns. I do not recommend it until you are familiar with object-oriented programming in general however.
Being curious and reading documentation about things as you come across them can help in general, and looking at documentation for various Collection types in different languages will give a good introduction to data structures - but there's probably excellent videos and books on this too, I can't really recommend any specific however.
Apple's books on Swift alongside Swift Playgrounds and Hacking With Swift in my opinion are good about describing things in ways such that they pertain to Swift but can easily be understood through the lenses of other languages if you move on to other things in the future.
Computers today have insanely many layers and while you will probably touch many things over time, you also just can't learn it all at once. It's OK to not know everything and you will learn over time too. All the time, and it never ends. It's turtles all the way down. But having something to make will continuously move you towards the next things to learn if you place the goals right. By which I mean never overshoot too far. If your starting goal is a networking application that uses GPU acceleration and machine learning, you'll never make anything. But if you always try and make the simplest thing you don't yet know how to do entirely, or even just something you feel really confident you know perfectly how to do, just to hone your skills and train your code and code architecture muscles, you will gradually improve.
Feel free to for further details, clarification, elaboration, or to request code-level guidance