I'm an undergraduate student majored in Computer Science in Peking University. Tired of the boring courses, I began self-learning totally after my fresh year. This repository contains all the resources I used to self-learning. The links below will take you either to another repository which contains my solution for homework and course projects or to the course website where you can get full guidance.
If you feel quite painful to take the courses at unversity. Trust me, there is high possibility that it's not your duty. Computer Science is so interesting and everyone should enjoy it if you have a good teacher to teach you a good course.
All the courses in this repository are developed in MIT, UC Berkeleys, Princeton, Harvard ...... , and I guarantee you will have a completely different experience to take these courses !
Let's self-learning together and get better together !
If you find this repo helpful for you, your π is the best gift for me ~
This guidance is a little bit long and may grow as I learn. Here are the section links. After each section, there is a β© which can link you back into Overview.
Data structures and Algorithms
Electronical Engineering Basics
Machine Learning and Deep Learning
Some people asked me how can I find these wonderful courses. Here are some great links that I used to choose my learning materials.
MIT OpenCouse Ware: There are hundreds of thousands of MIT courses in this website including all the subjects you can name.
UC berkeley EECS course map: The map details the UC berkeley EECS courses dependancy and has links to each course's official website.
UC berkeley CS Course List: The computer science courses list for UC berkeley's undergraduate students.
MIT CS Course List: The computer science courses list for MIT students.
I'm a fan in math, so I took many maths courses which CS students are not obligated to take. So feel free to take the ones you like !
Course Link | Difficulty |
---|---|
MIT18.01: Single variable calculus | ππ |
MIT18.02: Multi variable calculus | πππ |
MIT18.06: Linear Algebra | πππ |
Think you have already been expert in these three courses ? Trust me, spend some time reading the course notes, it will deepen your understanding !
Course Link | Difficulty |
---|---|
MIT6.050J: Information theory and Entropy | ππ |
This course is designed for freshman in MIT. I strongly recommend you to take it to understand some basic concepts in information theory.
Course Link | My repository | Difficulty |
---|---|---|
UCB CS70 : discrete Math and probility theory | Completed | πππ |
MIT6.431: Probabilistic Systems Analysis and Applied Probability | ππππ | |
UCB CS126 : Probility theory | Ongoing | πππππ |
I took these three courses about probility theory. The UCB CS126 has some really interesting labs where you can write code in python to solve some practical probability problems. I suggest you take the first two to enhance your theoretical basis then take the last one just for fun !
Course Link | Difficulty |
---|---|
MIT18.03: differential equations | πππ |
MIT18.04: Complex variables functions | πππ |
MIT18.152: Partial differential equations | ππππ |
MIT18.03 focuses on constant differential equations. To solve more interesting dynamic systems, we need to learn partial differential equations. Since PDE requires that you should know about complex variable functions, read the notes of MIT18.04 first !
You may feel tired to learn theoretical math (come on, isn't it exciting ?)
Don't worry, you can use computer to do the math for you. Many MIT maths courses use Julia language to help you understand maths concepts and deal with the maths problems in real life !
Course Link | My repository | Difficulty |
---|---|---|
MIT18.S191: Introduction to Computational Thinking | TBA | ππ |
MIT18.330 : Introduction to numerical analysis | Ongoing | πππ |
MIT18.335 : Introduction to numerical method | TBA | ππππ |
In the first course, you will master julia and do some basic but interesting labs, e.g. image processing, ray tracing, climate simulation and so on !
Then you can use julia to do the numerical analysis ! (a sad story: there are also many theoretical contents ~)
If you find 18.330 a little bit easy, you can take the graduate-level course : MIT18.335.
Course Link | My repository | Difficulty |
---|---|---|
MIT18.650: Statistics for Applications | Unknown | |
MIT18.781: Theory of Numbers | Unknown | |
MIT6.441: Information Theory | Unknown | |
Standford EE364A: Convex Optimization | Completed | ππππ |
Standford CS255: Cryptography | Unknown |
All the courses above are graduate-level and I haven't taken all of them. I may dive into some of them when I need. However, I personally recommend the Convex Optimization course.
There are many programming courses for freshman, I find all of them interesting !
Course Link | Language | Difficulty |
---|---|---|
MIT missing-semester | Shell | ππ |
Just as the course name indicated, this course will teach the missing things in the university courses. It will cover shell programming, git, vim editor, tmux, ssh, sed, awk and even how to beatify your terminal. Trust me, this will be your first step to become a hacker !
Course Link | Language | My repository | Difficulty |
---|---|---|---|
UCB CS61A: Structure and Interpretation of Computer Programs | Python, SQL, Scheme | Completed | πππ |
Have you ever heard about the legendary book SICP? but that book used the language "Scheme" which is not so popular today. This course uses Python to teach you the same idea! Isn't that cool ? Trust me, after this course, you will be expert in python!
Course Link | Language | My repository | Difficulty |
---|---|---|---|
Havard: cs50 | C, Python, SQL | ππ | |
Havard: cs50 ai | Python | Completed | πππ |
CS50 is the most popular courses in Havard University. In the first course you will learn C, Python and SQL. In the second course you will use python to learn some basic concepts about AI ! The most shining part of cs50 is the lab sections. There are many interesting labs that you want to dive into it once you hear about them: Minesweeper, crossword, Nim game, Tic-Tac-Toe and so on.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
Stanford: CS106L | C++ | Completed | ππ |
This is a C++ programming course taught in Stanford University. It covers many modern features of C++ (c++11, c++17, c++20 ...), and will almost certainly help you understand C++ more in depth.
Now you may have some experience in programming, but the art of programming is not programming itself, but to use it to solve problems elegantly and efficiently ! So data structures and algorithms are the most important part for a qualified programmer no matter you want to be a full-stack engineer, a theorist or a deep learning researcher.
And, it is actually very interesting to learn ~~ if you found it hard, it must be your teacher's guilty : (
Course Link | Language | My repository | Difficulty |
---|---|---|---|
UCB CS61B: data structures and algorithms | Java | Completed | πππ (not hard, but code heavy) |
In this course you will learn Java and use it to implement many data structures and algorithms. I highly recommend you to take the Spring 2018 version where you can use the Gradescope to self-grade your code. See the course website for more details !
Also, this course has some great labs and projects. In labs, you will implement the data structure by yourself. While in projects, you will use data structures to solve real problems. For example, in project 1 you will simulate the N-body problem. In project 2, you will implement a game in java. In project 3, you will implement a mini-GoogleMap.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
Princeton: Algorithms I & Princeton: Algorithms II | Java | Completed | πππ(not hard, but code heavy) |
These two courses are the greatest algorithm courses I found in coursera.
Do you often forget how to implement a specific algorithms?
I find the easiest way to master an algorithm is :
- first to know why do in this way
- second to know how to implement it
- then to use it to solve real problems
To know why you should do the algorithm in this way, I think the open-sourced textbook of this course is very helpful, where you can find the rigorous mathematical proofs for all the algorithms in this course.
To know how to implement it, the author implements all the algorithms in Java in a clear and efficient way. I find it very helpful to learn from official codes.
Now the last and also the most exciting part ββ use it to solve real problems. These are 10 projects in total where you can use algorithms to solve practical problems.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
UCB CS170: Efficient Algorithms and Intractable Problems | Latex | Completed | ππππ |
In this course you will learn more advanced algorithms like divide-and-conquer, dynamic programming, Network Flow, Graph algorithms Linear Programming and some NP problems.
This is a theoritic course where you do not need to write code but to design your algorithms and bound the time and memory complexity.
As a CS student, it does not harm to learn some EE lessons to deepen your understandings on the hardware. I found these basic EE lessons will help you understand the ideas in computer architecture.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
UCB: EE16A | Python | Completed | ππ |
UCB: EE16B | Python | TBA | πππ |
These two lessons are the introductary courses for freshman in UC Berkeley majored in EE. You can learn the basic ideas about circuits and some data analysis methods. You can also make your hands dirty in its labs.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
MIT 6.003 : signal and systems | ------ | ----- | πππ |
UCB EE120 : signal and systems | Python | Completed | πππ |
Signal and Systems is a very important course which will change your views of the world ! MIT 6.003 provides all the lecture videos and homework with solutions. UCB EE120 has some great course notes which I think are written in a very clear and easy to understand way. Personally I think the notes about Fourier transform are quite clear and great. So my recommended learning map is as follows :
- watch videos of MIT 6.003
- read the related notes of EE120
- complete the homework of MIT 6.003 to check your understanding
- complete the interesting labs of EE120 where you can use python to process real signals and solve practical problems (These labs are very very very interesting. For example, in lab3 you will implement your own FFT and compare it with numpy's version. In lab4 you will use the videos of your finger to predict your heart-beat rate. In lab5 you will restore blurred images taken by the Hubble Telescope. In lab6 you will control the small car to make it hold one stick.)
Now it's the most exciting part. When I was a little boy, people always told me that computer's world is just 0 and 1. I was so confused and sweared to understand how on earth the computer works in just 0 and 1. After learning these courses, you will understand it in depth.
Course Link | Language | My repository | Difficulty |
---|---|---|---|
Nand2Tetris I & Nand2Tetrix II | choose as you like, I chose Python | Completed | πππ |
This course got 5.0 full score on coursera ! It is divided into two part : hardware part and software part.
Hardware part : you will use Nand gates to implement all the components (ALU, Memory, Decoder, Mutiplexer ... ...) of a running computer. In the end you will implement a CPU to run your machine code.
Software part : The author created a new language called Jack. You will write the compiler to translate the Jack code into your machine code and run it on the computer you made in the hardware part. Then you will implement a basic OS to do the input and output. Finally you can write a Tetris game in Jack and play it on the computer you made ! It is so coolllllll !
Course Link | Language | My repository | Difficulty |
---|---|---|---|
UCB CS61C: Great Ideas in Computer Architecture | C, RISC-V, Logism | Completed | ππππ |
Although Nand2Tetris course is great, it is not a university-level course. So to step further, CS61C is your choice.
All the labs and projects and fantastic. In this course, you will learn C programming language and RISC-V assembly language, understand how the computer runs your code, write a MNIST classification neural network in RISC-V, use Logism to build your own CPU to run RISC-V from scratch, and finally, you can write a naive, but quite powerful numpy in C to accelerate the matrix manipulation. This is the best architecture course I've ever taken !
Course Link | Language | Difficulty |
---|---|---|
CMU CS15213: CASPP | C | πππππ |
This course is so well-known and I don't believe that you haven't heard about it before. Peking University has bought the copyright of this course so I took this course at school, but its official website has all the materials for you to complete the course. You can find course videos on Bilibili or Youtube.
The most important part of this course is its 8 labs, but the labs are relatively hard comparing to the other labs in the above courses.
p.s. I was the TA for this course in 2020, and this repository is somewhat created for my seminar students. Thanks for their excellence to drive me to write this long long README : )
There are so many good resources on the Internet you can use to learn AI, machine learning and deep learning, below are just some courses which I prefer.
I recommend this 2018 version which you can use the gradescope. This course will teach you the basic ideas in AI, such as search, CSP, MDP, RL, BNs, NN, logistic regression and so on.
In this course you will learn the basic neural network such as CNN, RNN, GAN, VAE, and learn to use tensorflow in the labs.
This course is taught by Andrew Ng (ε΄ζ©θΎΎ). This couse is maths heavy. If you feel painful, you can take the coursera Machine Learning course which is also taught by Andrew. I finished the coursera course's labs too, they are quite interesting !
Course Link | Language | Repository | Difficulty |
---|---|---|---|
Stanford CS110L | Rust | Completed | ππππ |
In this course, you will learn Rust, a magic language with C's speed and other high level language's safety. It aims at empowering everyone to write efficient and safe software.
In this course, you will learn more than mastering a language. Rust's design philosophy will help you program elegantly and safely in other system programming language (e.g. C/C++). Also, the course focused on concurrency in the second half. You will trade off between multi-process/multi-threading and event-driven programming and learn some subtle bugs when using them.
Personally, I love the "futures in Rust" part best. Future is a very weird concept and I spent two to three days to fully digest it. However, when you finally understand it, you will be amazed by its elegance and use it happily.
Course Link | Language | Repository | Difficulty |
---|---|---|---|
MIT 6.S081: Operating System | C | Completed | πππππ |
This course is lab-driven, you will implement many features of a real operating system based on xv6 (a toy operating system which is designed for teaching). After finishing 11 labs, I'm sure you will have a deep understanding of the operating system.
Course Link | Language | Repository | Difficulty |
---|---|---|---|
MIT 6.824: Distributed Systems | Go | Ongoing | ππππππ |
One paper per class!! Wonderful labs !! You will implement a working Raft protocal and write your KV storing service based on it.
This course is graduate-level and very hard. I am trying to find some time to finish it.
Course Link | Language | Repository | Difficulty |
---|---|---|---|
Computer Networking: A top down approach | Python | Completed | πππ |
stanford CS144: Introduction to computer network | C++ | Completed | πππππ |
In the fall 2020, the authors of this wonderful book (A Top Down Approach) released his teaching videos online which you can use to supplement your learning. In its labs, you will use wireshark to catch real network packet to understand how each protocol works.
The stanford course is much harder and you can also find its teaching videos on Youtube or Bilibili. In its labs you will implement the TCP, Network Interface, IP routing and put them together to talk with other peers on the Internet. Sounds cool right? (a sad story: the labs are time-consuming, personally I spent 5-6 hours per lab on average).
Here is the picture of what you will implement in CS144 labs :
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
Stanford CS143: Compilers | Java or C | Ongoing | πππππ |
I am taking Compiler course at school this term. Hope I can have time to complete this legendary course.
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
UCB CS161: Computer Security | Python, Go, C | Completed | πππππ |
This course is divided into 5 sections:
- Security principles : how to design a secure system
- Memory safety : buffer overflow attack
- Cryptography : symmetric encryption, asymmetric encryption, MAC, digital signature .........
- Web : SQL, XSS, XSRF .......
- Networking : attacks for each layer
The shining part of the course is the labs and projects, which will greatly enhance your mastery of the knowledge.
- Labs : there are three labs in total
- padding oracle : how to make use of the padding oracle to breach the block cypher.
- a real attack : a real problem countered in the CS61A's exam file releasing
- networking : packet sniffing
- Projects : there are three projects in total
- Proj1 : Hack into the VM using buffer overflow attacks. You will do real attacks on the providing virtualbox virtual machine.
- Proj2 (warning) : This is a very code-heavy projects. You will implement a secure file sharing system in Go language. Here is my implementation and design doc.(I spent three whole days to complete this project, 3k lines of code in total)
- Proj3 : In this project, you will use what you have learned in web scurity to attack a poorly-implemented website. Unfortunately, this project is only available for the berkeley's students. However, I found a great website Hacker101 which provides similar project.
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
Stanford CS149 : Parallel Computing | C/C++ | Completed | πππππ |
From smart phones, to multi-core CPUs and GPUs, to the world's largest supercomputers and web sites, parallel processing is ubiquitous in modern computing. The goal of this course is to provide a deep understanding of the fundamental principles and engineering trade-offs involved in designing modern parallel computing systems as well as to teach parallel programming techniques necessary to effectively utilize these machines. Because writing good parallel programs requires an understanding of key machine performance characteristics, this course will cover both parallel hardware and software design.
There are five programming assignments in the course. You will learn to analyze parallel program, write a CUDA renderer, use OpenMP to parallel BFS and use Spark to do the page rank.
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
UCB CS186: Introduction to Database System | Java/SQL/MQL | Completed | πππππ |
How to write SQL queries? What happens after you type in the queries into the SQL command line tool? How to optimize the query? How to design your own database to fit your demand? How to run tons of queries concurrently? How to recover your database from a ... fire? How to parallel your queries? What is NoSQL and how to write quries in the NoSQL database Mongodb? What is MapReduce and Spark? If you are interested in any questions above and if you want to implement a relational database yourself, this course is your best choice! Wonderful learning materials and wonderful projects, no need to say more.
All the programmers can write code, but how to write good code, how to write hundreds of thousands lines of good code is hard, and is even art.
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
MIT 6.031 : Software Construction | Java | Ongoing | πππ |
The primary goal in this course is learning how to produce software that is:
- Safe from bugs. Correctness (correct behavior right now) and defensiveness (correct behavior in the future) are required in any software we build.
- Easy to understand. The code has to communicate to future programmers who need to understand it and make changes in it (fixing bugs or adding new features). That future programmer might be you, months or years from now. Youβll be surprised how much you forget if you donβt write it down, and how much it helps your own future self to have a good design.
- Ready for change. Software always changes. Some designs make it easy to make changes; others require throwing away and rewriting a lot of code.
To achieve the goal, you will learn Java, learn how to write specifications, how to write tests, how to design good Abstract Data Types, how to write concurrent programs and so on.
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
UCB CS169 : software engineering | Ruby/Javascript | Ongoing | ππππ |
Unlike other traditional software engineering course which teaches you the old "plan and document" method, Software as a Service (SaaS) and agile development is today's trend. This great course will guide you into the world of modern software engineering, which is widely used by almost all the big companies like Google, Amazon ... ...
Course Link | Programming Language | My repository | Difficulty |
---|---|---|---|
MIT web development course | Javascript | Ongoing | πππ |
Do not have time to learn a comprehensive software engineering course ? Wanna develop your own website in two weeks ? Take this MIT's web development crash course! You will learn HTML/CSS/Javascript/React/NodeJS/MongoDB... ... almost all the critical things you need to know about web dev.