I suggest you also spend some time learning about data structures and algorithms. That’s one of the things that separate university trained computer scientists from many self-taught or college trained programmers. Spending some time learning about how the hardware works is also worthwhile. Just stick these on your todo list, they aren’t necessary to understand to program, but the quality of what you make will improve if you understand these.
There’s a lot of other ways you can increase your depth or breadth of knowledge, but IMO those are the two biggest.
And for software design in general, the biggest thing I’d emphasise is modularization. Try to break up your program into different pieces that fit together. Like for a game engine, you could have the renderer framework as one module, input handling as another, and game logic as a third. Then, if you want to make a different game, you just swap out the game logic module and you’ve got a different game using the same renderer and input modules. This is essentially what libraries are.
Nothing specific offhand as I went to university for it and even that was a long time ago.
My top suggestion would be if it’s available through one of those free online university programs, that would probably be the best bet (aside from attending a good university computer science program).
Other than that, my usual method for learning something programming-related is to just do a web search. Not all sources will be great but there should still be some decent ones.
Just did a search myself, and while I haven’t delved into exactly what is on this site, it does appear to be pretty comprehensive at least, plus has sample problems (which helps turn things from “something you read” to “something you know”):
imo these are things you learn if you really want to understand coding deeply and write good code, not if you just want to make some software. I also don’t know if you would really understand what you’re seeing unless you know why you need it, at least that was the case for me. I majored in CS and most of my understanding still comes from how I actually ended up using things, and most of it never fully clicked until a couple years of using it.
Somehow I got into an efficiency/performance focused mindset pretty early on, so I appreciated the algorithm analysis when I got to it (though I thought then and still do think that big O notation simplifies it a bit too much… Those dropped terms can be just as or even more significant as the final term when it comes to typical data sets, but it’s still useful in understanding how an algorithm scales).
And I’d say that just going over the existing data structures and understanding their strengths and weaknesses can help just by being aware something exists. Like if all you know are arrays and linked lists, you’ll probably struggle a bit to handle key/value pairs. And then, once you learn about them, you might use them for everything and then wonder why your code runs so slowly.
And the main reason why I’d like more people to be aware of how to be good programmers is that there seems to be a lot of people that just go from “something I’m doing as a hobby” to “something I’m doing for money” or “a large hobby project that has been picked up by the community”. And software quality has been dropping at a similar rate to how much hardware is improving.
But you’re right that, without the greater context, a lot of it can be confusing and can beg the question of “why do I need this?”
Yeah just for me personally I also really liked making things as efficient as possible, but I thought data structures and algorithms were lame because I had zero context around it.
Maybe that’s just how it’s taught though, because there are really cool examples of what data structures to use and why. For instance if you have npcs with attacks that all have different cooldowns, and a central system that applies the attacks, what’s the best way to store it? A min tree is O(log n) on insertion, so that seems best, but what if it’s very likely an attack is invalidated and you need to remove it before it triggers? Lots of interesting concepts to consider there, instead of just “this does x and has y properties, so it’s good in this use case.”
Oh yeah, and that’s where I think that knowledge comes in handy because they don’t just say “here’s a list of structures to use and the rules of when to use them” but they give you tools for evaluating how good various ideas are for handling that problem. It boils down to pretty much counting the CPU operations (which IMO is obvious, if tedious-seeming) and then goes through examples of how to do this to show that the math isn’t actually that overwhelming.
Also it helps seeing equivalence between problems. Like your example is pretty much equivalent to scheduling threads on shared CPU resources with different priorities, especially if there’s a shared global cooldown between all those skills so they don’t just fire off when ready. They are a bit different but they might be close enough for a similar solution to work. So research can include CPU schedulers. Though on the other hand, something running at a game time resolution is trivial compared to the OS that needs to determine this as quick as possible so it can switch to the next thread (which is also an important consideration because it might not be worth optimizing this part at all vs say the order you process the data in each frame, though this isn’t a lesson from algorithms or data structure class but more general “how to optimise usefully” advice).
algorithms and data structures are overrated IMO. No average programmer is manually writing sorting algorithms or reversing linked lists. And if you do need something like that, you can just google it
On the one hand, I get you, but on the other hand, a lot of math people aren’t doing by hand, but it’s still important for a foundational understanding.
Even if you aren’t implementing them directly, it can help to just understand how a library you’re using implements them. Most data structures have scenarios where they are the best option and other scenarios where they are the worst option. Which one you pick can be the difference between an operation taking under a second vs minutes or hours. Hell, even if you pick the correct structures overall but layer them poorly, you can see a difference like that.
It’s like adding an understanding of engineering to woodworking skills. Sure, a carpenter could probably build a house frame on their own, but it takes engineering knowledge to minimize the amount of wood used while still being sure that it won’t fall over if the wind gusts to 100 km/h or it snows during winter.
I suggest you also spend some time learning about data structures and algorithms. That’s one of the things that separate university trained computer scientists from many self-taught or college trained programmers. Spending some time learning about how the hardware works is also worthwhile. Just stick these on your todo list, they aren’t necessary to understand to program, but the quality of what you make will improve if you understand these.
There’s a lot of other ways you can increase your depth or breadth of knowledge, but IMO those are the two biggest.
And for software design in general, the biggest thing I’d emphasise is modularization. Try to break up your program into different pieces that fit together. Like for a game engine, you could have the renderer framework as one module, input handling as another, and game logic as a third. Then, if you want to make a different game, you just swap out the game logic module and you’ve got a different game using the same renderer and input modules. This is essentially what libraries are.
Any refs you recommend for data structures and algorithms, stuff recommended to me on YT is surface level or 150 npm Install tutorials
Nothing specific offhand as I went to university for it and even that was a long time ago.
My top suggestion would be if it’s available through one of those free online university programs, that would probably be the best bet (aside from attending a good university computer science program).
Other than that, my usual method for learning something programming-related is to just do a web search. Not all sources will be great but there should still be some decent ones.
Just did a search myself, and while I haven’t delved into exactly what is on this site, it does appear to be pretty comprehensive at least, plus has sample problems (which helps turn things from “something you read” to “something you know”):
https://www.geeksforgeeks.org/dsa/dsa-tutorial-learn-data-structures-and-algorithms/
imo these are things you learn if you really want to understand coding deeply and write good code, not if you just want to make some software. I also don’t know if you would really understand what you’re seeing unless you know why you need it, at least that was the case for me. I majored in CS and most of my understanding still comes from how I actually ended up using things, and most of it never fully clicked until a couple years of using it.
Somehow I got into an efficiency/performance focused mindset pretty early on, so I appreciated the algorithm analysis when I got to it (though I thought then and still do think that big O notation simplifies it a bit too much… Those dropped terms can be just as or even more significant as the final term when it comes to typical data sets, but it’s still useful in understanding how an algorithm scales).
And I’d say that just going over the existing data structures and understanding their strengths and weaknesses can help just by being aware something exists. Like if all you know are arrays and linked lists, you’ll probably struggle a bit to handle key/value pairs. And then, once you learn about them, you might use them for everything and then wonder why your code runs so slowly.
And the main reason why I’d like more people to be aware of how to be good programmers is that there seems to be a lot of people that just go from “something I’m doing as a hobby” to “something I’m doing for money” or “a large hobby project that has been picked up by the community”. And software quality has been dropping at a similar rate to how much hardware is improving.
But you’re right that, without the greater context, a lot of it can be confusing and can beg the question of “why do I need this?”
Yeah just for me personally I also really liked making things as efficient as possible, but I thought data structures and algorithms were lame because I had zero context around it.
Maybe that’s just how it’s taught though, because there are really cool examples of what data structures to use and why. For instance if you have npcs with attacks that all have different cooldowns, and a central system that applies the attacks, what’s the best way to store it? A min tree is O(log n) on insertion, so that seems best, but what if it’s very likely an attack is invalidated and you need to remove it before it triggers? Lots of interesting concepts to consider there, instead of just “this does x and has y properties, so it’s good in this use case.”
Oh yeah, and that’s where I think that knowledge comes in handy because they don’t just say “here’s a list of structures to use and the rules of when to use them” but they give you tools for evaluating how good various ideas are for handling that problem. It boils down to pretty much counting the CPU operations (which IMO is obvious, if tedious-seeming) and then goes through examples of how to do this to show that the math isn’t actually that overwhelming.
Also it helps seeing equivalence between problems. Like your example is pretty much equivalent to scheduling threads on shared CPU resources with different priorities, especially if there’s a shared global cooldown between all those skills so they don’t just fire off when ready. They are a bit different but they might be close enough for a similar solution to work. So research can include CPU schedulers. Though on the other hand, something running at a game time resolution is trivial compared to the OS that needs to determine this as quick as possible so it can switch to the next thread (which is also an important consideration because it might not be worth optimizing this part at all vs say the order you process the data in each frame, though this isn’t a lesson from algorithms or data structure class but more general “how to optimise usefully” advice).
algorithms and data structures are overrated IMO. No average programmer is manually writing sorting algorithms or reversing linked lists. And if you do need something like that, you can just google it
On the one hand, I get you, but on the other hand, a lot of math people aren’t doing by hand, but it’s still important for a foundational understanding.
Even if you aren’t implementing them directly, it can help to just understand how a library you’re using implements them. Most data structures have scenarios where they are the best option and other scenarios where they are the worst option. Which one you pick can be the difference between an operation taking under a second vs minutes or hours. Hell, even if you pick the correct structures overall but layer them poorly, you can see a difference like that.
It’s like adding an understanding of engineering to woodworking skills. Sure, a carpenter could probably build a house frame on their own, but it takes engineering knowledge to minimize the amount of wood used while still being sure that it won’t fall over if the wind gusts to 100 km/h or it snows during winter.