How to Learn Computer Science? (from Zero to Hero)

If you aspire to be a software engineer and you are just starting out, you probably have asked yourself these questions: what programming languages should I learn? is it enough to learn one or two programming languages to secure a good job at a big tech company? what other skills do I need, if any?

Because of all the noise out there, aspiring software engineers find it very hard to weed out the valuable information from the noise.

I was trying to find articles about this topic but the ONLY good resource I found was an article written by Ozan Onay and Myles Byrne from the Bradfield School of Computer Science.

So I decided to write an article that reflects my personal opinions and experiences.

What I want to do here is to give you a very broad overview of how your CS career looks like from start to finish, what skills you must absolutely acquire, and what to expect at every step of the way.

In doing so, I actually agree with many aspects presented in the mentioned article but I also disagree with some.

The overall thesis of this article is that software engineers pass through three different phases.

I am going to explain to you what these phases are. Afterwards, I am going to tell you exactly what skills you need to move from one phase to another.

The three phases of a software engineer

Any successful software engineer goes through three consecutive phases.

Some can’t go beyond the first phase, some can’t go beyond the second, and only a few reaches the third.

These three phases are:

1- the coder

2- the programmer

3- the computer scientist

It is important to mention that this classification is my personal opinion based on my experiences and observations.

Let me explain each one of these phases.

First Phase: The Coder

Any software engineer starts his career as a coder.

This can happen at a very young age.

You don’t even need a college degree to be a coder.

So what is a coder?

A coder is someone who knows how to talk the language of a machine.

Given a particular problem, a coder knows how to break down the problem into instructions that the machine can understand in order to come up with a solution.

Here is the thing, if you find yourself really struggling at this phase, then you might want to consider a different career path because the coding phase is literally the easiest phase of your CS career.

If you succeed, congratulations. You might have a successful career as a software engineer.

Unfortunately many software engineers remain in this phase for their whole career.

If you’re just a coder, your pay won’t be great because your skills are easily replaceable.

If you remain just a coder, your promotions will be severely limited.

At this stage, don’t expect to even get an entry-level job at any of the big tech companies.

You need at least to evolve to the next phase for this to happen.

You need to be a programmer.

Second Phase: The Programmer

Once you learnt the basics of at least two programming languages (preferably one statically-typed and one dynamically-typed), you are a solid coder.

The question now is how to promote yourself to the programmer status?

A programmer is essentially a sophisticated coder.

Writing code that does the job is what coders do but writing efficient code that does the job is what programmers do.

Here is a list of some skills that you should have as a programmer:

1- you know the fundamentals of how any code eventually turns into something that a hardware chip can understand and execute.

2- you understand that any system has finite compute, storage, and network resources and your software should utilize these resources efficiently.

3- you know how to use data structures and algorithms to write efficient code.

4- you understand what makes code efficient and what doesn’t.

5- you understand that quality is important and that testing your code is crucial.

Now I got good news and bad news for you.

The bad news: this is not the end, there is a long way to go.

The good news: there are a lot of coders out there, but there aren’t a lot of solid programmers. If you really master this phase, you can easily secure a job at one of the big tech companies like Google, Facebook, Amazon, and others. In fact most of the interviews conducted at these companies test how good of a programmer, not a coder, you are.

I wrote an in-depth article that discusses everything you need to know about the coding interview process.

The vast majority of software engineers retire at this phase.

Third Phase: The Computer Scientist

Learning does not stop after mastering the programming phase.

As a matter of fact it actually starts!

When you are at the computer scientist phase, you’re essentially an architect who thinks about the big picture more than the nitty gritty details.

You have a solid understanding of designing large distributed systems and you know how to build scalable systems that can handle large loads and tolerate failures.

A computer scientist also never stops learning, and always tries to stay up to date with the latest in technology.

At this level, you’ll most likely be in charge of big projects and you’ll be managing a team (usually of coders and solid programmers) to get the job done.

You might also need to cooperate with other teams.

All of these require stellar social and leadership skills.

In the rest of this article, I will go through the technical skills that you need in order to be a coder, then a programmer, and finally a computer scientist.

Let’s get started.

1- Programming

The first and only step to be a coder is to learn programming.

This is the easiest step in your CS career, and it gives you a quick feedback about whether you should pursue a CS career or not.

