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://github.com/clever-algorithms/CleverAlgorithms
[2]: https://people.eng.unimelb.edu.au/ammoffat/mg/
[3]: http://www.mmds.org/
[4]: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
[5]: https://www.amazon.com/Network-Algorithmics-Interdisciplinar...
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.
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://mitpress.mit.edu/sicp/
Or if you want made of dead trees:
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!
https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
It's nearly a third of the length of CLRS, and half of Sedgwick. Much more precise, yet offers more in that it talks about common problem solving uses cases with data structures and algorithms, rather than writing going through the theoretical proofs behind them.
I took these two OCW courses: https://ocw.mit.edu/courses/electrical-engineering-and-compu...
https://ocw.mit.edu/courses/electrical-engineering-and-compu...
And worked my way through these two books: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
https://www.amazon.com/Algorithms-Robert-Sedgewick-ebook/dp/...
I wrote out my solutions on a whiteboard or pen and paper before typing them into a computer.
Outside of A & DS, I spent some time on operating systems and networking in general. A little bit of probability, but no hardcore discrete math.
There are swaths of areas which I now cover at a slower pace as time allows; compilers, AI, etc.
https://www.amazon.com/Programming-Language-Brian-W-Kernigha...
I'd also learn SICP: https://www.amazon.com/Structure-Interpretation-Computer-Pro...
and algorithms from either CLRS https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press... or Skiena Algorithm Design https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...
- Skiena algorithm book: https://www.amazon.com/Algorithm-Design-Manual-Steve-Skiena/...
for this book one can focuses on the first 7 chapters (revision)
- Leet code editorial solutions https://leetcode.com/articles/ . They provide with the solution and complexity analysis of a few problems. I suggest you try to solve and give your complexity analysis then compare it with the "official" one.
http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
Read the book, and do whatever exercises you can from the book on the whiteboard. Talk out loud, the way you will in the interviews. After a few weeks and 60 hours of doing this, you'll be ready to blow the minds of the people interviewing you.
When you go to your interview, you will bring your own markers. Then you don't have to deal with the fat, half dried out stuff you encounter during the interview. Also, warm up for an hour or two before you go to the interview, by doing problems from the book on the whiteboard, out loud. This helps you leave nothing to chance, and be ready for whatever they throw at you.
Yeah, it's a waste of time. But you have to play the game. Similarly, when they ask you why you left your last job, lie and tell them you'd accomplished all your goals there, got everything lined up and nailed down, and you're ready to make something happen somewhere else. Don't tell the truth if it's because your managers couldn't care less about doing what's best for the business. If you want to work at the circus, sometimes you gotta jump through some hoops. Big deal, you'll be ok!
Yes, the interview process is broken, but you can actually work at it and do well, even if you're old.
Buy this book even if you're not planning to take my advice and study. Even if you don't study, this should become one of your most treasured books. I myself was amazed at how many things turn out to be graph problems, and had a great time going through this book.
[1] http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
I also suggest you to join this Coursera course, Algorithms: Design and Analysis by Tim Roughgarden[2]. Currently the course is open, so you can sign up for classes. The course is offered in two parts[3], complete both of them.
Once you are comfortable with basic concepts start solving questions/puzzles online on sites like SPOJ[4], UVa[5], (YC-funded) HackerRank[6]. You could try TopCoder[7] also, but the questions are bit difficult. Hope this helps.
PS - You should study math, because it is important in Algorithms Analysis. You could try reading required parts of Concrete Mathematics by Knuth[8] or as you come across new concepts, Google and understand them.
[0] - http://www.amazon.com/dp/8177583581
[1] - http://www.amazon.com/dp/1848000693
[2] - https://www.coursera.org/course/algo
[3] - https://www.coursera.org/course/algo2
[4] - http://www.spoj.com
[5] - http://uva.onlinejudge.org
[6] - http://hackerrank.com
[7] - http://www.topcoder.com
I think I've listened to every podcast on software engineering radio a few times [2]. The older ones are especially nice because they usually pick a specific topic and cover the high points. I liked that I could listen to it while I was driving, or otherwise not in front of a computer.
It's specific, but Javascript: The Good Parts is probably the most used book I have on my shelf. It has such a perfect amount of usable information in it. It's pretty great. Again, it's definitely worth looking up critiques and counterpoints.
I've also got Introduction to Algorithms, which I use as a reference, sometimes. I switched over to The Algorithm Design Manual [5] after I saw it referenced in an older Steve Yegge post [6]. I read through the intro and it seemed like a book that would be more appropriate from an autodidactic standpoint. I really have no idea if that's going to pan out, since I'm not that far into it, but we'll see, for sure. Doesn't kill me to have an extra algorithms book laying about, though, and I've always got intro to algorithms for cross reference. I've found that I really need to have as many sources available as possible when I'm learning alone. Usually I don't get something until the fifth person describes it from the tenth different angle.
That's most of what I can think of off hand. I really enjoyed The Joy of Clojure [7], though haven't checked out the newer version. Programming Collective Intelligence [8] is a fun book, and is what made me want to go back down the maths route to get more into machine learning.
And of course habitually reading hacker news for an hour or three every night :)
So that's my totally inexpert list of random stuff that I enjoy
[1] http://www.amazon.com/Code-Complete-Practical-Handbook-Const... [2] http://www.se-radio.net/ [3] http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockfor... [4] http://www.amazon.com/Introduction-Algorithms-Thomas-H-Corme... [5] http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/... [6] http://steve-yegge.blogspot.com/2008/03/get-that-job-at-goog... [7] http://www.amazon.com/Joy-Clojure-Michael-Fogus/dp/161729141... [8] http://www.amazon.com/Programming-Collective-Intelligence-Bu...
There's also Pearls of Functional Algorithm Design which I have yet to read. http://www.amazon.com/Pearls-Functional-Algorithm-Design-Ric...
In general you've got stuff like Introduction to Algorithms (http://www.amazon.com/Introduction-Algorithms-Thomas-H-Corme...) and the Algorithm Design Manual (http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...) both of which I have seen mentioned as good books. I'm in a grad school-level algorithms class that just started using the former (which is language agnostic, but we are doing our implementations in Java) and it looks pretty good to me.
[0] http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/... [1] http://www.amazon.com/Programming-Pearls-2nd-Edition-Bentley...
[1]: http://www-cs-faculty.stanford.edu/~uno/taocp.html
[2]: http://www.amazon.com/Introduction-Algorithms-Thomas-H-Corme...
Circuit routing is an entirely different beast. A previously routed "shortest" trace from one node to another can obstruct a much shorter trace between two unrelated nodes. In this way it's similar to the traveling salesman problem, where early "greedy" choices made by the salesman can force him to make much less efficient choices later.
I remember circuit routing was an example in Skeina's Algorithm Design Manual [1], and believe he proved that it was indeed NP-complete, not polynomial like the general pathfinding problem.
1. http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
There's also lecture videos here: http://www.cs.sunysb.edu/~algorith/video-lectures/
Learning data structures that you don't use often, like bit arrays, come in handy for interviews, especially for when they ask you to optimize your solution. (http://en.wikipedia.org/wiki/Bit_array)
http://en.wikipedia.org/wiki/List_of_tools_for_static_code_a...
From my very limited understanding, the powerful ones are seemingly only in reach for large enterprises [1].
With regard to number 3, In C# and Java, resharper/IntelliJ has partially automated refactoring tools. I'm sure similar tools exist for other languages.
However, I think going down this route is substantially more work unless you are inheriting a code base. I would aim to learn some of the design patterns basics[2], perhaps read "The Algorithm Design Manual" [3], and aim to have a clear idea of how to design your latest algorithm from the offset.
[1] - http://semmle.com/solutions/what-we-do/index.html
[2] - http://en.wikipedia.org/wiki/Design_Patterns
[3] - http://www.amazon.co.uk/Algorithm-Design-Manual-Steven-Skien...
http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
I was a bit flummoxed at first because algorist.com doesn't tell you how to buy the thing, and the Kindle edition appears to be out of date (based on the first edition, obsoleted by the second edition from 2010).
http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
Not a quick win but a comprehensive, in-depth algorithm book :-)
http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
Distributed Algorithms ($100) - http://amzn.to/glJVKv Algorithm Design Manual ($61.72) - http://amzn.to/f9G0KD
They are about $10 less than the physical book. Doesn't it cost them far less to produce, store, transport a digital version? I wonder how much of this goes to the author.
Also to the OP: this book is good, and a must read. It will help you a lot on the fundamentals of CS. http://www.amazon.com/Algorithm-Design-Manual-Steve-Skiena/d...
I've also heard The Algorithm Design Manual recommended, although I haven't read it and don't own a copy. http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/...
Can't recommend it enough.
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.