A Short Effective High-Quality Roadmap towards a Software Engineering Career
The Massive Online Open Course (MOOC) Dilemma
Before sharing the roadmap, I’d first like to share some critical tips that will help you to find the right materials.
Currently, one of the biggest dilemmas facing students looking for high-quality online-learning in computer science is the massive availability of resources. Weird, right? Before justifying that assertion, let’s think about why we have a tremendous number of courses in so many fields — and especially in computer science!
Basically, there are a lot of providers of both free and paid content. For example, nowadays, YouTube has so many playlists of courses covering a wide range of topics. There are also many free and paid educational platforms, such as Udemy, Coursera, Edx and Udacity.
Practically speaking, only a relatively small number of people can present advanced courses. The real trouble is that many people present introductory courses. A simple example would be a typical Python programming course. There are a huge number of Python courses on different platforms. Isn’t that good news?
Sadly, no. Firstly, many of the people fronting the courses lack the requisite teaching skills. Secondly, most of the provided materials lack any depth, as business is the main motivator in many of these cases. More importantly, most of the courses focus on presenting knowledge, but not getting you skilled. You may wonder: ‘as a student how can I select a good programming course among 100 available courses?’
Hmm
Idea #1: ‘Let’s google “the best resources to learn programming.” The results will lead me to experts who already know about where the best stuff is.’
This idea doesn’t work as well as you might wish! These articles are motivated by business too. The article owner gets some revenue from your clicks, e.g. if you buy a Udemy course after clicking a link on their website. They usually list some popular courses to increase their chances of gaining possible revenue. There is a possibility that some of the popular courses are strong, but in my opinion this is not frequent — and there are usually other stronger materials!
Idea #2: ‘We can make use of people comments and ratings on the courses.’
This is a better idea, but there is a trap here. Most people who are new to a topic don’t know what constitutes the ‘perfect’ course! Many will rate the course as 5 stars, as they are happy with what they’ve learned. But they don’t know what they don’t know. For example, how deep are the materials? I usually only check the low reviews to spot any real problems in the content. There are normally a few people who leave valid and constructive criticism! Positive reviews are a good sign, but far from being evidence of the quality of the course.
Idea #3: ‘I will google a complete roadmap by experts and follow it.’
Remember idea #1? But let me add some facts about roadmaps. Even when experts write a roadmap to follow, most probably they did not follow the same one. Experts build these roadmaps after a long journey. We try to create one that is efficient. However, the truth is, we usually did not try it out by ourselves. A roadmap is effective mainly if the author collected feedback from new people who have tried it — and this is usually not the case!
Here are a few ways to increase your chances of learning from a good resource
- A good course must have deep coverage of the topic. However, you might not know what the essential advanced/important topics are. If so, open a big introductory book, and list its topics to work out what should be covered. Alternatively, list the syllabus of different courses and compare.
- A good course must provide you with ENOUGH practice (e.g. quizzes, homework and projects), hopefully with answers! Your knowledge doesn’t matter without SKILLS. If you don’t see practice exercises, most probably you should IGNORE the materials even if it got 5 stars from 1 million people.
- Make use of the reviews; but as a signal NOT as unimpeachable evidence. Low ratings are more critical than high ratings.
- Do you personally know a senior in the area? Ask for their recommendation about a specific subject resource. Ask why they think this is a good resource.
- Released courses from the top institutes are a good choice. For example, the algorithms courses from MIT.
- In general, paid content is better than free content. At the very least, instructors will try to provide the kind of materials and support that attract students. At the same time, there are some free materials on YouTube that are awesome.
- You may start with a free ‘crash courses’ to get a sense of the topic, and then filter the courses to find a strong free/paid course among them
Ok, so you are waiting for my personal roadmap :)
We can divide your learning journey towards a career in software engineering into 3 stages. In summary, the first 2 stages relate to the fundamentals of computer science, while the third stage is about your potential first job.
Stage 1: The programming core
There are 4 very critical subjects that almost every strong senior software engineer must master.
- Programming Basics
- Object Oriented Programming
- Data Structures
- Algorithms
I understand you want to rush toward developing some real life applications, but this is a common fatal mistake nowadays.
Remember, the process is about getting skilled — NOT knowledgeable. You will need to implement 4–6 console projects ranging from 100 to 1000 lines of code. You should be completing a huge range of problem-solving exercises to build your algorithmic skills. Several companies, including those in FAANG, such as Google, will interview you using these kinds of problems.
Stage 2: Enhancing your CS background
There are many roadmaps that claim you need to cover the whole Computer Science curriculum to be a good CS person. This is NOT true. We can divide the subjects to major subjects and minor subjects. To elaborate on this, I’ll split subjects into 2A (major) and 2B (minor)
Stage 2A: Core CS subjects
- Courses: Discrete Mathematics, Networking, Operating Systems, Databases, Software Engineering, Design Patterns
Stage 2B: Relevant courses
- Theory of computation, Assembly programming, Computer Architecture, Computer Graphics, Cryptography, Security, Cloud Computing, Parallel Computing, and Others
- Note: You can be a very strong software engineer while remaining ignorant about these subjects. In the market, you can learn what you meet when working in industry (e.g. many software engineers first come across security basics on the job). The priorities are up to you. I don’t mean that you should simply skip or discard them. Courses on these subject will enrich your CS background
Stage 3: Toward the market needs
- From one local market to another, the demand for different jobs will change. Be conscious about your career choice.
- How can you realize the existence and the frequency of a specific role in the market? One way is to google and monitor that for a short period. For example, google: ’backend software engineer in British Columbia’
Potential jobs:
- AR/VR engineer
- NLP or Computer vision engineer
- Data Scientist
- Machine learning engineer (89%)
- Gaming engineer
- Security engineer
- Frontend engineer (Web, IOS, Android) or Backend engineer
- Devops engineer
- Cloud engineer
- Embedded engineer
- And more
Once you decide on one of the tracks, you will need to figure out a dedicated roadmap especially for it. Usually, working for 8–10 hours a day for ~4 months will be enough to get the basics, and develop a couple of projects. However, sometimes it may take around 12–15 months to be ready for some other careers, such as Machine Learning. It’s my impression that roles at both the frontend and backend are highly desirable across most markets.
Practically speaking, different market directions don’t necessarily place the same emphasis on the different CS fundamentals. For example, a front end engineer won’t interact with a database, and would only need somewhere from zero to very basic knowledge about operation systems. However, a security engineer needs to know a lot about networking and operating systems. As a final example, people wishing to enter the world of machine learning need strong mathematical background. However, keep in mind: many people change their careers! People with a strong background and a wide skillset navigate easily from one career to another. With weak CS basics, you will rarely be afforded the luxury of moving into another career. DON’T limit your choices. I don’t recommend roadmaps that only make you aware of what you need for a narrow specific role and remain relatively ignorant about everything else.
Materials
Stage 1
I want to clarify once more that I am writing this post to educate you about the key elements I just mentioned. However, there is another reason :). I also wanted to market my courses for the programming core part (stage 1)!
Since 2007, I have been involved in teaching CS students, and getting feedback from them. My experience in education is what shapes this article. More importantly, it also shapes my recent courses. After a long process, I feel that I have learned how to teach programming the right way. My courses have several key factors:
- Simple short but deep content
- Extensive practice to build your skills with their solutions
- Building a wide variety of skills
I recently, took the initiative to build core programming subjects in a way that can enable my students to build a complete skill set. Many of my students appreciate that my courses are Stanford-like, and challenge them way beyond how much their colleges do.
I named my series: Mastering critical skills. A title that means a lot!
What should be your first programming language be? Any language is OK. The problem is that many languages are not well served for beginners to learn. I highly suggest C++, but feel free to go with other languages. I still recommend subscribing to my courses to check the problems and implement solution in your language of choice.
Stage 2 and Stage 3
- For stage 2: utilize OSSU page to find a course to a subject of interest. You can parallize many courses. I suggest doing some nice projects for these courses. Google top universities for potential projects.
- For stage 3: There’s no way to provide roadmaps for all of these tracks. Search for roadmaps and compare.
A final tip: Some people keep searching for very long time to find the best materials for something. 99% this doesn’t work. Most of the courses/books are imperfect. Education is an accumulative process. You learn something from a resource and complement it from others. Put a time threshold to find a good resource, utilising my mentioned guidelines.
Some useful materials links (NO ads)
- My courses (You will always remember me)
- For Arab Speakers: My Youtube Channel (Includes English text)
- OSSU
- Several Roadmaps (no idea about quality)
- CS50: Introduction to Computer Science
- Algorithms: MIT (link link) , San Diego Coursera, Abdul bari Youtube, book (CLRS). Other books (The Algorithm Design Manual, Algorithm Design by Jon Kleinberg). Simple Intro books (Grokking Algorithms)
- Data Structures: Some in CLRS, Data Structures Using C++ D. S. Malik, Data Structures and Algorithms in C++ by Adam Drozdek
- Database: Book (ELmasri) / Course
- Design patterns: Book (Head first design patterns)
- CPP: Book(C++ How to program (find latest version))
- Python: Book(Core Python Programming by Chun Wesley)
- Java Script: Eloquent JavaScript / Secrets of the JavaScript Ninja / You don’t know JS
- Software Engineering Book(Clean Code: A Handbook of Agile Software Craftsmanship)
- Computer Network: Books (Computer Networking A Top-Down Approach, Computer Networks by Andrew S. Tanenbaum) — Course
- Operating Systems: CS-537, CS-342
- Discrete Mathematics: Book(Discrete Mathematics and Its Applications: Kenneth Rose)
- Python Deep Dive Series
- Machine Learning: ALL Andrew NG courses first + Kaggle competitions. Book (Pattern Recognition and Machine Learning — tough but worth it)
- Deep Learning for Computer Vision: CS231n: Convolutional Neural Networks for Visual Recognition
- Seniors — System Design: Link (basic) Link (deep) Link (useful), Udemy
- Seniors — Designing Data-Intensive Web Applications