When it comes to choosing programming languages, I don’t want you to fret over what programming language to learn.

The reason is, at this stage what matters is not the particular programming language, but the concepts that you will be learning. These concepts will hold in almost any other programming language.

When you become a more seasoned programmer, you will reach a point where learning a new programming language doesn’t take more than a week, so don’t waste your time trying to find the “perfect” programming language to start with because: a) it doesn’t exist and b) it doesn’t matter.

With that said, I personally recommend you start with these two languages (I will explain the reasons but feel free to start with whatever you’re most comfortable with):



I highly suggest you start with Python.


Because Python is a language that is very easy to learn, like, really really easy!

It is a very high-level language which allows you to write real programs in just a few lines of code.

So in a short amount of time, you will be able to build real software not just hello-world type programs

All of these features of python are extremely important especially when you’re starting out.

To learn python, I highly recommend Python Crash Course.

I find this book to be very useful for beginners.

I also like the fact that the book is project based so you will have fun building things while you are learning to code.


Why another language though?

 The reason I recommend another language, especially Java, is because it will teach you some programming concepts that do not even exist in python.

One example, Python is a dynamically-typed language while Java is a statically-typed language (If you don’t know what that means, you will know after you learn these two languages).

A combination of Python and Java is a very good way to start because together they provide you with a very solid idea of the programming concepts that you will need in almost any other programming language.

To add to the benefits mentioned above, both python and java are heavily used in industry. So not only will you be spending your time learning the foundations that will pave the way for you to progress further, but also you will be learning some practical languages that are very employable and in high demand.

I learnt Java from the Java core series many years ago.

They offer two separate books: One is for Java fundamentals, the other is for advanced Java features.

I’d recommend not to overwhelm yourself with the advanced features for now. Focus on the fundamentals in this phase.

Congratulations, Now you are a coder


2- The Software Stack

OK so you can write code that can do some really cool stuff, but seriously do you even understand what’s going on?

Say you write a very simple program that just adds two integers and prints the result to the screen.

In python, this would look like this:

x = 5
y = 10
print(x + y)

I take it you understand your code. You understand that a computer running your code should output 15.

But do you really understand what’s happening under the hood?

What does variable assignment (x = 5) mean at the hardware level? What is  x really? how is the number 5 represented in hardware? How does addition actually happen? and how did the result end up on my screen?!!

At the end of the day, a computer is just a collection of hardware chips and wires.

How can a computer really understand your code? and execute it flawlessly?

The fact of the matter is, your code is just the tip of the iceberg. There are a lot of other layers under your code that together make the whole thing works the way you expect it to work.

A programmer unravels this magic.

At this level, you need a solid understanding of all the layers of the stack starting from your code all the way down to the hardware layer.


The Elements of Computing Systems by Noam Nisan and Shimon Schocken is unequivocally my top suggestion for a book that will teach you the essential information you need to understand each layer of the stack.

The book covers hardware, compilers, linkers, and operating systems at a very basic level which makes it very beginner friendly.

It walks you through the steps of creating your first programming language, creating a compiler and a linker for it, and then creating an operating system.

3- Algorithms and Data Structures

Now you are in a very good shape to go back and start programming again, but this time with a completely different mindset.

Because now you REALLY know what’s happening under the hood.

You understand how hardware is eventually going to run your code.

You know that you have limited hardware resources and you understand the value of utilizing the available resources efficiently.

Studying algorithms and data structures will teach you how to write code in a way that makes your code more efficient (however you define efficiency: it could be speed, resource utilization, or both).

The skills you are going learn at this phase are one of the major differentiators that separates average coders from solid programmers.

In fact, most big tech companies like Google, Facebook, and Amazon focus a lot on data structures questions during their interview process.

I personally like Introduction to Algorithms: A Creative Approach by Udi Manber. It is well written and includes a wealth of exercises.

Be aware that the topic of data structures and algorithms is language neutral, so it doesn’t matter which programming language you’re using.

However, some people prefer to read books that are specific to their preferred language.

Even though that’s not my style, but you can find a lot of good language-specific data structures books like this one for java and this one for python.

4- Networks

It is very rare that your code will run on an isolated single machine.

Most useful code communicates with other computers either in a local network or the internet.

Programmers need to have a very solid foundation of how computer networking works.

