Is there any particular order of subjects you can follow?
Books or courses that were particularly helpful to you when you were in a similar situation?
I supplement this with reading a more advanced book which I understand little of and do not worry about understanding or applying, I find it helps keeps my mind engaged while working through banal exercises.
I have also found putting in the time to understand the long pedantic conversations/arguments some people have in various online forums to be quite valuable, they tend to be about nuances/minutiae of the language and this is something which books and the like fail to teach. This is actually what brought me to HN, when it comes to long seemingly pointless pedantry about code I have found no where better and I have learned a great deal from it.
CS50: Introduction to Programming with Python - https://cs50.harvard.edu/python/2022/
CS50: Introduction to Computer Science - https://cs50.harvard.edu/x/2023/
Projectbook: 100+ Project Ideas - https://projectbook.code.brettchalupa.com/
You learn any complex subject (CS) or skill (programming) with deliberate study and practice. Good teachers and mentors can help a lot.
You seem to express a bias to how schools work, conflating formal education with learning. You can easily start programming today with all of the free open source languages, tools, resources, and people available online.
Once you get the feel that you can build a lets say a calculator in any language of your choice then advance further.
Once you start feeling comfortable go to next level and try to make a software or application for a dummy company like a library system or a hotel. At this point you have to ask yourself if you want to stay in the backend or frontend and then that's another discussion for later
I started with Logo Writer (in 1st grade, didn't even realize I was learning programming). One of my ideas is to create Logo Writer for VR/MR. Both as a learning tool and to aid in creation of VR environments/experiences.
Learning to code means:
* Absolutely learn to type correctly and without looking; if you are not willing to do this, then do not bother with this field.
* Learn one editor really well; most people who are serious use gnu emacs or vi (vim?); I use gnu emacs.
* Learn a revision control system; these days, everyone will expect you to know git; get a github account, which is really cheap, and put all of your projects there; it makes it easy to collaborate with others; learn the correct way to write git commit messages.
* Start with the C programming language and the build tool gnu make; have someone show you how to write a simple makefile to build your projects.
* Have someone show you how to compile using, say, gcc so that the compiler outputs the assembly files (.s) annotated with the C input: https://stackoverflow.com/questions/137038/how-do-you-get-as...
* Write lots of little C programs and compile them and look at the assembly langauge with the C input interleaved with it.
* Maintain all of that in a github repository named, say, c-examples; write regression tests and run them every time you change anything.
* For any code repo you have called, say, foo, make another github repo called foo-notes; maintain a todo list in that repo, possibly in mulitple files; also maintain a list of relevant notes related to the project; also maintain another file or files of proposed changes or future work; doing this makes it easy to coordinate with others; DO NOT PRETEND TO KEEP EVERYTHING IN YOUR HEAD.
* Go through a book on C, say, The C Programming Language, and for every feature they mention, write a little program using it and a test for that.
* Learn to write C and read assembly before going on to any other language.
* After getting fairly competent at C, get a data-structures book and implement all of the primary data structures, such as linked lists, hashtables, red-black trees, etc.
* Build something you want, such as a tool to process your logs; you might want to use flex to process the input; write documentation for your project; if you put it in a file Readme.asciidoc in your repo, then github will run asciidoc on it and display it on the main screen of the repo.
Doing all of that, including learning all the idiomatic folk ways of doing things, like how to type without looking, how to write makefiles idiomatically, writing regression tests for everything you do, writing down EVERYTHING in the foo-notes repo, checking it off when done, etc. is a LOT of work; if you are not willing to do all of that, then pick a different field.
After you have built a few things, you might consider learning how the machine structures work, such as the memory hierarchy; learning this will help you write faster code. You might also want to study asymptotic analysis of algorithms which will help in picking the right data structure for a problem.
- Get the basics of programming from written ( no videos ) tutorials available online. Many are good quality and you skim through at your own pace.
- Pick a "difficult" compiled language, like C++. You'll also get insight on how interpreters for languages such as js or python work as well, and the low level stuff will make the high level concepts trivial to understand further down the line.
- Pick one or more simple and fun projects to do alone: a console text-based adventure, a glitchy platformer with SDL or SFML, a web scrapper with python, a tool to automate a task you find annoying in Batch script.
- Once you're there, reach out to programming communities. I used to go to irc channels. I'm not a big fan otherwise, but now some discord servers are full of people you can get insight from now and well-meaning people, who would be happy to show you some strings if you ask nicely.
- If you are in trouble, remember to make a minimal reproducible example of your issue with as few code as you can, more often than not this can lead to you finding the solution by yourself.
- If this doesn't work and you struggle with something, don't be afraid of recognising your ignorance: this stuff is not simple, no one guesses it all alone, ask for help while showing you did try other available solutions given your current knowledge.
- Be patient and learn to read code from other projects as well as documentations, this will provide incredible insight about expected/standard approaches for common problems.
- Rest, having pauses up to 1-2 weeks during the early process will help you integrate this complex stuff naturally, no need to burn yourself out. You may occasionally think about it during a walk or a shower and that's where the familirity builds up.
- Pick-up some boring books such as Bjarnes Stroutrup's one and read it without thinking too much. This can serve as reference without needing a network connection and that's invaluable. I can recommend other books for this purpose to read mindlessly if you're interested.
- Recognize your improvments, especially in the early stages the learning curve is incredibly rewarding, feel good about having a little square moving in your window, show it to your friends !
- Get into more serious maths, a good way to do that is to get the hang of linear algebra through parametric equation, solving 1 or 2 degree equations, vector and matrix, in the context of computer graphics. Graphics helps having satisfying feedback, identify issues intuitively, while exploring the basics of these concepts.
- Find a more serious project to work on, maybe you already have an idea, have fun and keep digging :)
[Edited: typos and formating]