
CD-ROM contains: Hypertext version of text -- Source code and URLs for all cited implementations -- Audio lectures on design and analysis of algorithms.
Academia was never a lucrative field. For the sacrifices it requires, it will never be financially viable for me to work there. Am I wasting my time going through the Feynman Lectures nonetheless? Keeping my calculus decent? I clicked on this for the same reasons; not looking for career/financial advice, I just have a morbid curiosity about how the sausage is made.
Not to mention, of course, that skills are transferable. Philosophy students don't study Plato because his ideas are relevant to everyday life. His way of thinking/reasoning about problems given his limited means is a timeless skill. I will probably never have to use any direct fact in the Feynman Lectures in my dayjob but learning to think like Feynman is useful when reasoning about large obscure systems which I do encounter daily. FL is not so much an exercise in physics but in the application of the scientific method in general. For software engineering, it nicely compliments Skiena's "The Algorithm Design Manual" IMO.
What I expect to learn from graphics programming:
- it's a good practice for applied maths/vectors/linalg - it's a good practice to learn lowlevel APIs/programming tricks - maybe I'll make a cool game
All of which can also find application elsewhere in computing.
"Python for Data Analysis" by McKinney (2018)
"The Go Programming Language" by Donovan and Kernighan (2016)
"Hacker's Delight" by Warren (2013)
"Algorithm Design Manual" by Skiena (2008)
"Purely Functional Data Structures" by Okasaki (1998)
"Structure and Interpretation of Computer Programs" by Abelson and Sussman (1985)
- Use probability as your advantage. Or put it another way, perseverance works. Do recognize that interviewing is a hit-and-miss game. Say with your preparation your chance of getting into any of your top 10 companies is 30% -- a pretty low number just for us to steelman argument. Let's say you can try each companies three times a year (most companies have cool-down period per department instead of per company). Then in 5 years, you can try 30 times. The probability of failing all of them is 0.3^30 ~ 10^-16. That is, practically, zero. Of course, this assumes that each attempt is independent of each other, and we can maximize such assumption by keeping learning the lessons of failures. By the way, this is also a reason why one can see so many so-so engineers in a big companies.
- Do not cram all of the leetcode questions. That's insane. Remember the quote from Invincibles: "when everyone is a superhero, nobody will be"? It applies to cramming too. Instead, use the time to study fundamentals. Pick up Kleinberg's Algorithm Design, Levitin's Introduction to the Design and Analysis of Algorithms, or Skiena's The Algorithm Design Manual. Note these books are not that academic. They all focus on the process of designing an algorithm from constraints and basic principles.
- Do not worry about Leetcode Hard. Yes they will be asked from time to time by an interviewer, but see my suggestion #1. If you really want to try Leetcode Hard, at least ignore the ones that require deep ad-hoc analysis or the ones that require an aha-moment. They are talent filters or memory filters or obedience filters, but they won't improve your engineering expertise. Then, why bother? And trust me, it is actually rare for you to get a Leetcode Hard question.
However, I might suggest that books and theoretical knowledge are not the main things you need right away. I moved into software engineering after a long time in science. I had done plenty of coding, and had a pretty decent amount of theoretical knowledge, but there was still quite a bit of practical adjustment. I really like Rzor's suggestion of https://missing.csail.mit.edu to start with.
Beyond that, I think maybe I would find some specific codebases that you'd like to understand better, and start with reading more of those. I feel like that's often better than books for picking up idiomatic usage and patterns in given domains. As you hit specific barriers, I think it will be much easier to pick up the intrinsic motivation to dip back into theoretical knowledge at that point.
Someone else mentioned data structures and algorithms. Algorithmic complexity is particularly important. The Algorithm Design Manual is a great book in this space.
As a low level developer, I've also found the following topics way more useful than I expected:
- Finite State Machines (These are the basis for everything from inter-device communication protocols to simple video game AIs.)
- Binary arithmetic and boolean logic (Rarely relevant, but absolutely essential for diagnosing certain types of parsing errors, buffer overflows, etc.)
- The Halting Problem and P = NP (Useful when a manager tries to get you to do something that is actually impossible.)
I learned these from intro to Computer Science classes in university, but honestly Wikipedia is probably a good place to start. I think the (middle grade) book Lorem Ipsum also covers most of these concepts.