I spent years struggling to write quality code, and I couldn't figure out why: I knew syntax inside and out, but still struggled with tasks my peers could do while watching YouTube videos and chatting with their friends.
It's like I could spell but didn't know the first thing about grammar.
I eventually went back and took some classes online to fill in the gaps, but I feel like I would be much further in my career had I just went ahead and done it in the first place.
That's a great analogy and I think often missed by many people. Spelling and arithmetic seem obvious as limitations in more complex fields (where communication and mathematics are involved). No one would say: "I can spell 'journalist' so I should be the editor-in-chief of the Washington Post." or "I can add 2 and 2 so you should hire me as an electrical engineer." (certainly not once they've grown up a bit, at least)
You have to advance to grammar, geometry, algebra, and more to find success in those fields.
But with programming, many people seem to stop at the point where they can program, and don't realize how much more there is to it (or not until much later). Programming is just the spelling/arithmetic level. Being able to design systems, select between different data structures and algorithms, understanding what a state machine is and how to structure your program using that concept, etc. These are the algebra and calculus of the field.
I don't really understand this when people say it. My first instinct is that you're talking about keeping functions as pure as possible.
The other thing I think of is simply understanding all (Or most) of the possible states in your program, which seems like common sense.
ok_to_change = var1 && !var2 && var3 < 10;
if(ok_to_change && ...) ...
else if(ok_to_change && ...) ...
else if(!ok_to_change && ...) ...
...
ok_to_change was added after someone realized how much redundancy was in the tests. But the whole thing was a state machine and could've been expressed better as such. There are lots of ways to do it. You could make a more explicit state variable (or function that returns the current state from a set of variables), use lookup tables, or have functions that call each other to represent the current state of the system (mutual recursion is nice). But by making it an explicit part of the system design it usually leads to clearer, more concise, and more consistent code (IME).Love this analogy for programming...
It also reminds me that English and Public Speaking are very important skills I picked up in college which are easily neglected in a DIY program.
Perhaps I've just forgotten about how much I've actually learnt though.
If you have great English/ Public speaking skills this isn't so important. But I know a lot of people have really mediocre communications skills.
I've seen self taught students really struggle with introductory courses because they assumed they would breeze through fundamentals because they already knew how to build web-apps.
Really, 90% of the advanced mathematics I do is linear algebra, and I don't have a code-monkey job. Linear algebra has so much mathmetics bang for very little complication bucks.
Those subjects are the foundations on which practical and applies computer science and programming are built. Not having a thorough understanding of them is like building a house without an understanding of its foundation. Don't be surprised if your magnificent Swamp Castle burns down, falls over, then sinks into the swamp if you don't know about foundations.
This stuff is all pretty deep into undergrad curricula.
Once you know a lot of these algorithms, it becomes painfully obvious which developers haven't learned about them. For instance, I know someone who works as a driver for UPS and they have a piece of software that automatically plans a route to each delivery and pickup. There's a lot of variables such as certain packages that have to be delivered before noon, business deliveries that have to be done before the business closes, etc. The software they are currently using is not efficient at all. It will have them deliver to a building, drive down the street and deliver somewhere else, and then drive back and deliver to the building next to the first one. It's so painful to hear about this software because I've solved a very similar problem in under an hour at a programming competition using Dijkstra's Algorithm and Traveling Salesperson. Obviously, my solution didn't have nearly the same level of variables, nor was it held to "enterprise" standards. However, considering the level of inefficiency the software constantly produces, I'm convinced that it isn't using any standard algorithms but instead some hacked-together solution from a programmer who hadn't learned the established way to solve similar problems.
On the other hand the grandparent comment just illustrates how even with all those optimization resources individual "decisions" may still be stupid in the moment even though the overall solution is "good enough".
I highly doubt someone could beat them in an hour at a hackathon by just saying “shortest path first” and calling it solved.
Though there is some benefit to having a business degree as well so it's not all bad.
Math is another biggie I think a lot of people would skip. While I'm not quite sure everyone needs 3 semesters of calculus to be an effective programmer, I think it is helpful to understand at least the basics of calculus and trigonometry.
There are also a lot of aspects of formal schooling that help you prepare for work/ life later on. If you see a degree on someone's resume, you know they've done a least a little bit of collaborative work and building an app to someone else's specs.