[Translation] Finish all the remaining translation (#544)

* GFW translation

* translate usage

* [FIX] Fix giscus plugin (#543)

* [Translate] translate CS188/Docker/GUN_Make (#540)

* complete eng_version for deep learning folder

* fix typo

* add english version for machine learning systems

* Update AICS.en.md

Adjust indentation

* [ADD]add translation for CS188

* [ADD]add translation for Docker

* [UPDATE]update file name

* [ADD]add translation for GNU_Make

* [FIX]fix typo

* [FIX]fix spacing error

* translate github

* translate thesis writing

* translate tools

* translate NJUOS

* translate CS122

* translate CS346

* translate 15799

* translate CS148

* translate games101

* translate games202

* translate games103

* translate advanced ML

* translate CS plan

* nits

* translate scoop

* translate CA

* translate information retrieval

* translate Decal && AUT

* translate workflow

---------

Co-authored-by: nzomi <jly14@tsinghua.org.cn>
This commit is contained in:
Yinmin Zhong 2023-12-16 12:15:13 +08:00 committed by GitHub
parent f5ef84aaf3
commit af9526f8c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 1290 additions and 22 deletions

View File

@ -22,9 +22,7 @@
我的目标是让一个刚刚接触计算机的小白,可以完全凭借这些开源社区的优质资源,少走弯路,在 2-3 年内成长为一个有扎实的数学功底和代码能力,经历过数十个千行代码量的 Project 的洗礼,掌握至少 C/C++/Java/JS/Python/Go/Rust 等主流语言对算法、电路、体系、网络、操统、编译、人工智能、机器学习、计算机视觉、自然语言处理、强化学习、密码学、信息论、博弈论、数值分析、统计学、分布式、数据库、图形学、Web 开发、云服务、超算等等方面均有所涉猎的全能程序员。此后,无论是选择科研还是就业,我相信你都会有相当的竞争力。
你可以[在线免费阅读这本书](https://csdiy.wiki)。
英文版请移步[这里](https://github.com/PKUFlyingPig/Self-learning-Computer-Science)。
你可以[在线免费阅读这本书](https://csdiy.wiki)。英文版请移步[这里](https://csdiy.wiki/en/)。
## 如何成为贡献者

357
docs/CS学习规划.en.md Normal file
View File

@ -0,0 +1,357 @@
# A Reference Guide for CS Learning
The field of computer science is vast and complex, with a seemingly endless sea of knowledge. Each specialized area can lead to limitless learning if pursued deeply. Therefore, a clear and definite study plan is very important. I've taken some detours in my years of self-study and finally distilled the following content for your reference.
Before you start learning, I highly recommend a popular science video series for beginners: [Crash Course: Computer Science](https://www.bilibili.com/video/BV1EW411u7th). In just 8 hours, it vividly and comprehensively covers various aspects of computer science: the history of computers, how computers operate, the important modules that make up a computer, key ideas in computer science, and so on. As its slogan says, *Computers are not magic!* I hope that after watching this video, everyone will have a holistic perception of computer science and embark on the detailed and in-depth learning content below with interest.
## Essential Tools
> As the saying goes: sharpening your axe will not delay your job of chopping wood. If you are a pure beginner in the world of computers, learning some tools will make you more efficient.
**Learn to ask questions**: You might be surprised that asking questions is the first one listed? I think in the open-source community, learning to ask questions is a very important ability. It involves two aspects. First, it indirectly cultivates your ability to solve problems independently, as the cycle of forming a question, describing it, getting answers from others, and then understanding the response is quite long. If you expect others to remotely assist you with every trivial issue, then the world of computers might not suit you. Second, if after trying, you still can't solve a problem, you can seek help from the open-source community. But at that point, how to concisely explain your situation and goal to others becomes particularly important. I recommend reading the article [How To Ask Questions The Smart Way](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md), which not only increases the probability and efficiency of solving your problems but also keeps those who provide answers in the open-source community in a good mood.
**Learn to be a hacker**: [MIT-Missing-Semester](./编程入门/MIT-Missing-Semester.md) covers many useful tools for a hacker and provides detailed usage instructions. I strongly recommend beginners to study this course. However, one thing to note is that the course occasionally refers to terms related to the development process. Therefore, it is recommended to study it at least after completing an introductory computer science course.
**[GFW](./必学工具/翻墙.md)**: For well-known reasons, sites like Google and GitHub are not accessible in mainland China. However, in many cases, Google and StackOverflow can solve 99% of the problems encountered during development. Therefore, learning to use a VPN is almost an essential skill for a mainland CSer. (Considering legal issues, the methods provided in this book are only applicable to users with a Peking University email address).
**Command Line**: Proficiency in using the command line is often overlooked or considered difficult to master, but in reality, it greatly enhances your flexibility and productivity as an engineer. [The Art of Command Line](https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md) is a classic tutorial that started as a question on Quora, but with the contribution of many experts, it has become a top GitHub project with over 100,000 stars, translated into dozens of languages. The tutorial is not long, and I highly recommend everyone to read it repeatedly and internalize it through practice. Also, mastering shell script programming should not be overlooked, and you can refer to this [tutorial](https://www.shellscript.sh/).
**IDE (Integrated Development Environment)**: Simply put, it's where you write your code. The importance of an IDE for a programmer goes without saying, but many IDEs are designed for large-scale projects and are quite bulky and overly feature-rich. Nowadays, some lightweight text editors with rich plugin ecosystems can basically meet the needs of daily lightweight programming. My personal favorites are VS Code and Sublime (the former has a very simple plugin configuration, while the latter is a bit more complex but aesthetically pleasing). Of course, for large projects, I would still use slightly heavier IDEs, such as Pycharm (Python), IDEA (Java), etc. (Disclaimer: all IDEs are the best in the world).
**[Vim](./必学工具/Vim.md)**: A command-line editor. Vim has a somewhat steep learning curve, but mastering it, I think, is very necessary because it will greatly improve your development efficiency. Most modern IDEs also support Vim plugins, allowing you to retain the coolness of a geek while enjoying a modern development environment.
**[Emacs](./必学工具/Emacs.md)**: A classic editor that stands alongside Vim, with equally high development efficiency and more powerful expandability. It can be configured as a lightweight editor or expanded into a custom IDE, and even more sophisticated tricks.
**[Git](./必学工具/Git.md)**: A version control tool for your project. Git, created by the father of Linux, Linus, is definitely one of the must-have tools for every CS student.
**[GitHub](./必学工具/GitHub.md)**: A code hosting platform based on Git. The world's largest open-source community and a gathering place for CS experts.
**[GNU Make](./必学工具/GNU_Make.md)**: An engineering build tool. Proficiency in GNU Make will help you develop a habit of modularizing your code and familiarize you with the compilation and linking processes of large projects.
**[CMake](./必学工具/CMake.md)**: A more powerful build tool than GNU Make, recommended for study after mastering GNU Make.
**[LaTex](./必学工具/LaTeX.md)**: <del>Pretentious</del> Paper typesetting tool.
**[Docker](./必学工具/Docker.md)**: A lighter-weight software packaging and deployment tool compared to virtual machines.
**[Practical Toolkit](./必学工具/tools.md)**: In addition to the tools mentioned above that are frequently used in development, I have also collected many practical and interesting free tools, such as download tools, design tools, learning websites, etc.
**[Thesis](./必学工具/thesis.md)**: Tutorial for writing graduation thesis in Word.
## Recommended Books
> I believe a good textbook should be people-oriented, rather than a display of technical jargon. It's certainly important to tell readers "what it is," but a better approach would be for the author to integrate decades of experience in the field into the book and narratively convey to the reader "why it is" and what should be done in the future.
[Link here](./好书推荐.md)
## Environment Setup
> What you think of as development — coding frantically in an IDE for hours.
>
> Actual development — setting up the environment for several days without starting to code.
### PC Environment Setup
If you are a Mac user, you're in luck, as this [guide](https://sourabhbajaj.com/mac-setup/) will walk you through setting up the entire development environment. If you are a Windows user, thanks to the efforts of the open-source community, you can enjoy a similar experience with [Scoop](./必学工具/Scoop.md).
Additionally, you can refer to an [environment setup guide][guide] inspired by [6.NULL MIT-Missing-Semester](./编程入门/MIT-Missing-Semester.md), focusing on terminal beautification. It also includes common software sources (such as GitHub, Anaconda, PyPI) for acceleration and replacement, as well as some IDE configuration and activation tutorials.
[guide]: https://taylover2016.github.io/%E6%96%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97%EF%BC%88%E6%96%B0%E6%89%8B%E5%90%91%EF%BC%89/index.html
### Server-Side Environment Setup
Server-side operation and maintenance require basic use of Linux (or other Unix-like systems) and fundamental concepts like processes, devices, networks, etc. Beginners can refer to the [Linux 101](https://101.lug.ustc.edu.cn/) online notes compiled by the Linux User Association of the University of Science and Technology of China. If you want to delve deeper into system operation and maintenance, you can refer to the [Aspects of System Administration](https://stevens.netmeister.org/615/) course.
Additionally, if you need to learn a specific concept or tool, I recommend a great GitHub project, [DevOps-Guide](https://github.com/Tikam02/DevOps-Guide), which covers a lot of foundational knowledge and tutorials in the administration field, such as Docker, Kubernetes, Linux, CI-CD, GitHub Actions, and more.
## Course Map
> As mentioned at the beginning of this chapter, this course map is merely a **reference guide** for course planning, from my perspective as an undergraduate nearing graduation. I am acutely aware that I neither have the right nor the capability to preach to others about “how one should learn”. Therefore, if you find any issues with the course categorization and selection below, I fully accept and deeply apologize for them. You can tailor your own course map in the next section [Customize Your Own Course Map](#yourmap).
Apart from courses labeled as *basic* or *introductory*, there is no explicit sequence in the following categories. As long as you meet the prerequisites for a course, you are free to choose any course according to your needs and interests.
### Mathematical Foundations
#### Calculus and Linear Algebra
As a freshman, mastering calculus and linear algebra is as important as learning to code. This point has been reiterated countless times by predecessors, but I feel compelled to emphasize it again: mastering calculus and linear algebra is really important! You might complain that these subjects are forgotten after exams, but I believe that indicates a lack of deep understanding of their essence. If you find the content taught in class to be obscure, consider referring to MITs [Calculus Course](./数学基础/MITmaths.md) and [18.06: Linear Algebra](./数学基础/MITLA.md) course notes. For me, they greatly deepened my understanding of the essence of calculus and linear algebra. Also, I highly recommend the maths YouTuber [**3Blue1Brown**](https://www.youtube.com/c/3blue1brown), whose channel features videos explaining the core of mathematics with vivid animations, offering both depth and breadth of high quality.
#### Introduction to Information Theory
For computer science students, gaining some foundational knowledge in information theory early on is beneficial. However, most information theory courses are targeted towards senior or even graduate students, making them quite inaccessible to beginners. MITs [6.050J: Information theory and Entropy](./数学基础/information.md) is tailored for freshmen, with almost no prerequisites, covering coding, compression, communication, information entropy, and more, which is very interesting.
### Advanced Mathematics
#### Discrete Mathematics and Probability Theory
Set theory, graph theory, and probability theory are essential tools for algorithm derivation and proof, as well as foundations for more advanced mathematical courses. However, the teaching of these subjects often falls into a rut of being overly theoretical and formalistic, turning classes into mere recitations of theorems and conclusions without helping students grasp the essence of these theories. If theory teaching can be interspersed with examples of algorithm application, students can expand their algorithm knowledge while appreciating the power and charm of theory.
[UCB CS70: Discrete Math and Probability Theory](./数学进阶/CS70.md) and [UCB CS126: Probability Theory](./数学进阶/CS126.md) are UC Berkeleys probability courses. The former covers the basics of discrete mathematics and probability theory, while the latter delves into stochastic processes and more advanced theoretical content. Both emphasize the integration of theory and practice and feature abundant examples of algorithm application, with the latter including numerous Python programming assignments to apply probability theory to real-world problems.
#### Numerical Analysis
For computer science students, developing computational thinking is crucial. Modeling and discretizing real-world problems, and simulating and analyzing them on computers, are vital skills. Recently, the [Julia](https://julialang.org/) programming language, developed by MIT, has become popular in the field of numerical computation with its C-like speed and Python-friendly syntax. Many MIT mathematics courses have started using Julia as a teaching tool, presenting complex mathematical theories through clear and intuitive code.
[ComputationalThinking](https://computationalthinking.mit.edu/Spring21/) is an introductory course in computational thinking offered by MIT. All course materials are open source and accessible on the course website. Using the Julia programming language, the course covers image processing, social science and data science, and climatology modeling, helping students understand algorithms, mathematical modeling, data analysis, interactive design, and graph presentation. The course content, though not difficult, profoundly impressed me with the idea that the allure of science lies not in obscure theories or jargon but in presenting complex concepts through vivid examples and concise, deep language.
After completing this experience course, if youre still eager for more, consider MITs [18.330: Introduction to Numerical Analysis](./数学进阶/numerical.md). This course also uses Julia for programming assignments but is more challenging and in-depth. It covers floating-point encoding, root finding, linear systems, differential equations, and more, with the main goal of using discrete computer representations to estimate and approximate continuous mathematical concepts. The course instructor has also written an accompanying open-source textbook, [Fundamentals of Numerical Computation](https://fncbook.github.io/fnc/frontmatter.html), which includes abundant Julia code examples and rigorous formula derivations.
If youre still not satisfied, MITs graduate course in numerical analysis, [18.335: Introduction to Numerical Methods][18.335], is also available for reference.
[18.335]: https://ocw.mit.edu/courses/mathematics/18-335j-introduction-to-numerical-methods-spring-2019/index.htm
#### Differential Equations
Wouldn't it be cool if the motion and development of everything in the world could be described and depicted with equations? Although differential equations are not a mandatory part of any CS curriculum, I believe mastering them provides a new perspective to view the world.
Since differential equations often involve complex variable functions, you can refer to [MIT18.04: Complex Variables Functions][MIT18.04] course notes to fill in prerequisite knowledge.
[MIT18.04]: https://ocw.mit.edu/courses/mathematics/18-04-complex-variables-with-applications-spring-2018/
[MIT18.03: Differential Equations][MIT18.03] mainly covers the solution of ordinary differential equations, and on this basis, [MIT18.152: Partial Differential Equations][MIT18.152] dives into the modeling and solving of partial differential equations. With the powerful tool of differential equations, you will gain enhanced capabilities in modeling real-world problems and intuitively grasping the essence among various noisy variables.
[MIT18.03]: https://ocw.mit.edu/courses/mathematics/18-03sc-differential-equations-fall-2011/unit-i-first-order-differential-equations/
[MIT18.152]: https://ocw.mit.edu/courses/mathematics/18-152-introduction-to-partial-differential-equations-fall-2011/index.htm
### Advanced Mathematical Topics
As a computer science student, I often hear arguments about the uselessness of mathematics. While I neither agree nor have the authority to oppose such views, if everything is forcibly categorized as useful or useless, it indeed becomes quite dull. Therefore, the following advanced mathematics courses, aimed at senior and even graduate students, are available for those interested.
#### Convex Optimization
[Standford EE364A: Convex Optimization](./数学进阶/convex.md)
#### Information Theory
[MIT6.441: Information Theory](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-441-information-theory-spring-2016/syllabus/)
#### Applied Statistics
[MIT18.650: Statistics for Applications](https://ocw.mit.edu/courses/mathematics/18-443-statistics-for-applications-spring-2015/index.htm)
#### Elementary Number Theory
[MIT18.781: Theory of Numbers](https://ocw.mit.edu/courses/mathematics/18-781-theory-of-numbers-spring-2012/index.htm)
#### Cryptography
[Standford CS255: Cryptography](http://crypto.stanford.edu/~dabo/cs255/)
### Programming Fundamentals
> Languages are tools, and you choose the right tool for the right job. Since there's no universally perfect tool, there's no universally perfect language.
#### Shell
- [MIT-Missing-Semester](编程入门/MIT-Missing-Semester.md)
#### Python
- [CS50P: CS50's Introduction to Programming with Python](编程入门/CS50P.md)
- [Harvard CS50: This is CS50x](编程入门/CS50.md)
- [UCB CS61A: Structure and Interpretation of Computer Programs](编程入门/CS61A.md)
#### C++
- [Stanford CS106B/X: Programming Abstractions](编程入门/CS106B_CS106X.md)
- [Stanford CS106L: Standard C++ Programming](编程入门/CS106L.md)
#### Rust
- [Stanford CS110L: Safety in Systems Programming](编程入门/CS110L.md)
#### OCaml
- [Cornell CS3110 textbook: Functional Programming in OCaml](https://cs3110.github.io/textbook/cover.html)
### Electronics Fundamentals
#### Basics of Circuits
For computer science students, understanding basic circuit knowledge and experiencing the entire pipeline from sensor data collection to data analysis and algorithm prediction can be very helpful for future learning and developing computational thinking. [EE16A&B: Designing Information Devices and Systems I&II](./电子基础/EE16.md) at UC Berkeley are introductory courses for freshmen in electrical engineering. EE16A focuses on collecting and analyzing data from the real environment through circuits, while EE16B focuses on analyzing these collected data to make predictive actions.
#### Signals and Systems
Signals and Systems is a course I find very worthwhile. Initially, I studied it out of curiosity about Fourier Transform, but after completing it, I was amazed at how Fourier Transform provided a new perspective to view the world, just like differential equations, immersing you in the elegance and magic of precisely depicting the world with mathematics.
[MIT 6.003: Signal and Systems][MIT6.003] provides all course recordings, written assignments, and answers. You can also check out this course's [ancient version](电子基础/Signals_and_Systems_AVO.md).
[MIT6.003]: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-003-signals-and-systems-fall-2011/lecture-videos/lecture-1-signals-and-systems/
[UCB EE120: Signal and Systems](电子基础/signal.md) has very well-written notes on Fourier Transform and provides many interesting Python programming assignments to practically apply the theories and algorithms of signals and systems.
### Data Structures and Algorithms
Algorithms are the core of computer science and the foundation for almost all professional courses. How to abstract real-world problems into algorithmic problems mathematically and solve them under time and memory constraints using appropriate data structures is the eternal theme of algorithm courses. If you are fed up with your teacher's rote teaching, I highly recommend UC Berkeley's [UCB CS61B: Data Structures and Algorithms](数据结构与算法/CS61B.md) and Princeton's [Coursera: Algorithms I & II](数据结构与算法/Algo.md). Both courses are taught in a deep yet simple manner and have rich and interesting programming experiments to integrate theory with knowledge.
Both of these courses are based on Java. If you prefer C/C++, you can refer to Stanford's data structure and basic algorithm course [Stanford CS106B/X: Programming Abstractions](编程入门/CS106B_CS106X.md). For those who prefer Python, you can learn MIT's introductory algorithm course [MIT 6.006: Introduction to Algorithms](数据结构与算法/6.006.md).
For those interested in more advanced algorithms and NP problems, consider UC Berkeley's course on algorithm design and analysis [UCB CS170: Efficient Algorithms and Intractable Problems](数据结构与算法/CS170.md) or MIT's advanced algorithms course [MIT 6.046: Design and Analysis of Algorithms](数据结构与算法/6.046.md).
### Software Engineering
#### Introductory Course
There is a fundamental difference between “working” code and high-quality industrial code. Therefore, I highly recommend senior students to take [MIT 6.031: Software Construction](软件工程/6031.md). Based on Java, this course teaches how to write high-quality code that is **bug-resistant, clear, and easy to maintain and modify** with rich and detailed reading materials and well-designed programming exercises. From macro data structure design to minor details like how to write comments, following these details and experiences summarized by predecessors can greatly benefit your future programming career.
#### Professional Course
Of course, if you want to systematically take a software engineering course, I recommend UC Berkeleys [UCB CS169: Software Engineering](软件工程/CS169.md). However, unlike most software engineering courses, this course does not involve the traditional **design and document** model that emphasizes various class diagrams, flowcharts, and document design. Instead, it adopts the **Agile Development** model, which has become popular in recent years, featuring small team rapid iterations and the **Software as a Service** model using cloud platforms.
### Computer Architecture
#### Introductory Course
Since childhood, I've always heard that the world of computers is made of 0s and 1s, which I didn't understand but was deeply impressed by. If you also have this curiosity, consider spending one to two months learning the barrier-free computer course [Coursera: Nand2Tetris](体系结构/N2T.md). This comprehensive course starts from 0s and 1s, allowing you to build a computer by hand and run a Tetris game on it. It covers compilation, virtual machines, assembly, architecture, digital circuits, logic gates, etc., from top to bottom, from software to hardware. Its difficulty is carefully designed to omit many complex details of modern computers, extracting the most core essence, aiming to make it understandable to everyone. In lower levels, establishing a bird's-eye view of the entire computer system is very beneficial.
#### Professional Course
Of course, if you want to delve into the complex details of modern computer architecture, you still need to take a university-level course [UCB CS61C: Great Ideas in Computer Architecture](体系结构/CS61C.md). This course emphasizes practice, and you will hand-write assembly to construct neural networks in projects, build a CPU from scratch, and more, all of which will give you a deeper understanding of computer architecture, beyond the monotony of "fetch, decode, execute, memory access, write back."
### Introduction to Computer Systems
Computer systems are a vast and profound topic. Before delving into a specific area, having a macro conceptual understanding of each field and some general design principles will reinforce core and even philosophical concepts in your subsequent in-depth study, rather than being shackled by complex internal details and various tricks. In my opinion, the key to learning systems is to grasp these core concepts to design and implement your own systems.
[MIT6.033: System Engineering](http://web.mit.edu/6.033/www/) is MIT's introductory course to systems, covering topics like operating systems, networks, distributed systems, and system security. In addition to the theory, this course also teaches some writing and expression skills, helping you learn how to design, introduce, and analyze your own systems. The accompanying textbook *Principles of Computer System Design: An Introduction* is also very well written and recommended for reading.
[CMU 15-213: Introduction to Computer System](体系结构/CSAPP.md) is CMUs introductory systems course, covering architecture, operating systems, linking, parallelism, networks, etc., with both breadth and depth. The accompanying textbook *Computer Systems: A Programmer's Perspective* is also of very high quality and strongly recommended for reading.
### Operating Systems
> Theres nothing like writing your own kernel to deepen your understanding of operating systems.
Operating systems provide a set of elegant abstractions to virtualize various complex underlying hardware, providing rich functional support for all application software. Understanding the design principles and internal mechanisms of operating systems is greatly beneficial for a programmer who is not satisfied with just being a coder. Out of love for operating systems, I have taken many operating system courses in different colleges, each with its own focus and merits. You can choose based on your interests.
[MIT 6.S081: Operating System Engineering](操作系统/MIT6.S081.md), offered by the famous PDOS lab at MIT, features 11 projects that modify an elegantly implemented Unix-like operating system xv6. This course made me realize that systems is not about reading PPTs; it's about writing tens of thousands of lines of code.
[UCB CS162: Operating System](操作系统/CS162.md), UC Berkeleys operating system course, uses the same Project as Stanford — an educational operating system, Pintos. As the teaching assistant for Peking Universitys 2022 and 2023 Spring Semester Operating Systems Course, I introduced and improved this Project. The course resources are fully open-sourced, with details on [the course website](https://pku-os.github.io).
[NJU: Operating System Design and Implementation](操作系统/NJUOS.md), offered by Professor Yanyan Jiang at Nanjing University, provides an in-depth and accessible explanation of various operating system concepts, combining a unique system perspective with rich code examples. All course content is in Chinese, making it very convenient for students.
[HIT OS: Operating System](操作系统/HITOS.md), taught by Professor Zhijun Li at Harbin Institute of Technology, is a Chinese course on operating systems. Based on the Linux 0.11 source code, the course places great emphasis on code practice, explaining the intricacies of operating systems from the student's perspective.
### Parallel and Distributed Systems
In recent years, the most common phrase heard in CS lectures is "Moore's Law is coming to an end." As single-core capabilities reach their limits, multi-core and many-core architectures are becoming increasingly important. The changes in hardware necessitate adaptations and changes in the upper-level programming logic. Writing parallel programs has nearly become a mandatory skill for programmers to fully utilize hardware performance. Meanwhile, the rise of deep learning has brought unprecedented demands on computing power and storage, making the deployment and optimization of large-scale clusters a hot topic.
#### Parallel Computing
[CMU 15-418/Stanford CS149: Parallel Computing](并行与分布式系统/CS149.md)
#### Distributed Systems
[MIT 6.824: Distributed System](并行与分布式系统/MIT6.824.md)
### System Security
Whether you chose computer science because of a youthful dream of becoming a hacker, the reality is that becoming a hacker is a long and difficult journey.
#### Theoretical Courses
[UCB CS161: Computer Security](系统安全/CS161.md) at UC Berkeley covers stack attacks, cryptography, website security, network security, and more.
[ASU CSE365: Introduction to Cybersecurity](系统安全/CSE365.md) at Arizona State University focuses mainly on injections, assembly, and cryptography.
[ASU CSE466: Computer Systems Security](系统安全/CSE466.md) at Arizona State University covers a wide range of topics in system security. It has a high barrier to entry, requiring familiarity with Linux, C, and Python.
[SU SEED Labs](系统安全/SEEDLabs.md) at Syracuse University, supported by a $1.3 million grant from the NSF, has developed hands-on experimental exercises (called SEED Labs) for cybersecurity education. The course emphasizes both theoretical teaching and practical exercises, including detailed open-source lectures, video tutorials, textbooks (printed in multiple languages), and a ready-to-use virtual machine and Docker-based attack-defense environment. This project is currently used by 1,050 institutions worldwide and covers a wide range of topics in computer and information security, including software security, network security, web security, operating system security, and mobile app security.
#### Practical Courses
After mastering this theoretical knowledge, it's essential to cultivate and hone these "hacker skills" in practice. [CTF competitions](https://ctf-wiki.org/) are a popular way to comprehensively test your understanding and application of computer knowledge in various fields. Peking University also successfully held the [0th and 1st editions](https://geekgame.pku.edu.cn/), encouraging participation to improve skills through practice. Here are some resources I use for learning (and relaxing):
- [CTF-wiki](https://ctf-wiki.org/)
- [CTF-101](https://ctf101.org/)
- [Hacker-101](https://ctf.hacker101.com/)
### Computer Networks
> Theres nothing like writing your own TCP/IP protocol stack to deepen your understanding of computer networks.
The renowned [Stanford CS144: Computer Network](计算机网络/CS144.md) includes 8 projects that guide you in implementing the entire TCP/IP protocol stack.
If you're just looking to understand computer networks theoretically, I recommend the famous networking textbook "A Top-Down Approach" and its accompanying learning resources [Computer Networking: A Top-Down Approach](计算机网络/topdown.md).
### Database Systems
> Theres nothing like building your own relational database to deepen your understanding of database systems.
CMU's famous database course [CMU 15-445: Introduction to Database System](数据库系统/15445.md) guides you through 4 projects to add various functionalities to the educational relational database [bustub](https://github.com/cmu-db/bustub). The experimental evaluation framework is also open-source, making it very suitable for self-learning. The course experiments also use many new features of C++11, offering a great opportunity to strengthen C++ coding skills.
Berkeley, as the birthplace of the famous open-source database PostgreSQL, has its own course [UCB CS186: Introduction to Database System](数据库系统/CS186.md) where you will implement a relational database in Java that supports SQL concurrent queries, B+ tree indexing, and fault recovery.
### Compiler Theory
> Theres nothing like writing your own compiler to deepen your understanding of compilers.
[Stanford CS143: Compilers](编译原理/CS143.md) guides you through the process of writing a compiler.
### Web Development
Front-end development is often overlooked in computer science curricula, but mastering these skills has many benefits, such as building your personal website or creating an impressive presentation website for your course projects.
#### Two-Week Crash Course
[MIT web development course](Web开发/mitweb.md)
#### Systematic Study Version
[Stanford CS142: Web Applications](Web开发/CS142.md)
### Computer Graphics
- [Stanford CS148](计算机图形学/CS148.md)
- [Games101](计算机图形学/GAMES101.md)
- [Games103](计算机图形学/GAMES103.md)
- [Games202](计算机图形学/GAMES202.md)
### Data Science
Data science, machine learning, and deep learning are closely related, with a focus on practical application. Berkeley's [UCB Data100: Principles and Techniques of Data Science](数据科学/Data100.md) lets you master various data analysis tools and algorithms through extensive programming exercises. The course guides you through extracting desired results from massive datasets and making predictions about future data or user behavior. For those looking to learn industrial-level data mining and analysis techniques, Stanford's big data mining course [CS246: Mining Massive Data Sets](https://web.stanford.edu/class/cs246/) is an option.
### Artificial Intelligence
Artificial intelligence has been one of the hottest fields in computer science over the past decade. If you're not content with just hearing about AI advancements in the media and want to delve into the subject, I highly recommend Harvard's renowned CS50 series AI course [Harvard CS50: Introduction to AI with Python](人工智能/CS50.md). The course is concise and covers several major branches of traditional AI, supplemented with rich and interesting Python programming exercises to reinforce your understanding of AI algorithms. However, the content is somewhat simplified for online learners and doesn't delve into deep mathematical theories. For a more systematic and in-depth study, consider an undergraduate-level course like Berkeley's [UCB CS188: Introduction to Artificial Intelligence](人工智能/CS188.md). This course's projects feature the classic game "Pac-Man," allowing you to use AI algorithms to play the game, which is very fun.
### Machine Learning
The most significant recent progress in the field of machine learning is the emergence of deep learning, a branch based on deep neural networks. However, many algorithms based on statistical learning are still widely used in data analysis. If you're new to machine learning and don't want to get bogged down in complex mathematical proofs, start with Andrew Ng's (Enda Wu) [Coursera: Machine Learning](机器学习/ML.md). This course is well-known in the field of machine learning, and Enda Wu, with his profound theoretical knowledge and excellent presentation skills, makes many complex algorithms accessible and practical. The accompanying assignments are also of high quality, helping you get started quickly.
However, completing this course will only give you a general understanding of the field of machine learning. To truly understand the mathematical principles behind these "magical" algorithms or to engage in related research, you need a more "mathematical" course, such as [Stanford CS229: Machine Learning](机器学习/CS229.md) or [UCB CS189: Introduction to Machine Learning](机器学习/CS189.md).
### Deep Learning
The popularity of AlphaGo a few years ago brought deep learning to the public eye, leading many universities to establish related majors. Many other areas of computer science also use deep learning technology for research, so regardless of your field, you will likely encounter some needs related to neural networks and deep learning. For a quick introduction, I again recommend Andrew Ng's (Enda Wu) [Coursera: Deep Learning](深度学习/CS230.md), a top-rated course on Coursera. Additionally, if you find English-language courses challenging, consider Professor Hongyi Li's course [National Taiwan University: Machine Learning](深度学习/LHY.md). Although titled "Machine Learning," this course covers almost all areas of deep learning and is very comprehensive, making it suitable for getting a broad overview of the field. The professor is also very humorous, with frequent witty remarks in class.
Due to the rapid development of deep learning, there are now many research branches. For further in-depth study, consider the following representative courses:
### Computer Vision
- [UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision](深度学习/EECS498-007.md)
- [Stanford CS231n: CNN for Visual Recognition](深度学习/CS231.md)
### Natural Language Processing
- [Stanford CS224n: Natural Language Processing](深度学习/CS224n.md)
### Graph Neural Networks
- [Stanford CS224w: Machine Learning with Graphs](深度学习/CS224w.md)
### Reinforcement Learning
- [UCB CS285: Deep Reinforcement Learning](深度学习/CS285.md)
## Customize Your Course Map
> Better to teach fishing than to give fish.
The course map above inevitably carries strong personal preferences and may not suit everyone. It is more intended to serve as a starting point for exploration. If you want to select your own areas of interest for study, you can refer to the following resources:
- [MIT OpenCourseWare](https://ocw.mit.edu/): MIT's open-sharing project for course resources, featuring thousands of courses from various disciplines, including computer science courses numbered 6.xxx.
- [MIT CS Course List](http://student.mit.edu/catalog/m6a.html): List of CS courses at MIT.
- [UC Berkeley EECS Course Map](https://hkn.eecs.berkeley.edu/courseguides): UC Berkeley's EECS curriculum plan, presenting the categories and prerequisites of various courses in a course map format, most of which are included in this book.
- [UC Berkeley CS Course List](https://www2.eecs.berkeley.edu/Courses/CS/): List of CS courses at UC Berkeley.
- [Stanford CS Course List](https://blog.csdn.net/qq_41220023/article/details/81976967): List of CS courses at Stanford.

View File

@ -2,7 +2,7 @@
![Image title](./images/title.png){ width="600" }
</figure>
# Foreword
# **Foreword**
**The English version is still under development, please check [this issue](https://github.com/PKUFlyingPig/cs-self-learning/issues/222) if you want to contribute.**
@ -17,7 +17,7 @@ The book is currently organized to include the following sections (if you have o
- Book recommendations: Those who have read the CSAPP must have realized the importance of good books. I will list links to books and resources in different areas of Computer Science that I find rewarding to read.
- **List of high quality CS courses**: I will summarize all the high quality foreign CS courses I have taken into different categories and give relevant self-learning advice. Most of them will have a separate repository containing relevant resources as well as my homework/project implementations.
## The place where dreams start —— CS61A
## **The place where dreams start —— CS61A**
In my freshman year, I was a novice who knew nothing about computers. I installed a giant IDE Visual Studio and fight with OJ every day. With my high school maths background, I did pretty well in maths courses, but I felt struggled to learn courses in my major. When it came to programming, all I could do was open up that clunky IDE, create a new project that I didn't know exactly what it was for, and then `cin`, `cout`, `for` loops, and then CE, RE, WA loops. I was in a state where I was desperately trying to learn well but I didn't know how to learn. I listened carefully in class but I couldn't solve the homework problems. I spent almost all my spare time doing the homework after class, but the results were disappointing. I still retain the source code of the project for Introduction to Computing course —— a single 1200-line C++ file with no header files, no class abstraction, no unit tests, no makefile, no version control. The only good thing is that it can run, the disadvantage is the complement of "can run". For a while I wondered if I wasn't cut out for computer science, as all my childhood imaginings of geekiness had been completely ruined by my first semester's experience.
@ -41,9 +41,9 @@ Imagine that if someone could chew up the hard knowledge and present it to you i
If you think I'm exaggerating, start with [CS61A](https://cs61a.org/), because it's where my dreams began.
## Why write this book?
## **Why write this book?**
In the 2020 Fall semester, I worked as a teaching assistant for the class Introduction to Computer Systems at Peking University. At that time, I had been studying totally on my own for over a year. I enjoyed this style of learning immensely. To share this joy, I have made a [CS Self-learning Materials List](https://github.com/PKUFlyingPig/Self-learning-Computer-Science) for students in my seminar. It was purely on a whim at the time, as I wouldn't dare to encourage my students to skip classes and study on their own.
In the 2020 Fall semester, I worked as a teaching assistant for the class "Introduction to Computer Systems" at Peking University. At that time, I had been studying totally on my own for over a year. I enjoyed this style of learning immensely. To share this joy, I have made a [CS Self-learning Materials List](https://github.com/PKUFlyingPig/Self-learning-Computer-Science) for students in my seminar. It was purely on a whim at the time, as I wouldn't dare to encourage my students to skip classes and study on their own.
But after another year of maintenance, the list has become quite comprehensive, covering most of the courses in Computer Science, Artificial Intelligence and Soft Engineering, and I have built separate repositories for each course, summarising the self-learning materials that I used.
@ -53,7 +53,7 @@ If you can build up the whole CS foundation in less than three years, have relat
I firmly believe that if you have read to this line, you do not lack the ability and committment to learn CS well, you just need a good teacher to teach you a good course. And I will try my best to pick such courses for you, based on my three years of experience.
## Pros
## **Pros**
For me, the biggest advantage of self-learning is that I can adjust the pace of learning entirely according to my own progress. For difficult parts, I can watch the videos over and over again, Google it online and ask questions on StackOverflow until I have it all figured out. For those that I mastered relatively quickly, I could skip them at twice or even three times the speed.
@ -61,7 +61,7 @@ Another great thing about self-learning is that you can learn from different per
A third advantage of self-learning is that you do not need to go to the class, listening to the boring lectures.
## Cons
## **Cons**
Of course, as a big fan of self-learning, I have to admit that it has its disadvantages.
@ -71,16 +71,16 @@ The second thing is that these courses are basically in English. From the videos
The third, and I think the most difficult one, is self-discipline. Because have no DDL can sometimes be a really scary thing, especially when you get deeper, many foreign courses are quite difficult. You have to be self-driven enough to force yourself to settle down, read dozens of pages of Project Handout, understand thousands of lines of skeleton code and endure hours of debugging time. With no credits, no grades, no teachers, no classmates, just one belief - that you are getting better.
## Who is this book for?
## **Who is this book for?**
As I said in the beginning, anyone who is interested in learning computer science on their own can refer to this book. If you already have some basic skills and are just interested in a particular area, you can selectively pick and choose what you are interested in to study. Of course, if you are a novice who knows nothing about computers like I did back then, and just begin your college journey, I hope this book will be your cheat sheet to get the knowledge and skills you need in the least amount of time. In a way, this book is more like a course search engine ordered according to my experience, helping you to learn high quality CS courses from the world's top universities without leaving home.
Of course, as an undergraduate student who has not yet graduated, I feel that I am not in a position nor have the right to preach one way of learning. I just hope that this material will help those who are also self-motivated and persistent to gain a richer, more varied and satisfying college life.
## Special thanks
## **Special thanks**
I would like to express my sincere gratitude to all the professors who have made their courses public for free. These courses are the culmination of decades of their teaching careers, and they have chosen to selflessly make such a high quality CS education available to all. Without them, my university life would not have been as fulfilling and enjoyable. Many of the professors would even reply with hundreds of words in length after I had sent them a thank you email, which really touched me beyond words. They also inspired me all the time that if decide to do something, do it with all heart and soul.
## Want to join as a contributor?
## **Want to join as a contributor?**
There is a limit to how much one person can do, and this book was written by me under a heavy research schedule, so there are inevitably imperfections. In addition, as I work in the area of systems, many of the courses focus on systems, and there is relatively little content related to advanced mathematics, computing theory, and advanced algorithms. If any of you would like to share your self-learning experience and resources in other areas, you can directly initiate a Pull Request in the project, or feel free to contact me by email ([zhongyinmin@pku.edu.cn](mailto:zhongyinmin@pku.edu.cn)).

View File

@ -0,0 +1,26 @@
# ETH: Computer Architecture
## Course Overview
- University: ETH Zurich
- Prerequisites: [DDCA](https://csdiy.wiki/%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/DDCA/)
- Programming Language: C/C++, Verilog
- Difficulty Level: 🌟🌟🌟🌟
- Estimated Study Time: 70+ hours
This course, taught by Professor Onur Mutlu, delves into computer architecture. It appears to be an advanced course following [DDCA](https://csdiy.wiki/%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/DDCA/), aimed at teaching how to design control and data paths hardware for a MIPS-like processor, how to execute machine instructions concurrently through pipelining and simple superscalar execution, and how to design fast memory and storage systems. According to student feedback, the course is at least more challenging than CS61C, and some of its content is cutting-edge. Bilibili uploaders recommend it as a supplement to Carnegie Mellon University's 18-447 course. The reading materials provided are extensive, akin to attending a semester's worth of lectures.
The official website description is as follows:
> "We will learn the fundamental concepts of the different parts of modern computing systems, as well as the latest major research topics in Industry and Academia. We will extensively cover memory systems (including DRAM and new Non-Volatile Memory technologies, memory controllers, flash memory), new paradigms like processing-in-memory, parallel computing systems (including multicore processors, coherence and consistency, GPUs), heterogeneous computing, interconnection networks, specialized systems for major data-intensive workloads (e.g., graph analytics, bioinformatics, machine learning), etc. We will focus on fundamentals as well as cutting-edge research. Significant attention will be given to real-life examples and tradeoffs, as well as critical analysis of modern computing systems."
The programming practice involves using Verilog to design and simulate RT implementations of a MIPS-like pipeline processor to enhance theoretical course understanding. The initial experiments include Verilog CPU pipeline programming. Additionally, students will develop a cycle-accurate processor simulator in C and explore processor design options using this simulator.
## Course Resources
- Course Website: [2020 Fall](https://safari.ethz.ch/architecture/fall2022/doku.php?id=start), [2022 Fall](https://safari.ethz.ch/architecture/fall2022/doku.php?id=start)
- Course Videos: Official videos available on the course website. A [2020 version is available on Bilibili](https://www.bilibili.com/video/BV1Vf4y1i7YG/?vd_source=77d47fcb2bac41ab4ad02f265b3273cf).
- Course Textbooks: No designated textbook; each lecture has an extensive bibliography for reading.
- Course Assignments: 5 Projects, mostly related to memory and cache, detailed on the [lab page of the course website](https://safari.ethz.ch/architecture/fall2022/doku.php?id=labs).
## Resource Summary
Some universities in China have introduced this course, so interested students can find additional resources through online searches.

47
docs/使用指南.en.md Normal file
View File

@ -0,0 +1,47 @@
# **How to Use This Book**
As the number of contributors grows, the content of this book keeps expanding. It is impractical and unnecessary to try to complete all the courses in the book. Attempting to do so might even be counterproductive, resulting in effort without reward. To better align with our readers and make this book truly useful for you, I have roughly divided readers into the following three categories based on their needs. Everyone can plan their own self-study program accurately according to their actual situation.
## **Freshmen**
If you have just entered the university or are in the lower grades, and you are studying or planning to switch to computer science, then you are lucky. As studying is your main task, you have ample time and freedom to learn what you are interested in without the pressure of work and daily life. You needn't be overly concerned with utilitarian thoughts like "is it useful" or "can it help me find a job". So, how should you arrange your studies? The first point is to break away from the passive learning style formed in high school. As a small-town problem solver, I know that most Chinese high schools fill every minute of your day with tasks, and you just need to passively follow the schedule. As long as you are diligent, the results wont be too bad. However, once you enter university, you have much more freedom. All your extracurricular time is yours to use, and no one will organize knowledge points or summarize outlines for you. Exams are not as formulaic as in high school. If you still hold the mentality of a "good high school student", following everything step by step, the results may not be as expected. The professional training plan may not be reasonable, the teaching may not be responsible, attending classes may not guarantee understanding, and even the exam content may not relate to what was taught. Jokingly, you might feel that the whole world is against you, and you can only rely on yourself.
Given this reality, if you want to change it, you must first survive and have the ability to question it. In the lower grades, its important to lay a solid foundation. This foundation is comprehensive, covering both in-class knowledge and practical skills, which are often lacking in China's undergraduate computer science education. Based on personal experience, I offer the following suggestions for your reference.
First, learn how to write "elegant" code. Many programming introductory courses in China can be extremely boring syntax classes, less effective than reading official documentation. Initially, letting students understand what makes code elegant and what constitutes "bad taste" is beneficial. Introductory courses usually start with procedural programming (like C language), but even here, the concepts of **modularity** and **encapsulation** are crucial. If you write code just to pass on OpenJudge, using lengthy copy-pasting and bloated main functions, your code quality will remain poor. For larger projects, endless debugging and maintenance costs will overwhelm you. So, constantly ask yourself, is there a lot of repetitive code? Is the current function too complex (Linux advocates each function should do only one thing)? Can this code be abstracted into a function? Initially, this may seem cumbersome for simple problems, but remember, good habits are invaluable. Even middle school students can master C language, so why should a company hire you as a software engineer?
After procedural programming, the second semester of the freshman year usually introduces object-oriented programming (like C++ or Java). I highly recommend [MIT 6.031: Software Construction](软件工程/6031.md) course notes, which use Java (switch to TypeScript after 2022) to explain how to write “elegant” code in detail, including Test-Driven development, function Specification design, exception handling, and more. Also, understanding common design patterns is necessary when learning object-oriented programming. Domestic object-oriented courses can easily become dull syntax classes, focusing on inheritance syntax and puzzling questions, neglecting that these are rarely used in real-world development. The essence of object-oriented programming is teaching students to abstract real problems into classes and their relationships, and design patterns are the essence of these abstractions. I recommend the book ["Big Talk Design Patterns"](https://book.douban.com/subject/2334288/), which is very easy to understand.
Second, try to learn some productivity-enhancing tools and skills, such as Git, Shell, Vim. I strongly recommend the [MIT missing semester](编程入门/MIT-Missing-Semester.md) course. Initially, you may feel awkward, but force yourself to use them, and your development efficiency will skyrocket. Additionally, many applications can greatly increase your productivity. A rule of thumb is: any action that requires your hands to leave the keyboard should be eliminated. For example, switching applications, opening files, browsing the web - there are plugins for these (like [Alfred](https://www.alfredapp.com/) for Mac). If you find an daily operation that takes more than 1 second, try to reduce it to 0.1 seconds. After all, you'll be dealing with computers for decades, so forming a smooth workflow can greatly enhance efficiency. Lastly, learn to touch type! If you still need to look at the keyboard while typing, find a tutorial online and learn to type without looking. This will significantly increase your development efficiency.
Third, balance coursework and self-learning. We feel angry about the institution but must also follow the rules, as GPA is still important for postgraduate recommendations. Therefore, in the first year, I suggest focusing on the curriculum, complemented by high-quality extracurricular resources. For example, for calculus and linear algebra, refer to [MIT 18.01/18.02](./数学基础/MITmaths.md) and [MIT 18.06](./数学基础/MITLA.md). During holidays, learn Python through [UCB CS61A](./编程入门/CS61A.md). Also, focus on good programming habits and practical skills mentioned above. From my experience, mathematics courses matter a lot for your GPA in the first year, and the content of math exams varies greatly between different schools and teachers. Self-learning might help you understand the essence of mathematics, but it may not guarantee good grades. Therefore, its better to specifically practice past exams.
In your sophomore year, as computer science courses become the majority, you can fully immerse yourself in self-learning. Refer to [A Reference Guide for CS Learning](./CS学习规划.md), a guide I created based on three years of self-learning, introducing each course and its importance. For every course in your curriculum, this guide should have a corresponding one, and I believe they are of higher quality. If there are course projects, try to adapt labs or projects from these self-learning courses. For example, I took an operating systems course and found the teacher was still using experiments long abandoned by UC Berkeley, so I emailed the teacher to switch to the [MIT 6.S081](./操作系统/MIT6.S081.md) xv6 Project I was studying. This allowed me to self-learn while inadvertently promoting curriculum reform. In short, be flexible. Your goal is to master knowledge in the most convenient and efficient way. Anything that contradicts this goal can be “fudged” as necessary. With this attitude, after my junior year, I barely attended offline classes (I spent most of my sophomore year at home due to the pandemic), and it had no impact on my GPA.
Finally, I hope everyone can be less impetuous and more patient in their pursuit. Many ask if self-learning requires strong self-discipline. It depends on what you want. If you still hold the illusion that mastering a programming language will earn you a high salary and a share of the internets profits, then whatever I say is pointless. Initially, my motivation was out of pure curiosity and a natural desire for knowledge, not for utilitarian reasons. The process didn't involve “extraordinary efforts”; I spent my days in college as usual and gradually accumulated this wealth of materials. Now, as the US-China confrontation becomes a trend, we still humbly learn techniques from the West. Who will change this? You, the newcomers. So, go for it, young man!
## **Simplify the Complex**
If you have graduated and started postgraduate studies, or have begun working, or are in another field and want to learn coding in your spare time, you may not have enough time to systematically complete the materials in [A Reference Guide for CS Learning](./CS学习规划.md), but still want to fill the gaps in your undergraduate foundation. Considering that these readers usually has some programming experience, there is no need to repeat introductory courses. From a practical standpoint, since the general direction of work is already determined, there is no need to deeply study every branch of computer science. Instead, focus on general principles and skills. Based on my own experience, I've selected the most important and highest quality core professional courses to deepen readers' understanding of computer science. After completing these courses, regardless of your specific job, I believe you won't just be an ordinary coder, but will have a deeper understanding of the underlying logic of computers.
| Course Direction | Course Name |
|---------------------|------------------------------------------------------|
| Discrete Mathematics and Probability Theory | [UCB CS70: Discrete Math and Probability Theory](数学进阶/CS70.md) |
| Data Structures and Algorithms | [Coursera: Algorithms I & II](数据结构与算法/Algo.md) |
| Software Engineering | [MIT 6.031: Software Construction](软件工程/6031.md) |
| Full-Stack Development | [MIT Web Development Course](Web开发/mitweb.md) |
| Introduction to Computer Systems | [CMU CS15213: CSAPP](Web开发/mitweb.md) |
| Introductory System Architecture | [Coursera: Nand2Tetris](体系结构/N2T.md) |
| Advanced System Architecture | [CS61C: Great Ideas in Computer Architecture](体系结构/CS61C.md) |
| Principles of Databases | [CMU 15-445: Introduction to Database Systems](数据库系统/15445.md) |
| Computer Networking | [Computer Networking: A Top-Down Approach](计算机网络/topdown.md) |
| Artificial Intelligence | [Harvard CS50: Introduction to AI with Python](人工智能/CS50.md) |
| Deep Learning | [Coursera: Deep Learning](深度学习/CS230.md) |
## **Focused and Specialized**
If you have a solid grasp of the core professional courses in computer science and have already determined your work or research direction, then there are many courses in the book not mentioned in [A Reference Guide for CS Learning](./CS学习规划.md) for you to explore.
As the number of contributors increases, new branches such as **Advanced Machine Learning** and **Machine Learning Systems** will be added to the navigation bar. Under each branch, there are several similar courses from different schools with different emphases and experiments, such as the **Operating Systems** branch, which includes courses from MIT, UC Berkeley, Nanjing University, and Harbin Institute of Technology. If you want to delve into a field, studying these similar courses will give you different perspectives on similar knowledge. Additionally, I plan to contact researchers in related fields to share research learning paths in specific subfields, enhancing the depth of the CS Self-learning Guide while pursuing breadth.
If you want to contribute in this area, feel free to contact the author via email [zhongyinmin@pku.edu.cn](mailto:zhongyinmin@pku.edu.cn).

View File

@ -10,7 +10,7 @@
其一就是了解如何写“优雅”的代码。国内的很多大一编程入门课都会讲成极其无聊的语法课,其效果还不如直接让学生看官方文档。事实上,在刚开始接触编程的时候,让学生试着去了解什么样的代码是优雅的,什么样的代码 "have bad taste" 是大有裨益的。一般来说,编程入门课会先介绍过程式编程(例如 C 语言)。但即便是面向过程编程,**模块化** 和 **封装** 的思想也极其重要。如果你只想着代码能在 OpenJudge 上通过,写的时候图省事,用大段的复制粘贴和臃肿的 main 函数,长此以往,你的代码质量将一直如此。一旦接触稍微大一点的项目,无尽的 debug 和沟通维护成本将把你吞没。因此写代码时不断问自己是否有大量重复的代码当前函数是否过于复杂Linux 提倡每个函数只需要做好一件事这段代码能抽象成一个函数吗一开始你可能觉得很不习惯甚至觉得这么简单的题需要如此大费周章吗但记住好的习惯是无价的C 语言初中生都能学会,凭什么公司要招你去当程序员呢?
学过面向过程编程后,大一下学期一般会讲面向对象编程(例如 C++ 或 Java。这里非常推荐大家看 [MIT 6.031: Software Construction](./软件工程/6031.md) 这门课的 Notes会以 Java 语言为例非常详细地讲解如何写出“优雅”的代码。例如 Test-Driven 的开发、函数 Specification 的设计、异常的处理等等等等。除此之外,既然接触了面向对象,那么了解一些常见的设计模式也是很有必要的。因为国内的面向对象课程同样很容易变成极其无聊的语法课,让学生纠结于各种继承的语法,甚至出一些无聊的脑筋急转弯一样的题目,殊不知这些东西在地球人的开发中基本不会用到。面向对象的精髓是让学生学会自己将实际的问题抽象成若干类和它们之间的关系,而设计模式则是前人总结出来的一些精髓的抽象方法。这里推荐[大话设计模式](https://book.douban.com/subject/2334288/) 这本书,写得非常浅显易懂。
学过面向过程编程后,大一下学期一般会讲面向对象编程(例如 C++ 或 Java。这里非常推荐大家看 [MIT 6.031: Software Construction](./软件工程/6031.md) 这门课的 Notes会以 Java 语言22年改用了 TypeScript 语言)为例非常详细地讲解如何写出“优雅”的代码。例如 Test-Driven 的开发、函数 Specification 的设计、异常的处理等等等等。除此之外,既然接触了面向对象,那么了解一些常见的设计模式也是很有必要的。因为国内的面向对象课程同样很容易变成极其无聊的语法课,让学生纠结于各种继承的语法,甚至出一些无聊的脑筋急转弯一样的题目,殊不知这些东西在地球人的开发中基本不会用到。面向对象的精髓是让学生学会自己将实际的问题抽象成若干类和它们之间的关系,而设计模式则是前人总结出来的一些精髓的抽象方法。这里推荐[大话设计模式](https://book.douban.com/subject/2334288/) 这本书,写得非常浅显易懂。
其二就是尝试学习一些能提高生产力的工具和技能,例如 Git、Shell、Vim。这里强烈推荐学习 [MIT missing semester](./编程入门/MIT-Missing-Semester.md) 这门课,也许一开始接触这些工具用起来会很不习惯,但强迫自己用,熟练之后开发效率会直线提高。此外,还有很多应用也能极大提高的你生产力。一条定律是:一切需要让手离开键盘的操作,都应该想办法去除。例如切换应用、打开文件、浏览网页这些都有相关插件可以实现快捷操作(例如 Mac 上的 [Alfred](https://www.alfredapp.com/)。如果你发现某个操作每天都会用到并且用时超过1秒那就应该想办法把它缩减到0.1秒。毕竟以后数十年你都要和电脑打交道,形成一套顺滑的工作流是事半功倍的。最后,学会盲打!如果你还需要看着键盘打字,那么赶紧上网找个教程学会盲打,这将极大提高你的开发效率。

View File

@ -0,0 +1,17 @@
# GitHub
## What is GitHub
Functionally, GitHub is an online platform for hosting code. You can host your local Git repositories on GitHub for collaborative development and maintained by a group. However, GitHub's significance has evolved far beyond that. It has become a very active and resource-rich open-source community. Developers from all over the world share a wide variety of open-source software on GitHub. From industrial-grade deep learning frameworks like PyTorch and TensorFlow to practical scripts consisting of just a few lines of code, GitHub offers hardcore knowledge sharing, beginner-friendly tutorials, and even many technical books are open-sourced here (like the one you're reading now). Browsing GitHub has become a part of my daily life.
On GitHub, stars are the ultimate affirmation for a project. If you find this book useful, you are welcome to enter the repository's homepage via the link in the upper right corner and give your precious star✨.
## How to Use GitHub
If you have never created your own remote repository on GitHub or cloned someone else's code, I suggest you start your open-source journey with [GitHub's official tutorial](https://docs.github.com/en/get-started).
If you want to keep up with some interesting open-source projects on GitHub, I highly recommend the [HelloGitHub](https://hellogithub.com/) website. It regularly features GitHub's recently trending or very interesting open-source projects, giving you the opportunity to access various quality resources firsthand.
I believe GitHub's success is due to the "one for all, all for one" spirit of open source and the joy of sharing knowledge. If you also want to become the next revered open-source giant or the author of a project with tens of thousands of stars, then transform your ideas that spark during development into code and showcase them on GitHub.
However, it's important to note that the open-source community is not lawless. Many open-source softwares are not meant for arbitrary copying, distribution, or even sale. Understanding various [open-source licenses](https://www.runoob.com/w3cnote/open-source-license.html) and complying with them is not only a legal requirement but also the responsibility of every member of the open-source community.

View File

@ -0,0 +1,32 @@
# LaTeX
## Why Learn LaTeX
If you need to write academic papers, please skip directly to the next section, as learning LaTeX is not just a choice but a necessity.
LaTeX is a typesetting system based on TeX, developed by Turing Award winner Lamport, while TeX was originally developed by Knuth, both of whom are giants in the field of computer science. Of course, the developers' prowess is not the reason we learn LaTeX. The biggest difference between LaTeX and the commonly used WYSIWYG (What You See Is What You Get) Word documents is that in LaTeX, users only need to focus on the content of the writing, leaving the typesetting entirely to the software. This allows people without any typesetting experience to produce papers or articles with highly professional formatting.
Berkeley computer science professor Christos Papadimitriou once jokingly said:
> Every time I read a LaTeX document, I think, wow, this must be correct!
## How to Learn LaTeX
The recommended learning path is as follows:
- Setting up the LaTeX environment can be a headache. If you encounter problems with configuring LaTeX locally, consider using [Overleaf], an online LaTeX editor. The site not only offers a variety of LaTeX templates to choose from but also eliminates the difficulty of environment setup.
- Read the following three tutorials: [Part-1], [Part-2], [Part-3].
- The best way to learn LaTeX is, of course, by writing papers. However, starting with a math class and using LaTeX for homework is also a good choice.
[Overleaf]: https://www.overleaf.com
[Part-1]: https://www.overleaf.com/latex/learn/free-online-introduction-to-latex-part-1
[Part-2]: https://www.overleaf.com/latex/learn/free-online-introduction-to-latex-part-2
[Part-3]: https://www.overleaf.com/latex/learn/free-online-introduction-to-latex-part-3
Other recommended introductory materials include:
- A brief guide to installing LaTeX [[GitHub](https://github.com/OsbertWang/install-latex-guide-zh-cn)] or the TEX Live Guide (texlive-zh-cn) [[PDF](https://www.tug.org/texlive/doc/texlive-zh-cn/texlive-zh-cn.pdf)] can help you with installation and environment setup.
- A (not so) brief introduction to LaTeX2ε (lshort-zh-cn) [[PDF](https://mirrors.ctan.org/info/lshort/chinese/lshort-zh-cn.pdf)] [[GitHub](https://github.com/CTeX-org/lshort-zh-cn)], translated by the CTEX development team, helps you get started quickly and accurately. It's recommended to read it thoroughly.
- Liu Haiyang's "Introduction to LaTeX" can be used as a reference book, to be consulted when you have specific questions. Skip the section on CTEX suite.
- [Modern LaTeX Introduction Seminar](https://github.com/stone-zeng/latex-talk)
- [A Very Short LaTeX Introduction Document](https://liam.page/2014/09/08/latex-introduction/)

View File

@ -0,0 +1,50 @@
# Scoop
## Why Use Scoop
Setting up a development environment in Windows has always been a complex and challenging task. The lack of a unified standard means that the installation methods for different development environments vary greatly, resulting in unnecessary time costs. Scoop helps you uniformly install and manage common development software, eliminating the need for manual downloads, installations, and environment variable configurations.
For example, to install Python and Node.js, you just need to execute:
```powershell
scoop install python
scoop install nodejs
```
## Installing Scoop
Scoop requires [Windows PowerShell 5.1](https://aka.ms/wmf5download) or [PowerShell](https://aka.ms/powershell) as its runtime environment. If you are using Windows 10 or later, Windows PowerShell is built into the system. However, the version of Windows PowerShell built into Windows 7 is outdated, and you will need to manually install a newer version of PowerShell.
> Many students have encountered issues due to setting up Windows user accounts with Chinese usernames, leading to user directories also being named in Chinese. Installing software via Scoop into user directories in such cases may cause some software to execute incorrectly. Therefore, it is recommended to install in a custom directory. For other installation methods, please refer to: [ScoopInstaller/Install](https://github.com/ScoopInstaller/Install)
```powershell
# Set PowerShell execution policy
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Download the installation script
irm get.scoop.sh -outfile 'install.ps1'
# Run the installation, use --ScoopDir parameter to specify Scoop installation path
.\install.ps1 -ScoopDir 'C:\Scoop'
```
## Using Scoop
Scoop's official documentation is very user-friendly for beginners. Instead of elaborating here, it is recommended to read the [official documentation](https://github.com/ScoopInstaller/Scoop) or the [Quick Start guide](https://github.com/ScoopInstaller/Scoop/wiki/Quick-Start).
## Q&A
### Can Scoop Configure Mirror Sources?
The Scoop community only maintains installation configurations, and all software is downloaded from the official download links provided by the software's creators. Therefore, mirror sources are not provided. If your network environment causes repeated download failures, you may need a bit of [magic](翻墙.md).
### Why Can't I Find Java 8?
For the same reasons mentioned above, the official download links for Java 8 are no longer provided. It is recommended to use [ojdkbuild8](https://github.com/ScoopInstaller/Java/blob/master/bucket/ojdkbuild8.json) as a substitute.
### How Do I Install Python 2?
For software that is outdated and no longer in use, the Scoop community removes it from [ScoopInstaller/Main](https://github.com/ScoopInstaller/Main) and adds it to [ScoopInstaller/Versions](https://github.com/ScoopInstaller/Versions). If you need such software, you need to manually add the bucket:
```powershell
scoop bucket add versions
scoop install python27
```

View File

@ -0,0 +1,15 @@
# Thesis Writing
## Why I Wrote This Tutorial
In 2022, I graduated from my college. When I started writing my thesis, I embarrassingly realized that my command of Word was limited to basic functions like adjusting fonts and saving documents. I considered switching to LaTeX, but formatting requirements for the thesis were more conveniently handled in Word. After a painful struggle, I finally completed the writing and defense of my thesis. To prevent others from following in my footsteps, I compiled relevant resources into a ready-to-use document for everyone's reference.
## How to Write a Graduation Thesis in Word
Just as it takes three steps to put an elephant in a fridge, writing a graduation thesis in Word also requires three simple steps:
1. **Determine the Format Requirements of the Thesis**: Usually, colleges will provide the formatting requirements for theses (font and size for headings, sections, formatting of figures and citations, etc.), and if you're lucky, they might even provide a thesis template (if so, jump to the next step). Unfortunately, my college did not issue standard format requirements and provided a chaotic and almost useless template. Out of desperation, I found the [thesis format requirements](https://github.com/PKUFlyingPig/Thesis-Template/blob/master/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6%E7%A0%94%E7%A9%B6%E7%94%9F%E5%AD%A6%E4%BD%8D%E8%AE%BA%E6%96%87%E5%86%99%E4%BD%9C%E6%8C%87%E5%8D%97.pdf) of Peking University graduate students and created [a template](https://github.com/PKUFlyingPig/Thesis-Template/blob/master/%E8%AE%BA%E6%96%87%E6%A8%A1%E7%89%88.docx) based on their guidelines. Feel free to use it, but I take no responsibility for any issues for using it.
2. **Learn Word Formatting**: At this stage, you either have a standard template provided by your college or just a vague set of formatting requirements. Now, the priority is to learn basic Word formatting skills. If you have a template, learn to use it; if not, learn to create one. Remember, there's no need to ambitiously start with a lengthy Word tutorial video. A half-hour tutorial is enough to get started for creating a passable academic paper. I watched [a concise and practical Bilibili tutorial video](https://www.bilibili.com/video/BV1YQ4y1M73G?p=1&vd_source=a4d76d1247665a7e7bec15d15fd12349), which is very useful for a quick start.
3. **Produce Academic Work**: The easiest step. Everyone has their own way, so unleash your creativity. Best wishes for a smooth graduation!

View File

@ -0,0 +1,100 @@
# Practical Toolbox
## Download Tools
- [Sci-Hub](https://sci-hub.se/): A revolutionary site aiming to break knowledge barriers, greeted by the goddess Elbakyan.
- [Library Genesis](http://libgen.is/): A website for downloading e-books.
- [Z-library](https://zlibrary-global.se/): An e-book download site (works better under [Tor](https://www.torproject.org/), [link](http://loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion/)).
- [Z-ePub](https://z-epub.com/): ePub e-book download site.
- [PDF Drive](https://www.pdfdrive.com/): A PDF e-book search engine.
- [MagazineLib](https://magazinelib.com/): A site for downloading PDF e-magazines.
- [BitDownloader](https://bitdownloader.io/): YouTube video downloader.
- [qBittorrent](https://www.qbittorrent.org/download.php): A BitTorrent client.
- [uTorrent](https://www.utorrent.com): Another BitTorrent client.
- [National Standard Information Public Service Platform](https://std.samr.gov.cn/): Official platform for querying and downloading various standards.
- [Standard Knowledge Service System](http://www.standards.com.cn/): Search and read the standards you need.
- [MSDN, I Tell You](https://msdn.itellyou.cn/): A site for downloading Windows OS images and other software.
## Design Tools
- [excalidraw](https://excalidraw.com/): A hand-drawn style drawing tool, great for creating diagrams in course reports or PPTs.
- [tldraw](https://www.tldraw.com/): A drawing tool suitable for flowcharts, architecture diagrams, etc.
- [draw.io](https://app.diagrams.net/): A powerful and concise online drawing website, supports flowcharts, UML diagrams, architecture diagrams, prototypes, etc., with export options for Onedrive, Google Drive, Github, and offline client availability.
- [origamiway](https://www.origamiway.com/paper-folding-crafts-step-by-step.shtml): Step-by-step origami tutorials.
- [thingiverse](https://www.thingiverse.com/): Includes various 2D/3D design resources, with STL files ready for 3D printing.
- [iconfont](https://www.iconfont.cn/): The largest icon and illustration library in China, useful for development or drawing system architecture diagrams.
- [turbosquid](https://www.turbosquid.com/): A platform to purchase various models.
- [flaticon](https://www.flaticon.com/): A site to download free and high-quality icons.
- [Standard Map Service System](http://bzdt.ch.mnr.gov.cn/): Official standard map downloads.
- [PlantUML](https://plantuml.com/zh/): Quickly write UML diagrams using code.
## Programming Related
- [sqlfiddle](http://www.sqlfiddle.com/): An easy-to-use online SQL Playground.
- [sqlzoo](https://sqlzoo.net/wiki/SQL_Tutorial): Practice SQL statements online.
- [godbolt](https://godbolt.org/): A convenient compiler exploration tool. Write some C/C++ code, choose a compiler, and observe the specific assembly code generated.
- [explainshell](https://explainshell.com/): Struggling with the meaning of a shell command? Try this site!
- [regex101](https://regex101.com/): A regex debugging site supporting various programming language standards.
- [typingtom](https://www.typingtom.com/lessons): Typing practice/speed test site for programmers.
- [wrk](https://github.com/wg/wrk): Website stress testing tool.
- [gbmb](https://www.gbmb.org/): Data unit conversion tool.
- [tools](https://tools.fun/): A collection of online tools.
- [github1s](https://github1s.com/): Read GitHub code online with a web-based VS Code.
- [visualgo](https://visualgo.net/en): Algorithm visualization website.
- [DataStructureVisual](http://www.rmboot.com/): Data structure visualization website.
- [Data Structure Visualizations](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html): Visualization website for data structures and algorithms.
- [learngitbranching](https://learngitbranching.js.org/?locale=zh_CN): Visualize learning git.
- [UnicodeCharacter](https://unicode-table.com/en/): Unicode character set website.
## Learning Websites
- [HFS](https://hepsoftwarefoundation.org/training/curriculum.html): Various software tutorials.
- [Shadertoy](https://www.shadertoy.com/): Write various shaders.
- [comments-for-awesome-courses](https://conanhujinming.github.io/comments-for-awesome-courses/): Reviews of open courses from prestigious universities.
- [codetop](https://codetop.cc/home): Corporate problem bank.
- [cs-video-courses](https://github.com/Developer-Y/cs-video-courses): List of computer science courses with video lectures.
- [bootlin](https://elixir.bootlin.com/linux/v2.6.39.4/source/include/linux): Read Linux source code online.
- [ecust-CourseShare](https://github.com/tianyilt/ecnu-PGCourseShare): East China Normal University graduate course strategy sharing project.
- [REKCARC-TSC-UHT](https://github.com/PKUanonym/REKCARC-TSC-UHT): Tsinghua University computer science course strategy.
- [seu-master](https://github.com/oneman233/seu-master): Southeast University graduate course materials.
- [Runoob](https://www.runoob.com/): Brief tutorials on computer-related knowledge.
- [FreeBSD From Entry to Run Away](https://book.bsdcn.org/): A Chinese tutorial on FreeBSD.
- [MDN Web Docs](https://developer.mozilla.org/zh-CN/docs/Learn): MDN's beginner's guide to web development.
- [Hello Algorithm](https://www.hello-algo.com/): A quick introductory tutorial on data structures and algorithms with animations, runnable examples, and Q&A.
## Encyclopedic/Dictionarial Websites
- [os-wiki](https://wiki.osdev.org/Main_Page): An encyclopedia of operating system technology resources.
- [FreeBSD Documentation](https://docs.freebsd.org/en/): Official FreeBSD documentation.
- [Python3 Documentation](https://docs.python.org/zh-cn/3/): Official Chinese documentation for Python3.
- [C++ Reference](https://en.cppreference.com/w/): C++ reference manual.
- [OI Wiki](https://oi-wiki.org/): An integrated site for programming competition knowledge.
- [Microsoft Learn](https://learn.microsoft.com/zh-cn/): Microsoft's official learning platform, containing most Microsoft product documentation.
- [Arch Wiki](https://wiki.archlinux.org/): Wiki written for Arch Linux, containing a lot of Linux-related knowledge.
- [Qt Wiki](https://wiki.qt.io/Main): Official Qt Wiki.
- [OpenCV Chinese Documentation](https://opencv.apachecn.org/#/): Community version of OpenCV's Chinese documentation.
- [npm Docs](https://docs.npmjs.com/): Official npm documentation.
## Communication Platforms
- [GitHub](https://github.com/): Many open-source projects' hosting platform, also a major communication platform for many open-source projects, where issues can solve many problems.
- [StackExchange](https://stackexchange.com/): A programming community composed of 181 Q&A communities (including Stack Overflow).
- [StackOverflow](https://stackoverflow.com/): An IT technical Q&A site related to programming.
- [Gitee](https://gitee.com/): A code hosting platform similar to GitHub, where you can find solutions to common questions in the issues of corresponding projects.
- [Zhihu](https://www.zhihu.com/): A Q&A community similar to Quora, where you can ask questions, with some answers containing computer knowledge.
- [Cnblogs](https://www.cnblogs.com/): A knowledge-sharing community for developers, containing blogs on common questions. Accuracy is not guaranteed, please use with caution.
- [CSDN](https://blog.csdn.net/): Contains blogs on common questions. Accuracy is not guaranteed, please use with caution.
## Miscellaneous
- [tophub](https://tophub.today/): A collection of trending news headlines (aggregating from Zhihu, Weibo, Baidu, WeChat, etc.).
- [feedly](https://feedly.com/): A famous RSS feed reader.
- [speedtest](https://www.speedtest.net/zh-Hans): An online network speed testing website.
- [public-apis](https://github.com/public-apis/public-apis): A collective list of free APIs for development.
- [numberempire](https://zh.numberempire.com/derivativecalculator.php): A tool for calculating derivatives of functions.
- [sustech-application](https://sustech-application.com/#/grad-application/computer-science-and-engineering/README): Southern University of Science and Technology experience sharing website.
- [vim-adventures](https://vim-adventures.com/): An online game based on vim keyboard shortcuts.
- [vimsnake](https://vimsnake.com/): Play the snake game using vim commands.
- [keybr](https://www.keybr.com/): A website for learning touch typing.
- [Awesome C++](https://cpp.libhunt.com/): A curated list of awesome C/C++ frameworks, libraries, resources.
- [HelloGitHub](https://hellogithub.com/): Shares interesting and beginner-friendly open-source projects on GitHub.

View File

@ -0,0 +1,121 @@
> Contributed by [@HardwayLinka](https://github.com/HardwayLinka)
The field of computer science is vast and rapidly evolving, making lifelong learning crucial. However, our sources of knowledge in daily development and learning are complex and fragmented. We encounter extensive documentation manuals, brief blogs, and even snippets of news and public accounts on our phones that may contain interesting knowledge. Therefore, it's vital to use various tools to create a learning workflow that suits you, integrating these knowledge fragments into your personal knowledge base for easy reference and review. After two years of learning alongside work, I have developed the following learning workflow:
![](https://raw.githubusercontent.com/HardwayLinka/image/master/Drawing 2022-10-20 11.23.41.excalidraw.png)
## Core Logic
Initially, when learning new knowledge, I referred to Chinese blogs but often found bugs and gaps in my code practice. Gradually, I realized that the information I referred to might be incorrect, as the threshold for posting blogs is low and their credibility is not high. So, I started consulting some related Chinese books.
Chinese books indeed provide a comprehensive and systematic explanation of concepts. However, given the rapid evolution of computer technology and the US's leadership in CS, content in Chinese books often lags behind the latest knowledge. This led me to realize the importance of firsthand information. Some Chinese books are translations of English ones, and translation can take a year or two, causing a delay in information transmission and loss during translation. If a Chinese book is not a translation, it likely references other books, introducing biases in interpreting the original English text.
Therefore, I naturally started reading English books. The quality of English books is generally higher than that of Chinese ones. As I delved deeper into my studies, I discovered a hierarchy of information reliability: `source code` > `official documentation` > `English books` > `English blogs` > `Chinese blogs`. This led me to create an "Information Loss Chart":
![](https://cdn.sspai.com/2022/10/11/bf07c1965a2e5bdf3f00644737789e2e.png)
Although firsthand information is crucial, subsequent iterations (N-th hand information) are not useless. They include the author's transformation of the source knowledge — such as logical organization (flow charts, mind maps) or personal interpretations (abstractions, analogies, extensions to other knowledge points). These transformations can help us quickly grasp and consolidate core knowledge, like using guidebooks in school. Moreover, interacting with others' interpretations during learning is important, allowing us to benefit from various perspectives. Hence, it's advisable to first choose high-quality, less distorted sources of information while also considering multiple sources for a more comprehensive and accurate understanding.
In real-life work and study, learning rarely follows a linear, deep dive into a single topic. Often, it involves other knowledge points, such as new jargon, classic papers not yet read, or unfamiliar code snippets. This requires us to think deeply and "recursively" learn, establishing connections between multiple knowledge points.
## Choosing the Right Note-taking Software
The backbone of the workflow is built around the core logic of "multiple references for a single knowledge point and building connections among various points." This is similar to writing academic papers. Papers usually have footnotes explaining keywords and multiple references at the end. But our daily notes are much more casual, hence the need for a more flexible method.
I'm accustomed to jumping to related functions and implementations in an IDE. It would be great if notes could also be interlinked like code. Current "double-link note-taking software," such as Roam Research, Logseq, Notion, and Obsidian, addresses this need. I chose Obsidian for the following reasons:
- Obsidian is based locally, with fast opening speeds, and can store many e-books. My laptop, an Asus TUF Gaming FX505 with 32GB of RAM, runs Obsidian very smoothly.
- Obsidian is Markdown-based. This is an advantage because if a note-taking software uses a proprietary format, it's inconvenient for third-party extensions and opening notes with other software.
- Obsidian has a rich and active plugin ecosystem, allowing for an "all in one" effect, meaning various knowledge sources can be integrated in one place.
## Information Sources
Obsidian's plugins support PDF formats, and it naturally supports Markdown. To achieve "all in one," you can convert other file formats to PDF or Markdown. This presents two questions:
- What formats are there?
- How to convert them to PDF or Markdown?
![](https://cdn.sspai.com/2022/10/11/3801b1c9b94286566fe677e3b12cc7b0.png)
### Formats
File formats depend on their display platforms. Before considering formats, let's list the sources of information I usually access:
![](https://cdn.sspai.com/2022/10
/11/07e97f372850054958d4961a3787a93f.png)
The main categories are `articles`, `papers`, `e-books`, and `courses`, primarily including formats like `web pages`, `PDFs`, `MOBI`, `AZW`, and `AZW3`.
### Conversion to PDF or Markdown
Online articles and courses are mostly presented as web pages. To convert web pages to Markdown, I use the clipping software "Simplified Read," which can clip articles from nearly all platforms into Markdown and import them into Obsidian.
![](https://cdn.sspai.com/2022/10/11/211cffa78f20a9e7286a7419e9e0b878.png)
For papers and e-books, if the format is already PDF, it's straightforward. Otherwise, I use Calibre for conversion:
![](https://cdn.sspai.com/2022/10/11/51575f65f6f4c6edfa6c5b97fd16d625.png)
Now, using Obsidian's PDF plugin and native Markdown support, I can seamlessly take notes and reference across these documents (see "Information Processing" below for details).
![](https://cdn.sspai.com/2022/10/11/d64a9a2d6406d2d367dcb505ede69c83.png)
### Managing Information Sources
For file resources like PDFs, I use local or cloud storage. For web resources, I categorize and save them in browser bookmarks or clip them into Markdown notes. However, browsers don't support mobile web bookmarking. To enable cross-platform web bookmarking, I use Cubox. With a swipe on my phone, I can save interesting web pages in one place. Although the free version limits to 100 bookmarks, it's usually sufficient and prompts me to process these pages promptly.
![](https://cdn.sspai.com/2022/10/11/ad7ebfcb4619f64a41d328b88e0e3a12.png)
Moreover, many of the web pages we bookmark are not from fully-featured blog platforms like Zhihu or Juejin but personal sites without mobile apps. These can be easily overlooked in browser bookmarks, and we might miss new article notifications. Here, `RSS` comes into play.
`RSS` (Rich Site Summary) is a type of web feed that allows users to access updates to online content in a standardized format. On desktops, `RSSHub Radar` helps discover and generate `RSS` feeds, which can be subscribed to using `Feedly` (both have official Chrome browser plugins).
![](https://cdn.sspai.com/2022/10/11/5df6cd9d967f190df35928e781f9185f.png)
With this, the information collection process is comprehensive. But no matter how well categorized, information needs to be internalized to be useful. After collecting information, the next step is processing it — reading, understanding the semantics (especially for English sources), highlighting key sentences or paragraphs, noting queries, brainstorming related knowledge points, and writing summaries. What tools are needed for this process?
## Information Processing
### English Sources
For English materials, I initially used "Youdao Dictionary" for word translation, Google Translate for sentences, and "Deepl" for paragraphs. Eventually, I realized this was too slow and inefficient. Ideally, a single tool that can handle word, sentence, and paragraph translation would be optimal. After researching, I chose "Quicker" + "Saladict" for translation.
![](https://cdn.sspai.com/2022/10/11/a7ebb1d3c46702b56bd6d171dfcfc075.png)
This combo allows translation outside browsers and supports words, sentences, and paragraphs, offering results from multiple translation platforms. For non-urgent word lookups, the "Collins Advanced" dictionary is helpful as it explains English words in English, providing context to aid understanding.
![](https://cdn.sspai.com/2022/10/11/article/827c9a8048c83e504ccb15893702bf09)
### Multimedia Information
After processing text-based information, it's important to consider how to handle multimedia information. Specifically, I'm referring to English videos, as I don't have a habit of learning through podcasts or recordings and I rarely watch Chinese tutorials anymore. Many renowned universities offer open courses in video format. Wouldn't it be helpful if you could take notes on these videos? Have you ever thought it would be great if you could convert the content of a lecture into text, since we usually read faster than a lecturer speaks? Fortunately, the software `Language Reactor` can export subtitles from YouTube and Netflix videos, along with Chinese translations.
We can copy the subtitles exported by `Language Reactor` into `Obsidian` and read them as articles. Besides learning purposes, you can also use this plugin while watching YouTube videos. It displays subtitles in both English and Chinese, and you can click on unfamiliar words in the subtitles to see their definitions.
![](https://cdn.sspai.com/2022/10/11/364c8e6ed263affa84d9eee61338b4af.png)
However, reading texts isn't always the most efficient way to learn about some abstract concepts. As the saying goes, "A picture is worth a thousand words." What if we could link a segment of text to corresponding images or even video operations? While browsing the `Obsidian` plugin marketplace, I discovered a plugin called `Media Extended`. This plugin allows you to add links in your notes that jump to specific times in a video, effectively connecting your notes to the video! This works well with the video subtitles mentioned earlier, where each line of subtitles corresponds to a time stamp, allowing for jumps to specific parts of the video. This means you don't have to cut specific video segments; instead, you can jump directly within the article!
![](https://cdn.sspai.com/2022/10/11/17554cfdf662d5719ada453674012fdb.gif)
`Obsidian` also has a powerful plugin called `Annotator`, which allows you to jump from notes to the corresponding section in a PDF.
![](https://cdn.sspai.com/2022/10/11/article/b56994bf9a306830d8b0b8112677d3ec)
Now, with `Obsidian`'s built-in double-chain feature, we can achieve inter-note linking, and with the above plugins, we can extend these links to multimedia. This completes the process of information handling. Learning often involves both a challenging ascent and a familiar descent. So, how can we incorporate the review process into this workflow?
## Information Review
`Obsidian` already has a plugin that connects to `Anki`, the renowned spaced repetition-based memory software. With this plugin, you can export segments of your notes to `Anki` as flashcards, each containing a link back to the original note.
![](https://cdn.sspai.com/2022/10/11/1f7cebd8dd28f664d77cbf0ab228c406.gif)
## Conclusion
This workflow evolved over two years of learning in my spare time. Frustration with repetitive processes led to specific needs, which were fortunately met by tools I discovered online. Don't force tools into your workflow just for the sake of satisfaction; life is short, so focus on what's truly important.
By the way, this article discusses the evolution of the workflow. If you're interested in the details of how this workflow is implemented, I recommend reading the following articles in order after this one:
1. [3000+ Hours Accumulated Learning Workflow](https://sspai.com/post/75969)
2. [Advanced Techniques in Obsidian | Creating Notes that Link to Any File Format](https://juejin.cn/post/7145351315705577485)

View File

@ -0,0 +1,99 @@
# Information Retrieval
## Introduction
> When encountering a problem, remember the first thing is to **read the documentation**. Don't start by searching online or asking others directly. Reviewing FAQs may quickly provide the answer.
Information retrieval, as I understand it, is essentially about skillfully using search engines to quickly find the information you need, including but not limited to programming.
The most important thing in programming is STFW (search the fucking web) and RTFM (read the fucking manual). First, you should read the documentation, and second, learn to search. With so many resources online, how you use them depends on your information retrieval skills.
To understand how to search effectively, we first need to understand how search engines work.
## How Search Engines Work
The working process of a search engine can generally be divided into three stages: [^1]
1. Crawling and Fetching: Search engine spiders visit web pages by tracking links, obtain the HTML code of the pages, and store it in a database.
2. Preprocessing: The indexing program processes the fetched web page data by extracting text, segmenting Chinese words, indexing, etc., preparing for the ranking program.
3. Ranking: When users enter keywords, the ranking program uses the indexed data to calculate relevance and then generates the search results page in a specific format.
The first step involves web crawlers, often exaggerated in Python courses. It can be simply understood as using an automated program to download all text, images, and related information from websites and store them locally.
The second step is the core of a search engine, but not critical for users to understand. It can be roughly understood as cleaning data and indexing pages, each with keywords for easy querying.
The third step is closely related to us. Whether it's Google, Baidu, Bing, or others, you input keywords or queries, and the search engine returns results. This article teaches you how to obtain better results.
## Basic Search Techniques
Based on the above working principles, we can roughly understand that a search engine can be treated as a smart database. Using better query conditions can help you find the information you need faster. Here are some search techniques:
### Use English
First, it's important to know that in programming, it's best to search in English. Reasons include:
1. In programming and various software operations, English resources are of higher quality than those in Chinese or other languages.
2. Due to translation issues, English terms are more accurate and universally applicable than Chinese.
3. Chinese search engines' word segmentation systems can lead to ambiguity. For example, Google searches in Chinese may not yield many useful results.
If your English is not strong, use translation tools like Baidu or Sogou; they are sufficient.
### Refine Keywords
Don't search whole sentences. Although search engines automatically segment words, searching with whole sentences versus keywords can yield significantly different results in accuracy and order. Search engines are machines, not your teachers or colleagues. As mentioned above, searching is actually querying a database crawled by the search engine, so it's better to break down into keywords or phrases.
For example, if you want to know how to integrate vcpkg into a project instead of globally, searching for "如何将vcpkg集成到项目中而不是全局" in a long sentence may not yield relevant results. It's better to break it down into keywords like "vcpkg 集成 项目 全局".
### Replace Keywords
If you can't find what you're looking for, try replacing "项目" with "工程" or remove "集成". If that doesn't work, try advanced searching.
### Advanced Searching
Most search engines support advanced searching, including Google, Bing, Baidu, Ecosia, etc. Common formats include:
* Exact Match: Enclose the search term in quotes for precise matching.
* Exclude Keywords: Use a minus sign (-) to exclude specific words.
* Include Keywords: Use a plus sign (+) to ensure a keyword is included.
* Search Specific File Types: Use `filetype:pdf` to search for PDF files directly.
* Search Specific Websites: Use `site:stackoverflow.com` to search within a specific site.
Refer to the website instructions for specific syntax, such as [Baidu Advanced Search](https://baike.baidu.com/item/高级搜索/1743887?fr=aladdin) or [Bing Advanced Search Keywords](https://help.bing.microsoft.com/#apex/bing/zh-CHS/10001/-1).
#### GitHub Advanced Search
Use [GitHub's Advanced Search page](https://github.com/search/advanced) or refer to [GitHub Query Syntax](https://zhuanlan.zhihu.com/p/273766377) for advanced searches on GitHub. Examples include searching by repository name, description, readme, stars, fork count, size, update/creation date, license, language, user, and organization. These can be
used in combination.
### More Tips
Depending on the context, I recommend specific sites for certain queries:
* For language-specific queries (e.g., C++/Qt/OpenGL), add `site:stackoverflow.com`.
* For specific business/development environments or software-related issues, first check BugLists, IssueLists, or relevant forums.
* QQ groups are also a place to ask questions, but make sure your queries are meaningful.
* Chinese platforms like Zhihu, Jian Shu, Blog Park, and CSDN have a wealth of Chinese notes and experiences.
### About Baidu
Many programmers advise against using Baidu, preferring Google or Bing International. However, if you really need it, consider using alternatives like Ecosia or Yandex. For Chinese searches, Baidu might actually be the best option due to its database and indexing policies.
## Code Search
In addition to search engines, you might also need to search for code, either your own or from projects. Here are some recommended tools:
### Local Code Search
* ACK or ACK2, well-established search tools written in Perl.
* The Silver Searcher, implemented in C.
* The Platinum Searcher, implemented in Go.
* FreeCommander's built-in search, efficient on solid-state drives.
* IDE's built-in search, though not always the most user-friendly.
### Open Source Code Search
* [Searchcode](https://searchcode.com) for searching open source code, known for speed.
* [一行代码](https://www.alinecode.com) a useful Chinese tool for code search.
[^1]: [Introduction to How Search Engines Work - Zhihu](https://zhuanlan.zhihu.com/p/301641935)

View File

@ -0,0 +1,3 @@
# GFW
[This link](https://wallesspku.space/) appears here purely as a random combination of binary bits and has nothing to do with me.

View File

@ -0,0 +1,30 @@
# NJU OS: Operating System Design and Implementation
## Course Introduction
- **University**: Nanjing University
- **Prerequisites**: Computer Architecture + Solid C programming skills
- **Programming Language**: C
- **Course Difficulty**: 🌟🌟🌟🌟
- **Estimated Study Time**: 150 hours
I had always heard that the operating system course taught by Professor Yanyan Jiang at Nanjing University was excellent. This semester, I had the opportunity to watch his lectures on Bilibili and gained a lot. As a young professor with rich coding experience, his teaching is full of a hacker's spirit. Often in class, he would start coding in the command line on a whim, and many important points were illustrated with vivid and straightforward code examples. What struck me most was when he implemented a mini executable file and a series of binary tools to help students better understand the design philosophy of dynamic link libraries, solving many problems that had puzzled me for years.
In the course, Prof. Jiang starts from the perspective that "programs are state machines" to establish an explainable model for the "root of all evil" concurrent programs. Based on this, he discusses common methods of concurrency control and strategies for dealing with concurrency bugs. Then, he views the operating system as a series of objects (processes/threads, address spaces, files, devices, etc.) and their APIs (system calls), combined with rich practical examples to show how operating systems use these objects to virtualize hardware resources and provide various services to application software. In the final part about persistence, he builds up various storage devices from 1-bit storage media and abstracts a set of interfaces through device drivers to facilitate the design and implementation of file systems. Although I have taken many operating system courses before, this unique approach has given me many unique perspectives on system software.
In addition to its innovative theoretical instruction, the course's emphasis on practice is a key feature of Prof. Jiang's teaching. In class and through programming assignments, he subtly cultivates the ability to read source code and consult manuals, which are essential skills for computer professionals. During the fifth MiniLab, I read Microsoft's FAT file system manual in detail for the first time, gaining a very valuable experience.
The programming assignments consist of 5 MiniLabs and 4 OSLabs. Unfortunately, the grading system is only open to students at Nanjing University. However, Professor Jiang generously allowed me to participate after I emailed him. I completed the 5 MiniLabs, and the overall experience was excellent. Particularly, the second coroutine experiment left a deep impression on me, where I experienced the beauty and "terror" of context switching in a small experiment of less than a hundred lines. Also, the MiniLabs can be easily tested locally, so the lack of a grading system should not hinder self-learning. Therefore, I hope others will not collectively "harass" the professor for access.
Finally, I want to thank Professor Jiang again for designing and offering such an excellent operating system course, the first independently developed computer course from a domestic university included in this book. It's thanks to young, new-generation teachers like Professor Jiang, who teach with passion despite the heavy Tenure track evaluation, that many students have an unforgettable undergraduate experience. I also look forward to more such high-quality courses in China, which I will include in this book for the benefit of more people.
## Course Resources
- Course Website: <https://jyywiki.cn/OS/2022/index.html>
- Course Videos: <https://space.bilibili.com/202224425/channel/collectiondetail?sid=192498>
- Course Textbook: <http://pages.cs.wisc.edu/~remzi/OSTEP/>
- Course Assignments: <https://jyywiki.cn/OS/2022/index.html>
## Resource Summary
As per Professor Jiang's request, my assignment implementations are not open-sourced.

View File

@ -0,0 +1,28 @@
# CMU 15-799: Special Topics in Database Systems
## Course Introduction
- **University**: Carnegie Mellon University (CMU)
- **Prerequisites**: CMU 15-445
- **Programming Language**: C++
- **Course Difficulty**: 🌟🌟🌟
- **Estimated Study Time**: 80 hours
This course has only been offered twice so far, in Fall 2013 and Spring 2022, and it discusses some cutting-edge topics in the field of databases. The Fall 2013 session covered topics like Streaming, Graph DB, NVM, etc., while the Spring 2022 session mainly focused on Self-Driving DBMS, with relevant papers provided.
The tasks for the Spring 2022 version of the course included:
1. **Task One**: Manual performance tuning based on `PostgreSQL`.
2. **Task Two**: Improving the Self-Driving DBMS based on [NoisePage Pilot](https://github.com/cmu-db/noisepage-pilot), with no limitations on features.
The teaching style is more akin to a seminar, with fewer programming assignments. This course can broaden the horizons for general students and may be particularly beneficial for those specializing in databases.
## Course Resources
- **Course Homepages**:
- [CMU15-799 - Special Topics in Database Systems (Fall 2013)](https://15799.courses.cs.cmu.edu/fall2013)
- [CMU15-799 - Special Topics: Self-Driving Database Management Systems (Spring 2022)](https://15799.courses.cs.cmu.edu/spring2022/)
- **Course Videos**: Not available
- **Course Assignments**: 2 Projects + 1 Group Project

View File

@ -0,0 +1,41 @@
# Caltech CS 122: Database System Implementation
## Course Introduction
- **University**: California Institute of Technology (Caltech)
- **Prerequisites**: None
- **Programming Language**: Java
- **Course Difficulty**: 🌟🌟🌟🌟🌟
- **Estimated Study Time**: 150 hours
Caltech's course, unlike CMU15-445 which does not offer SQL layer functionality, focuses on the implementation at the SQL layer in its CS122 course labs. It covers various modules of a query optimizer, such as SQL parsing, translation, implementation of joins, statistics and cost estimation, subquery implementation, and the implementation of aggregations and group by operations. Additionally, there are experiments related to B+ trees and Write-Ahead Logging (WAL). This course is suitable for students who have completed the CMU15-445 course and are interested in query optimization.
Below is an overview of the first three assignments or lab experiments of this course:
### Assignment 1
- Provide support for delete and update statements in NanoDB.
- Add appropriate pin/unpin code to the Buffer Pool Manager.
- Improve the performance of insert statements without excessively inflating the size of the database file.
### Assignment 2
- Implement a simple plan generator to convert various parsed SQL statements into executable plans.
- Implement join plan nodes that support inner and outer joins using the nested-loop join algorithm.
- Add unit tests to ensure the correct implementation of inner and outer joins.
### Assignment 3
- Complete the collection of table statistics.
- Perform plan cost calculation for various plan nodes.
- Calculate the selectivity of various predicates that may appear in the execution plan.
- Update the tuple statistics of the plan nodes' outputs based on predicates.
For the remaining Assignments and Challenges, please refer to the course description. It is recommended to use IDEA to open the project and Maven for building, keeping in mind the log-related configurations.
## Course Resources
- Course Website: <http://courses.cms.caltech.edu/cs122/>
- Course Code: <https://gitlab.caltech.edu/cs122-19wi>
- Course Textbook: None
- Course Assignments: 7 Assignments + 2 Challenges

View File

@ -0,0 +1,30 @@
# Stanford CS 346: Database System Implementation
## Course Introduction
- **University**: Stanford
- **Prerequisites**: None
- **Programming Language**: C++
- **Course Difficulty**: 🌟🌟🌟🌟🌟
- **Estimated Study Time**: 150 hours
RedBase, the project for CS346, involves the implementation of a simplified database system and is highly structured. The project can be divided into the following parts, which also correspond to the four labs that need to be completed:
1. **The Record Management Component**: This involves the implementation of record management functionalities.
2. **The Index Component**: Focuses on the management of B+ tree indexing.
3. **The System Management Component**: Deals with DDL statements, command-line tools, data loading commands, and metadata management.
4. **The Query Language Component**: In this part, students are required to implement the RQL Redbase Query Language, including select, insert, delete, and update statements.
5. **Extension Component**: Beyond the basic components of a database system, students must implement an extension component, which could be a Blob type, network module, join algorithms, CBO optimizer, OLAP, transactions, etc.
RedBase is an ideal follow-up project for students who have completed CMU 15-445 and wish to learn other components of a database system. Due to its manageable codebase, it allows for convenient expansion as needed. Furthermore, as it is entirely written in C++, it also serves as good practice for C++ programming skills.
## Course Resources
- Course Website: <https://web.stanford.edu/class/cs346/2015/>
- Course Code: <https://github.com/junkumar/redbase.git>
- Course Textbook: None
- Course Assignments: 4 Projects + 1 Extension

View File

@ -0,0 +1,13 @@
# CMU 10-708: Probabilistic Graphical Models
## Course Introduction
- **University**: Carnegie Mellon University (CMU)
- **Prerequisites**: Machine Learning, Deep Learning, Reinforcement Learning
- **Course Difficulty**: 🌟🌟🌟🌟🌟
- **Course Website**: [CMU 10-708](https://sailinglab.github.io/pgm-spring-2019/)
- **Course Resources**: The course website includes slides, notes, videos, homework, and project materials.
CMU's course on Probabilistic Graphical Models, taught by Eric P. Xing, is a foundational and advanced course on graphical models. The curriculum covers the basics of graphical models, their integration with neural networks, applications in reinforcement learning, and non-parametric methods, making it a highly rigorous and comprehensive course.
For students with a solid background in machine learning, deep learning, and reinforcement learning, this course provides a deep dive into the theoretical and practical aspects of probabilistic graphical models. The extensive resources available on the course website make it an invaluable learning tool for anyone looking to master this complex and rapidly evolving field.

View File

@ -6,6 +6,6 @@
- 先修要求Machine Learning, Deep Learning, Reinforcement Learning
- 课程难度:🌟🌟🌟🌟🌟
- 课程网站:<https://sailinglab.github.io/pgm-spring-2019/>
- 这个网站包含了所有的资源slides, nots, video, homework, project
- 课程网站包含了所有的资源slides, notes, video, homework, and project
这门课程是 CMU 的图模型基础 + 进阶课,授课老师为 Eric P. Xing涵盖了图模型基础与神经网络的结合在强化学习中的应用以及非参数方法。相当硬核
这门课程是 CMU 的图模型基础 + 进阶课,授课老师为 Eric P. Xing涵盖了图模型基础与神经网络的结合在强化学习中的应用以及非参数方法,相当硬核。

View File

@ -0,0 +1,12 @@
# STATS214 / CS229M: Machine Learning Theory
## Course Introduction
- **University**: Stanford
- **Prerequisites**: Machine Learning, Deep Learning, Statistics
- **Course Difficulty**: 🌟🌟🌟🌟🌟🌟
- **Course Website**: [STATS214 / CS229M](http://web.stanford.edu/class/stats214/)
This course offers a rigorous blend of classical learning theory and the latest developments in deep learning theory, making it exceptionally challenging and comprehensive. Previously taught by Percy Liang, the course is now led by Tengyu Ma, ensuring a high level of expertise and insight into the theoretical aspects of machine learning.
The curriculum is designed for students with a solid foundation in machine learning, deep learning, and statistics, aiming to deepen their understanding of the underlying theoretical principles in these fields. This course is an excellent choice for anyone looking to gain a thorough understanding of both the traditional and contemporary theoretical approaches in machine learning.

View File

@ -7,4 +7,4 @@
- 课程难度:🌟🌟🌟🌟🌟🌟
- 课程网站:<http://web.stanford.edu/class/stats214/>
经典学习理论 + 最新深度学习理论,非常硬核。授课老师之前是 Percy Liang现在是 Tengyu Ma
经典学习理论 + 最新深度学习理论,非常硬核。授课老师之前是 Percy Liang现在是 Tengyu Ma

View File

@ -0,0 +1,14 @@
# STA 4273 Winter 2021: Minimizing Expectations
## Course Introduction
- **University**: University of Toronto
- **Prerequisites**: Bayesian Inference, Reinforcement Learning
- **Course Difficulty**: 🌟🌟🌟🌟🌟🌟🌟
- **Course Website**: [STA 4273 Winter 2021](https://www.cs.toronto.edu/~cmaddis/courses/sta4273_w21/)
"Minimizing Expectations" is an advanced Ph.D. level research course, focusing on the interplay between inference and control. The course is taught by Chris Maddison, a founding member of AlphaGo and a NeurIPS 2014 best paper awardee.
This course is notably challenging and is designed for students who have a strong background in Bayesian Inference and Reinforcement Learning. The curriculum explores deep theoretical concepts and their practical applications in the fields of machine learning and artificial intelligence.
Chris Maddison's expertise and his significant contributions to the field, particularly in the development of AlphaGo, make this course highly prestigious and insightful for Ph.D. students and researchers looking to deepen their understanding of inference and control in advanced machine learning contexts. The course website provides valuable resources for anyone interested in this specialized area of study.

View File

@ -7,4 +7,4 @@
- 课程难度:🌟🌟🌟🌟🌟🌟🌟
- 课程网站:<https://www.cs.toronto.edu/~cmaddis/courses/sta4273_w21/>
这是一门较为进阶的 Ph.D. 研究课程,核心内容是 inference 和 control 之间的关系。授课老师为 Chris Maddison (AlphaGo founding member, NeurIPS 14 best paper)
这是一门较为进阶的 Ph.D. 研究课程,核心内容是 inference 和 control 之间的关系。授课老师为 Chris Maddison (AlphaGo founding member, NeurIPS 14 best paper)

View File

@ -0,0 +1,14 @@
# Columbia STAT 8201: Deep Generative Models
## Course Introduction
- **University**: Columbia University
- **Prerequisites**: Machine Learning, Deep Learning, Graphical Models
- **Course Difficulty**: 🌟🌟🌟🌟🌟🌟
- **Course Website**: [STAT 8201](http://stat.columbia.edu/~cunningham/teaching/GR8201/)
"Deep Generative Models" is a Ph.D. level seminar course at Columbia University, taught by John Cunningham. This course is structured around weekly paper presentations and discussions, focusing on deep generative models, which represent the intersection of graphical models and neural networks and are one of the most important directions in modern machine learning.
The course is designed to explore the latest advancements and theoretical foundations in deep generative models. Participants engage in in-depth discussions about current research papers, fostering a deep understanding of the subject matter. This format not only helps students keep abreast of the latest developments in this rapidly evolving field but also sharpens their critical thinking and research skills.
Given the advanced nature of the course, it is ideal for Ph.D. students and researchers who have a solid foundation in machine learning, deep learning, and graphical models, and are looking to delve into the cutting-edge of deep generative models. The course website provides a valuable resource for accessing the curriculum and related materials.

View File

@ -7,4 +7,4 @@
- 课程难度:🌟🌟🌟🌟🌟🌟
- 课程网站:<http://stat.columbia.edu/~cunningham/teaching/GR8201/>
这门课是一门 PhD 讨论班,每周的内容是展示 + 讨论论文,授课老师是 John Cunningham。Deep Generative Models (深度生成模型) 是图模型与神经网络的结合,也是现代机器学习最重要的方向之一
这门课是一门 PhD 讨论班,每周的内容是展示 + 讨论论文,授课老师是 John Cunningham。Deep Generative Models (深度生成模型) 是图模型与神经网络的结合,也是现代机器学习最重要的方向之一

View File

@ -0,0 +1,56 @@
# Advanced Machine Learning
This learning path is suitable for students who have already learned the basics of machine learning (ML, NLP, CV, RL), such as senior undergraduates or junior graduate students, and have published at least one paper in top conferences (NeurIPS, ICML, ICLR, ACL, EMNLP, NAACL, CVPR, ICCV) and are interested in pursuing a research path in machine learning.
The goal of this path is to lay the theoretical groundwork for understanding and publishing papers at top machine learning conferences, especially in the track of Probabilistic Methods.
There can be multiple advanced learning paths in machine learning, and this one represents the best path as understood by the author [Yao Fu](https://franxyao.github.io/), focusing on probabilistic modeling methods under the Bayesian school and involving interdisciplinary knowledge.
## Essential Textbooks
- PRML: Pattern Recognition and Machine Learning by Christopher Bishop
- AoS: All of Statistics by Larry Wasserman
These two books respectively represent classic teachings of the Bayesian and frequentist schools, complementing each other nicely.
## Reference Books
- MLAPP: Machine Learning: A Probabilistic Perspective by Kevin Murphy
- Convex Optimization by Stephen Boyd and Lieven Vandenberghe
## Advanced Books
- W&J: Graphical Models, Exponential Families, and Variational Inference by Martin Wainwright and Michael Jordan
- Theory of Point Estimation by E. L. Lehmann and George Casella
## Reading Guidelines
### How to Approach
- Essential textbooks are a must-read.
- Reference books are like dictionaries: consult them when encountering unfamiliar concepts (instead of Wikipedia).
- Advanced books should be approached after completing the essential textbooks, which should be read multiple times for thorough understanding.
- Contrastive-comparative reading is crucial: open two books on the same topic, compare similarities, differences, and connections.
- Recall previously read papers during reading and compare them with textbook content.
### Basic Pathway
1. Start with AoS Chapter 6: Models, Statistical Inference, and Learning as a basic introduction.
2. Read PRML Chapters 10 and 11:
- Chapter 10 covers Variational Inference, and Chapter 11 covers MCMC, the two main routes for Bayesian inference.
- Consult earlier chapters in PRML or MLAPP for any unclear terms.
- AoS Chapter 8 (Parametric Inference) and Chapter 11 (Bayesian Inference) can also serve as references. Compare these chapters with the relevant PRML chapters.
3. After PRML Chapters 10 and 11, proceed to AoS Chapter 24 (Simulation Methods) and compare it with PRML Chapter 11, focusing on MCMC.
4. If foundational concepts are still unclear, review PRML Chapter 3 and compare it with AoS Chapter 11.
5. Read PRML Chapter 13 (skip Chapter 12) and compare it with MLAPP Chapters 17 and 18, focusing on HMM and LDS.
6. After completing PRML Chapter 13, move on to Chapter 8 (Graphical Models).
7. Cross-reference these topics with CMU 10-708 PGM course materials.
By this point, you should have a grasp of:
- Basic definitions of probabilistic models
- Exact inference - Sum-Product
- Approximate inference - MCMC
- Approximate inference - VI
Afterward, you can proceed to more advanced topics.

View File

@ -2,18 +2,16 @@
此路线图适用于已经学过了基础机器学习 (ML, NLP, CV, RL) 的同学 (高年级本科生或低年级研究生),已经发表过至少一篇顶会论文 (NeurIPS, ICML, ICLR, ACL, EMNLP, NAACL, CVPR, ICCV) 想要走机器学习科研路线的选手。
此路线的目标是为读懂与发表机器学习顶会论文打下理论基础,特别是 Probabilistic Methods 这个 track 下的文章
此路线的目标是为读懂与发表机器学习顶会论文打下理论基础,特别是 Probabilistic Methods 这个 track 下的文章
机器学习进阶可能存在多种不同的学习路线,此路线只能代表作者 [Yao Fu](https://franxyao.github.io/) 所理解的最佳路径,侧重于贝叶斯学派下的概率建模方法,也会涉及到各项相关学科的交叉知识。
## 必读教材
- PRML: Pattern Recognition and Machine Learning. Christopher Bishop
- 经典贝叶斯学派教材
- AoS: All of Statistics. Larry Wasserman
- 经典频率学派教材
所以这两本书刚好相辅相成
这两本书分别是经典贝叶斯学派和经典频率学派的教材,刚好相辅相成
## 字典

View File

@ -0,0 +1,34 @@
# Amirkabir University of Technology 1400-2: Advanced Programming Course
## Course Introduction
- Affiliated University: Amirkabir University of Technology
- Prerequisites: None
- Programming Language: C++
- Course Difficulty: 🌟🌟🌟🌟🌟
- Estimated Study Time: 50 hours
This is an accidentally discovered C++ course. The quality of the homework assignments is outstanding, with each being independently structured and simple, complemented by comprehensive unit tests, making it highly suitable for learning C++ programming. The course includes a total of 7 homework assignments, as follows:
1. Implement a Matrix class and related functions.
2. Implement a program that simulates the operation of a cryptocurrency client/server.
3. Implement a Binary Search Tree (BST).
4. Implement SharedPtr and UniquePtr smart pointers in C++.
5. Use inheritance and polymorphism to implement multiple classes.
6. Solve 4 problems using the STL library.
7. There's a Python project, for those interested.
The course homepage was not found, but the source code for the homework (named AP1400-2-HW) can be found on GitHub.
## Course Resources
- Course Website: None
- Course Code: <https://github.com/courseworks>
- Course Textbook: None
- Course Assignments: 7 homework assignments

View File

@ -0,0 +1,22 @@
# UCB: Sysadmin DeCal
## Course Introduction
- Affiliated University: UCB
- Prerequisites: None
- Programming Language: Shell
- Course Difficulty: 🌟🌟🌟
- Estimated Study Time: 20 hours
This is an introductory course on Linux from UCB, which I find more systematic and clearer than MIT's similarly aimed open course, Missing Semester. This is the main reason I recommend it. While Missing Semester seems more like a course for filling gaps for students who have started programming but haven't systematically used these tools, DeCal is more suitable for absolute beginners. The twelve-week course covers Linux basics, shell programming (including tmux and vim), package management, services, basic computer networks, network services, security (key management), Git, Docker, Kubernetes, Puppet, and CUDA. It's ideal for newcomers to understand and get started with the Linux environment.
A slight drawback is that some course assignments require operations on remote servers, like exercises on ssh, which need UCB internal account access. However, most assignments can be practiced by setting up a virtual machine and using tools like Xshell or directly using a Linux desktop version. After completing the full course and assignments, you should have a basic understanding of Linux.
To compensate for the inability to use remote servers and to familiarize with the Linux command line, I recommend [bandit](https://overthewire.org/wargames/bandit/). Bandit is a Wargame from OverTheWire, providing a free practice range for CTF enthusiasts. The first 15 levels of bandit are basic Linux operations without any CTF knowledge. These exercises perfectly supplement the parts of DeCal that are inaccessible to external students (mainly remote connections, file permissions, etc.).
## Course Resources
- Course Website: [Official Site](https://decal.ocf.berkeley.edu/)
- Course Videos: Available on the official course website, [Bilibili](https://www.bilibili.com/video/BV1rs4y1T7zJ/?share_source=copy_web) has an incomplete transfer that only includes the first part.
- Course Textbook: No specified textbook, but each week's labs contain enough reading material for in-depth study.
- Course Assignments: Available on the official course website.

View File

@ -0,0 +1,24 @@
# Stanford CS148
## Course Introduction
- **University**: Stanford
- **Prerequisites**: Linear Algebra, Advanced Mathematics, Python
- **Programming Language**: Python
- **Course Difficulty**: 🌟🌟🌟
- **Estimated Study Time**: 40 hours
Official Description:
This introductory course in computer graphics begins with using Blender to generate images and understanding the underlying mathematical concepts, including triangles, normals, interpolation, texture mapping, bump mapping, and more. It then delves into light and color and how they affect computer displays and printing. The course also covers BRDF and some basic lighting and shading models. Towards the end, topics like ray tracing, anti-aliasing, and acceleration structures are introduced.
For more detailed information, you can visit the [course website](https://web.stanford.edu/class/cs148/index.html).
This course is somewhat less in-depth compared to GAMES101 and uses Python, making it more accessible for students who are not familiar with C++.
## Course Resources
- **Course Website**: [CS148](https://web.stanford.edu/class/cs148/index.html)
- **Course Videos**: None, the [lectures](https://web.stanford.edu/class/cs148/lectures.html) themselves are sufficient. GAMES101 videos can also be referenced.
- **Course Textbook**: Fundamentals of Computer Graphics
- **Course Assignments**: [8 Homework Assignments, 1 Final Project](https://web.stanford.edu/class/cs148/assignments.html)

View File

@ -0,0 +1,31 @@
# GAMES101
## Course Introduction
- **University**: University of California, Santa Barbara (UCSB)
- **Prerequisites**: Linear Algebra, Advanced Mathematics, C++
- **Programming Language**: C++
- **Course Difficulty**: 🌟🌟🌟
- **Estimated Study Time**: 80 hours
Official Introduction:
> This course comprehensively and systematically introduces the four major components of modern computer graphics: (1) rasterization imaging, (2) geometric representation, (3) the theory of light propagation, and (4) animation and simulation. Each aspect is explained from basic principles to practical applications, along with the introduction of cutting-edge theoretical research. Through this course, you can learn the mathematics and physics behind computer graphics and enhance your practical programming skills.
> As an introduction, this course aims to cover as many aspects of graphics as possible, clearly explaining the basic concepts of each part to provide a complete, top-down understanding of computer graphics. A global understanding is crucial; after completing this course, you will realize that graphics is not just OpenGL or ray tracing but a set of methods for creating virtual worlds. The title of this course also contains the word "modern," indicating that the knowledge imparted is contemporary and essential for the modern graphics industry.
GAMES101 is a well-known graphics course in China. Unlike the traditionally math and algorithm-heavy perception of graphics, this course introduces the field of graphics in a very vivid way.
Each project is not code-heavy but is quite interesting. Through these projects, students will implement simple rasterization to render basic models and ray tracing for better rendering quality. Each project also includes optional extensions to enhance the quality and speed of the rendered models.
If you enjoy gaming, you might be familiar with real-time ray tracing, a technology that the course instructor, Lingqi Yan, has directly contributed to. By following the course videos and completing each project, you'll likely develop a strong interest in graphics and modern rendering techniques, just as I did.
## Course Resources
- **Course Websites**: [GAMES101](http://games-cn.org/intro-graphics/), [GAMES101](https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html)
- **Course Videos**: [Bilibili](https://www.bilibili.com/video/BV1X7411F744?p=1), [Official Site](http://games-cn.org/graphics-intro-ppt-video/)
- **Course Textbook**: Fundamentals of Computer Graphics
- **Course Assignments**: [8 projects](http://games-cn.org/forums/topic/allhw/)
## Resource Summary
All resources and homework implementations used by @ysj1173886760 during the course are compiled at [ysj1173886760/Learning: graphics/GAMES101 - GitHub](https://github.com/ysj1173886760/Learning/tree/master/graphics/GAMES101).

View File

@ -0,0 +1,30 @@
# GAMES103
## Course Introduction
- **University**: Style3D / Oregon State University (OSU)
- **Prerequisites**: Linear Algebra, Advanced Mathematics, College Physics, Programming Skills, Basic Graphics Knowledge
- **Programming Language**: C#
- **Course Difficulty**: 🌟🌟🌟🌟
- **Estimated Study Time**: 50 hours
Official Introduction:
> This course serves as an introduction to physics-based computer animation techniques, focusing on various fundamental physical animation simulation technologies.
>
> The course mainly covers four areas: 1) Rigid body simulation; 2) Particle systems, springs, constraints, and cloth simulation; 3) Elastic body simulation based on the finite element method; 4) Fluid simulation.
>
> The course content will not delve into specific physical simulation engines but will discuss the technologies behind various engines and their pros and cons. Since developing and learning physical simulations requires a solid mathematical foundation, the initial stages of the course will also spend some time reviewing necessary mathematical concepts. Upon successful completion of the course, students should have a deep understanding of basic physical simulation techniques and some exposure to advanced simulation technologies.
In graphics, the field can be roughly divided into rendering, simulation, and geometry. While GAMES101 and GAMES202 mainly focus on rendering, GAMES103 is an excellent resource for learning about physical simulation.
## Course Resources
- **Course Website**: [GAMES103](http://games-cn.org/games103/)
- **Course Videos**: [Bilibili](https://www.bilibili.com/video/BV12Q4y1S73g)
- **Reference Materials**: [Course PPT](https://www.aliyundrive.com/s/YGuzfDCzw4n/folder/61824d985307bbf3920044b4afd48abb633441f6)
- **Course Assignments**: Four assignments, available on the official BBS mini-app or the unofficial Repo: [GAMES103 HW](https://github.com/indevn/GAMES103/tree/main/HW)
## Resource Summary
All resources and homework requirements used by @indevn during the course are compiled at [GAMES103 Unofficial](https://github.com/indevn/GAMES103). For detailed implementations of the assignments, there are many articles on Zhihu that provide in-depth explanations and can be referenced.

View File

@ -0,0 +1,26 @@
# GAMES202
## Course Introduction
- **University**: University of California, Santa Barbara (UCSB)
- **Prerequisites**: Linear Algebra, Advanced Mathematics, C++, GAMES101
- **Programming Language**: C++
- **Course Difficulty**: 🌟🌟🌟🌟
- **Estimated Study Time**: 60 hours
Official Introduction:
> This course comprehensively introduces the key issues and solutions in modern real-time rendering. Since real-time rendering (>30 FPS) demands high speed, the focus of this course is on how to break the trade-off between speed and quality under strict time constraints, ensuring both high-speed real-time performance and photorealism.
>
> The course will be presented in a thematic manner, covering cutting-edge content from both academia and industry, including: (1) real-time soft shadow rendering; (2) ambient lighting; (3) global illumination with or without precomputation; (4) physically-based shading models and methods; (5) real-time ray tracing; (6) anti-aliasing and supersampling; as well as various common acceleration methods.
>
> In addition to the latest and most comprehensive content, an important distinction of this course from other real-time rendering tutorials is that it does not teach the use of game engines or emphasize specific shader implementation techniques. Instead, it focuses on the science and knowledge behind real-time rendering. The goal of this course is to provide you with a solid foundation to develop your own real-time rendering engine upon completion.
As an advanced course following GAMES101, GAMES202 offers a slightly increased level of difficulty, but it's manageable for students who have completed GAMES101. Each project requires a moderate amount of coding but involves significant thought.
## Course Resources
- **Course Website**: [GAMES202](https://sites.cs.ucsb.edu/~lingqi/teaching/games202.html)
- **Course Videos**: [Bilibili](https://www.bilibili.com/video/BV1YK4y1T7yY)
- **Course Textbook**: Real-Time Rendering, 4th edition.
- **Course Assignments**: [5 Projects](http://games-cn.org/forums/topic/games202zuoyehuizong/)