There are many paths to becoming a software engineer but no matter how you get there the three most critical skills you need as an entry level SE are
1. Programming Ability
2. Theoretical background in computing
3. Ability to put 1 and 2 together to implement efficent and functional software ("problem solving")
Simply put: Can you give the computer instructions to accomplish some task succssfully?
How well can you write code in a programming language you are comfortable with? Do you fully understand basic programming concepts that are non-language specific such as conditional statements (if/else), looping, recurrsion, object oriented vs functional vs procedural paradigms
Depending on what type of SE you become you maybe dealing with lots or little theory, but no good SE can escape the basics.
Computers have physical limitations. The information stored long term and retrived (like the picutres you store on your computer or phone) and the way programs are stored when they are being run (RAM) have very different properties for example. One is much slower to access (read data) from for example and the way your code interacts with the pysical hardware can affect your program's performance.
[Additionally algorithms (the instructions given to the computer) themselves have properties](https://en.wikipedia.org/wiki/Analysis_of_algorithms). Some are much slower than others, for example, and thus your program will take a long time to complete if you choose the wrong one.
Ability to Combine the 2
This, in my opinion only, is what seperates a "programmer" and a "scientist" from a "software engineer"
Programmers maybe able to write code that works and maybe "clean" (easy to work with) but they may not be able to reason about it. Getting the code to run is all they care about. They may not know what is going on under the hood: why some times you want to use a [linked list instead of an array](https://stackoverflow.com/questions/166884/array-versus-linked-list) or the [dangers of not minding your programs memory](https://developer.apple.com/library/content/documentation/Performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html).
A scientist is using programming as a tool for some other primary purpose. They maybe studying how to improve algorithm efficentcy, new techonolgies like AI, or processing large sets of data for analysis. They are not very intersted in reusing the program or how "clean" it maybe because its a means to an end.
A software engineer does both. They are very concerned with writing clean, efficent code (easy for other people to work with, easy to extend and maintain, bug free, does what it is suppose to do, does it run quickly, etc) while also balancing borader end goal (like making some photo sharing app).
This is often called "problem solving" and you hear about it al the time. Its a vauge term and everyone may have a different definition but it always involved putting together the theory and the practice to deliver a solution that works and if efficent.
### How to Get These Skills
The most common paths I have seen (in order of how often I see them) and my (and only my) opinions about them.
1. Go to university: (note: starting at a junior/community college then transfering is fine) this is the most common path I've seen for entry level developers. You get a good balance of the theory and the practice, though some schools/tracks may emphizie one over the other. Its very important to try to work on things outside the scope of your class assignments, group projects are great! This is likely the most expensive option, but it is the most common source of entry level devs and also a life experience as well as an educational experience for many)
2. Bootcamps: There are 2-4+ week intensive courses that are meant to teach you how to become a developer. I have seen lots of canidates with some unrelated background or major (like history for example) apply for jobs after doing these courses and they are reasonable programmers. I find these programs produce decent "programmers" but do not really cover theory enough to create good "software engineers". If you go this route you should find a way to supplement it with more theory. These courses can also be expensive (several thousand dollars some times).
3. Guided Courses: Sites like [udemy.com](https://www.udemy.com/) or [pluralsight.com](https://www.pluralsight.com/) offer guided hands on courses for programming. I use these sites myself even now to learn about new technologies. Try to take courses on theory as well as hands on practice wher possible. College and bootcamps act as a "show of commitment" (that you can stick with a program and finish it and have proof you did so). If you are fully self guided you should make sure to have projects to show or certificates of completion.
4. Self taught: I have met a few who did this. Now between the sites mentioned about, [colleges posting courses online](https://www.extension.harvard.edu/open-learning-initiative/intensive-introduction-computer-science), youtube, the rest of the internet, and your library you can learn this all on your own with practice. This takes a lot of displine and is the most non-conventional. Going this route you better have a great porfoilio.
You can start options #2-#4 today and still do #1 in the future.
I hope this has helped you understand what maybe involved to achieve your parents dreams :)