I’m a self-taught software engineer who’s been working in industry for 12 years. I don’t have any formal education in CS and math was never my strong suit (although I’m willing to do the work to make it my strong suit!), but when I first started learning how to program I went through some basic courses offered by Stanford, MIT, etc.

Anyhow, I’m looking to gain a more rigorous understanding of CS, starting from the most basic, foundational pieces. I’m looking for some guidance on a good course of self-study – the order to go in, suggested resources, etc.

Given that I’m looking to understand CS fundamentals more rigorously, as I said, I’m beginning with some basic math (not my strong suit). What I’ve mapped out so far is going through the following books (and investigating prerequisites/dependent concepts for these materials on an as-needed basis):

- Discrete Mathematics with Applications 4th edition by Susanna Epp
- Practical Analysis of Algorithms by Dana Vrajitoru, William Knight
- Book of Proof Richard Hammack
- Mathematics for Computer Science by Lehman, Leighton, Meyer

I have a bit of a tendency to get down the rabbit hole and go on detours, whereby the main purpose of my study recedes into the distance as I investigate yet another area that I don’t seem to have a solid foundation in. But I’m unsure how to avoid this as some things *really do* need to be understood before other things. For example, without understanding some basic discrete maths, it will be difficult to talk about recursion, time complexity in a way that is more rigorous than my current understanding.

Perhaps I’d be better suited just starting immediately with MIT’s “Mathematics for Computer Science” course (6.042J) and only looking into things I don’t have a grasp on as needed?

Anyhow, sorry for the ramble. Would love some general guidance and direction for getting to where I’m trying to go. Thanks in advance.