Home

Awesome

<p align="center"> بسم الله الرحمن الرحيم</p> <p align="center"> <img src="https://fontmeme.com/permalink/220326/f0317afa6de04ad1c83003645b98179d.png"> </p> <p align="center"> A Computer Science Curriculum with Rust flavor! </p> <p align="center"> <a href="https://github.com/rust-unofficial/awesome-rust"> <img src="https://awesome.re/mentioned-badge-flat.svg" alt="Awesome"> </a> </p>
// tl:dr
let RustyCS = CS.iter().zip(Rust.iter())

Contents

Why Learn Computer Science

From Teachyourselfcs.com:

There are 2 types of software engineer: those who understand computer science well enough to do challenging, innovative work, and those who just get by because they’re familiar with a few high level tools. Both call themselves software engineers, and both tend to earn similar salaries in their early careers. But Type 1 engineers progress toward more fulfilling and well-remunerated work over time, whether that’s valuable commercial work or breakthrough open-source projects, technical leadership or high-quality individual contributions. Type 1 engineers find ways to learn computer science in depth, whether through conventional means or by relentlessly learning throughout their careers. Type 2 engineers typically stay at the surface, learning specific tools and technologies rather than their underlying foundations, only picking up new skills when the winds of technical fashion change. Currently, the number of people entering the industry is rapidly increasing, while the number of CS grads is relatively static. This oversupply of Type 2 engineers is starting to reduce their employment opportunities and keep them out of the industry’s more fulfilling work. Whether you’re striving to become a Type 1 engineer or simply looking for more job security, learning computer science is the only reliable path.

Why Learn Rust

There are a lot of reasons why one would want to learn Rust, but I'm going to mention just what I think are the killer features: Rust is a low-level programming language with direct access to hardware and memory, giving you the same power that C and C++ do with a greater focus on memory safety. Rust also makes it easier to write concurrent programs by preventing data races at compile time. Another great thing about Rust is that Rust is a low-level language with abstractions from higher-level languages without any performance sacrifices (zero-cost abstraction). Rust is general-purpose and can be used for almost anything from embedded systems, building operating systems to running on the browser via webassembly. The possibilities are endless.

Why This Curriculum

At first, I made a CS curriculum based on the ACM & IEEE Computer Science Curricula 2013 guidelines to make up for the low learning quality in the university where I study. Then I found out about Rust and fell in love with it. I wanted to jump in right away, but I had my CS courses to finish first, later I had this idea about spreading some Rust over my CS curriculum, this way I can learn them both at the same time, plus Rust being a system programming language it's almost imperative to have a strong CS background first before you can use it effectively.

How To Use

This is a Computer Science curriculum first and foremost, <del>designed to mimic an undergraduate Computer Science degree</del> focused on systems programming and provides high-quality learning content from top-notch universities adhering to the ACM & IEEE Computer Science Curricula 2013 guidelines.

You may follow this curriculum even if you are not interested in learning Rust by skipping Rust sections. For those who are here to learn both CS and Rust, the way to go is to study the material in the given order. Each section contains the academic course(s) and the relevant Rust implementation(s). you start with the academic part and then move to the applicative Rust part if found.

Make sure that you satisfy the prerequisites before starting any course.

Contribution and Community

Everyone is welcome to contribute to this curriculum. For broken/missing links, spelling errors, and language refactoring, please create a pull request with the fixes. If you think that there is an issue with the curriculum, like missing or wrong prerequisites, wrong order of courses, inaccurate or a better description of courses and sections, better alternatives to the suggested courses, please open an issue stating what's wrong and your suggestion to fix it.

Acknowledgment

Although this was an original idea, I consider The OSSU and Teachyourselfcs curriculums prior arts. This project borrowed a lot from them in terms of courses recommendations and organizations, even quotes. Many thanks to them.

Curriculum

Prerequisites

The below material assumes that you have already finished high school. If not, you can study the needed math and physics course at Khan Academy. Additionally, some courses require Calculus as a prerequisite. You can either go through the courses and learn the required calculus part when needed or take a complete calculus course such as the one on Khan Academy or MIT-Open Learning Library.

Additionally, the curriculum starts with How to Code courses as introductory courses. These courses may be somewhat challenging. Initially, the curriculum suggested starting with Python for Everybody but later removed to reduce the number of introductory materials, and the idea of learning python where comers expect to learn Rust may be unappealing to most. However, feel free to take it if you struggle with these courses. It's a good starting point for those who never wrote a line of code before.

Introduction

CS Part: <br> Start here. These two courses will teach you general ways of thinking about programming and how to write programs even if you have experience. the knowledge that you will learn here will serve you forever and you will use them in literally everything.

Check these summeries to get a sneak peak of what is coming ahead in your CS journey here and here.

Course nameAssociated BookOther ResourcesPrerequisite
How to Code Simple DataHow to Design Programs//
How to Code Complex DataHow to Design Programs/How to Code Simple Data

Rust Part: <br> After finishing the above courses, you should be able to read the book, in addition to the official book, another small book with a gentler introduction to some concepts is provided. And while you're at it, solve the exercises and questions below to help retain the knowledge. There is no particular order to go through the materials except of course reading the book.

Programming Languages

In addition to learning programming languages, learning about programming languages will benefit you tremendously.

Course nameAssociated BookOther ResourcesPrerequisite
Programming Languages Part A/Course websiteHow to Code Complex Data
Programming Languages Part B/Course websiteProgramming Languages Part A
Programming Languages Part C/Course websiteProgramming Languages Part B

