MIT Web Development Crash Course
Descriptions
- Offered by: MIT
- Prerequisites: better if you are already proficient in a programming language
- Programming Languages: JavaScript/HTML/CSS/NoSQL
- Difficulty: 🌟🌟🌟
- Class Hour: Varying according to the learner
Independent Activities Period (IAP) is a four-week period in January during which faculty and students are freed from the rigors of regularly scheduled classes for flexible teaching and learning and for independent study and research, and that's how this web development course was born.
Within a month, you will master the core content of designing, building, beautifying, and publishing a website from scratch, basically covering full-stack web development. If you don't need to learn web development systematically, but just want to add it to your toolkit out of interest, then this class will be perfect for you.
Resources
- Course Website: https://weblab.mit.edu/schedule/
- Recordings: refer to the course website
- Assignments: refer to the course website
MIT Web Development Crash Course
Descriptions
- Offered by: MIT
- Prerequisites: better if you are already proficient in a programming language
- Programming Languages: JavaScript/HTML/CSS/NoSQL
- Difficulty: 🌟🌟🌟
- Class Hour: Varying according to the learner
Independent Activities Period (IAP) is a four-week period in January during which faculty and students are freed from the rigors of regularly scheduled classes for flexible teaching and learning and for independent study and research, and that's how this web development course was born.
Within a month, you will master the core content of designing, building, beautifying, and publishing a website from scratch, basically covering full-stack web development. If you don't need to learn web development systematically, but just want to add it to your toolkit out of interest, then this class will be perfect for you.
Resources
- Course Website: https://weblab.mit.edu/schedule/
- Recordings: refer to the course website.
- Assignments: refer to the course website.
CS61C: Great Ideas in Computer Architecture
Descriptions
- Offered by: UC Berkeley
- Prerequisites: CS61A, CS61B
- Programming Languages: C
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is the last course in Berkeley's CS61 series, which dives into the internal of computer architecture and will make you understand how the C language is translated into RISC-V assembly language and executed on the CPU. Unlike Nand2Tetris, this course is much more difficult and more in-depth, covering pipelining, cache, virtual memory, and concurrency-related content.
The projects are very innovative and interesting. Project1 is a warmup assignment in C. In 2020Fall, you will implement the famous Game of Life. Project2 requires you to write a fully-connected neural network in RISC-V assembly to classify handwritten digits in MNIST dataset, which is a great exercise to write assembly code. In Project3, you will use Logisim, a digital circuit simulation software, to build a two-stage pipeline CPU from scratch and run RISC-V assembly code on it. In Project4 you will implement a toy version of Numpy, using OpenMP, SIMD, and other techniques to speed up matrix operations.
In a word, this is the best computer architecture course I have ever taken.
Course Resources
- Course Website: https://cs61c.org/su20/
- Recordings: Youtube
- Textbook: None
- Assignments: 11 Labs, 4 Projects, the course website has specific requirements
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS61C-summer20 - GitHub
CS61C: Great Ideas in Computer Architecture
Descriptions
- Offered by: UC Berkeley
- Prerequisites: CS61A, CS61B
- Programming Languages: C
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is the last course in Berkeley's CS61 series, which dives into the internal of computer architecture and will make you understand how the C language is translated into RISC-V assembly language and executed on the CPU. Unlike Nand2Tetris, this course is much more difficult and more in-depth, covering pipelining, cache, virtual memory, and concurrency-related content.
The projects are very innovative and interesting. Project1 is a warmup assignment in C. In 2020Fall, you will implement the famous Game of Life. Project2 requires you to write a fully-connected neural network in RISC-V assembly to classify handwritten digits in MNIST dataset, which is a great exercise to write assembly code. In Project3, you will use Logisim, a digital circuit simulation software, to build a two-stage pipeline CPU from scratch and run RISC-V assembly code on it. In Project4 you will implement a toy version of Numpy, using OpenMP, SIMD, and other techniques to speed up matrix operations.
In a word, this is the best computer architecture course I have ever taken.
Course Resources
- Course Website: https://cs61c.org/su20/
- Recordings: Youtube
- Textbook: None
- Assignments: 11 Labs, 4 Projects, the course website has specific requirements.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS61C-summer20 - GitHub.
CMU CS15213: CSAPP
Descriptions
- Offered by: CMU
- Prerequisites: CS61A, CS61B
- Programming Languages: C
- Difficulty: 🌟🌟🌟🌟🌟
- Class Hour: 150 hours
This course is one of CMU's most reputable courses, and is known for its extensive content and difficult projects. The course covers assembly language, computer architecture, operating systems, compilation and linking, parallelism, networking, etc. As an introductory course of computer system, it has both breadth and depth, and does require considerable perseverance and coding skills if you learn it on your own.
The textbook for this course, known as CSAPP, was written by Professor Bryant, Dean of the School of Computer Science at CMU. This is also the first computer textbook that I read carefully from the start to the end, although it was tough, I gained a lot from it.
Peking University purchased the copyright of the course and opened a similar one, but you can have access to all of the course resources on its official homepage (see the link below for details).
This course is so famous that you can easily have access to the project solutions on the Internet. But if you really want to practice your coding skills, it is highly recommended to implement the projects on your own.
After completing this course, your understanding of computer systems will definitely go up a notch.
Course Resources
- Course Website: http://csapp.cs.cmu.edu/
- Recordings: https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22
- Textbook: Computer Systems: A Programmer's Perspective, 3/E
- Assignments: 11 Projects, skeleton code all open source
If you have trouble with Chapter 7 Linking, I recommend reading the book Programmer's Self-Cultivation, subtitled link. load and library. This book can complete our understanding of program linking, and I believe after reading this book you will have a deeper comprehension of program linking, ELF files, and dynamic libraries. It is highly recommended to be read as a supplementary material after reading CSAPP and having a certain understanding of computer systems.
CMU CS15213: CSAPP
Descriptions
- Offered by: CMU
- Prerequisites: CS61A, CS61B
- Programming Languages: C
- Difficulty: 🌟🌟🌟🌟🌟
- Class Hour: 150 hours
This course is one of CMU's most reputable courses, and is known for its extensive content and difficult projects. The course covers assembly language, computer architecture, operating systems, compilation and linking, parallelism, networking, etc. As an introductory course of computer system, it has both breadth and depth, and does require considerable perseverance and coding skills if you learn it on your own.
The textbook for this course, known as CSAPP, was written by Professor Bryant, Dean of the School of Computer Science at CMU. This is also the first computer textbook that I read carefully from the start to the end, although it was tough, I gained a lot from it.
Peking University purchased the copyright of the course and opened a similar one, but you can have access to all of the course resources on its official homepage (see the link below for details).
This course is so famous that you can easily have access to the project solutions on the Internet. But if you really want to practice your coding skills, it is highly recommended to implement the projects on your own.
After completing this course, your understanding of computer systems will definitely go up a notch.
Course Resources
- Course Website: http://csapp.cs.cmu.edu/
- Recordings: https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22
- Textbook: Computer Systems: A Programmer's Perspective, 3/E
- Assignments: 11 Projects, skeleton code all open source.
If you have trouble with Chapter 7 Linking, I recommend reading the book Programmer's Self-Cultivation, subtitled link. load and library. This book can complete our understanding of program linking, and I believe after reading this book you will have a deeper comprehension of program linking, ELF files, and dynamic libraries. It is highly recommended to be read as a supplementary material after reading CSAPP and having a certain understanding of computer systems.
Digital Design and Computer Architecture
Descriptions
- Offered by: ETH Zurich
- Prerequisites: CS50 or same level course; Better have a basic knowledge of C
- Programming Languages: C, Verilog, MIPS, LC3
- Difficulty: 🌟🌟🌟
- Class Hour: 100 hours
In this course, Onur Mutlu, a great expert in the field of Computer Architecture, will teach you about digital circuits and computer architecture. The course is entirely from the perspective of a computer designer, starting with transistors and logic gates and extending to microarchitecture, caches, and virtual memory. It also covers many of the latest research advances in the field of computer architecture. After learning, you will master digital circuits, hardware description language Verilog, MIPS instruction set, CPU design and performance analysis, pipelining, cache, virtual memory, and so on.
There are 9 labs in the course. You will use the Basys 3 FPGA board and Vivado to design and synthesize the circuits, starting from combinational and sequential circuits, and eventually assembly into a complete CPU. Except for assignment solutions, all the course materials are open source.
Course Resources
- Course Website: https://safari.ethz.ch/digitaltechnik/spring2020/
- Recordings: https://www.youtube.com/playlist?list=PL5Q2soXY2Zi_FRrloMa2fUYWPGiZUBQo2
- Textbook1: Patt and Patel, Introduction to Computing Systems
- Textbook2: Harris and Harris, Digital Design and Computer Architecture (MIPS Edition)
- Assignments: refer to the course website
Digital Design and Computer Architecture
Descriptions
- Offered by: ETH Zurich
- Prerequisites: CS50 or same level course; Better have a basic knowledge of C
- Programming Languages: C, Verilog, MIPS, LC3
- Difficulty: 🌟🌟🌟
- Class Hour: 100 hours
In this course, Onur Mutlu, a great expert in the field of Computer Architecture, will teach you about digital circuits and computer architecture. The course is entirely from the perspective of a computer designer, starting with transistors and logic gates and extending to microarchitecture, caches, and virtual memory. It also covers many of the latest research advances in the field of computer architecture. After learning, you will master digital circuits, hardware description language Verilog, MIPS instruction set, CPU design and performance analysis, pipelining, cache, virtual memory, and so on.
There are 9 labs in the course. You will use the Basys 3 FPGA board and Vivado to design and synthesize the circuits, starting from combinational and sequential circuits, and eventually assembly into a complete CPU. Except for assignment solutions, all the course materials are open source.
Course Resources
- Course Website: https://safari.ethz.ch/digitaltechnik/spring2020/
- Recordings: https://www.youtube.com/playlist?list=PL5Q2soXY2Zi_FRrloMa2fUYWPGiZUBQo2
- Textbook1: Patt and Patel, Introduction to Computing Systems
- Textbook2: Harris and Harris, Digital Design and Computer Architecture (MIPS Edition)
- Assignments: refer to the course website.
CMU 15-418/Stanford CS149: Parallel Computing
Descriptions
- Offered by: CMU and Stanford
- Prerequisites: Computer Architecture, C++
- Programming Languages: C++
- Difficulty: 🌟🌟🌟🌟🌟
- Class Hour: 150 hours
The professor Kayvon Fatahalian used to teach course 15-418 at CMU. After he became an assistant professor at Stanford, he offered a similar course, CS149 at Stanford. In general, the 15-418 version is more comprehensive and has lecture recordings, but CS149's programming assignments are more fashionable. Personally, I watched the recordings of 15-418 but completed the assignments of CS149.
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 how to utilize hardwares and software programming frameworks (such as CUDA, MPI, OpenMP, etc.) for writing high-performance parallel programs. Due to the complexity of parallel computing architecture, this course involves a lot of advanced computer architecture and network communication content, the knowledge is quite low-level and hardcore. Meanwhile, the five assignments develop your understanding and application of upper-level abstraction through software, specifically by analyzing bottlenecks in parallel programs, writing multi-threaded synchronization code, learning CUDA programming, OpenMP programming, and the popular Spark framework, etc. It really combines theory and practice perfectly.
Resources
- Course Website: CMU15418, CS149
- Recordings: http://15418.courses.cs.cmu.edu/spring2016/lectures
- Textbook: None
- Assignments: https://gfxcourses.stanford.edu/cs149/fall21, 5 assignments
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS149-parallel-computing - GitHub
CMU 15-418/Stanford CS149: Parallel Computing
Descriptions
- Offered by: CMU and Stanford
- Prerequisites: Computer Architecture, C++
- Programming Languages: C++
- Difficulty: 🌟🌟🌟🌟🌟
- Class Hour: 150 hours
The professor Kayvon Fatahalian used to teach course 15-418 at CMU. After he became an assistant professor at Stanford, he offered a similar course, CS149 at Stanford. In general, the 15-418 version is more comprehensive and has lecture recordings, but CS149's programming assignments are more fashionable. Personally, I watched the recordings of 15-418 but completed the assignments of CS149.
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 how to utilize hardwares and software programming frameworks (such as CUDA, MPI, OpenMP, etc.) for writing high-performance parallel programs. Due to the complexity of parallel computing architecture, this course involves a lot of advanced computer architecture and network communication content, the knowledge is quite low-level and hardcore. Meanwhile, the five assignments develop your understanding and application of upper-level abstraction through software, specifically by analyzing bottlenecks in parallel programs, writing multi-threaded synchronization code, learning CUDA programming, OpenMP programming, and the popular Spark framework, etc. It really combines theory and practice perfectly.
Resources
- Course Website: CMU15418, CS149
- Recordings: http://15418.courses.cs.cmu.edu/spring2016/lectures
- Textbook: None
- Assignments: https://gfxcourses.stanford.edu/cs149/fall21, 5 assignments.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS149-parallel-computing - GitHub.
MIT6.824: Distributed System
Descriptions
- Offered by: MIT
- Prerequisites: Computer Architecture, Parallel Computing
- Programming Languages: Go
- Difficulty: 🌟🌟🌟🌟🌟🌟
- Class Hour: 200 hours
This course, the same as MIT 6.S081, comes from the renowned MIT PDOS Lab. The instructor, Professor Robert Morris, was once a famous hacker who created 'Morris', the first worm virus in the world.
Each lecture will discuss a classic paper in the field of distributed systems, teaching you the important principles and key techniques of distributed systems design and implementation. The Project is known for its difficulty. In four programming assignments, you will implement a KV-store framework step by step based on the Raft consensus algorithm, allowing you to experience the randomness and complexity to implement and debug a distributed system.
This course is so famous that you can easily have access to the project solutions on the Internet. It is highly recommended to implement the projects on your own.
Resources
- Course Website: https://pdos.csail.mit.edu/6.824/schedule.html
- Assignments: refer to the course website
- Textbook: None
- Assignments: 4 torturing projects, the course website has specific requirements
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/MIT6.824 - GitHub
@OneSizeFitsQuorum has written a Lab Documentation that quite clearly describes many of the details to be considered when implementing lab 1-4 and challenge 1-2, you can read when you encounter bottlenecks ~ ~
MIT6.824: Distributed System
Descriptions
- Offered by: MIT
- Prerequisites: Computer Architecture, Parallel Computing
- Programming Languages: Go
- Difficulty: 🌟🌟🌟🌟🌟🌟
- Class Hour: 200 hours
This course, the same as MIT 6.S081, comes from the renowned MIT PDOS Lab. The instructor, Professor Robert Morris, was once a famous hacker who created 'Morris', the first worm virus in the world.
Each lecture will discuss a classic paper in the field of distributed systems, teaching you the important principles and key techniques of distributed systems design and implementation. The Project is known for its difficulty. In four programming assignments, you will implement a KV-store framework step by step based on the Raft consensus algorithm, allowing you to experience the randomness and complexity to implement and debug a distributed system.
This course is so famous that you can easily have access to the project solutions on the Internet. It is highly recommended to implement the projects on your own.
Resources
- Course Website: https://pdos.csail.mit.edu/6.824/schedule.html
- Assignments: refer to the course website.
- Textbook: None
- Assignments: 4 torturing projects, the course website has specific requirements.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/MIT6.824 - GitHub.
@OneSizeFitsQuorum has written a Lab Documentation that quite clearly describes many of the details to be considered when implementing lab 1-4 and challenge 1-2, you can read when you encounter bottlenecks ~ ~
Vim
Why Vim
In my opinion, the Vim editor has the following benefits:
- It keeps your finger on the keyboard throughout the development and moving the cursor without the arrow keys keeps your fingers in the best position for typing.
- Convenient file switching and panel controls allow you to edit multiple files simultaneously or even different locations of the same file.
- Vim's macros can batch repeat operations (e.g. add tabs to multi-lines, etc.)
- Vim is well-suited for Linux servers without GUI. When you connect to a remote server through
ssh, you can only develop from the command line because there is no GUI (of course, many IDEs such as PyCharm now providesshplugins to solve this problem). - A rich ecology of plugins gives you the world's most fancy command-line editor.
How to learn Vim
Unfortunately Vim does have a pretty steep learning curve and it took me a few weeks to get used to developing with Vim. You'll feel very uncomfortable at first, but once you get past the initial stages, trust me, you'll fall in love with Vim.
There is a vast amount of learning material available on Vim, but the best way to master it is to use it in your daily development, no need to learn all the fancy advanced Vim tricks right away. The recommended learning path is as follows:
- Read This tutorial first to understand the basic Vim concepts and usage.
- Use Vim's own
vimtutorto practice. After installing Vim, typevimtutordirectly into the command line to enter the practice program. - Then you can force yourself to use Vim for development, and you can install Vim plugins in your favorite IDE.
- Once you're fully comfortable with Vim, a new world opens up to you, and you can configure your own Vim on demand (by modifying the
.vimrcfile), and there are countless resources on the Internet to learn from. - If you want to know more about how to customize Vim to suit your needs, Learn Vim Script the Hard Way is a perfect start point.
Remapping Keys
Ctrl and Esc keys are probably two of the most used keys in Vim. However, these two keys are pretty far away from home row. In order to make it easier to reach these keys, you can remap CapsLock to Esc or Ctrl.
On Windows, Powertoys or AutoHotkey can be used to achieve this goal.
On macOS, you can remap keys in system settings, see this page.
A better solution is to make CapsLock function as Esc and Ctrl simultaneously. Click CapsLock to send Esc, hold CapsLock to use it as Ctrl key.
On Windows, this AutoHotKey gist does just this.
On macOS, this karabiner rule does the magic.
Recommended References
- Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
- Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.
Vim
Why Vim
In my opinion, the Vim editor has the following benefits:
- It keeps your finger on the keyboard throughout the development and moving the cursor without the arrow keys keeps your fingers in the best position for typing.
- Convenient file switching and panel controls allow you to edit multiple files simultaneously or even different locations of the same file.
- Vim's macros can batch repeat operations (e.g. add tabs to multi-lines, etc.)
- Vim is well-suited for Linux servers without GUI. When you connect to a remote server through
ssh, you can only develop from the command line because there is no GUI (of course, many IDEs such as PyCharm now providesshplugins to solve this problem). - A rich ecology of plugins gives you the world's most fancy command-line editor.
How to learn Vim
Unfortunately Vim does have a pretty steep learning curve and it took me a few weeks to get used to developing with Vim. You'll feel very uncomfortable at first, but once you get past the initial stages, trust me, you'll fall in love with Vim.
There is a vast amount of learning material available on Vim, but the best way to master it is to use it in your daily development, no need to learn all the fancy advanced Vim tricks right away. The recommended learning path is as follows:
- Read This tutorial first to understand the basic Vim concepts and usage.
- Use Vim's own
vimtutorto practice. After installing Vim, typevimtutordirectly into the command line to enter the practice program. - Then you can force yourself to use Vim for development, and you can install Vim plugins in your favorite IDE.
- Once you're fully comfortable with Vim, a new world opens up to you, and you can configure your own Vim on demand (by modifying the
.vimrcfile), and there are countless resources on the Internet to learn from. - If you want to know more about how to customize Vim to suit your needs, Learn Vim Script the Hard Way is a perfect start point.
Remapping Keys
Ctrl and Esc keys are probably two of the most used keys in Vim. However, these two keys are pretty far away from home row. In order to make it easier to reach these keys, you can remap CapsLock to Esc or Ctrl.
On Windows, Powertoys or AutoHotkey can be used to achieve this goal.
On macOS, you can remap keys in system settings, see this page. Karabiner-Elements also works.
A better solution is to make CapsLock function as Esc and Ctrl simultaneously. Click CapsLock to send Esc, hold CapsLock to use it as Ctrl key.
On Windows, this AutoHotKey gist does just this.
On macOS, this karabiner rule does the magic.
Recommended References
- Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
- Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.
CS162: Operating System
Descriptions
- Offered by: UC Berkeley
- Prerequisites: CS61A, CS61B, CS61C
- Programming Languages: C, x86 Assembly
- Difficulty: 🌟🌟🌟🌟🌟🌟
- Class Hour: 200 hours+
The course impressed me in two aspects:
Firstly, the textbook: Operating Systems: Principles and Practice (2nd Edition) is written in an insightful but easy-to-understand way, well compensated for the lack of theoretical knowledge in MIT6.S081, I highly recommend you to read this book.
Secondly, the project for this course Pintos is a great journey for system hackers. Pintos is a toy operating system developed at Stanford for educational use. The author Ben Pfaff even published a paper to explain the design principles of Pintos.
Unlike the small but comprehensive design philosophy in MIT's xv6 labs, Pintos emphasizes system design and implementation more. The codebase is about 10,000 LOC and only provides the basic functions of a working operating system. The four projects let you add scheduler (Project1), system calls (Project2), virtual memory (Project3), and the file system (Project4) to this extremely simple operating system. All projects leave a a big design space for students and require more than 2000 LOC. Based on the feedback from Stanford students, the latter two projects take over 40 hours per person even in teams of 3-4 people.
Although it is tough, Stanford, Berkeley, JHU and many other top U.S. colleges have chosen Pintos as their OS course project. If you're really interested in operating systems, it will greatly improve your ability to write and debug low-level system code. For me, it is an invaluable experience to design, implement, and debug a large system independently.
Pintos will also be introduced as a course project in Peking University's OS Course. In the Spring 2022 semester, I worked with another TA to write a comprehensive lab documentation and provided a docker image for the ease of cross-platform development. In the last semester before graduation, I hope such an attempt can make more people fall in love with systems and contribute to the field of systems in China.
Course Resources
- Course Website: https://cs162.org/
- Lecture Videos: https://www.youtube.com/watch?v=YfHY0pvpRkk, videos for each lecture can be found on the course website.
- Textbook: Operating Systems: Principles and Practice (2nd Edition)
- Assignments: https://cs162.org/, 6 Homework, 3 Projects, the course website has specific requirements
Personal Resources
Since the Operating System Course at PKU uses the project, my implementation is not open source to prevent plagiarism.
CS162: Operating System
Descriptions
- Offered by: UC Berkeley
- Prerequisites: CS61A, CS61B, CS61C
- Programming Languages: C, x86 Assembly
- Difficulty: 🌟🌟🌟🌟🌟🌟
- Class Hour: 200 hours+
The course impressed me in two aspects:
Firstly, the textbook: Operating Systems: Principles and Practice (2nd Edition) is written in an insightful but easy-to-understand way, well compensated for the lack of theoretical knowledge in MIT6.S081, I highly recommend you to read this book.
Secondly, the project for this course Pintos is a great journey for system hackers. Pintos is a toy operating system developed at Stanford for educational use. The author Ben Pfaff even published a paper to explain the design principles of Pintos.
Unlike the small but comprehensive design philosophy in MIT's xv6 labs, Pintos emphasizes system design and implementation more. The codebase is about 10,000 LOC and only provides the basic functions of a working operating system. The four projects let you add scheduler (Project1), system calls (Project2), virtual memory (Project3), and the file system (Project4) to this extremely simple operating system. All projects leave a a big design space for students and require more than 2000 LOC. Based on the feedback from Stanford students, the latter two projects take over 40 hours per person even in teams of 3-4 people.
Although it is tough, Stanford, Berkeley, JHU and many other top U.S. colleges have chosen Pintos as their OS course project. If you're really interested in operating systems, it will greatly improve your ability to write and debug low-level system code. For me, it is an invaluable experience to design, implement, and debug a large system independently.
Pintos will also be introduced as a course project in Peking University's OS Course. In the Spring 2022 semester, I worked with another TA to write a comprehensive lab documentation and provided a docker image for the ease of cross-platform development. In the last semester before graduation, I hope such an attempt can make more people fall in love with systems and contribute to the field of systems in China.
Course Resources
- Course Website: https://cs162.org/
- Lecture Videos: https://www.youtube.com/watch?v=YfHY0pvpRkk, videos for each lecture can be found on the course website.
- Textbook: Operating Systems: Principles and Practice (2nd Edition)
- Assignments: https://cs162.org/, 6 Homework, 3 Projects, the course website has specific requirements.
Personal Resources
Since the Operating System Course at PKU uses the project, my implementation is not open source to prevent plagiarism.
CMU 15-445: Database Systems
Descriptions
- Offered by: CMU
- Prerequisites: C++, Data Structures and Algorithms
- Programming Languages: C++
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is an introductory course on databases at CMU taught by Andy Pavlo, a great expert in the field of databases. It teaches the basic topics of database systems from the bottom up, covering storage management, indexing, query processing, concurrency control, transactions, and so on.
The course project Bustub is an educational database system developed at CMU by the course instructors. During the semester, you will modify this database to implement the functions mentioned above. Moreover, as a well-written project in C++, Bustub obeys many modern development best practices, such as code specification, unit testing, cmake module build, etc. So it can be an excellent open source project to study.
Resources
- Course Website: Fall2019, Fall2020, Fall2021
- Assignments: refer to the course website
- Textbook: Database System Concepts
- Assignments: 4 Projects
In Fall 2019, the second Project is to implement a hash table, and the fourth Project is to implement Logging, Recovery, and Checkpoints in your database system.
In Fall 2020, the second Project is to implement B+Tree dynamic index structure, and the fourth Project is to implement concurrency control.
In Fall 2021, the first Project is to implement a buffer pool, the second Project is to implement a hash table, and the fourth Project is to implement concurrency control.
If you have more time you can try them all, and when you do not understand the textbook very well, trying to implement the real system will deepen your understanding.
Personal Resources
All the resources and assignments used by @ysj1173886760 in this course are maintained in ysj1173886760/Learning:db - GitHub
Due to Andy's request, the repository does not contain the source code for the project, only the solution for homework. In particular, for Homework1, @ysj1173886760 wrote a shell script to help you evaluate your solution automatically.
After the course, it is recommended to read the paper Architecture Of a Database System. This paper provides an overview of the overall architecture of database systems so that you can have a more comprehensive view of the database.
Advanced courses
CMU15-721 is a graduate-level course on advanced database system topics. It mainly focuses on the in-memory database, and each class has a corresponding paper to read. It is suitable for those who wish to do research in the field of databases. @ysj1173886760 is currently following up on this course and will create a pull request here after completing it to provide advanced guidance.
CMU 15-445: Database Systems
Descriptions
- Offered by: CMU
- Prerequisites: C++, Data Structures and Algorithms
- Programming Languages: C++
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is an introductory course on databases at CMU taught by Andy Pavlo, a great expert in the field of databases. It teaches the basic topics of database systems from the bottom up, covering storage management, indexing, query processing, concurrency control, transactions, and so on.
The course project Bustub is an educational database system developed at CMU by the course instructors. During the semester, you will modify this database to implement the functions mentioned above. Moreover, as a well-written project in C++, Bustub obeys many modern development best practices, such as code specification, unit testing, cmake module build, etc. So it can be an excellent open source project to study.
Resources
- Course Website: Fall2019, Fall2020, Fall2021
- Recording: refer to the course website.
- Textbook: Database System Concepts
- Assignments: 4 Projects
In Fall 2019, the second Project is to implement a hash table, and the fourth Project is to implement Logging, Recovery, and Checkpoints in your database system.
In Fall 2020, the second Project is to implement B+Tree dynamic index structure, and the fourth Project is to implement concurrency control.
In Fall 2021, the first Project is to implement a buffer pool, the second Project is to implement a hash table, and the fourth Project is to implement concurrency control.
If you have more time you can try them all, and when you do not understand the textbook very well, trying to implement the real system will deepen your understanding.
Personal Resources
All the resources and assignments used by @ysj1173886760 in this course are maintained in ysj1173886760/Learning:db - GitHub.
Due to Andy's request, the repository does not contain the source code for the project, only the solution for homework. In particular, for Homework1, @ysj1173886760 wrote a shell script to help you evaluate your solution automatically.
After the course, it is recommended to read the paper Architecture Of a Database System. This paper provides an overview of the overall architecture of database systems so that you can have a more comprehensive view of the database.
Advanced courses
CMU15-721 is a graduate-level course on advanced database system topics. It mainly focuses on the in-memory database, and each class has a corresponding paper to read. It is suitable for those who wish to do research in the field of databases. @ysj1173886760 is currently following up on this course and will create a pull request here after completing it to provide advanced guidance.
CS229: Machine Learning
课程简介
- 所属大学:Stanford
- 先修要求:高数,概率论,Python,需要较深厚的数学功底
- 编程语言:无
- 课程难度:🌟🌟🌟🌟
- 预计学时:100 小时
同样是吴恩达讲授,但是这是一门研究生课程,所以更偏重数学理论,不满足于调包而想深入理解算法本质,或者有志于从事机器学习理论研究的同学可以学习这门课程。课程网站上提供了所有的课程 notes,写得非常专业且理论,需要一定的数学功底。
课程资源
- 课程网站:http://cs229.stanford.edu/syllabus.html
- 课程视频:https://www.bilibili.com/video/BV1JE411w7Ub
- 课程教材:无,课程 notes 写得非常好
- 课程作业:不对公众开放
资源汇总
@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS229 - GitHub 中。
CS229: Machine Learning
Descriptions
- Offered by: Stanford
- Prerequisite requirements: Advanced Mathematics, Probability Theory, Python, Solid mathematics skills
- Programming Languages: None
- Difficulty:🌟🌟🌟🌟
- Class Hour: 100 hours
This is another ML course offered by Andrew Ng. Since it is graduate-level, it focuses more on the mathematical theory behind machine learning. If you are not satisfied with using off-the-shelf tools but want to understand the essence of the algorithm, or aspire to engage in theoretical research on machine learning, you can take this course. All the lecture notes are provided on the course website, written in a professional and theoretical way, requiring a solid mathematical background.
Resources
- Course Website: http://cs229.stanford.edu/syllabus.html
- Recordings: https://www.bilibili.com/video/BV1JE411w7Ub
- Textbook: None, but the lecture notes is excellent.
- Assignments: Not open to the public.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS229 - GitHub.
MIT 6.858: Computer System Security
Descriptions
- Offered by: MIT
- Prerequisites: Computer Architecture, basic knowledge about programming and computer system
- Programming Languages: C, Python
- Difficulty:🌟🌟🌟🌟🌟
- Class Hour: 150 hours
This is MIT's Computer Systems Security course. Lectures cover threat models, attacks that compromise security, and techniques for achieving security, based on recent research papers. Topics include operating system (OS) security, capabilities, information flow control, language security, network protocols, hardware security, and security in web applications.
Assignments include labs that involve implementing and compromising a secure web server and web application, and a group final project:
- Lab 1: you will explore the zoobar web application, and use buffer overflow attacks to break its security properties.
- Lab 2: you will improve the zoobar web application by using privilege separation, so that if one component is compromised, the adversary doesn't get control over the whole web application.
- Lab 3: you will build a program analysis tool based on symbolic execution to find bugs in Python code such as the zoobar web application.
- Lab 4: you will improve the zoobar application against browser attacks.
I mainly did Lab 3 in this course. Lab 3 requires you to traverse all the branches of a program by concolic execution, and it is not difficult to do once you understand the idea of symbolic execution. This Lab visually demonstrates the use of symbolic execution.
In the Final Project, you will build a remote file system, SecFS, that provides both confidentiality and integrity in the face of a completely untrusted server. Reference Papers: SUNDR
Resources
- Course Website: http://css.csail.mit.edu/6.858/2022/
- Assignments: refer to the course website
- Textbook: None
- Assignments: 4 Labs + Final Project / Lab5
MIT 6.858: Computer System Security
Descriptions
- Offered by: MIT
- Prerequisites: Computer Architecture, basic knowledge about programming and computer system
- Programming Languages: C, Python
- Difficulty:🌟🌟🌟🌟🌟
- Class Hour: 150 hours
This is MIT's Computer Systems Security course. Lectures cover threat models, attacks that compromise security, and techniques for achieving security, based on recent research papers. Topics include operating system (OS) security, capabilities, information flow control, language security, network protocols, hardware security, and security in web applications.
Assignments include labs that involve implementing and compromising a secure web server and web application, and a group final project:
- Lab 1: you will explore the zoobar web application, and use buffer overflow attacks to break its security properties.
- Lab 2: you will improve the zoobar web application by using privilege separation, so that if one component is compromised, the adversary doesn't get control over the whole web application.
- Lab 3: you will build a program analysis tool based on symbolic execution to find bugs in Python code such as the zoobar web application.
- Lab 4: you will improve the zoobar application against browser attacks.
I mainly did Lab 3 in this course. Lab 3 requires you to traverse all the branches of a program by concolic execution, and it is not difficult to do once you understand the idea of symbolic execution. This Lab visually demonstrates the use of symbolic execution.
In the Final Project, you will build a remote file system, SecFS, that provides both confidentiality and integrity in the face of a completely untrusted server. Reference Papers: SUNDR
Resources
- Course Website: http://css.csail.mit.edu/6.858/2022/
- Assignments: refer to the course website.
- Textbook: None
- Assignments: 4 Labs + Final Project / Lab5
CS110L: Safety in Systems Programming
Descriptions
- Offered by: Stanford
- Prerequisites: basic knowledge about programming and computer system
- Programming Languages: Rust
- Difficulty: 🌟🌟🌟
- Class Hour: 30 hours
In this course, you will learn a fantastic language, Rust.
If you have studied C and have some knowledge of systems programming, you should have heard about memory leaks and the danger of pointers, but C's high efficiency makes it impossible to be replaced by other higher-level languages with garbage collection such as Java in system-level programming. Whereas Rust aims to make up for C's lack of security while having competitive efficiency. Therefore, Rust was designed from a system programmer's point of view. By learning Rust, you will learn the principles to write safer and more elegant system code (e.g., operating systems, etc.).
The latter part of this course focuses on the topic of concurrency, where you will systematically learn multi-processing, multi-threading, event-driven programming, and several other techniques. In the second project, you will compare the pros and cons of each method.
Personally, I find the concept of "futures" in Rust fascinating and elegant, and mastering this idea will help you in your following systems-related courses. In addition, Tsinghua University's operating system lab, rCore is based on Rust. You can see the documentation for more details.
Course Resources
- Course Website: https://reberhardt.com/cs110l/spring-2020/
- Recordings: https://youtu.be/j7AQrtLevUE
- Textbook: None
- Assignments: 6 Labs, 2 Projects, the course website has specific requirements. The projects are quite interesting where you will Implement a GDB-like debugger and a load balancer in Rust.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS110L - GitHub
Due to the rapid evolution of Rust, the libraries used in the 2020 version of the course project are obsolete, so @fung-hwang tried to adapt these libraries (in November 2022). His adaptation advice and completed assignments are maintained in fung-hwang/CS110L-2020spr - GitHub. It is possible that Rust and these libraries will have changed again when you start to learn CS110L, but you can still refer to this repo for help.
CS110L: Safety in Systems Programming
Descriptions
- Offered by: Stanford
- Prerequisites: basic knowledge about programming and computer system
- Programming Languages: Rust
- Difficulty: 🌟🌟🌟
- Class Hour: 30 hours
In this course, you will learn a fantastic language, Rust.
If you have studied C and have some knowledge of systems programming, you should have heard about memory leaks and the danger of pointers, but C's high efficiency makes it impossible to be replaced by other higher-level languages with garbage collection such as Java in system-level programming. Whereas Rust aims to make up for C's lack of security while having competitive efficiency. Therefore, Rust was designed from a system programmer's point of view. By learning Rust, you will learn the principles to write safer and more elegant system code (e.g., operating systems, etc.).
The latter part of this course focuses on the topic of concurrency, where you will systematically learn multi-processing, multi-threading, event-driven programming, and several other techniques. In the second project, you will compare the pros and cons of each method.
Personally, I find the concept of "futures" in Rust fascinating and elegant, and mastering this idea will help you in your following systems-related courses. In addition, Tsinghua University's operating system lab, rCore is based on Rust. You can see the documentation for more details.
Course Resources
- Course Website: https://reberhardt.com/cs110l/spring-2020/
- Recordings: https://youtu.be/j7AQrtLevUE
- Textbook: None
- Assignments: 6 Labs, 2 Projects, the course website has specific requirements. The projects are quite interesting where you will Implement a GDB-like debugger and a load balancer in Rust.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS110L - GitHub.
Due to the rapid evolution of Rust, the libraries used in the 2020 version of the course project are obsolete, so @fung-hwang tried to adapt these libraries (in November 2022). His adaptation advice and completed assignments are maintained in fung-hwang/CS110L-2020spr - GitHub. It is possible that Rust and these libraries will have changed again when you start to learn CS110L, but you can still refer to this repo for help.
MIT 6.031: Software Construction
Descriptions
- Offered by: MIT
- Prerequisites: better if you are already proficient in a programming language
- Programming Languages: Java
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
The goal of this course is for you to learn how to write high quality code, and what is meant by high quality is to meet the following three targets:
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 this, the instructors write a book explaining many of the core principles of software construction and valuable lessons learned from the past. The book covers many practical topics such as how to write comments and specifications, how to design abstract data structures, and many parallel programming caveats. You will explore all of these ideas in the programming assignments.
In the 2016 spring, the course open-sourced all of its programming assignments, and the textbook can be found on the latest website (see links below).
Course Resources
- Course Website: 2021spring, 2016spring
- Recordings: None
- Assignments: 4 Problem Sets + 1 Project
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/ MIT6.031-Software-Engineering - GitHub
@pengzhangzhi completed the assignments and took some notes, maintained at pengzhangzhi/self-taught-CS/Software Construction - Github
MIT 6.031: Software Construction
Descriptions
- Offered by: MIT
- Prerequisites: better if you are already proficient in a programming language
- Programming Languages: Java
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
The goal of this course is for you to learn how to write high quality code, and what is meant by high quality is to meet the following three targets:
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 this, the instructors write a book explaining many of the core principles of software construction and valuable lessons learned from the past. The book covers many practical topics such as how to write comments and specifications, how to design abstract data structures, and many parallel programming caveats. You will explore all of these ideas in the programming assignments.
In the 2016 spring, the course open-sourced all of its programming assignments, and the textbook can be found on the latest website (see links below).
Course Resources
- Course Website: 2021spring, 2016spring
- Recordings: None
- Assignments: 4 Problem Sets + 1 Project
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/ MIT6.031-Software-Engineering - GitHub.
@pengzhangzhi completed the assignments and took some notes, maintained at pengzhangzhi/self-taught-CS/Software Construction - Github.
UCB CS169: software engineering
Descriptions
- Offered by: UC Berkeley
- Prerequisites: None
- Programming Languages: Ruby/JavaScript
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is Berkeley's software engineering course. Unlike many traditional software engineering courses that emphasize UML diagrams, plans, and documents, this course adopts agile development methodologies and uses the cloud platform to provide software as a service. The instructors wrote a textbook Software as a service to explain the concept of SaaS and agile development. Also, there are plenty of programming assignments using Ruby + Rails framework.
This course is available on Edx, an online education platform sponsored by MIT and Harvard, where you can search for the course Agile SaaS Development and learn it yourself. The course content follows the textbook's order and takes you to build software step by step in an agile development way and deploy it on the cloud platform for free.
Course Resources
- Course Website: http://www.saasbook.info/courses
- Recordings: refer to the course website.
- Textbook: Software as a service
- Assignments: refer to the course website
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS169-Software-Engineering - GitHub
UCB CS169: software engineering
Descriptions
- Offered by: UC Berkeley
- Prerequisites: None
- Programming Languages: Ruby/JavaScript
- Difficulty: 🌟🌟🌟🌟
- Class Hour: 100 hours
This is Berkeley's software engineering course. Unlike many traditional software engineering courses that emphasize UML diagrams, plans, and documents, this course adopts agile development methodologies and uses the cloud platform to provide software as a service. The instructors wrote a textbook Software as a service to explain the concept of SaaS and agile development. Also, there are plenty of programming assignments using Ruby + Rails framework.
This course is available on Edx, an online education platform sponsored by MIT and Harvard, where you can search for the course Agile SaaS Development and learn it yourself. The course content follows the textbook's order and takes you to build software step by step in an agile development way and deploy it on the cloud platform for free.
Course Resources
- Course Website: http://www.saasbook.info/courses
- Recordings: refer to the course website.
- Textbook: Software as a service
- Assignments: refer to the course website.
Personal Resources
All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS169-Software-Engineering - GitHub.