I came across, in my opinion, the best networking book when I was a senior undergrad. It helped me overcome the bad teaching skills of my professor at the time and his dry text book.


Computer Networking: A Top-Down Approach by Kurose and Ross is a very well-written, super easy to understand book that covers all the networking basics that you need to know.

I still go back to this book every now and then if I need a refresher.

5- Operating Systems

Operating systems play a major role in the software stack.

If you are following this list in order, then by now you should have a very broad idea of the role of an operating system in the stack.

But now is the time to have a deeper understanding of operating systems.

Operating Systems Concepts by Abraham Silberschatz is one of the best books on the subject.

You need some basic knowledge of C though because the majority of operating systems are written in C.

My recommendation, unless you want to be a kernel developer,  is not to allow yourself to get stuck at this point.

This is a very dense topic and understanding all the details of all the aspects of operating systems is very time consuming.

Grasping the main fundamental operating systems concepts is good enough to keep you going but don’t get bogged down in details.

Another resource I highly recommend is the OSDev Wiki especially if you want to learn how to create your own kernel (this is pretty advanced but something that 99% of software engineers can’t do)

6- Distributed Systems

Welcome to the start of your computer scientist status.

In this level, you will be learning new skills while you improve the skills you learnt as a programmer.

Distributed systems is about building and architecting software systems that are scalable and that can tolerate failures at the same time. This requires you to think of the bigger picture rather than focusing on how to build the individual components (programmers and coders can do that).

For example, think about building a search engine service like Google for some text files that exist in your laptop only.

This service that you built is going to be listening to search queries that it receives over the network, search your files for the query, and respond with the results.

In fact, this is not a hard thing to do. Any programmer with a decent knowledge of algorithms and data structures can build an efficient search engine for a small number of files.

Now imagine that more and more people become interested in your service and they start using it.

Now you’re getting millions and millions of requests a second.

Not only that but the size and number of files you are searching through begins to dramatically grow.

What happens if your laptop (that hosts the search service) fails?

Will you just ignore all these millions of requests you’re getting?

Distributed systems is about creating an army of computers that work together to form a specific task (in our example, the search service).

It allows you to create scalable systems that can handle more requests or more data. At the same time, it provides redundancy that would be useful in case any one (or more) machine fail.

Now, let’s talk about resources.

By far, this link is the best resource I have found on the subject (disclaimer: you will need to read some academic papers).

If you are a text book kind of person, then this O’reilly book by Martin Kleppmann is good as well. I have skimmed through it and it covers most of the important topics.

With that said, Distributed Systems is a field where experience matters a lot.

So learn the theory, but also get your hands dirty by working on a distributed system projects.

7- Machine Learning

Machine learning is an interdisciplinary field that spans computer science, mathematics, and statistics.

In this day and age, it is being used every where: Netflix uses it for movie recommendations, Amazon also uses it for their recommendation engine and Echo, vesty waves uses it to automatically classify articles, and the list goes on.

To be able to build these types of software, you need to be more than just a solid programmer because as I mentioned this field requires a very strong mathematical and statistical foundation.

And No, learning everything about python’s scikit-learn library (a very popular python library for machine learning) won’t make you a data scientist or a machine learning expert. You still need to understand the mathematical and statistical underpinnings.

There are two ways to study machine learning: the top-down approach method where you start first by writing machine learning code right away (for example by using python’s scikit-learn library) and understand the math later, or the bottom-up approach where you start with the math first and then move up to code.

I personally prefer the second method just because it is what works for me. Even though It is harder to start and will take longer before you start writing code but once you grasp the concepts, picking up on a library or two is a piece of cake.

On the other hand, the top-down approach has the advantage of writing useful code very fast.

This motivates a lot of people.

The downside is that it will be much harder for you to understand why some things work, and why others don’t because you would not have the necessary mathematical background.

Andrew Ng’s course on coursera is a very good place to start.

If you have prior knowledge of mathematics, probability, and statistics, then “An Introduction to Statistical Learning” is a very good book for building the statistical and mathematical foundations for machine learning.

However don’t get this book if you are not already strong in linear algebra, probabilities, and basic statistics because you will not be able to understand it.

If you want to solve real world problems and make money doing this, then create a team, go to Kaggle, solve a problem, and make some money.

And even if you don’t win, you will learn 🙂

