49
Ask HN: Book recommendations for CS fundamentals for a self-taught programmer?
I'm at a career crossroads and could use the community's advice. Does anyone have books they recommend that teach the basics or the "base" of computer science and programming logic?
I've worked as the customer support specialist or technical documentation writer in SaaS companies for about 18 years now, and at every company I work at I tend to do sysadmin and/or engineering work as well, mostly when I'm bored or did all my tasks for the day. Recently, my manager pulled me aside and mentioned I should be pursuing an engineering job instead, as they think I've the skills to do so, and offered to move me from support to engineering. The thought has crossed my mind, but I have to admit, I'm scared.
I started computer science in college a few times, but left because the first semester was incredibly slow or boring (I recently found out I have ADHD), so I lack the basics. For example, I only learned what a "method" was a few years ago, when I started writing open source Go programs and libraries. I know my way around a server (I have a homelab and self-host most services I use) and can code following best practices and whatnot, but if the company gave me a project today I wouldn't know where to start. If I'm coding for myself and I find out I made a mistake after spending days on the project, no problem, I can start over if I need to, but things are quite different if you're doing that as your job.
Now that I'm medicated for my ADHD I thought about going back to college, but that wouldn't solve my problem right away. Now that my wife is pregnant, juggling work, family responsibilities, and college would be a bit much, so I thought reading a few books might help. I really want to accept this offer, as it'll come with a significant salary bump (which would help a lot with the baby), but also because I really enjoy programming and solving problems with code.
So, basically, I'm looking for book recommendations that cover CS fundamentals and programming logic.
Ideal resources would: 1. Provide a structured approach to fill knowledge gaps. 2. Cover topics like software architecture, algorithms, and design patterns. 3. Be engaging enough for someone with ADHD to read. 4. Offer practical examples or projects.
Has anyone successfully made a similar career shift? What resources were most helpful? Are there alternatives to books that you'd recommend for my situation?
Any advice on managing the transition from support to engineering would also be greatly appreciated.
I started out as a business analyst and technical product manager at a startup before transitioning to software engineer job family there and in my 2 subsequent roles over the past 6 years. It sounds like your management is especially supportive of you making this transition internally, which is going to be very helpful.
I want to add a caveat that your manager and colleagues should be a resource for you when tackling projects at work, and not to hesitate to ask pragmatic questions about the project(s) you might pitch in on there. It's ok to not have all the fundamentals down, as long as you're working to be a net positive on the project(s).
I went through some of the books listed in the teach yourself CS resource. https://teachyourselfcs.com/
A subset of the resources listed there are probably the most pragmatic for the topics you asked, but you might discover that you're interested in other areas of CS as you slowly work through them. I think it's ok to nibble away at exercises while juggling your family and work obligations.
* Structure and Interpretation of Computer Programs - SICP. If the book doesn't necessarily click right away, doing a subset of the Scheme exercises are still worthwhile.
* Computer Systems: A Programmer's Perspective - CS:APP. Incredibly helpful knowledge about low-level programming.
* Computer Networking: A Top-Down Approach - You mentioned having a home lab, and more networking understanding will help contextualize some of your work.
I think the hardest thing about books like SICP, or the Knuth texts, for "casual hobby programmers" is the need to tear themselves away from thinking in the idioms of popular languages like Python, Javascript or (back in the day) VB.
It's almost like having a Zen master trying to teach you the principles of Zen using a special artificial language with simple but precise semantics, that you have to learn first (and understand thoroughly), rather than try to learn it in a conversational language.
It's a difficult task, but ultimately rewarding. However, it is a struggle to turn your mind away from Javascript when looking at an algorithm or a data structure being taught by one of these texts, and use the simpler semantics of Scheme or "literate programming".
Check the threads below and this could also help: https://missing.csail.mit.edu/
https://news.ycombinator.com/item?id=21919465
https://news.ycombinator.com/item?id=29498220
https://news.ycombinator.com/item?id=13014900
https://news.ycombinator.com/item?id=34854488
[dead]
The recommendations in this thread so far do suggest a lot of nice books - CS:APP and SICP - but given your description of previous struggles with more academic stuff, along with the request for "practical examples or projects", I'm not sure they are right for you. By all means take a look, but don't be discouraged if they don't fit what you're after. An algorithm book with a somewhat different tone that you might check out is Skiena's Algorithm Design Manual. I've been reading Ousterhout's A Philosophy of Software Design recently and that might also be something that would interest you.
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.
The structure and interpretation of computer programs. SICP as it is often called:
https://en.m.wikipedia.org/wiki/Structure_and_Interpretation...
With a supportive manager like yours, you should ask to get connected with someone in engineering who might mentor you a bit. If your current side work was driven from that end, you would quickly figure out how the culture works there and if you can get comfortable. You may have the luxury of something like an internship without the hassle.
Given the context you provide, I would suggest you try an online course or two rather than books. There are plenty of free ones but stick to those from credible sources like universities. With ADHD, you will struggle over dry textbooks. The external structure provided by a course would probably work better even with your improved health. If you start with a single self-paced course, you can go as fast as you like and avoid boredom. Burn through it in a weekend, great! Take it slower, also fine. The current lesson covers material you already know, skip it!
Ask your manager what language(s) are used at your company if you don't already know, and filter courses to focus on that for the most rapid progress to your goal.
Rob Conery's "The Imposter's Handbook"
This is a much better suggestion than most here given all of the detail shared by OP. The material is specifically directed at them. I'd suggest getting the videos too.
FWIW I have a CS degree and got the material to review because I have had to answer questions similar to OP's. It's only after strong familiarity with Conery's book that I'd recommend moving to items listed on Teach Yourself Computer Science. Why? You are trying to compress years of learning while dealing with some struggles that don't have affordances in the other material. Learning is hard work and while the Imposter's Handbook will get you started, you need to dig in much deeper in a targeted fashion.
Going deeper in relational databases is one of the things with the biggest payoffs (see Conery's other book.) It is rewarding for the self-learner to go after advanced mathematics or other CS topics, but this is a harder path with less immediate career value.
Algorithms in a Nutshell. Massive bang for the buck and very approachable. Get a book on Discrete Mathematics for set theory, combinatorial etc. For understanding how computers actually work, I learned to code on a 6510 so that wasn't really optional. I did check out Elements of Computing Systems: Building a Modern Computer from First Principles though which will give you a great understanding.
I didn't find SICP to be that fantastic as I already learned a lot of the principles from the masses of books I've read and software systems I've taken apart to understand.
I can also recommend taking Coursera courses on compilers, ML, architecture, anything interesting from a good US university. At least if they're still a thing :-)
I will probably recommend csprimer, this is hands down one of the best introductions that I found and I recommended to a lot of people who reached out to me. The order I will probably recommend is the following
1. Programming: Beyond the basics
2. Computer Systems
3. Operating Systems
4. Algorithms and Data Structures
5. Computer Networks
This is going to take time but it will be worth your time.
For discrete Math I sincerely recommend you to take a look at this book "Discrete Mathematics with Applications by Susanna Epp. This is an excellent book and it has good problems.
I will also recommend you to look at https://fa24.datastructur.es/ this is a very good beginner course on data structures that is completely free by UC Berkeley
Teach Yourself Computer Science[0] is a great resource, but if you have ADHD or focus issues, the CS Primer[1] (by the same curator) might suit you better. It costs up to $75/month depending on your location, but it’s worth it. I also recommend The Imposter’s Handbook and The Imposter’s Roadmap by Rob Conery.
[0]https://teachyourselfcs.com/
[1]https://csprimer.com/
https://bigmachine.io/
I can't help with books. I knew I couldn't teach myself, so I took a boot camp and it was worth every penny. I took out a 14%-ish loan but paid it off. In my early background, I used to be a tech support analyst.
Honestly, if your manager suggested it, do not be scared and take advantage of the opportunity. Be humble, ask questions, find the senior programmer that loves to talk and they will teach you everything.
Thanks for the help, everyone! I think I'll start with "The Imposter's Handbook" and "CS Primer", as they seem to be more geared toward what I'm looking for.
I do feel a lot better after reading everyone's comments here, and will definitely talk with my manager about maybe starting this transition soon, maybe in a month or two.
A key subject is Logic. Logic is the Calculus of CS and should be your first stop. I recommend:
* Logic for Computer Scientists by Uwe Schoening
* Logic in Computer Science by M. Huth and M. Ryan
The first one is short, very elegant and doable. The second one is a bit longer, but also at freshman level.
There are PDFs circulating on the Internet. Skim through those before buying a hardcopy.
My friend Oz has a few resources here that many have found helpful (me included!)
* https://teachyourselfcs.com - book list and open course suggestions
* https://csprimer.com - Oz's own curriculum for CS fundamentals
The Elements of Computing Systems, by Noam Nisan and Shimon Schocken.
At the end of the day, CS deals with computers. The book guides you through building and programming your own computer.
I'm a CompEng PhD myself and going through it right now. I keep finding gems at every page.
For CS fundamentals, I would say "Computer Science: A Programmes Perspective" covers a good portion.
https://csapp.cs.cmu.edu/
That's Computer Systems: A Programmer's Perspective, not Computer Science. It's reportedly a good book, but by the TOC I wouldn't consider it CS fundamentals so much as systems programming fundamentals.
I've just seen this:
https://github.com/ossu/computer-science
https://teachyourselfcs.com/
Book is not enough though. Fundamentals is hard ! Knowing is different from mastering.
[dead]