Discrete Structures

CS Part: <br>

This course covers the most important parts of mathematics relevant to Computer Science, which are needed later in areas like Algorithms and Sytems studies. My official recommendation is Discrete Mathematics with Applications by Susanna S. Epp, it provides a gentler introduction, and the material is explained in a very good way. Sadly the book is not free. As an alternative, you can work through the Trefor Bazett course on Youtube, it has decent quality and is accompanied by a free book. Make sure to check How to Solve it book, a unique guide to general problem solving.

Course nameAssociated BookOther ResourcesPrerequisite
Discrete Mathematics with Applications/- Extremely summarized study guide discrete math <br> - How to Solve It/
Discrete Mathematics - Trefor BazettDiscrete Mathematics: An Open Introduction//

Rust part:<br> These resources are not related to this section, but they are included here to keep your memory sharp and to be able to switch between doing the course and practicing Rust so you don't get bored.

Systems Fundamentals

CS Part: <br>

The best course to learn how computers work and how to build one. This course will prepare you for the upcoming courses about computer architectures and operating systems.

Course nameAssociated BookOther ResourcesPrerequisite
Build a Modern Computer from First Principles Part 1The Elements of Computing SystemsCourse websiteUp to Chapter three of Discrete Math with Applications
Build a Modern Computer from First Principles Part 2The Elements of Computing SystemsCourse website- Build a Modern Computer from First Principles Part 1 <br> - Good with at least one programming language (Rust, Java, Python...)

Algorithms

CS part:<br> Familiarity with common algorithms and data structures is one of the most empowering aspects of a computer science education. This is also a great place to train one’s general problem-solving abilities, which will pay off in every other area of study. How to Solve it book will also be usefull here.

Course nameAssociated BookOther ResourcesPrerequisite
AlgorithmsAlgorithms IlluminatedVisuAlgo visualizing data structures and algorithms through animation- Discrete Mathematics

Rust part:<br> Solving problems with the language that you are trying to learn is the best way to learn it. Go ahead and solve as most as you can. Check more problems at leetcode.com, Hackerrank, Codewars, etc...

Architecture and Organization

Learning what is going on under the hood of a computer system is what makes the difference between a programmer and a good programmer. Understand computer systems will let you write faster, more efficient and more reliable software.

Course nameAssociated BookOther ResourcesPrerequisite
CMU 15-213: Introduction to Computer SystemsComputer Systems: A Programmer's Perspective/- Build a Modern Computer from First Principles Part 2 <br> - C language

CS Tools

CS part:<br> This course will teach you the general tools that you may need and make it easier for you to create programs like the shell and Git.

Course nameAssociated BookOther ResourcesPrerequisite
The Missing Semester of Your CS Education///

Rust Part: <br> These resources are not related to this section, but they are included here to keep your memory sharp and to be able to switch between doing the course and practicing Rust so you don't get bored.

Information Management

It's necessary to learn how databases work. You will find yourself dealing with them in almost all fields of programming. Don't be intimidated by the number of courses, they are short.

Course nameAssociated BookOther ResourcesPrerequisite
Databases: Modeling and Theory///
Databases: Relational Databases and SQL///
Databases: Advanced Topics in SQL///
Databases: Semistructured Data///

Networking and Communications

CS part:<br> From teachyourselfcs.com: Given that so much of software engineering is on web servers and clients, one of the most immediately valuable areas of computer science is computer networking. Our self-taught students who methodically study networking find that they finally understand terms, concepts and protocols they’d been surrounded by for years.

Course nameAssociated BookOther ResourcesPrerequisite
Computer Networking: A Top-Down ApproachComputer Networking: A Top-Down Approach-Beej's Guide to Network ProgrammingGood in at least one: C, Python, Java

Rust part:<br> A reimplementation of what you learned about networks in Rust. This will be of great value in your future projects.

Operating Systems

CS part:<br> So what happens when a program runs?

Course nameAssociated BookOther ResourcesPrerequisite
Introduction to Operating SystemsOperating Systems: Three Easy PiecesThis Extensive guide from OSSU wirtten by palladian1 will show you how to effectively take this course, make sure to read it!- Introduction to Computer Systems<br> - C language

Rust part:<br>

Distributed Computing and Advanced Databases

CS part:<br> “It’s typical now for even very small applications to run across multiple machines. Distributed systems is the study of how to reason about the trade-offs involved in doing so.”

Course nameAssociated BookOther ResourcesPrerequisite
CMU 15-445: Intro to Database SystemsDatabase System Concepts 7th ed/- Introduction to Computer Systems <br> - C++
Distributed Systems MIT 6.824//Operating Systems and networking and databases
Designing Data-Intensive Applications/Author Website

Rust part:<br>

Compilers and Interpreters

“If you don't know how compilers work, then you don't know how computers work”. The first two courses cover the same topic, choose one. CS part:<br>

Course nameAssociated BookOther ResourcesPrerequisite
Crafting interpreters///
CompilersCompilers: Principles, Techniques & Tools//

Rust part:<br>

Information Assurance and Security

todo()! //Inshallah

Software Engineering

todo()! //Inshallah

Rust Handy references

These are useful resources but are not meant to be read cover to cover. Instead, use them every time you are developing a project. you'll find references for some features that you may have a hard time understanding or help you when you are wondering what's the best way to read a file or parse an argument.

Managing your project

Blogs

Channels

Rust Community

Jobs