بسم الله الرحمن الرحيم
A Computer Science Curriculum with Rust flavor!
// tl:dr
let RustyCS = CS.iter().zip(Rust.iter())
- Contents
- Why Learn Computer Science
- Why Learn Rust
- Why This Curriculum
- How To Use
- Contribution and Community
- Acknowledgment
- Curriculum
- Prerequisites
- Introduction
- Programming Languages
- Discrete Structures
- Systems Fundamentals
- Algorithms
- Architecture and Organization
- CS Tools
- Information Management
- Networking and Communications
- Operating Systems
- Distributed Computing and Advanced Databases
- Compilers and Interpreters
- Information Assurance and Security
- Software Engineering
- Rust Handy references
- Blogs
- Channels
- Rust Community
- Jobs
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.
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.
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.
This is a Computer Science curriculum first and foremost, designed to mimic an undergraduate Computer Science degree 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.
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.
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.
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.
CS Part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
How to Code Simple Data | How to Design Programs | / | / |
How to Code Complex Data | How to Design Programs | / | How to Code Simple Data |
Rust Part:
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.
- Book-The Rust Programming Language Book The offcial book of the language will give you an overview of the language from first principles.
- Track-Rustlings
- Track-Rust By Practice
- Project-PNGme - An Intermediate Rust Project.
- Project-Triangle From Scratch - draw a triangle using Win32, but no external crates
In addition to learning programming languages, learning about programming languages will benefit you tremendously.
Course name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Programming Languages Part A | / | Course website | How to Code Complex Data |
Programming Languages Part B | / | Course website | Programming Languages Part A |
Programming Languages Part C | / | Course website | Programming Languages Part B |
CS Part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Discrete Mathematics with Applications | / | - Extremely summarized study guide discrete math - How to Solve It |
/ |
Discrete Mathematics - Trefor Bazett | Discrete Mathematics: An Open Introduction | / | / |
Rust part:
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.
- Track-Rust Exercism
- Track-Rust Practice Questions
- Project-Build your own JIRA with Rust - A test-driven workshop to learn Rust building your own JIRA clone!
- Book-Rust Programming by Example
- Book-Creative Projects for Rust Programmers
CS Part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Build a Modern Computer from First Principles Part 1 | The Elements of Computing Systems | Course website | Up to Chapter three of Discrete Math with Applications |
Build a Modern Computer from First Principles Part 2 | The Elements of Computing Systems | Course website | - Build a Modern Computer from First Principles Part 1 - Good with at least one programming language (Rust, Java, Python...) |
CS part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Algorithms | Algorithms Illuminated | VisuAlgo visualizing data structures and algorithms through animation | - Discrete Mathematics |
Rust part:
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...
- Book-Hands-On Data Structures and Algorithms with Rust
- Repo-Rust Gym: Leetcode, AoC, Googe..
- Playlist-Rust Advent of Code 2019 - Brian Myers
- Repo-ProjectEulerRust
- Repo-Algorithm Cookbook in Rust
- Book-Learning Rust With Entirely Too Many Linked Lists
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
CMU 15-213: Introduction to Computer Systems | Computer Systems: A Programmer's Perspective | / | - Build a Modern Computer from First Principles Part 2 - C language |
CS part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
The Missing Semester of Your CS Education | / | / | / |
Rust Part:
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.
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Databases: Modeling and Theory | / | / | / |
Databases: Relational Databases and SQL | / | / | / |
Databases: Advanced Topics in SQL | / | / | / |
Databases: Semistructured Data | / | / | / |
CS part:
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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Computer Networking: A Top-Down Approach | Computer Networking: A Top-Down Approach | -Beej's Guide to Network Programming | Good in at least one: C, Python, Java |
Rust part:
A reimplementation of what you learned about networks in Rust. This will be of great value in your future projects.
- Course-TIKV Practical Networked Applications in Rust
- Book-Network Programming with Rust
- Project-Building a DNS server in Rust
- Course-Low-Level Academy
CS part:
So what happens when a program runs?
Course name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Introduction to Operating Systems | Operating Systems: Three Easy Pieces | This 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 - C language |
Rust part:
- Book-Rust in Action
- Blog-Writing a file system from scratch in Rust
- Blog Series-Writing an OS in Rust
- Book-The Theseus OS Book
- News Letter-OSDev,Operating System Development in Rust
- Book-intermezzOS OS
CS part:
“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 name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
CMU 15-445: Intro to Database Systems | Database System Concepts 7th ed | / | - Introduction to Computer Systems - C++ |
Distributed Systems MIT 6.824 | / | / | Operating Systems and networking and databases |
Designing Data-Intensive Applications | / | Author Website |
Rust part:
- Book-Async Raft - the Raft distributed consensus protocol in async Rust
- TIKV Training program in Distributed Systems this course focuses on implementing important distributed algorithms, including the Raft consensus algorithm, and the Percolator distributed transaction protocol.
“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:
Course name | Associated Book | Other Resources | Prerequisite |
---|---|---|---|
Crafting interpreters | / | / | / |
Compilers | Compilers: Principles, Techniques & Tools | / | / |
Rust part:
- Playlist-Rust Ports of Carfting interpreters
- Project-Writing Interpreters in Rust: a Guide
- Project-Make a Lisp - Joel Martin
- Project-Cross-platform Brainfuck Interpreter implementation in Rust
- Blog Series-Why and how we wrote a compiler in Rust
- Project-Build a language VM
- Intro to the Architecture of LLVM
todo()! //Inshallah
todo()! //Inshallah
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.
- Cheat Sheets:
- References:
- Book-Rust for Rustaceans - Covers how to design reliable, idiomatic, and ergonomic Rust programs based on best principles.
- Book-Programming Rust
- Official Ressources
- Guidelines and Idioms:
- Rust by Example A community driven collection of example code which follow Rust best practices.
- Rust Cook Book a collection of simple examples that demonstrate good practices to accomplish common programming tasks.
- Rust API guidelines An extensive list of recommendations for idiomatic Rust APIs.
- Rust Design Patterns A catalogue of design patterns in Rust.
- Effective Rust - Rust guidelines
- Rust Programming Tipz A collection of software engineering techniques for effectively expressing intent with Rust.
- The Rust Performance Book
- Secure Rust Guidelines
- stdx: Learn these crates first as an extension to std
- Common Newbie Mistakes and Bad Practices in Rust: Bad Habits
- Hexagonal architecture in Rust
- Debugging:
- Compiling
- Benchmark and Fuzzing:
- Benchmarking programs in Rust
- Criterion.rs Benchmark
- Rust verification tools
- Rust Fuzz Book Fuzz testing
- Cargo:
- Tools:
- CI/CD:
- Keeping Rust projects' README.md code examples up-to-date
- Guide on how to write documentation for a Rust crate - Writing good documentation with rustdoc including many examples.
- Building an open source project?
- Home – Read Rust
- Hackr.io: most upvoted Rust ressources
- Morioh
- Awesome Rust, A curated list of Rust code and resources.
- Idiomatic Rust
- AreWeRustYet
- Lobsters.rs
- Rust official Blog
- This Week in Rust
- Dev.to Rust
- Llogiq on stuff
- Niko Matsakis
- Endler
- Lucas Palmieri
- Michael Gattozzi
- MICHAEL-F-BRYAN
- Faster Than Lime
- Ralf's Ramblings (ralfj.de)
- Antoyo's Blog
- Blogs - Without boats, dreams dry up
- Sylvain Kerkour
- matklad
- Yoshua Wuyts
- Possible Rust A blog for intermediate Rust programmers exploring real-world code and design patterns.