2018-09-17T20:44:50+00:00 By |


  1. Stanley December 29, 2017 at 7:08 pm - Reply

    Well… 3 years of CS and this is the best thing I have seen anywhere. I must confess though I’m having trouble getting past the coder phase but I believe it’ll pass.

    Very well written article. I need to share it with my fellows.

    • Karim January 26, 2018 at 10:32 pm - Reply

      Thanks Stanley! Keep at it and good luck 🙂 You will soon go past this coding phase.

  2. Nuhu Jerry December 30, 2017 at 5:20 am - Reply

    I find this very inspiring and important as its has helped me understand the fundamentals of being a computer scientist!

    thank you very much

    • Karim January 26, 2018 at 10:34 pm - Reply

      Nuhu! Thank you very much. Glad the article helped you.

  3. Hussein M Yussuf December 30, 2017 at 5:25 am - Reply

    So helpful indeed, i really appreciate for a well done job, keep it up!!!

    • Karim January 26, 2018 at 10:40 pm - Reply

      Thanks Hussein and good luck in your career!

  4. George December 30, 2017 at 7:13 am - Reply

    A very good step-by-step analysis of the CS career. Kudos. You should give us a talk in our university. Please share with
    me your contacts

    • Karim January 26, 2018 at 10:39 pm - Reply

      Thank you George! Glad it helped. You can always contact me at ‘my-first-name’

  5. Patience December 31, 2017 at 4:26 pm - Reply

    What a grate piece.I have fear when it comes to programming but after reading this ,it build up my moral to start up.thanks

    • Karim January 26, 2018 at 10:41 pm - Reply

      Fear is part of the learning process. As long as you persevere this initial feeling of fear and intimidation, you will prevail! Thanks!:)

      • Jonas September 8, 2018 at 8:36 pm - Reply

        Thank you immensely. This is what I did need to know when I started to learn how to program computer I mean a clear road, this will save my time.
        Thank you again for your generosity

  6. Mickelson Joseph Vil January 3, 2018 at 3:20 pm - Reply

    I’m very interested!

    • Karim January 26, 2018 at 10:42 pm - Reply

      Thanks for your interest Mickelson!

  7. Et January 4, 2018 at 12:18 pm - Reply

    Great guide mate. Thank you!

    • Karim January 26, 2018 at 10:42 pm - Reply

      Thank you Et! 🙂 Glad I can help

  8. Cheelo January 4, 2018 at 12:18 pm - Reply

    Very enlightening read for beginners. Do you also offer tutorials? How do I get certified? If not get me linked.

    • Karim January 26, 2018 at 10:43 pm - Reply

      Thanks a lot! What do you mean by certified? Certification is of no value in the CS career. trust me!:)

  9. Asad Ur Rehman January 4, 2018 at 6:00 pm - Reply

    Hi thanks for this Great Article.

    • Karim January 26, 2018 at 10:44 pm - Reply

      Thanks Asad! Glad it helped.

  10. cs-aspirant January 26, 2018 at 10:26 pm - Reply

    Thanks for this post. I really learnt a lot!

    • Karim January 26, 2018 at 10:44 pm - Reply

      Thanks cs-aspirant 🙂

  11. Akash January 28, 2018 at 7:28 am - Reply

    Looking forward for many such great articles insights about cs field from you.Thanks ALOT…

    • Karim January 29, 2018 at 7:27 pm - Reply

      Always happy to help! thanks.

  12. Mani February 6, 2018 at 2:38 pm - Reply

    i did my CS grad 6 years back, would have been great if I came across a splendid article like this at that time. nevertheless Im glad atleast now I have came across such gem. Thanks a lot for explaining in detail. Inspiring!

    • Karim February 6, 2018 at 3:33 pm - Reply

      Thanks for your kind words Mani! And good luck in your CS career 🙂

  13. Yahya Mohamed February 6, 2018 at 6:45 pm - Reply

    Wow! What a great piece of a nice and easy-to-understand article. This will surely help me kick-start my dream of pursuing CS in the university. Please do post other interesting articles like this one. Thanks dude and stay blessed!

    • Karim February 6, 2018 at 9:33 pm - Reply

      Thanks Yahya! Good luck in your career!:)

  14. Akash March 23, 2018 at 12:10 pm - Reply

    Brilliant piece of article…can u tell more about how to develop your CV so u can get great resumes…

    • Karim March 31, 2018 at 3:32 am - Reply

      Hello Akash, the best thing to develop your resume is to get internships or work on projects, either at school or open source ones.

  15. Zaheer Abbas March 30, 2018 at 6:07 pm - Reply

    I really love this article and bookmarked.

    • Karim March 31, 2018 at 3:24 am - Reply

      Thanks Zaheer. Happy to help!

  16. SHRAVAN May 4, 2018 at 8:07 am - Reply


  17. Khanh Chung May 19, 2018 at 11:09 am - Reply

    This is really a great article. What do you think about database? I think it is really important if we want to learn CS.

    • Karim May 20, 2018 at 8:40 pm - Reply

      Thank you. You are right. It definitely is!

  18. phill May 21, 2018 at 2:18 pm - Reply

    This piece is very interesting and enlightening. I have always loved computers but never had the chance to dive into a CS career. This article provides me a solid roadmap to enter CS space. Thank you very much. Just completed a B.A degree. Will launch into CS career now

    • Karim May 21, 2018 at 4:36 pm - Reply

      Thank you Phill and Good luck in your CS career!

  19. Jonathan May 24, 2018 at 1:41 am - Reply

    I never though i’d ever come across any of this. Atleast now i’ve got a path to follow rather that just doing everything blindly. Nailed it! Nice work

  20. Rithik May 29, 2018 at 12:43 am - Reply

    If don’t want to major in computer science because I want to major in an engineering field, but I really want to learn computer science. Are the materials listed above to supplement extra information to comsci majors, or can I use the materials above to learn compsci without a traditional learning environment.

    • Karim May 29, 2018 at 3:31 pm - Reply

      You can use the material above to teach yourself computer science. These are the things that students learn in CS majors

      • Rithik May 30, 2018 at 10:03 pm - Reply

        Ok, thank you!

  21. Anas Mayow Salaat June 1, 2018 at 11:48 am - Reply

    i didnt know where to start, but, i guess i do now with this article and Thank You for your help.

    • Karim June 5, 2018 at 4:06 am - Reply

      Glad to help! Good luck 🙂

  22. K June 4, 2018 at 4:43 am - Reply

    Great article. I love this article I’m following this road-map, but I don’t really enjoy reading thick books, so I use videos instead. Is it ok?

    • Karim June 5, 2018 at 4:05 am - Reply

      Of course! Just make sure the teacher is good.

      • K June 13, 2018 at 2:17 am - Reply

        I’m not really sure that they are good teachers or not, I have two courses on Udemy, one is Java and another is Python. They have highest rate courses on Udemy.

  23. laiju June 21, 2018 at 5:28 am - Reply

    Sir ,you are giving a good information on computer science career.

    • Karim June 21, 2018 at 5:47 am - Reply

      I am always happy to help. Thanks for reading!

  24. Tony June 30, 2018 at 7:22 pm - Reply

    Thank you so much, sir!

  25. Karl July 16, 2018 at 1:57 pm - Reply

    Very well elaborated! Thank you so much! Man, I feel so happy, it’s like you just gave a 1000 bucks…

  26. G ARCHANA July 16, 2018 at 4:05 pm - Reply

    Such a great article! explained everything in a lucid manner that even a non CS grad can easily catch.Thank you!

    • Karim July 18, 2018 at 5:28 am - Reply

      You are welcome! Glad you liked it.

  27. Moiz July 19, 2018 at 11:20 am - Reply

    This looks like a really good guide
    i was studing in BS physics and wanted to study Cs as well
    this guide deals with what CS majors learn in Bachelors right would i still need a degree in cs to go to programming

    • Karim July 24, 2018 at 3:01 am - Reply

      No, you don’t need a CS “degree” to go to programming. You need to learn CS to have a successful career. It doesn’t matter if you learn CS through a traditional college degree or not (although having an actual degree opens many doors when you’re starting out)

  28. Edu July 26, 2018 at 10:06 pm - Reply

    Thank you very much. God bless you.

  29. Li Shenghui August 8, 2018 at 3:23 am - Reply

    Thank you very much! This is the best article I had read.

  30. Heba August 8, 2018 at 4:27 am - Reply

    More than helpful article , a hell of a one actually .
    Thanks so very much ,that’s precious .

    • Karim August 10, 2018 at 7:03 pm - Reply

      Thanks Heba! Very happy to help.

  31. Seshai Hari August 13, 2018 at 8:44 am - Reply

    Superb Article. I’m a freshmen entering college for persuing computer science engeneering. Hope i will follow these steps and become a great computer science engineer

    • Karim August 13, 2018 at 9:05 pm - Reply

      I can see this happening. Good luck Seshai!

  32. Musa August 15, 2018 at 11:52 pm - Reply

    This a Great resource regarding CS. I can’t thank you enough for such a Write up. It is really helpful. But I’ve a question Mr. Karim, how many years can these processes take an average person?. I’ll be quite glad if I could get a detailed answer.Thanks a Billion.

    • Karim August 28, 2018 at 2:45 am - Reply

      Honestly it differs from one person to another. Also this is a field that is frequently changing, so you will be learning all the time. It doesn’t really stop 🙂

  33. nonone August 16, 2018 at 10:38 am - Reply

    Thank you

    million times

    —by whoever will saw this post

  34. Andrew August 27, 2018 at 10:38 pm - Reply

    Hi Karim, I’m interested in robotics and AI. I was told to learn and be good at python, c and c++. Could I leave out Java for now? Also, could you recommend me some good resources to learn c and c++?

    • Karim August 28, 2018 at 2:29 am - Reply

      Hi Andrew. Of course! the reason I haven’t suggested C/C++ for absolute beginners is because C/C++ are more low-level and requires you to know a little bit about the underlying stack (especially memory management). That said, I actually started with C/C++ myself. For C, I recommend “C Programming: A Modern Approach, 2nd Edition” by K.N. King. I don’t have book recommendations for C++ but a strong foundation in C will help you tremendously when you make the move to C++

  35. Divyanshi Parashar August 28, 2018 at 5:22 am - Reply

    Thanks a lot! It’s really very helpful.

  36. Parth September 4, 2018 at 4:14 pm - Reply

    Thanks a lot!
    This is the first time when someone clearly explained what it means to be a programmer and a computer scientist.

  37. Jason September 28, 2018 at 11:56 pm - Reply

    Hey Karim ,so as a beginner ,we have to learn both Java and Python before going into the next phase right?

    • Karim October 2, 2018 at 9:57 pm - Reply

      Hi Jason, I recommend this but it is not a must. I actually only learnt C before moving to the next phase.

  38. Honey October 4, 2018 at 11:34 am - Reply

    I am a 50 something who is tired of feeling left out of the sophisticated world of CS. I am glad I came across your article. The manner in which you presented a step-by-step approach to learning this “magic” makes me feel confident in my pursuit. I am going to stop searching for “how to’s“ and begin my journey based on your recommendations. Thank you

    • Karim October 4, 2018 at 2:50 pm - Reply

      Thank you for stopping by! Glad I helped and I wish you the best.

  39. sandeep narula October 7, 2018 at 6:27 pm - Reply

    Very well explained.Thanks for the inspiration 🙂

  40. October 16, 2018 at 3:41 pm - Reply

    Thank you very much. I want to become a Computer Scientist and I know this will help me through. Thank you once again. God bless you.

  41. kevin November 21, 2018 at 7:33 am - Reply

    Thanks a million dude!

  42. Michelle November 27, 2018 at 7:03 pm - Reply

    Wow! Thank you for sharing!

  43. Daud November 28, 2018 at 11:36 pm - Reply

    I’m in my third year of pursuing an IT Degree and your article blew my mind, it very well structured and very informative. I think I will be following your path into becoming a Computer Scientist.

  44. Khadija December 3, 2018 at 3:12 pm - Reply

    Thank you very much, I realy apreciate this article! Wich book do you recomand for C language?

    • Karim December 6, 2018 at 3:12 pm - Reply

      I like “C Programming: A Modern Approach”

  45. Abhishek Shandilya December 7, 2018 at 3:34 pm - Reply

    Hello Sir, I completed my B.Tech in Computer Science & Engg. 4 years back but never had a beautiful broad view of Computer Science with such clearance of thought, as i am having now after reading this. I am excited again about CS after reading this article. Thank you sooooooooo much.

    • Karim December 7, 2018 at 4:34 pm - Reply

      You are welcome Abhishek! Happy to help.

Leave A Comment