The Algorithm Design Manual
About This Book
Most professional programmers that I’ve encountered are not well prepared to tackle algorithm design problems. This is a pity, because the techniques of algorithm design form one of the core practical technologies of computer science. Designing correct, efficient, and implementable algorithms for real-world problems requires access to two distinct bodies of knowledge:
• Techniques – Good algorithm designers understand several fundamental algorithm design techniques, including data structures, dynamic programming, depth first search, backtracking, and heuristics. Perhaps the single most important design technique is modeling, the art of abstracting a messy real-world application into a clean problem suitable for algorithmic attack.
• Resources – Good algorithm designers stand on the shoulders of giants. Rather than laboring from scratch to produce a new algorithm for every task, they can figure out what is known about a particular problem. Rather than re-implementing popular algorithms from scratch, they seek existing implementations to serve as a starting point. They are familiar with many classic algorithmic problems, which provide sufficient source material to model most any application. This book is intended as a manual on algorithm design, providing access to combinatorial algorithm technology for both students and computer professionals.
1. It's probably fine. Based on your self-description, based on your self-description I imagine you're still struggling with syntax and program structure. Programming in either language will improve your abilities in that regard and let you focus more on the underlying ideas in your classes. That said, if you can stick to 1 or 2 languages for most of your CS classes that is preferable.
2. Data Structures and Algorithms is useful, how useful depends on your goals. If you want to make the big bucks you should aim to be fluent in at least a textbook's worth of material. If you don't feel the need to aim for the top, you can get away with less. I would start with Skienna: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
If you really want to be a master, you can then go for CLRS: https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press...
3. This depends on your goals. If you're aiming to be a top engineer now's one of your few chances to really focus in on lower level system stuff: Operating Systems, Networking, Compilers, or Databases. If you want a decent job fast of college, focus on data structures and algorithms and start trying to deploy code on something like digital ocean. That said you probably also want to do: https://missing.csail.mit.edu/
General advice: Dive deep, understanding a few things really well is better than understanding many things shallowly (you will retain more info over time).
A mistake many people make when reading textbooks is to guess what words mean. In technical texts this usually leads to misunderstandings and ultimately a slower learning process. Take the time to understand the words even if it takes hours (imminent deadlines notwithstanding), you will go faster. (I once took a month to get through a single page of a textbook because it had so many new words and concepts).
Start using version control (preferably git). Try to at least every hour if you have new code.
Try to start writing well structured code now. You probably won't do a great job at first but by trying earlier you'll do better.
Related to above, start writing tests for your code. Code that is testable is usually better structured.
Source: Senior engineer at one of the bigger tech companies and a former educator.
As others have mentioned any books on Data Structures & Algorithms are a must. [4], [5], [6]
However in my opinion, trying to understand CS fundamentals without undergoing some sort of formal education is a chore. You won't know what you are missing. Going through an established approved syllabus will give you a fuller understanding. But that is only if you are interested in the long haul.
There are a number of MOOCs that may fit the bill allowing you to slowly gather the knowledge without sacrificing too much time and focus on a day job to keep you going. I feel they are also great value for money for what you get. Some of them are from very reputable names if that is important. [7][8].
Since you have a B.Sc you can do the Masters level but there are also Bachelors level courses. [9]
1. https://www.amazon.com/Graphics-Gems-Andrew-S-Glassner/dp/01...
2. https://www.amazon.com/Graphics-Gems-II-IBM-No/dp/0120644819...
3. https://www.amazon.com/Graphics-Gems-No-3-David-Kirk/dp/0124...
4. https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press...
5. https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/03...
6. https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
7. https://www.coursera.org/degrees/master-of-computer-science-...
8. https://www.coursera.org/degrees/mcit-penn
9. https://www.coursera.org/degrees/bachelor-of-science-compute...
Edit:
A couple of other suggestions.
Managing Gigabytes: Compressing and Indexing Documents and Images[2]
Mining of Massive Datasets[3]
Algorithm Design Manual[4]
Network Algorithmics[5]
Neural Network Design[6]
I think all of these fall into the category of "Won't be applicable to everyone, but can be good for those who need this kind of stuff."
[1]: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
[5]: https://www.amazon.com/Network-Algorithmics-Interdisciplinar...
[6]: https://hagan.okstate.edu/NNDesign.pdf
Amazing book. Very readable. I highly recommend it. The book has a section call "War story" at the end of each chapter in which Skiena shares his real life experience of when the contents from that particular chapter came in handy for him.
Go through it. You won't regret
https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
Far more readable than the usual text (Cormen), the first half is a guide on how to select and design algorithms for the problems you encounter, and the second half is a whistle-stop tour of hundreds of well-known algorithms. The tour helped me a lot with X->Y esque issues where I was building bad solutions because I didn't know anything better could exist.
Incidentally, there's a lot more to CS theory than algorithms and data structures, but if you're asking on HN for a generic CS theory book, I reckon it's most likely an algorithms and data structures book that you're after.
https://smile.amazon.com/Algorithm-Design-Manual-Steven-Skie...
My Story
Hey pal, I was in a similar boat about 8 months ago. It was my senior year as an Economics major, and after taking a programming class, I instantly fell in love with it. I crammed a few more programming classes in before graduating, but in the end, I sure as hell wasn't employable as a software engineer.
​
I had a choice: become a data analyst (the path I was currently on) or follow the software engineering dream. I chose the latter.
​
I decided to go to a (remote) coding bootcamp after college. The program was 6 months. It taught web development (Node, React) and some very basic CS fundamentals. I spent my free time outside the bootcamp inhaling all the computer science and industry information I could. I did this because I wanted to be a competent programmer. I found it fun.
​
This week I had my second onsite. I expect to receive a full-time software engineer offer (my second offer so far) later today, and I have 4 other onsites in the near future (a big 4 + a few startups). It has been a heck of a lot of work to get here, but if you want it badly enough, it's possible.
​
My Tips
​
Happy to answer any other questions you may have. I'm not an expert or an experienced software engineer yet, but I've walked the path you're considering, so hopefully my tips are helpful.
I really like The Algorithm Design Manual by Steven Skiena.
Sounds like you could use a good foundation in data structures and algorithms. I'd find a book on the subject and dive in.
My recommendation: The Algorithm Design Manual by Skiena.
Link: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202
The Algorithm Design Manual was super helpful for me.
https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202
I also didn't have a CS background prior to starting grad school in it. I used Steven Skienna's Algorithm Design Manual to cover my bases.
It is incredibly concise, well written, and teaches all the important concepts. I preferred it over the CLRS textbook, linked by other people down here, because it is more of a reference guide than a book you can learn something from on your own.
I bought it and it was a counterfeit book. Pretty sure if you buy it there you will get either a counterfeit book or an international edition which has significantly lower print quality.
[1]: https://www.amazon.com/Cracking-Coding-Interview-Programming...
[2]: https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Str...
[3]: https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/020...
[4]: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
I would recommend The algorithm design manual for more practical purposes. https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
SOURCE: The Algorithm Design Manual 2nd ed. 2008 Edition https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press...
As a second suggestion, I'd recommend to learn a language somewhat different from JavaScript-like (or C-like) languages, something that challenges your mind to think a little differently and understand and create higher order abstractions. There are many choices, but to avoid confusion and being my favourite, I'll point to one: read the "Structure and Interpretation of Computer Programs" by Abelson and Sussman. It teaches Scheme in a gentle and inspiring way but at the same time it teaches how to become a better programmer:
https://www.amazon.com/Structure-Interpretation-Computer-Pro...
I can't recommend it enough. If you read it, do the exercises, don't limit to read through them.
Maybe it's even better if you start with this, and THEN read the books on algorithms and data structures.
Enjoy your journey!
Algorithm design manual
Algorithms in Java
Also I recommend you to go through this MIT lectures videos.
My book recommendation is Steve Skiena's "Algorithm Design Manual". There's a nice chapter on graphs.
Read a book on algorithms.
Learn OOP and read a book on Design Patterns
Realize that making code readable is often more important than making it as efficient as possible, and most optimization should be left up to your compiler.
[0] http://www.amazon.com/dp/1849967202