1. Data Structures & Algorithms
Why?
Data structures and algorithms are the backbone of computer science. An algorithm refers to the logical computational steps it takes to solve a problem. A data structure is a way to organize and store data effectively.
Learning the common algorithms and data structures will help you solve problems more efficiently in your applications.
Resources
Books
- Introduction to Algorithms by Thomas Cormen, Charles Leiserson, Ronald Rivest & Clifford Stein
- Algorithms by Robert Sedgewick & Kevin Wayne
Courses
2. Computer Networking
Why?
Networking refers to the communication of data between networks. Understanding the basic concepts of computer networking will help you as a developer understand the magic behind how computers send and receive data.
Resources
Books
- Computer Networking: A Top-Down Approach by Ross Keith W. & Kurose James F.
- Computer Networks by Andrew Tanenbaum & David Wetherall
Courses
3. Operating Systems
Why?
Studying operating systems will give you an understanding of how computers work under the hood. You will learn how processes and memory are managed, and how applications are able to run concurrently with other processes, among many other things.
Resources
Books
- Operating Systems: Three Easy Pieces by Remzi H Arpaci-Dusseau & Andrea C Arpaci-Dusseau
- Operating System Concepts by Abraham Silberschatz, Peter Galvin & Gerg Gagne
Courses
4. Database Management
Why?
A database is an organized collection of data, allowing storage and retrieval of data. As a developer you will be working with a lot of data; knowing how to effectively store and retrieve this data will go a long way.
Resources
Books
- Designing Data-Intensive Applications by Martin Kleppmann
- Database Design for Mere Mortals: A Hands-On Guide to Relational Database Design by Michael Hernandez
Courses
5. Design Patterns
Why?
Design patterns are reusable solutions to commonly occurring problems in software development. Learning design patterns will help you conquer problems you are faced with as a developer more effectively. Having good knowledge of design patterns will allow you to weigh up the pros & cons of potential solutions, allowing you to pick the best tool for the job.
Resources
Books
- Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides
- Head First Design Patterns: A Brain-Friendly Guide by Eric Freeman, Bert Bates, Kathy Sierra & Elisabeth Robson
Courses
6. Compiler Design
Why?
Compilation refers to the translation of high-level code down to machine code so that your CPU is able to understand it. By understanding the compilation process, you will understand how programming languages are made, which will allow you to make better use of a language; such as being able to optimize code better, as well as improve debugging skills, and more.
Resources
Books
- Compilers: Principles, Techniques and Tools by Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman
- Engineering a Compiler by Keith Cooper & Linda Torczon
Courses
Header photo by Jessica Ruscello on Unsplash
Top comments (11)
While it's very nice to have a basic understanding of all the things above, you don't need to be an expert in all of them.
It depends on the businesses you are working for and what are the skills they need to solve their problems.
For example: You won't add much value to a company that builds Web Applications if you have deep knowledge of compilers and all of the above. You will need specialized knowledge of how the Web works and you might need to know a Web framework.
Yeah I definitely agree with this. I think that compiler design isn't a must know for all software engineers. For most jobs, I would argue that software architecture is more applicable than compiler design.
Architecture skills, soft skills, learning to explain complex things in a simple way to stackeholders, those will make a big difference IMHO.
Yes. Big ups on the explaining complex things to stakeholders. Without that, the whole development process falls apart. Great communication will definitely make you stand out from other engineers.
Depending the type of work you do as an engineer you need to know what is required.
You don't NEED to know everything in the list but you WILL have a better understanding of the big picture, even if it's not directly relatable to your day to day job.
Thanks for sharing.
Good list; knowledge of any or all of these topics will only make you a better engineer, for sure. Knowledge is power!
I probably won't be going anywhere near compiler stuff anytime soon. I'm already having hard enough time just getting users and making money on my apps to worry about optimizing for scale.
You just described an average computer science undergrad degree.
What about at least the principles of security?
Good post :) +10 up votes if I could :), Robert book are absolute gem.
Excellent list of resources, and no affiliate links? I'm impressed!