From f2341cac1e44a96d4d27658f8072149916a9fcae Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 21 Dec 2022 12:26:48 +0000 Subject: [PATCH] Deployed 86ad554 with MkDocs version: 1.4.2 --- CS学习规划/index.html | 14 ++++++++++++++ Web开发/CS142/index.html | 14 ++++++++++++++ Web开发/fullstackopen/index.html | 14 ++++++++++++++ Web开发/mitweb/index.html | 14 ++++++++++++++ en/CS学习规划/index.html | 14 ++++++++++++++ en/Web开发/CS142/index.html | 14 ++++++++++++++ en/Web开发/fullstackopen/index.html | 14 ++++++++++++++ en/Web开发/mitweb/index.html | 14 ++++++++++++++ en/index.html | 14 ++++++++++++++ en/人工智能/CS188/index.html | 14 ++++++++++++++ en/人工智能/CS50/index.html | 14 ++++++++++++++ en/人工智能/CYJ/index.html | 14 ++++++++++++++ en/体系结构/CS61C/index.html | 14 ++++++++++++++ en/体系结构/CSAPP/index.html | 14 ++++++++++++++ en/体系结构/DDCA/index.html | 14 ++++++++++++++ en/体系结构/N2T/index.html | 14 ++++++++++++++ en/使用指南/index.html | 14 ++++++++++++++ en/后记/index.html | 14 ++++++++++++++ en/培养方案Pro/index.html | 14 ++++++++++++++ en/好书推荐/index.html | 14 ++++++++++++++ en/并行与分布式系统/CS149/index.html | 14 ++++++++++++++ en/并行与分布式系统/MIT6.824/index.html | 14 ++++++++++++++ en/必学工具/CMake/index.html | 14 ++++++++++++++ en/必学工具/Docker/index.html | 14 ++++++++++++++ en/必学工具/GNU_Make/index.html | 14 ++++++++++++++ en/必学工具/Git/index.html | 14 ++++++++++++++ en/必学工具/GitHub/index.html | 14 ++++++++++++++ en/必学工具/LaTeX/index.html | 14 ++++++++++++++ en/必学工具/Scoop/index.html | 14 ++++++++++++++ en/必学工具/Vim/index.html | 14 ++++++++++++++ en/必学工具/thesis/index.html | 14 ++++++++++++++ en/必学工具/tools/index.html | 14 ++++++++++++++ en/必学工具/workflow/index.html | 14 ++++++++++++++ en/必学工具/翻墙/index.html | 14 ++++++++++++++ en/操作系统/CS162/index.html | 14 ++++++++++++++ en/操作系统/MIT6.S081/index.html | 14 ++++++++++++++ en/操作系统/NJUOS/index.html | 14 ++++++++++++++ en/数学基础/MITLA/index.html | 14 ++++++++++++++ en/数学基础/MITmaths/index.html | 14 ++++++++++++++ en/数学基础/information/index.html | 14 ++++++++++++++ en/数学进阶/6.042J/index.html | 14 ++++++++++++++ en/数学进阶/CS126/index.html | 14 ++++++++++++++ en/数学进阶/CS70/index.html | 14 ++++++++++++++ .../index.html | 14 ++++++++++++++ en/数学进阶/convex/index.html | 14 ++++++++++++++ en/数学进阶/numerical/index.html | 14 ++++++++++++++ en/数据库系统/15445/index.html | 14 ++++++++++++++ en/数据库系统/CS122/index.html | 14 ++++++++++++++ en/数据库系统/CS186/index.html | 14 ++++++++++++++ en/数据库系统/CS346/index.html | 14 ++++++++++++++ en/数据科学/Data100/index.html | 14 ++++++++++++++ en/数据结构与算法/Algo/index.html | 14 ++++++++++++++ en/数据结构与算法/CS170/index.html | 14 ++++++++++++++ en/数据结构与算法/CS61B/index.html | 14 ++++++++++++++ en/机器学习/CS189/index.html | 14 ++++++++++++++ en/机器学习/CS229/index.html | 14 ++++++++++++++ en/机器学习/ML/index.html | 14 ++++++++++++++ en/机器学习系统/CMU10-414/index.html | 14 ++++++++++++++ en/机器学习系统/MLC/index.html | 14 ++++++++++++++ en/机器学习进阶/CMU10-708/index.html | 14 ++++++++++++++ en/机器学习进阶/CS229M/index.html | 14 ++++++++++++++ en/机器学习进阶/STA4273/index.html | 14 ++++++++++++++ en/机器学习进阶/STAT8201/index.html | 14 ++++++++++++++ en/机器学习进阶/roadmap/index.html | 14 ++++++++++++++ en/深度学习/CS224n/index.html | 14 ++++++++++++++ en/深度学习/CS224w/index.html | 14 ++++++++++++++ en/深度学习/CS230/index.html | 14 ++++++++++++++ en/深度学习/CS231/index.html | 14 ++++++++++++++ en/深度学习/CS285/index.html | 14 ++++++++++++++ en/深度学习/LHY/index.html | 14 ++++++++++++++ en/电子基础/EE16/index.html | 14 ++++++++++++++ .../Signals_and_Systems_AVO/index.html | 14 ++++++++++++++ en/电子基础/signal/index.html | 14 ++++++++++++++ en/程序语言设计/CS242/index.html | 14 ++++++++++++++ en/系统安全/CS161/index.html | 14 ++++++++++++++ en/系统安全/MIT6.858/index.html | 14 ++++++++++++++ en/编程入门/AUT1400/index.html | 14 ++++++++++++++ en/编程入门/CS106B_CS106X/index.html | 14 ++++++++++++++ en/编程入门/CS106L/index.html | 14 ++++++++++++++ en/编程入门/CS110L/index.html | 14 ++++++++++++++ en/编程入门/CS50/index.html | 14 ++++++++++++++ en/编程入门/CS61A/index.html | 14 ++++++++++++++ en/编程入门/Duke-Coursera-Intro-C/index.html | 14 ++++++++++++++ en/编程入门/MIT-Missing-Semester/index.html | 14 ++++++++++++++ en/编译原理/6035/index.html | 14 ++++++++++++++ en/编译原理/CS143/index.html | 14 ++++++++++++++ en/计算机图形学/15462/index.html | 14 ++++++++++++++ en/计算机图形学/CS148/index.html | 14 ++++++++++++++ en/计算机图形学/CS184/index.html | 14 ++++++++++++++ en/计算机图形学/GAMES101/index.html | 14 ++++++++++++++ en/计算机图形学/GAMES103/index.html | 14 ++++++++++++++ en/计算机图形学/GAMES202/index.html | 14 ++++++++++++++ en/计算机网络/CS144/index.html | 14 ++++++++++++++ en/计算机网络/topdown/index.html | 14 ++++++++++++++ en/计算机网络/topdown_ustc/index.html | 14 ++++++++++++++ en/软件工程/6031/index.html | 14 ++++++++++++++ en/软件工程/CS169/index.html | 14 ++++++++++++++ index.html | 14 ++++++++++++++ sitemap.xml.gz | Bin 2183 -> 2183 bytes zh/CS学习规划/index.html | 14 ++++++++++++++ zh/Web开发/CS142/index.html | 14 ++++++++++++++ zh/Web开发/fullstackopen/index.html | 14 ++++++++++++++ zh/Web开发/mitweb/index.html | 14 ++++++++++++++ zh/index.html | 14 ++++++++++++++ zh/人工智能/CS188/index.html | 14 ++++++++++++++ zh/人工智能/CS50/index.html | 14 ++++++++++++++ zh/人工智能/CYJ/index.html | 14 ++++++++++++++ zh/体系结构/CS61C/index.html | 14 ++++++++++++++ zh/体系结构/CSAPP/index.html | 14 ++++++++++++++ zh/体系结构/DDCA/index.html | 14 ++++++++++++++ zh/体系结构/N2T/index.html | 14 ++++++++++++++ zh/使用指南/index.html | 14 ++++++++++++++ zh/后记/index.html | 14 ++++++++++++++ zh/培养方案Pro/index.html | 14 ++++++++++++++ zh/好书推荐/index.html | 14 ++++++++++++++ zh/并行与分布式系统/CS149/index.html | 14 ++++++++++++++ zh/并行与分布式系统/MIT6.824/index.html | 14 ++++++++++++++ zh/必学工具/CMake/index.html | 14 ++++++++++++++ zh/必学工具/Docker/index.html | 14 ++++++++++++++ zh/必学工具/GNU_Make/index.html | 14 ++++++++++++++ zh/必学工具/Git/index.html | 14 ++++++++++++++ zh/必学工具/GitHub/index.html | 14 ++++++++++++++ zh/必学工具/LaTeX/index.html | 14 ++++++++++++++ zh/必学工具/Scoop/index.html | 14 ++++++++++++++ zh/必学工具/Vim/index.html | 14 ++++++++++++++ zh/必学工具/thesis/index.html | 14 ++++++++++++++ zh/必学工具/tools/index.html | 14 ++++++++++++++ zh/必学工具/workflow/index.html | 14 ++++++++++++++ zh/必学工具/翻墙/index.html | 14 ++++++++++++++ zh/操作系统/CS162/index.html | 14 ++++++++++++++ zh/操作系统/MIT6.S081/index.html | 14 ++++++++++++++ zh/操作系统/NJUOS/index.html | 14 ++++++++++++++ zh/数学基础/MITLA/index.html | 14 ++++++++++++++ zh/数学基础/MITmaths/index.html | 14 ++++++++++++++ zh/数学基础/information/index.html | 14 ++++++++++++++ zh/数学进阶/6.042J/index.html | 14 ++++++++++++++ zh/数学进阶/CS126/index.html | 14 ++++++++++++++ zh/数学进阶/CS70/index.html | 14 ++++++++++++++ .../index.html | 14 ++++++++++++++ zh/数学进阶/convex/index.html | 14 ++++++++++++++ zh/数学进阶/numerical/index.html | 14 ++++++++++++++ zh/数据库系统/15445/index.html | 14 ++++++++++++++ zh/数据库系统/CS122/index.html | 14 ++++++++++++++ zh/数据库系统/CS186/index.html | 14 ++++++++++++++ zh/数据库系统/CS346/index.html | 14 ++++++++++++++ zh/数据科学/Data100/index.html | 14 ++++++++++++++ zh/数据结构与算法/Algo/index.html | 14 ++++++++++++++ zh/数据结构与算法/CS170/index.html | 14 ++++++++++++++ zh/数据结构与算法/CS61B/index.html | 14 ++++++++++++++ zh/机器学习/CS189/index.html | 14 ++++++++++++++ zh/机器学习/CS229/index.html | 14 ++++++++++++++ zh/机器学习/ML/index.html | 14 ++++++++++++++ zh/机器学习系统/CMU10-414/index.html | 14 ++++++++++++++ zh/机器学习系统/MLC/index.html | 14 ++++++++++++++ zh/机器学习进阶/CMU10-708/index.html | 14 ++++++++++++++ zh/机器学习进阶/CS229M/index.html | 14 ++++++++++++++ zh/机器学习进阶/STA4273/index.html | 14 ++++++++++++++ zh/机器学习进阶/STAT8201/index.html | 14 ++++++++++++++ zh/机器学习进阶/roadmap/index.html | 14 ++++++++++++++ zh/深度学习/CS224n/index.html | 14 ++++++++++++++ zh/深度学习/CS224w/index.html | 14 ++++++++++++++ zh/深度学习/CS230/index.html | 14 ++++++++++++++ zh/深度学习/CS231/index.html | 14 ++++++++++++++ zh/深度学习/CS285/index.html | 14 ++++++++++++++ zh/深度学习/LHY/index.html | 14 ++++++++++++++ zh/电子基础/EE16/index.html | 14 ++++++++++++++ .../Signals_and_Systems_AVO/index.html | 14 ++++++++++++++ zh/电子基础/signal/index.html | 14 ++++++++++++++ zh/程序语言设计/CS242/index.html | 14 ++++++++++++++ zh/系统安全/CS161/index.html | 14 ++++++++++++++ zh/系统安全/MIT6.858/index.html | 14 ++++++++++++++ zh/编程入门/AUT1400/index.html | 14 ++++++++++++++ zh/编程入门/CS106B_CS106X/index.html | 14 ++++++++++++++ zh/编程入门/CS106L/index.html | 14 ++++++++++++++ zh/编程入门/CS110L/index.html | 14 ++++++++++++++ zh/编程入门/CS50/index.html | 14 ++++++++++++++ zh/编程入门/CS61A/index.html | 14 ++++++++++++++ zh/编程入门/Duke-Coursera-Intro-C/index.html | 14 ++++++++++++++ zh/编程入门/MIT-Missing-Semester/index.html | 14 ++++++++++++++ zh/编译原理/6035/index.html | 14 ++++++++++++++ zh/编译原理/CS143/index.html | 14 ++++++++++++++ zh/计算机图形学/15462/index.html | 14 ++++++++++++++ zh/计算机图形学/CS148/index.html | 14 ++++++++++++++ zh/计算机图形学/CS184/index.html | 14 ++++++++++++++ zh/计算机图形学/GAMES101/index.html | 14 ++++++++++++++ zh/计算机图形学/GAMES103/index.html | 14 ++++++++++++++ zh/计算机图形学/GAMES202/index.html | 14 ++++++++++++++ zh/计算机网络/CS144/index.html | 14 ++++++++++++++ zh/计算机网络/topdown/index.html | 14 ++++++++++++++ zh/计算机网络/topdown_ustc/index.html | 14 ++++++++++++++ zh/软件工程/6031/index.html | 14 ++++++++++++++ zh/软件工程/CS169/index.html | 14 ++++++++++++++ 人工智能/CS188/index.html | 14 ++++++++++++++ 人工智能/CS50/index.html | 14 ++++++++++++++ 人工智能/CYJ/index.html | 14 ++++++++++++++ 体系结构/CS61C/index.html | 14 ++++++++++++++ 体系结构/CSAPP/index.html | 14 ++++++++++++++ 体系结构/DDCA/index.html | 14 ++++++++++++++ 体系结构/N2T/index.html | 14 ++++++++++++++ 使用指南/index.html | 14 ++++++++++++++ 后记/index.html | 14 ++++++++++++++ 培养方案Pro/index.html | 14 ++++++++++++++ 好书推荐/index.html | 14 ++++++++++++++ 并行与分布式系统/CS149/index.html | 14 ++++++++++++++ 并行与分布式系统/MIT6.824/index.html | 14 ++++++++++++++ 必学工具/CMake/index.html | 14 ++++++++++++++ 必学工具/Docker/index.html | 14 ++++++++++++++ 必学工具/GNU_Make/index.html | 14 ++++++++++++++ 必学工具/Git/index.html | 14 ++++++++++++++ 必学工具/GitHub/index.html | 14 ++++++++++++++ 必学工具/LaTeX/index.html | 14 ++++++++++++++ 必学工具/Scoop/index.html | 14 ++++++++++++++ 必学工具/Vim/index.html | 14 ++++++++++++++ 必学工具/thesis/index.html | 14 ++++++++++++++ 必学工具/tools/index.html | 14 ++++++++++++++ 必学工具/workflow/index.html | 14 ++++++++++++++ 必学工具/翻墙/index.html | 14 ++++++++++++++ 操作系统/CS162/index.html | 14 ++++++++++++++ 操作系统/MIT6.S081/index.html | 14 ++++++++++++++ 操作系统/NJUOS/index.html | 14 ++++++++++++++ 数学基础/MITLA/index.html | 14 ++++++++++++++ 数学基础/MITmaths/index.html | 14 ++++++++++++++ 数学基础/information/index.html | 14 ++++++++++++++ 数学进阶/6.042J/index.html | 14 ++++++++++++++ 数学进阶/CS126/index.html | 14 ++++++++++++++ 数学进阶/CS70/index.html | 14 ++++++++++++++ .../index.html | 14 ++++++++++++++ 数学进阶/convex/index.html | 14 ++++++++++++++ 数学进阶/numerical/index.html | 14 ++++++++++++++ 数据库系统/15445/index.html | 14 ++++++++++++++ 数据库系统/CS122/index.html | 14 ++++++++++++++ 数据库系统/CS186/index.html | 14 ++++++++++++++ 数据库系统/CS346/index.html | 14 ++++++++++++++ 数据科学/Data100/index.html | 14 ++++++++++++++ 数据结构与算法/Algo/index.html | 14 ++++++++++++++ 数据结构与算法/CS170/index.html | 14 ++++++++++++++ 数据结构与算法/CS61B/index.html | 14 ++++++++++++++ 机器学习/CS189/index.html | 14 ++++++++++++++ 机器学习/CS229/index.html | 14 ++++++++++++++ 机器学习/ML/index.html | 14 ++++++++++++++ 机器学习系统/CMU10-414/index.html | 14 ++++++++++++++ 机器学习系统/MLC/index.html | 14 ++++++++++++++ 机器学习进阶/CMU10-708/index.html | 14 ++++++++++++++ 机器学习进阶/CS229M/index.html | 14 ++++++++++++++ 机器学习进阶/STA4273/index.html | 14 ++++++++++++++ 机器学习进阶/STAT8201/index.html | 14 ++++++++++++++ 机器学习进阶/roadmap/index.html | 14 ++++++++++++++ 深度学习/CS224n/index.html | 14 ++++++++++++++ 深度学习/CS224w/index.html | 14 ++++++++++++++ 深度学习/CS230/index.html | 14 ++++++++++++++ 深度学习/CS231/index.html | 14 ++++++++++++++ 深度学习/CS285/index.html | 14 ++++++++++++++ 深度学习/LHY/index.html | 14 ++++++++++++++ 电子基础/EE16/index.html | 14 ++++++++++++++ 电子基础/Signals_and_Systems_AVO/index.html | 14 ++++++++++++++ 电子基础/signal/index.html | 14 ++++++++++++++ 程序语言设计/CS242/index.html | 14 ++++++++++++++ 系统安全/CS161/index.html | 14 ++++++++++++++ 系统安全/MIT6.858/index.html | 14 ++++++++++++++ 编程入门/AUT1400/index.html | 14 ++++++++++++++ 编程入门/CS106B_CS106X/index.html | 14 ++++++++++++++ 编程入门/CS106L/index.html | 14 ++++++++++++++ 编程入门/CS110L/index.html | 14 ++++++++++++++ 编程入门/CS50/index.html | 14 ++++++++++++++ 编程入门/CS61A/index.html | 14 ++++++++++++++ 编程入门/Duke-Coursera-Intro-C/index.html | 14 ++++++++++++++ 编程入门/MIT-Missing-Semester/index.html | 14 ++++++++++++++ 编译原理/6035/index.html | 14 ++++++++++++++ 编译原理/CS143/index.html | 14 ++++++++++++++ 计算机图形学/15462/index.html | 14 ++++++++++++++ 计算机图形学/CS148/index.html | 14 ++++++++++++++ 计算机图形学/CS184/index.html | 14 ++++++++++++++ 计算机图形学/GAMES101/index.html | 14 ++++++++++++++ 计算机图形学/GAMES103/index.html | 14 ++++++++++++++ 计算机图形学/GAMES202/index.html | 14 ++++++++++++++ 计算机网络/CS144/index.html | 14 ++++++++++++++ 计算机网络/topdown/index.html | 14 ++++++++++++++ 计算机网络/topdown_ustc/index.html | 14 ++++++++++++++ 软件工程/6031/index.html | 14 ++++++++++++++ 软件工程/CS169/index.html | 14 ++++++++++++++ 280 files changed, 3906 insertions(+) diff --git a/CS学习规划/index.html b/CS学习规划/index.html index 97c46d5c..41e54c4d 100644 --- a/CS学习规划/index.html +++ b/CS学习规划/index.html @@ -1,2 +1,16 @@ 一个仅供参考的CS学习规划 - CS自学指南
跳转至

一个仅供参考的 CS 学习规划

计算机领域方向庞杂,知识浩如烟海,每个细分领域如果深究下去都可以说学无止境。因此,一个清晰明确的学习规划是非常重要的。我在多年自学的尝试中也走过不少弯路,最终提炼出了下面的内容,供大家参考。

不过,在开始学习之前,先向小白们强烈推荐一个科普向系列视频 Crash Course: Computer Science,在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面:计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正如它的口号所说的 Computers are not magic!,希望看完这个视频之后,大家能对计算机科学有个全貌性地感知,从而怀着兴趣去面对下面浩如烟海的更为细致且深入的学习内容。

必学工具

俗话说:磨刀不误砍柴工。如果你是一个刚刚接触计算机的24k纯小白,学会一些工具将会让你事半功倍。

学会提问:也许你会惊讶,提问也算计算机必备技能吗,还放在第一条?我觉得在开源社区中,学会提问是一项非常重要的能力,它包含两方面的事情。其一是会变相地培养你自主解决问题的能力,因为从形成问题、描述问题并发布、他人回答、最后再到理解回答这个周期是非常长的,如果遇到什么鸡毛蒜皮的事情都希望别人最好远程桌面手把手帮你完成,那计算机的世界基本与你无缘了。其二,如果真的经过尝试还无法解决,可以借助开源社区的帮助,但这时候如何通过简洁的文字让别人瞬间理解你的处境以及目的,就显得尤为重要。推荐阅读提问的智慧这篇文章,这不仅能提高你解决问题的概率和效率,也能让开源社区里无偿提供解答的人们拥有一个好心情。

MIT-Missing-Semester 这门课覆盖了这些工具中绝大部分,而且有相当详细的使用指导,强烈建议小白学习。

翻墙:由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 99% 的问题。因此,学会翻墙几乎是一个内地 CSer 的必备技能。(考虑到法律问题,这个文档提供的翻墙方式仅对拥有北大邮箱的用户适用)。

命令行:熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程,它源于 Quora 的一个提问,但在各路大神的贡献努力下已经成为了一个 GitHub 十万 stars 的顶流项目,被翻译成了十几种语言。教程不长,非常建议大家反复通读,在实践中内化吸收。同时,掌握 Shell 脚本编程也是一项不容忽视的技术,可以参考这个教程

IDE (Integrated Development Environment):集成开发环境,说白了就是你写代码的地方。作为一个码农,IDE 的重要性不言而喻,但由于很多 IDE 是为大型工程项目设计的,体量较大,功能也过于丰富。其实如今一些轻便的文本编辑器配合丰富的插件生态基本可以满足日常的轻量编程需求。个人常用的编辑器是 VS Code 和 Sublime(前者的插件配置非常简单,后者略显复杂但颜值很高)。当然对于大型项目我还是会采用略重型的 IDE,例如 Pycharm (Python),IDEA (Java) 等等(免责申明:所有的 IDE 都是世界上最好的 IDE)。

Vim:一款命令行编辑工具。这是一个学习曲线有些陡峭的编辑器,不过学会它我觉得是非常有必要的,因为它将极大地提高你的开发效率。现在绝大多数 IDE 也都支持 Vim 插件,让你在享受现代开发环境的同时保留极客的炫酷(yue)。

Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的童鞋必须掌握的神器之一。

GitHub:基于 Git 的代码托管平台。全世界最大的代码开源社区,大佬集聚地。

GNU Make:一款工程构建工具。善用 GNU Make 会让你养成代码模块化的习惯,同时也能让你熟悉一些大型工程的编译链接流程。

CMake:一款功能比 GNU Make 更为强大的构建工具,建议掌握 GNU Make 之后再加以学习。

LaTex逼格提升 论文排版工具。

Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。

实用工具箱:除了上面提到的这些在开发中使用频率极高的工具之外,我还收集了很多实用有趣的免费工具,例如一些下载工具、设计工具、学习网站等等。

Thesis:毕业论文 Word 写作教程。

好书推荐

私以为一本好的教材应当是以人为本的,而不是炫技式的理论堆砌。告诉读者“是什么”固然重要,但更好的应当是教材作者将其在这个领域深耕几十年的经验融汇进书中,向读者娓娓道来“为什么”以及未来应该“怎么做”。

链接戳这里

环境配置

你以为的开发 —— 在 IDE 里疯狂码代码数小时。

实际上的开发 —— 配环境配几天还没开始写代码。

PC 端环境配置

如果你是 Mac 用户,那么你很幸运,这份指南 将会手把手地带你搭建起整套开发环境。如果你是 Windows 用户,在开源社区的努力下,你同样可以获得与其他平台类似的体验:Scoop

另外大家可以参考一份灵感来自 6.NULL MIT-Missing-Semester环境配置指南,重点在于终端的美化配置。此外还包括常用软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及一些 IDE 的配置与激活教程。

服务器端环境配置

推荐一个非常不错的 GitHub 项目 DevOps-Guide,其中涵盖了非常多的运维方面的基础知识和教程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。

课程地图

正如这章开头提到的,这份课程地图仅仅是一个仅供参考的课程规划,我作为一个临近毕业的本科生。深感自己没有权利也没有能力向别人宣扬“应该怎么学”。因此如果你觉得以下的课程分类与选择有不合理之处,我全盘接受,并深感抱歉。你可以在下一节定制属于你的课程地图

以下课程类别中除了含有 基础入门 字眼的以外,并无明确的先后次序,大家只要满足某个课程的先修要求,完全可以根据自己的需要和喜好选择想要学习的课程。

数学基础

微积分与线性代数

作为大一新生,学好微积分线代是和写代码至少同等重要的事情,相信已经有无数的前人经验提到过这一点,但我还是要不厌其烦地再强调一遍:学好微积分线代真的很重要!你也许会吐槽这些东西岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻骨铭心的程度。如果觉得老师课上讲的内容晦涩难懂,不妨参考 MIT 的 Calculus Course18.06: Linear Algebra 的课程 notes,至少于我而言,它帮助我深刻理解了微积分和线性代数的许多本质。顺道再安利一个油管数学网红 3Blue1Brown,他的频道有很多用生动形象的动画阐释数学本质内核的视频,兼具深度和广度,质量非常高。

信息论入门

作为计算机系的学生,及早了解一些信息论的基础知识,我觉得是大有裨益的。但大多信息论课程都面向高年级本科生甚至研究生,对新手极不友好。而 MIT 的 6.050J: Information theory and Entropy 这门课正是为大一新生量身定制的,几乎没有先修要求,涵盖了编码、压缩、通信、信息熵等等内容,非常有趣。

数学进阶

离散数学与概率论

集合论、图论、概率论等等是算法推导与证明的重要工具,也是后续高阶数学课程的基础。但我觉得这类课程的讲授很容易落入理论化与形式化的窠臼,让课堂成为定理结论的堆砌,而无法使学生深刻把握理论的本质,进而造成学了就背,考了就忘的怪圈。如果能在理论教学中穿插算法运用实例,学生在拓展算法知识的同时也能窥见理论的力量和魅力。

UCB CS70 : discrete Math and probability theoryUCB CS126 : Probability theory 是 UC Berkeley 的概率论课程,前者覆盖了离散数学和概率论基础,后者则涉及随机过程以及深入的理论内容。两者都非常注重理论和实践的结合,有丰富的算法实际运用实例,后者还有大量的 Python 编程作业来让学生运用概率论的知识解决实际问题。

数值分析

作为计算机系的学生,培养计算思维是很重要的,实际问题的建模、离散化,计算机的模拟、分析,是一项很重要的能力。而这两年开始风靡的,由 MIT 打造的 Julia 编程语言以其 C 一样的速度和 Python 一样友好的语法在数值计算领域有一统天下之势,MIT 的许多数学课程也开始用 Julia 作为教学工具,把艰深的数学理论用直观清晰的代码展示出来。

ComputationalThinking 是 MIT 开设的一门计算思维入门课,所有课程内容全部开源,可以在课程网站直接访问。这门课利用 Julia 编程语言,在图像处理、社会科学与数据科学、气候学建模三个 topic 下带领学生理解算法、数学建模、数据分析、交互设计、图例展示,让学生体验计算与科学的美妙结合。内容虽然不难,但给我最深刻的感受就是,科学的魅力并不是故弄玄虚的艰深理论,不是诘屈聱牙的术语行话,而是用直观生动的案例,用简练深刻的语言,让每个普通人都能理解。

上完上面的体验课之后,如果意犹未尽的话,不妨试试 MIT 的 18.330 : Introduction to numerical analysis,这门课的编程作业同样会用 Julia 编程语言,不过难度和深度上都上了一个台阶。内容涉及了浮点编码、Root finding、线性系统、微分方程等等方面,整门课的主旨就是让你利用离散化的计算机表示去估计和逼近一个数学上连续的概念。这门课的教授还专门撰写了一本配套的开源教材 Fundamentals of Numerical Computation,里面附有丰富的 Julia 代码实例和严谨的公式推导。

如果你还意犹未尽的话,还有 MIT 的数值分析研究生课程 18.335: Introduction to numerical method 供你参考。

微分方程

如果世间万物的运动发展都能用方程来刻画和描述,这是一件多么酷的事情呀!虽然几乎任何一所学校的 CS 培养方案中都没有微分方程相关的必修课程,但我还是觉得掌握它会赋予你一个新的视角来审视这个世界。

由于微分方程中往往会用到很多复变函数的知识,所以大家可以参考 MIT18.04: Complex variables functions 的课程 notes 来补齐先修知识。

MIT18.03: differential equations 主要覆盖了常微分方程的求解,在此基础之上 MIT18.152: Partial differential equations 则会深入偏微分方程的建模与求解。掌握了微分方程这一有力工具,相信对于你的实际问题的建模能力以及从众多噪声变量中把握本质的直觉都会有很大帮助。

数学高阶

作为计算机系的学生,我经常听到数学无用论的论断,对此我不敢苟同但也无权反对,但若凡事都硬要争出个有用和无用的区别来,倒也着实无趣,因此下面这些面向高年级甚至研究生的数学课程,大家按兴趣自取所需。

凸优化

Standford EE364A: Convex Optimization

信息论

MIT6.441: Information Theory

应用统计学

MIT18.650: Statistics for Applications

初等数论

MIT18.781: Theory of Numbers

密码学

Standford CS255: Cryptography

编程入门

Languages are tools, you choose the right tool to do the right thing. Since there's no universally perfect tool, there's no universally perfect language.

Shell

Python

C++

Rust

OCaml

电子基础

电路基础

作为计算机系的学生,了解一些基础的电路知识,感受从传感器收集数据到数据分析再到算法预测整条流水线,对于后续知识的学习以及计算思维的培养还是很有帮助的。EE16A&B: Designing Information Devices and Systems I&II 是伯克利 EE 学生的大一入门课,其中 EE16A 注重通过电路从实际环境中收集和分析数据,而 EE16B 则侧重从这些收集到的数据进行分析并做出预测行为。

信号与系统

信号与系统是一门我觉得非常值得一上的课,最初学它只是为了满足我对傅里叶变换的好奇,但学完之后我才不禁感叹,傅立叶变换给我提供了一个全新的视角去看待这个世界,就如同微分方程一样,让你沉浸在用数学去精确描绘和刻画这个世界的优雅与神奇之中。

MIT 6.003: signal and systems 提供了全部的课程录影、书面作业以及答案。也可以去看这门课的远古版本

UCB EE120: Signal and Systems 关于傅立叶变换的 notes 写得非常好,并且提供了6 个非常有趣的 Python 编程作业,让你实践中运用信号与系统的理论与算法。

数据结构与算法

算法是计算机科学的核心,也是几乎一切专业课程的基础。如何将实际问题通过数学抽象转化为算法问题,并选用合适的数据结构在时间和内存大小的限制下将其解决是算法课的永恒主题。如果你受够了老师的照本宣科,那么我强烈推荐伯克利的 UCB CS61B: Data Structures and Algorithms 和普林斯顿的 Coursera: Algorithms I & II,这两门课的都讲得深入浅出并且会有丰富且有趣的编程实验将理论与知识结合起来。此外,对一些更高级的算法以及 NP 问题感兴趣的同学可以学习伯克利的算法设计与分析课程 UCB CS170: Efficient Algorithms and Intractable Problems

软件工程

入门课

一份“能跑”的代码,和一份高质量的工业级代码是有本质区别的。因此我非常推荐低年级的同学学习一下 MIT 6.031: Software Construction 这门课,它会以 Java 语言为基础,以丰富细致的阅读材料和精心设计的编程练习传授如何编写不易出 bug、简明易懂、易于维护修改的高质量代码。大到宏观数据结构设计,小到如何写注释,遵循这些前人总结的细节和经验,对于你此后的编程生涯大有裨益。

专业课

当然,如果你想系统性地上一门软件工程的课程,那我推荐的是伯克利的 UCB CS169: software engineering。但需要提醒的是,和大多学校(包括贵校)的软件工程课程不同,这门课不会涉及传统的 design and document 模式,即强调各种类图、流程图及文档设计,而是采用近些年流行起来的小团队快速迭代 Agile Develepment 开发模式以及利用云平台的 Software as a service 服务模式。

体系结构

入门课

从小我就一直听说,计算机的世界是由 01 构成的,我不理解但大受震撼。如果你的内心也怀有这份好奇,不妨花一到两个月的时间学习 Coursera: Nand2Tetris 这门无门槛的计算机课程。这门麻雀虽小五脏俱全的课程会从 01 开始让你亲手造出一台计算机,并在上面运行俄罗斯方块小游戏。一门课里涵盖了编译、虚拟机、汇编、体系结构、数字电路、逻辑门等等从上至下、从软至硬的各类知识,非常全面。难度上也是通过精心的设计,略去了众多现代计算机复杂的细节,提取出了最核心本质的东西,力图让每个人都能理解。在低年级,如果就能从宏观上建立对整个计算机体系的鸟瞰图,是大有裨益的。

专业课

当然,如果想深入现代计算机体系结构的复杂细节,还得上一门大学本科难度的课程 UCB CS61C: Great Ideas in Computer Architecture。UC Berkeley 作为 RISC-V 架构的发源地,在体系结构领域算得上首屈一指。其课程非常注重实践,你会在 Project 中手写汇编构造神经网络,从零开始搭建一个 CPU,这些实践都会让你对计算机体系结构有更为深入的理解,而不是仅停留于“取指译码执行访存写回”的单调背诵里。

系统入门

计算机系统是一个庞杂而深刻的主题,在深入学习某个细分领域之前,对各个领域有一个宏观概念性的理解,对一些通用性的设计原则有所知晓,会让你在之后的深入学习中不断强化一些最为核心乃至哲学的概念,而不会桎梏于复杂的内部细节和各种 trick。因为在我看来,学习系统最关键的还是想让你领悟到这些最核心的东西,从而能够设计和实现出属于自己的系统。

MIT6.033: System Engineering 是 MIT 的系统入门课,主题涉及了操作系统、网络、分布式和系统安全,除了知识点的传授外,这门课还会讲授一些写作和表达上的技巧,让你学会如何设计并向别人介绍和分析自己的系统。这本书配套的教材 Principles of Computer System Design: An Introduction 也写得非常好,推荐大家阅读。

CMU 15-213: Introduction to Computer System 是 CMU 的系统入门课,内容覆盖了体系结构、操作系统、链接、并行、网络等等,兼具广度和深度,配套的教材 Computer Systems: A Programmer's Perspective 也是质量极高,强烈建议阅读。

操作系统

没有什么能比自己写个内核更能加深对操作系统的理解了。

操作系统作为各类纷繁复杂的底层硬件虚拟化出一套规范优雅的抽象,给所有应用软件提供丰富的功能支持。了解操作系统的设计原则和内部原理对于一个不满足于当调包侠的程序员来说是大有裨益的。出于对操作系统的热爱,我上过国内外很多操作系统课程,它们各有侧重和优劣,大家可以根据兴趣各取所需。

MIT 6.S081: Operating System Engineering,MIT 著名 PDOS 实验室出品,11 个 Project 让你在一个实现非常优雅的类Unix操作系统xv6上增加各类功能模块。这门课也让我深刻认识到,做系统不是靠 PPT 念出来的,是得几万行代码一点点累起来的。

UCB CS162: Operating System,伯克利的操作系统课,采用和 Stanford 同样的 Project —— 一个教学用操作系统 Pintos。我作为北京大学2022年春季学期操作系统实验班的助教,引入并改善了这个 Project,课程资源也会全部开源,具体参见课程网站

NJU: Operating System Design and Implementation,南京大学的蒋炎岩老师开设的操作系统课程。蒋老师以其独到的系统视角结合丰富的代码示例将众多操作系统的概念讲得深入浅出,此外这门课的全部课程内容都是中文的,非常方便大家学习。

并行与分布式系统

想必这两年各类 CS 讲座里最常听到的话就是“摩尔定律正在走向终结”,此话不假,当单核能力达到上限时,多核乃至众核架构如日中天。硬件的变化带来的是上层编程逻辑的适应与改变,要想充分利用硬件性能,编写并行程序几乎成了程序员的必备技能。与此同时,深度学习的兴起对计算机算力与存储的要求都达到了前所未有的高度,大规模集群的部署和优化也成为热门技术话题。

并行计算

CMU 15-418/Stanford CS149: Parallel Computing

分布式系统

MIT 6.824: Distributed System

系统安全

不知道你当年选择计算机是不是因为怀着一个中二的黑客梦想,但现实却是成为黑客道阻且长。

理论课程

UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、网站安全、网络安全等等内容。

实践课程

掌握这些理论知识之后,还需要在实践中培养和锻炼这些“黑客素养”。CTF 夺旗赛是一项比较热门的系统安全比赛,赛题中会融会贯通地考察你对计算机各个领域知识的理解和运用。北大今年也成功举办了第 0 届和第 1 届,鼓励大家后期踊跃参与,在实践中提高自己。下面列举一些我平时学习(摸鱼)用到的资源:

计算机网络

没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了。

大名鼎鼎的 Stanford CS144: Computer Network,8 个 Project 带你实现整个 TCP/IP 协议栈。

如果你只是想在理论上对计算机网络有所了解,那么推荐计网著名教材《自顶向下方法》的配套学习资源 Computer Networking: A Top-Down Approach

数据库系统

没有什么能比自己写个关系型数据库更能加深对数据库系统的理解了。

CMU 的著名数据库神课 CMU 15-445: Introduction to Database System 会通过 4 个 Project 带你为一个用于教学的关系型数据库 bustub 添加各种功能。实验的评测框架也免费开源了,非常适合大家自学。此外课程实验会用到 C++11 的众多新特性,也是一个锻炼 C++ 代码能力的好机会。

Berkeley 作为著名开源数据库 postgres 的发源地也不遑多让,UCB CS186: Introduction to Database System 会让你用 Java 语言实现一个支持 SQL 并发查询、B+ 树索引和故障恢复的关系型数据库。

编译原理

没有什么能比自己写个编译器更能加深对编译器的理解了。

Stanford CS143: Compilers 带你手写编译器。

Web开发

前后端开发很少在计算机的培养方案里被重视,但其实掌握这项技能还是好处多多的,例如搭建自己的个人主页,抑或是给自己的课程项目做一个精彩的展示网页。

两周速成版

MIT web development course

系统学习版

Stanford CS142: Web Applications

计算机图形学

数据科学

其实数据科学和机器学习与深度学习有着很紧密的联系,但可能更侧重于实践。Berkeley 的 UCB Data100: Principles and Techniques of Data Science 通过丰富的编程练习让你在实践中掌握各类数据分析工具和算法,并带领你体验从海量的数据集中提取出想要的结果,并对未来的数据或用户的行为做出相应的预测。但这只是一门基础课,如果想学习工业级别的数据挖掘与分析技术,可以尝试 Stanford 的大数据挖掘课程 CS246: Mining Massive Data Sets

人工智能

近十年人工智能应该算是计算机界最火爆的领域。如果你不满足于整日听各路媒体争相报道人工智能相关的进展,而想真正一探究竟,那么非常推荐学习 Harvard 神课 CS50 系列的人工智能课程 Harvard CS50: Introduction to AI with Python。课程短小精悍,覆盖了传统人工智能领域的几大分支,并配有丰富有趣的 Python 编程练习来巩固你对人工智能算法的理解。美中不足的是这门课因为面向在线自学者的缘故内容较为精简,并且不会涉及特别深入的数学理论,如果想要系统深入地学习还需要一门本科生难度的课程,例如 Berkeley 的 UCB CS188: Introduction to Artificial Intelligence。这门课的 Project 复刻了经典游戏糖豆人,让你运用人工智能算法玩游戏,非常有趣。

机器学习

机器学习领域近些年最重要的进展就是发展出了基于神经网络的深度学习分支,但其实很多基于统计学习的算法依然在数据分析领域有着广泛的应用。如果你之前从未接触过机器学习的相关知识,而且不想一开始就陷入艰深晦涩的数学证明,那么不妨先从 Andrew Ng (吴恩达)的 Coursera: Machine Learning 学起。这门课在机器学习领域基本无人不晓,吴恩达以其深厚的理论功底和出色的表达能力把很多艰深的算法讲得深入浅出,并且非常实用。其配套的作业也是质量相当上乘,可以帮助你快速入门。

但上过这门课只能让你从宏观上对机器学习这一领域有一定了解,如果想真正理解那些“神奇”算法背后的数学原理甚至从事相关领域的科研工作,那么还需要一门更“数学”的课程,例如 Stanford CS229: Machine Learning 或者 UCB CS189: Introduction to Machine Learning

深度学习

前几年 AlphaGo 的大热让深度学习进入了大众的视野,不少大学甚至专门成立了相关专业。很多计算机的其他领域也会借助深度学习的技术来做研究,因此基本不管你干啥多少都会接触到一些神经网络、深度学习相关的技术需求。如果想快速入门,同样推荐 Andrew Ng (吴恩达)的 Coursera: Deep Learning,质量无需多言,Coursera 上罕见的满分课程。此外如果你觉得英文课程学习起来有难度,推荐李宏毅老师的 国立台湾大学:机器学习 课程。这门课打着机器学习的名号,却囊括了深度学习领域的几乎所有方向,非常全面,很适合你从宏观上对这个领域有一个大致的了解。而且老师本人也非常幽默,课堂金句频出。

当然因为深度学习领域发展非常迅速,已经拥有了众多研究分支,如果想要进一步深入,可以按需学习下面罗列的代表课程,

计算机视觉

Stanford CS231n: CNN for Visual Recognition

自然语言处理

Stanford CS224n: Natural Language Processing

图神经网络

Stanford CS224w: Machine Learning with Graphs

强化学习

UCB CS285: Deep Reinforcement Learning

定制属于你的课程地图

授人以鱼不如授人以渔。

以上的课程规划难免带有强烈的个人偏好,不一定适合所有人,更多是起到抛砖引玉的作用。如果你想挑选自己感兴趣的方向和内容加以学习,可以参考我在下面列出来的资源。


最后更新: November 2, 2022
Back to top
\ No newline at end of file diff --git a/Web开发/CS142/index.html b/Web开发/CS142/index.html index b6e5aab5..244434f8 100644 --- a/Web开发/CS142/index.html +++ b/Web开发/CS142/index.html @@ -1,2 +1,16 @@ Stanford CS142: Web Applications - CS自学指南
跳转至

Stanford CS142: Web Applications

课程简介

  • 所属大学:Stanford
  • 先修要求:有一定的编程经验
  • 编程语言:JavaScript/HTML/CSS
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

斯坦福的 Web 应用开发课程,内容覆盖了 HTML, CSS, JavaScript, ReactJs, NodeJS, ExpressJS, Web安全等等。8 个 Project 会让你在实战中锻炼自己的 Web 开发技巧。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/Web开发/fullstackopen/index.html b/Web开发/fullstackopen/index.html index f405e2dc..63da45c8 100644 --- a/Web开发/fullstackopen/index.html +++ b/Web开发/fullstackopen/index.html @@ -1,2 +1,16 @@ University of Helsinki: Full Stack open 2022 - CS自学指南
跳转至

University of Helsinki: Full Stack open 2022

课程简介

  • 所属大学:University of Helsinki
  • 先修要求:具备良好的编程技能、基本的网络编程和数据库知识,并且了解使用 Git 这个版本控制系统的基础知识。
  • 编程语言:JavaScript/HTML/CSS/NoSQL/SQL
  • 课程难度:🌟🌟
  • 预计学时:因人而异

本课程是介绍如何使用 JavaScript 开发现代Web应用程序。 课程的重点是使用 ReactJS 构建单页面应用程序(SPA),并使用由 Node.js 构建 REST API。该课程还包含介绍 GraphQL 的部分,这是 REST API 的现代替代方案。

课程还包括测试、配置和环境管理,以及使用 MongoDB 来存储应用的数据。

课程资源


最后更新: September 7, 2022
Back to top
\ No newline at end of file diff --git a/Web开发/mitweb/index.html b/Web开发/mitweb/index.html index a63f97e4..93a73084 100644 --- a/Web开发/mitweb/index.html +++ b/Web开发/mitweb/index.html @@ -1,2 +1,16 @@ MIT web development course - CS自学指南
跳转至

MIT Web Development Crash Course

课程简介

  • 所属大学:MIT
  • 先修要求:掌握至少一门编程语言
  • 编程语言:JavaScript/HTML/CSS/NoSQL
  • 课程难度:🌟🌟🌟
  • 预计学时:因人而异

MIT 在每年 1 月份会有一个为期 4 周的 Independent Activities Period (IAP),在这个月里,MIT 的学生和老师可以自由地开设很多有趣的课程,而这门网站开发课程就是其中之一。

在一个月的时间里,你会从零开始掌握一个网站的设计、搭建、美化、交互等等核心内容,基本覆盖了 Web 开发的前后端大部分技术栈。如果你不需要系统地学习网络开发,而只是出于兴趣想把它加入自己的技能包里,那么这门课将非常适合你。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/CS学习规划/index.html b/en/CS学习规划/index.html index 96088202..1c42ba35 100644 --- a/en/CS学习规划/index.html +++ b/en/CS学习规划/index.html @@ -1,2 +1,16 @@ Guideline - CSDIY.wiki
Skip to content

一个仅供参考的 CS 学习规划

计算机领域方向庞杂,知识浩如烟海,每个细分领域如果深究下去都可以说学无止境。因此,一个清晰明确的学习规划是非常重要的。我在多年自学的尝试中也走过不少弯路,最终提炼出了下面的内容,供大家参考。

不过,在开始学习之前,先向小白们强烈推荐一个科普向系列视频 Crash Course: Computer Science,在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面:计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正如它的口号所说的 Computers are not magic!,希望看完这个视频之后,大家能对计算机科学有个全貌性地感知,从而怀着兴趣去面对下面浩如烟海的更为细致且深入的学习内容。

必学工具

俗话说:磨刀不误砍柴工。如果你是一个刚刚接触计算机的24k纯小白,学会一些工具将会让你事半功倍。

学会提问:也许你会惊讶,提问也算计算机必备技能吗,还放在第一条?我觉得在开源社区中,学会提问是一项非常重要的能力,它包含两方面的事情。其一是会变相地培养你自主解决问题的能力,因为从形成问题、描述问题并发布、他人回答、最后再到理解回答这个周期是非常长的,如果遇到什么鸡毛蒜皮的事情都希望别人最好远程桌面手把手帮你完成,那计算机的世界基本与你无缘了。其二,如果真的经过尝试还无法解决,可以借助开源社区的帮助,但这时候如何通过简洁的文字让别人瞬间理解你的处境以及目的,就显得尤为重要。推荐阅读提问的智慧这篇文章,这不仅能提高你解决问题的概率和效率,也能让开源社区里无偿提供解答的人们拥有一个好心情。

MIT-Missing-Semester 这门课覆盖了这些工具中绝大部分,而且有相当详细的使用指导,强烈建议小白学习。

翻墙:由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 99% 的问题。因此,学会翻墙几乎是一个内地 CSer 的必备技能。(考虑到法律问题,这个文档提供的翻墙方式仅对拥有北大邮箱的用户适用)。

命令行:熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程,它源于 Quora 的一个提问,但在各路大神的贡献努力下已经成为了一个 GitHub 十万 stars 的顶流项目,被翻译成了十几种语言。教程不长,非常建议大家反复通读,在实践中内化吸收。同时,掌握 Shell 脚本编程也是一项不容忽视的技术,可以参考这个教程

IDE (Integrated Development Environment):集成开发环境,说白了就是你写代码的地方。作为一个码农,IDE 的重要性不言而喻,但由于很多 IDE 是为大型工程项目设计的,体量较大,功能也过于丰富。其实如今一些轻便的文本编辑器配合丰富的插件生态基本可以满足日常的轻量编程需求。个人常用的编辑器是 VS Code 和 Sublime(前者的插件配置非常简单,后者略显复杂但颜值很高)。当然对于大型项目我还是会采用略重型的 IDE,例如 Pycharm (Python),IDEA (Java) 等等(免责申明:所有的 IDE 都是世界上最好的 IDE)。

Vim:一款命令行编辑工具。这是一个学习曲线有些陡峭的编辑器,不过学会它我觉得是非常有必要的,因为它将极大地提高你的开发效率。现在绝大多数 IDE 也都支持 Vim 插件,让你在享受现代开发环境的同时保留极客的炫酷(yue)。

Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的童鞋必须掌握的神器之一。

GitHub:基于 Git 的代码托管平台。全世界最大的代码开源社区,大佬集聚地。

GNU Make:一款工程构建工具。善用 GNU Make 会让你养成代码模块化的习惯,同时也能让你熟悉一些大型工程的编译链接流程。

CMake:一款功能比 GNU Make 更为强大的构建工具,建议掌握 GNU Make 之后再加以学习。

LaTex逼格提升 论文排版工具。

Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。

实用工具箱:除了上面提到的这些在开发中使用频率极高的工具之外,我还收集了很多实用有趣的免费工具,例如一些下载工具、设计工具、学习网站等等。

Thesis:毕业论文 Word 写作教程。

好书推荐

私以为一本好的教材应当是以人为本的,而不是炫技式的理论堆砌。告诉读者“是什么”固然重要,但更好的应当是教材作者将其在这个领域深耕几十年的经验融汇进书中,向读者娓娓道来“为什么”以及未来应该“怎么做”。

链接戳这里

环境配置

你以为的开发 —— 在 IDE 里疯狂码代码数小时。

实际上的开发 —— 配环境配几天还没开始写代码。

PC 端环境配置

如果你是 Mac 用户,那么你很幸运,这份指南 将会手把手地带你搭建起整套开发环境。如果你是 Windows 用户,在开源社区的努力下,你同样可以获得与其他平台类似的体验:Scoop

另外大家可以参考一份灵感来自 6.NULL MIT-Missing-Semester环境配置指南,重点在于终端的美化配置。此外还包括常用软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及一些 IDE 的配置与激活教程。

服务器端环境配置

推荐一个非常不错的 GitHub 项目 DevOps-Guide,其中涵盖了非常多的运维方面的基础知识和教程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。

课程地图

正如这章开头提到的,这份课程地图仅仅是一个仅供参考的课程规划,我作为一个临近毕业的本科生。深感自己没有权利也没有能力向别人宣扬“应该怎么学”。因此如果你觉得以下的课程分类与选择有不合理之处,我全盘接受,并深感抱歉。你可以在下一节定制属于你的课程地图

以下课程类别中除了含有 基础入门 字眼的以外,并无明确的先后次序,大家只要满足某个课程的先修要求,完全可以根据自己的需要和喜好选择想要学习的课程。

数学基础

微积分与线性代数

作为大一新生,学好微积分线代是和写代码至少同等重要的事情,相信已经有无数的前人经验提到过这一点,但我还是要不厌其烦地再强调一遍:学好微积分线代真的很重要!你也许会吐槽这些东西岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻骨铭心的程度。如果觉得老师课上讲的内容晦涩难懂,不妨参考 MIT 的 Calculus Course18.06: Linear Algebra 的课程 notes,至少于我而言,它帮助我深刻理解了微积分和线性代数的许多本质。顺道再安利一个油管数学网红 3Blue1Brown,他的频道有很多用生动形象的动画阐释数学本质内核的视频,兼具深度和广度,质量非常高。

信息论入门

作为计算机系的学生,及早了解一些信息论的基础知识,我觉得是大有裨益的。但大多信息论课程都面向高年级本科生甚至研究生,对新手极不友好。而 MIT 的 6.050J: Information theory and Entropy 这门课正是为大一新生量身定制的,几乎没有先修要求,涵盖了编码、压缩、通信、信息熵等等内容,非常有趣。

数学进阶

离散数学与概率论

集合论、图论、概率论等等是算法推导与证明的重要工具,也是后续高阶数学课程的基础。但我觉得这类课程的讲授很容易落入理论化与形式化的窠臼,让课堂成为定理结论的堆砌,而无法使学生深刻把握理论的本质,进而造成学了就背,考了就忘的怪圈。如果能在理论教学中穿插算法运用实例,学生在拓展算法知识的同时也能窥见理论的力量和魅力。

UCB CS70 : discrete Math and probability theoryUCB CS126 : Probability theory 是 UC Berkeley 的概率论课程,前者覆盖了离散数学和概率论基础,后者则涉及随机过程以及深入的理论内容。两者都非常注重理论和实践的结合,有丰富的算法实际运用实例,后者还有大量的 Python 编程作业来让学生运用概率论的知识解决实际问题。

数值分析

作为计算机系的学生,培养计算思维是很重要的,实际问题的建模、离散化,计算机的模拟、分析,是一项很重要的能力。而这两年开始风靡的,由 MIT 打造的 Julia 编程语言以其 C 一样的速度和 Python 一样友好的语法在数值计算领域有一统天下之势,MIT 的许多数学课程也开始用 Julia 作为教学工具,把艰深的数学理论用直观清晰的代码展示出来。

ComputationalThinking 是 MIT 开设的一门计算思维入门课,所有课程内容全部开源,可以在课程网站直接访问。这门课利用 Julia 编程语言,在图像处理、社会科学与数据科学、气候学建模三个 topic 下带领学生理解算法、数学建模、数据分析、交互设计、图例展示,让学生体验计算与科学的美妙结合。内容虽然不难,但给我最深刻的感受就是,科学的魅力并不是故弄玄虚的艰深理论,不是诘屈聱牙的术语行话,而是用直观生动的案例,用简练深刻的语言,让每个普通人都能理解。

上完上面的体验课之后,如果意犹未尽的话,不妨试试 MIT 的 18.330 : Introduction to numerical analysis,这门课的编程作业同样会用 Julia 编程语言,不过难度和深度上都上了一个台阶。内容涉及了浮点编码、Root finding、线性系统、微分方程等等方面,整门课的主旨就是让你利用离散化的计算机表示去估计和逼近一个数学上连续的概念。这门课的教授还专门撰写了一本配套的开源教材 Fundamentals of Numerical Computation,里面附有丰富的 Julia 代码实例和严谨的公式推导。

如果你还意犹未尽的话,还有 MIT 的数值分析研究生课程 18.335: Introduction to numerical method 供你参考。

微分方程

如果世间万物的运动发展都能用方程来刻画和描述,这是一件多么酷的事情呀!虽然几乎任何一所学校的 CS 培养方案中都没有微分方程相关的必修课程,但我还是觉得掌握它会赋予你一个新的视角来审视这个世界。

由于微分方程中往往会用到很多复变函数的知识,所以大家可以参考 MIT18.04: Complex variables functions 的课程 notes 来补齐先修知识。

MIT18.03: differential equations 主要覆盖了常微分方程的求解,在此基础之上 MIT18.152: Partial differential equations 则会深入偏微分方程的建模与求解。掌握了微分方程这一有力工具,相信对于你的实际问题的建模能力以及从众多噪声变量中把握本质的直觉都会有很大帮助。

数学高阶

作为计算机系的学生,我经常听到数学无用论的论断,对此我不敢苟同但也无权反对,但若凡事都硬要争出个有用和无用的区别来,倒也着实无趣,因此下面这些面向高年级甚至研究生的数学课程,大家按兴趣自取所需。

凸优化

Standford EE364A: Convex Optimization

信息论

MIT6.441: Information Theory

应用统计学

MIT18.650: Statistics for Applications

初等数论

MIT18.781: Theory of Numbers

密码学

Standford CS255: Cryptography

编程入门

Languages are tools, you choose the right tool to do the right thing. Since there's no universally perfect tool, there's no universally perfect language.

Shell

Python

C++

Rust

OCaml

电子基础

电路基础

作为计算机系的学生,了解一些基础的电路知识,感受从传感器收集数据到数据分析再到算法预测整条流水线,对于后续知识的学习以及计算思维的培养还是很有帮助的。EE16A&B: Designing Information Devices and Systems I&II 是伯克利 EE 学生的大一入门课,其中 EE16A 注重通过电路从实际环境中收集和分析数据,而 EE16B 则侧重从这些收集到的数据进行分析并做出预测行为。

信号与系统

信号与系统是一门我觉得非常值得一上的课,最初学它只是为了满足我对傅里叶变换的好奇,但学完之后我才不禁感叹,傅立叶变换给我提供了一个全新的视角去看待这个世界,就如同微分方程一样,让你沉浸在用数学去精确描绘和刻画这个世界的优雅与神奇之中。

MIT 6.003: signal and systems 提供了全部的课程录影、书面作业以及答案。也可以去看这门课的远古版本

UCB EE120: Signal and Systems 关于傅立叶变换的 notes 写得非常好,并且提供了6 个非常有趣的 Python 编程作业,让你实践中运用信号与系统的理论与算法。

数据结构与算法

算法是计算机科学的核心,也是几乎一切专业课程的基础。如何将实际问题通过数学抽象转化为算法问题,并选用合适的数据结构在时间和内存大小的限制下将其解决是算法课的永恒主题。如果你受够了老师的照本宣科,那么我强烈推荐伯克利的 UCB CS61B: Data Structures and Algorithms 和普林斯顿的 Coursera: Algorithms I & II,这两门课的都讲得深入浅出并且会有丰富且有趣的编程实验将理论与知识结合起来。此外,对一些更高级的算法以及 NP 问题感兴趣的同学可以学习伯克利的算法设计与分析课程 UCB CS170: Efficient Algorithms and Intractable Problems

软件工程

入门课

一份“能跑”的代码,和一份高质量的工业级代码是有本质区别的。因此我非常推荐低年级的同学学习一下 MIT 6.031: Software Construction 这门课,它会以 Java 语言为基础,以丰富细致的阅读材料和精心设计的编程练习传授如何编写不易出 bug、简明易懂、易于维护修改的高质量代码。大到宏观数据结构设计,小到如何写注释,遵循这些前人总结的细节和经验,对于你此后的编程生涯大有裨益。

专业课

当然,如果你想系统性地上一门软件工程的课程,那我推荐的是伯克利的 UCB CS169: software engineering。但需要提醒的是,和大多学校(包括贵校)的软件工程课程不同,这门课不会涉及传统的 design and document 模式,即强调各种类图、流程图及文档设计,而是采用近些年流行起来的小团队快速迭代 Agile Develepment 开发模式以及利用云平台的 Software as a service 服务模式。

体系结构

入门课

从小我就一直听说,计算机的世界是由 01 构成的,我不理解但大受震撼。如果你的内心也怀有这份好奇,不妨花一到两个月的时间学习 Coursera: Nand2Tetris 这门无门槛的计算机课程。这门麻雀虽小五脏俱全的课程会从 01 开始让你亲手造出一台计算机,并在上面运行俄罗斯方块小游戏。一门课里涵盖了编译、虚拟机、汇编、体系结构、数字电路、逻辑门等等从上至下、从软至硬的各类知识,非常全面。难度上也是通过精心的设计,略去了众多现代计算机复杂的细节,提取出了最核心本质的东西,力图让每个人都能理解。在低年级,如果就能从宏观上建立对整个计算机体系的鸟瞰图,是大有裨益的。

专业课

当然,如果想深入现代计算机体系结构的复杂细节,还得上一门大学本科难度的课程 UCB CS61C: Great Ideas in Computer Architecture。UC Berkeley 作为 RISC-V 架构的发源地,在体系结构领域算得上首屈一指。其课程非常注重实践,你会在 Project 中手写汇编构造神经网络,从零开始搭建一个 CPU,这些实践都会让你对计算机体系结构有更为深入的理解,而不是仅停留于“取指译码执行访存写回”的单调背诵里。

系统入门

计算机系统是一个庞杂而深刻的主题,在深入学习某个细分领域之前,对各个领域有一个宏观概念性的理解,对一些通用性的设计原则有所知晓,会让你在之后的深入学习中不断强化一些最为核心乃至哲学的概念,而不会桎梏于复杂的内部细节和各种 trick。因为在我看来,学习系统最关键的还是想让你领悟到这些最核心的东西,从而能够设计和实现出属于自己的系统。

MIT6.033: System Engineering 是 MIT 的系统入门课,主题涉及了操作系统、网络、分布式和系统安全,除了知识点的传授外,这门课还会讲授一些写作和表达上的技巧,让你学会如何设计并向别人介绍和分析自己的系统。这本书配套的教材 Principles of Computer System Design: An Introduction 也写得非常好,推荐大家阅读。

CMU 15-213: Introduction to Computer System 是 CMU 的系统入门课,内容覆盖了体系结构、操作系统、链接、并行、网络等等,兼具广度和深度,配套的教材 Computer Systems: A Programmer's Perspective 也是质量极高,强烈建议阅读。

操作系统

没有什么能比自己写个内核更能加深对操作系统的理解了。

操作系统作为各类纷繁复杂的底层硬件虚拟化出一套规范优雅的抽象,给所有应用软件提供丰富的功能支持。了解操作系统的设计原则和内部原理对于一个不满足于当调包侠的程序员来说是大有裨益的。出于对操作系统的热爱,我上过国内外很多操作系统课程,它们各有侧重和优劣,大家可以根据兴趣各取所需。

MIT 6.S081: Operating System Engineering,MIT 著名 PDOS 实验室出品,11 个 Project 让你在一个实现非常优雅的类Unix操作系统xv6上增加各类功能模块。这门课也让我深刻认识到,做系统不是靠 PPT 念出来的,是得几万行代码一点点累起来的。

UCB CS162: Operating System,伯克利的操作系统课,采用和 Stanford 同样的 Project —— 一个教学用操作系统 Pintos。我作为北京大学2022年春季学期操作系统实验班的助教,引入并改善了这个 Project,课程资源也会全部开源,具体参见课程网站

NJU: Operating System Design and Implementation,南京大学的蒋炎岩老师开设的操作系统课程。蒋老师以其独到的系统视角结合丰富的代码示例将众多操作系统的概念讲得深入浅出,此外这门课的全部课程内容都是中文的,非常方便大家学习。

并行与分布式系统

想必这两年各类 CS 讲座里最常听到的话就是“摩尔定律正在走向终结”,此话不假,当单核能力达到上限时,多核乃至众核架构如日中天。硬件的变化带来的是上层编程逻辑的适应与改变,要想充分利用硬件性能,编写并行程序几乎成了程序员的必备技能。与此同时,深度学习的兴起对计算机算力与存储的要求都达到了前所未有的高度,大规模集群的部署和优化也成为热门技术话题。

并行计算

CMU 15-418/Stanford CS149: Parallel Computing

分布式系统

MIT 6.824: Distributed System

系统安全

不知道你当年选择计算机是不是因为怀着一个中二的黑客梦想,但现实却是成为黑客道阻且长。

理论课程

UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、网站安全、网络安全等等内容。

实践课程

掌握这些理论知识之后,还需要在实践中培养和锻炼这些“黑客素养”。CTF 夺旗赛是一项比较热门的系统安全比赛,赛题中会融会贯通地考察你对计算机各个领域知识的理解和运用。北大今年也成功举办了第 0 届和第 1 届,鼓励大家后期踊跃参与,在实践中提高自己。下面列举一些我平时学习(摸鱼)用到的资源:

计算机网络

没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了。

大名鼎鼎的 Stanford CS144: Computer Network,8 个 Project 带你实现整个 TCP/IP 协议栈。

如果你只是想在理论上对计算机网络有所了解,那么推荐计网著名教材《自顶向下方法》的配套学习资源 Computer Networking: A Top-Down Approach

数据库系统

没有什么能比自己写个关系型数据库更能加深对数据库系统的理解了。

CMU 的著名数据库神课 CMU 15-445: Introduction to Database System 会通过 4 个 Project 带你为一个用于教学的关系型数据库 bustub 添加各种功能。实验的评测框架也免费开源了,非常适合大家自学。此外课程实验会用到 C++11 的众多新特性,也是一个锻炼 C++ 代码能力的好机会。

Berkeley 作为著名开源数据库 postgres 的发源地也不遑多让,UCB CS186: Introduction to Database System 会让你用 Java 语言实现一个支持 SQL 并发查询、B+ 树索引和故障恢复的关系型数据库。

编译原理

没有什么能比自己写个编译器更能加深对编译器的理解了。

Stanford CS143: Compilers 带你手写编译器。

Web开发

前后端开发很少在计算机的培养方案里被重视,但其实掌握这项技能还是好处多多的,例如搭建自己的个人主页,抑或是给自己的课程项目做一个精彩的展示网页。

两周速成版

MIT web development course

系统学习版

Stanford CS142: Web Applications

计算机图形学

数据科学

其实数据科学和机器学习与深度学习有着很紧密的联系,但可能更侧重于实践。Berkeley 的 UCB Data100: Principles and Techniques of Data Science 通过丰富的编程练习让你在实践中掌握各类数据分析工具和算法,并带领你体验从海量的数据集中提取出想要的结果,并对未来的数据或用户的行为做出相应的预测。但这只是一门基础课,如果想学习工业级别的数据挖掘与分析技术,可以尝试 Stanford 的大数据挖掘课程 CS246: Mining Massive Data Sets

人工智能

近十年人工智能应该算是计算机界最火爆的领域。如果你不满足于整日听各路媒体争相报道人工智能相关的进展,而想真正一探究竟,那么非常推荐学习 Harvard 神课 CS50 系列的人工智能课程 Harvard CS50: Introduction to AI with Python。课程短小精悍,覆盖了传统人工智能领域的几大分支,并配有丰富有趣的 Python 编程练习来巩固你对人工智能算法的理解。美中不足的是这门课因为面向在线自学者的缘故内容较为精简,并且不会涉及特别深入的数学理论,如果想要系统深入地学习还需要一门本科生难度的课程,例如 Berkeley 的 UCB CS188: Introduction to Artificial Intelligence。这门课的 Project 复刻了经典游戏糖豆人,让你运用人工智能算法玩游戏,非常有趣。

机器学习

机器学习领域近些年最重要的进展就是发展出了基于神经网络的深度学习分支,但其实很多基于统计学习的算法依然在数据分析领域有着广泛的应用。如果你之前从未接触过机器学习的相关知识,而且不想一开始就陷入艰深晦涩的数学证明,那么不妨先从 Andrew Ng (吴恩达)的 Coursera: Machine Learning 学起。这门课在机器学习领域基本无人不晓,吴恩达以其深厚的理论功底和出色的表达能力把很多艰深的算法讲得深入浅出,并且非常实用。其配套的作业也是质量相当上乘,可以帮助你快速入门。

但上过这门课只能让你从宏观上对机器学习这一领域有一定了解,如果想真正理解那些“神奇”算法背后的数学原理甚至从事相关领域的科研工作,那么还需要一门更“数学”的课程,例如 Stanford CS229: Machine Learning 或者 UCB CS189: Introduction to Machine Learning

深度学习

前几年 AlphaGo 的大热让深度学习进入了大众的视野,不少大学甚至专门成立了相关专业。很多计算机的其他领域也会借助深度学习的技术来做研究,因此基本不管你干啥多少都会接触到一些神经网络、深度学习相关的技术需求。如果想快速入门,同样推荐 Andrew Ng (吴恩达)的 Coursera: Deep Learning,质量无需多言,Coursera 上罕见的满分课程。此外如果你觉得英文课程学习起来有难度,推荐李宏毅老师的 国立台湾大学:机器学习 课程。这门课打着机器学习的名号,却囊括了深度学习领域的几乎所有方向,非常全面,很适合你从宏观上对这个领域有一个大致的了解。而且老师本人也非常幽默,课堂金句频出。

当然因为深度学习领域发展非常迅速,已经拥有了众多研究分支,如果想要进一步深入,可以按需学习下面罗列的代表课程,

计算机视觉

Stanford CS231n: CNN for Visual Recognition

自然语言处理

Stanford CS224n: Natural Language Processing

图神经网络

Stanford CS224w: Machine Learning with Graphs

强化学习

UCB CS285: Deep Reinforcement Learning

定制属于你的课程地图

授人以鱼不如授人以渔。

以上的课程规划难免带有强烈的个人偏好,不一定适合所有人,更多是起到抛砖引玉的作用。如果你想挑选自己感兴趣的方向和内容加以学习,可以参考我在下面列出来的资源。


Last update: November 2, 2022
Back to top
\ No newline at end of file diff --git a/en/Web开发/CS142/index.html b/en/Web开发/CS142/index.html index d5af4ecc..34a22afb 100644 --- a/en/Web开发/CS142/index.html +++ b/en/Web开发/CS142/index.html @@ -1,2 +1,16 @@ Stanford CS142: Web Applications - CSDIY.wiki
Skip to content

Stanford CS142: Web Applications

Descriptions

  • Offered by: Stanford
  • Prerequisites: CS107 and CS108
  • Programming Languages: JavaScript/HTML/CSS
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

This is Stanford's Web Application course covers HTML, CSS, JavaScript, ReactJs, NodeJS, ExpressJS, Web Security, and more. Eight projects will enhance your web development skills in practice.

Course Resources


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/Web开发/fullstackopen/index.html b/en/Web开发/fullstackopen/index.html index 35c2599e..bec28d90 100644 --- a/en/Web开发/fullstackopen/index.html +++ b/en/Web开发/fullstackopen/index.html @@ -1,2 +1,16 @@ University of Helsinki: Full Stack open 2022 - CSDIY.wiki
Skip to content

University of Helsinki: Full Stack open 2022

Descriptions

  • Offered by: University of Helsinki
  • Prerequisites: Good programming skills, basic knowledge of web programming and databases, and have mastery of the Git version management system.
  • Programming Languages: JavaScript/HTML/CSS/NoSQL/SQL
  • Difficulty: 🌟🌟
  • Class Hour: Varying according to the learner

This course serves as an introduction to modern web application development with JavaScript. The main focus is on building single page applications with ReactJS that use REST APIs built with Node.js. The course also contains a section on GraphQL, a modern alternative to REST APIs.

The course covers testing, configuration and environment management, and the use of MongoDB for storing the application’s data.

Resources


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/Web开发/mitweb/index.html b/en/Web开发/mitweb/index.html index 1d7f2b4a..b3a4bd4c 100644 --- a/en/Web开发/mitweb/index.html +++ b/en/Web开发/mitweb/index.html @@ -1,2 +1,16 @@ MIT web development course - CSDIY.wiki
Skip to content

MIT Web Development Crash Course

Descriptions

  • Offered by: MIT
  • Prerequisites: better if you are already proficient in a programming language
  • Programming Languages: JavaScript/HTML/CSS/NoSQL
  • Difficulty: 🌟🌟🌟
  • Class Hour: Varying according to the learner

Independent Activities Period (IAP) is a four-week period in January during which faculty and students are freed from the rigors of regularly scheduled classes for flexible teaching and learning and for independent study and research, and that's how this web development course was born.

Within a month, you will master the core content of designing, building, beautifying, and publishing a website from scratch, basically covering full-stack web development. If you don't need to learn web development systematically, but just want to add it to your toolkit out of interest, then this class will be perfect for you.

Resources


Last update: October 25, 2022
Back to top
\ No newline at end of file diff --git a/en/index.html b/en/index.html index 432e4f65..e407952f 100644 --- a/en/index.html +++ b/en/index.html @@ -1,2 +1,16 @@ Foreword - CSDIY.wiki
Skip to content

Image title

Foreword

The English version is still under development, please check this issue if you want to contribute.

This is a self-learning guide to computer science, and a memento of my three years of self-learning at university.

It is also a gift to the young students at Peking University. It would be a great encouragement and comfort to me if this book could be of even the slightest help to you in your college life.

The book is currently organized to include the following sections (if you have other good suggestions, or would like to join the ranks of contributors, please feel free to email zhongyinmin@pku.edu.cn or ask questions in the issue).

  • Productivity Toolkit: IDE, VPN, StackOverflow, Git, Github, Vim, Latex, GNU Make and so on.
  • Environment configuration: PC/Server development environment setup, DevOps tutorials and so on.
  • 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

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.

It all turned around during the winter break of my freshman year, when I had a hankering to learn Python. I overheard someone recommend CS61A, a freshman introductory course at UC Berkeley on Python. I'll never forget that day, when I opened the CS61A course website. It was like Columbus discovering a new continent, and I opened the door to a new world.

I finished the course in 3 weeks and for the first time I felt that CS could be so fulfilling and interesting, and I was shocked that there existed such a great course in the world.

To avoid any suspicion of pandering to foreign courses, I will tell you about my experience of studying CS61A from the perspective of a pure student.

  • Course website developed by course staffs: The course website integrates all the course resources into one, with a well organised course schedule, links to all slides, recorded videos and homework, detailed and clear syllabus, list of exams and solutions from previous years. Aesthetics aside, this website is so convenient for students.

  • Textbook written by course instructor: The course instructor has adapted the classic MIT textbook Structure and Interpretation of Computer Programs (SICP) into Python (the original textbook was based on Scheme). This is a great way to ensure that the classroom content is consistent with the textbook, while adding more details. The entire book is open source and can be read directly online.

  • Various, comprehensive and interesting homework: There are 14 labs to reinforce the knowledge gained in class, 10 homework assignments to practice, and 4 projects each with thousands of lines of code, all with well-organized skeleton code and babysitting instructions. Unlike the old-school OJ and Word document assignments, each lab/homework/project has a detailed handout document, fully automated grading scripts, and CS61A staffs have even developed an automated assignment submission and grading system. Of course, one might say "How much can you learn from a project where most of code are written by your teaching assistants?" . For someone who is new to CS and even stumbling over installing Python, this well-developed skeleton code allows students to focus on reinforcing the core knowledge they've learned in class, but also gives them a sense of achievement that they already can make a little game despite of learning Python only for a month. It also gives them the opportunity to read and learn from other people's high quality code so that they can reuse it later. I think in the freshman year, this kind of skeleton code is absolutely beneficial. The only bad thing perhaps is for the instructors and teaching assistants, as developing such assignments can conceivably require a considerable time commitment.

  • Weekly discussion sessions: The teaching assistants will explain the difficult knowledge in class and add some supplementary materials which may not be covered in class. Also, there will be exercises from exams of previous years. All the exercises are written in LaTeX with solutions.

In CS61A, You don't need any prerequesites about CS at all. You just need to pay attention, spend time and work hard. The feeling that you do not know what to do, that you are not getting anything in return for all the time you put in, is gone. It suited me so well that I fell in love with self-learning.

Imagine that if someone could chew up the hard knowledge and present it to you in a vivid and straightforward way, with so many fancy and varied projects to reinforce your theoretical knowledge, you'd think they were really trying their best to make you fully grasp the course, and it was even an insult to the course builders not to learn it well.

If you think I'm exaggerating, start with CS61A, because it's where my dreams began.

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 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.

In my last college year, when I opened up my curriculum book, I realized that it was already a subset of my self-learning list. By then, it was only two and a half years after I had started my self-learning journey. Then, a bold idea came to my mind: perhaps I could create a self-learning book, write down the difficulty I encountered and the interest I found during these years of self-learning, hoping to make it easy for students who may also enjoy self-learning to start their wonderful self-learning journey.

If you can build up the whole CS foundation in less than three years, have relatively solid mathematical skills and coding ability, experience dozens of projects with thousands of lines of code, master at least C/C++/Java/JS/Python/Go/Rust and other mainstream programming languages, have a good understanding of algorithms, circuits, architectures, networks, operating systems, compilers, artificial intelligence, machine learning, computer vision, natural language processing, reinforcement learning, cryptography, information theory, game theory, numerical analysis, statistics, distributed systems, parallel computing, database systems, computer graphics, web development, cloud computing, supercomputing etc. I think you will be confident enough to choose the area you are interested in, and you will be quite competitive in both industry and academia.

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

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.

Another great thing about self-learning is that you can learn from different perspectives. I have taken core courses such as architectures, networking, operating systems, and compilers from different universities. Different instructors may have different views on the same knowledge, which will broaden your horizon.

A third advantage of self-learning is that you do not need to go to the class, listening to the boring lectures.

Cons

Of course, as a big fan of self-learning, I have to admit that it has its disadvantages.

The first is the difficulty of communication. I'm actually a very keen questioner, and I like to follow up all the points I don't understand. But when you're facing a screen and you hear a teacher talking about something you don't understand, you can't go to the other end of the network and ask him or her for clarification. I try to mitigate this by thinking independently and making good use of Google, but it would be great to have a few friends to study together. You can refer to README for more information on participating a community group.

The second thing is that these courses are basically in English. From the videos to the slides to the assignments, all in English. You may struggle at first, but I think it's a challenge that if you overcome, it will be extremely rewarding. Because at the moment, as reluctant as I am, I have to admit that in computer science, a lot of high quality documentation, forums and websites are all in English.

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?

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

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?

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).


Last update: September 15, 2022
Back to top
\ No newline at end of file diff --git a/en/人工智能/CS188/index.html b/en/人工智能/CS188/index.html index b6637f9f..83146265 100644 --- a/en/人工智能/CS188/index.html +++ b/en/人工智能/CS188/index.html @@ -1,2 +1,16 @@ UCB CS188: Introduction to Artificial Intelligence - CSDIY.wiki
Skip to content

CS188: Introduction to Artificial Intelligence

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS70
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:50 小时

伯克利的人工智能入门课,课程 notes 写得非常深入浅出,基本不需要观看课程视频。课程内容的安排基本按照人工智能的经典教材 Artificial intelligence: A Modern Approach 的章节顺序,覆盖了搜索剪枝、约束满足问题、马尔可夫决策过程、强化学习、贝叶斯网络、隐马尔可夫模型以及基础的机器学习和神经网络的相关内容。

2018年秋季学期的版本免费开放了 gradescope,大家可以在线完成书面作业并实时得到测评结果。同时课程的 6 个 Project 也是质量爆炸,复现了经典的 Packman(吃豆人)小游戏,会让你利用学到的 AI 知识,去实现相关算法,让你的吃豆人在迷宫里自由穿梭,躲避鬼怪,收集豆子。

课程资源

  • 课程网站:Fall 2022Fall 2018
  • 课程视频:Fall 2022Fall 2018,每节课的链接详见课程网站
  • 课程教材:Artificial intelligence: A Modern Approach
  • 课程作业:在线测评书面作业和 Projects,详见课程网站

Last update: December 6, 2022
Back to top
\ No newline at end of file diff --git a/en/人工智能/CS50/index.html b/en/人工智能/CS50/index.html index 987e3ca7..1955133d 100644 --- a/en/人工智能/CS50/index.html +++ b/en/人工智能/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50's Introduction to AI with Python - CSDIY.wiki
Skip to content

Harvard's CS50: Introduction to AI with Python

Descriptions

  • Offered by: Harvard University
  • Prerequisites: Basic knowledge of probability theory and Python
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟
  • Class Hour: 30

A very basic introductory AI course, what makes it stand out is the 12 well-designed programming assignments, all of which will use the learned knowledge to implement a simple game AI, such as using reinforcement learning to play Nim game, using max-min search with alpha-beta pruning to sweep mines, and so on. It's perfect for newbies to get started or bigwigs to relax.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/cs50_ai - GitHub.


Last update: November 30, 2022
Back to top
\ No newline at end of file diff --git a/en/人工智能/CYJ/index.html b/en/人工智能/CYJ/index.html index 6ef596a8..e1144121 100644 --- a/en/人工智能/CYJ/index.html +++ b/en/人工智能/CYJ/index.html @@ -1,2 +1,16 @@ 智能计算系统 - CSDIY.wiki
Skip to content

智能计算系统

课程简介

  • 所属大学:中国科学院大学
  • 先修要求:体系结构,深度学习
  • 编程语言:Python, C++, BCL
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时+

智能计算系统是智能的核心物质载体,每年全球要制造数以十亿计的智能计算系统(包括智能手机、智能服务器、智能可穿戴设备等),需要大量的智能计算系统的设计者和开发者。智能计算系统人才的培养直接关系到我国智能产业的核心竞争力。因此,对智能计算系统的认识和理解是智能时代计算机类专业学生培养方案中不可或缺的重要组成部分,是计算机类专业学生的核心竞争力。

国内的陈云霁老师开的课,在其他若干个大学也都有开对应的课程。这门课用一个个实验带大家以一个完整的视野理解人工智能的技术栈。从上层的深度学习框架,到用底层语言编写算子,再到硬件中 MLU 的设计,让大家形成系统思维,体会自上而下,融会贯通的乐趣。

我做了其中的 2,3,4,5 这几个实验,其中综合实验和硬件实验没有做,如果有做了的同学欢迎大家补上你的链接。

个人体会是第三章实现算子的实验让我对深度学习框架的了解加深了很多。第五章的实验BCL语言编写算子如果了解 CUDA 的话会感觉很熟悉。

推荐去买一本教材看一看,会让我们理解整体的技术栈。熟悉深度学习的同学可以直接从第五章开始看,看看深度学习框架底层到底是什么样的。

我因为这门课的启发,参考一本书(书名在仓库中)写了一个简易的深度学习框架。在这个框架里可以看到智能计算系统实验中的一些影子。同时受到 build-your-own-x 系列的启发,我也打算写一下教程,教大家写一个自己的深度学习框架。代码用 Python 写的,代码量较少,适合有一定基础的同学阅读。之后打算添加更多的算子,有望实现一个较为全面的框架,并希望移植到 C++ 中,以兼顾性能与开发效率。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在 ysj1173886760/Learning: ai-system - GitHub 中。


Last update: November 14, 2022
Back to top
\ No newline at end of file diff --git a/en/体系结构/CS61C/index.html b/en/体系结构/CS61C/index.html index 3518ed02..a7790314 100644 --- a/en/体系结构/CS61C/index.html +++ b/en/体系结构/CS61C/index.html @@ -1,2 +1,16 @@ UCB CS61C: Great Ideas in Computer Architecture - CSDIY.wiki
Skip to content

CS61C: Great Ideas in Computer Architecture

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, CS61B
  • Programming Languages: C
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

This is the last course in Berkeley's CS61 series, which dives into the internal of computer architecture and will make you understand how the C language is translated into RISC-V assembly language and executed on the CPU. Unlike Nand2Tetris, this course is much more difficult and more in-depth, covering pipelining, cache, virtual memory, and concurrency-related content.

The projects are very innovative and interesting. Project1 is a warmup assignment in C. In 2020Fall, you will implement the famous Game of Life. Project2 requires you to write a fully-connected neural network in RISC-V assembly to classify handwritten digits in MNIST dataset, which is a great exercise to write assembly code. In Project3, you will use Logisim, a digital circuit simulation software, to build a two-stage pipeline CPU from scratch and run RISC-V assembly code on it. In Project4 you will implement a toy version of Numpy, using OpenMP, SIMD, and other techniques to speed up matrix operations.

In a word, this is the best computer architecture course I have ever taken.

Course Resources

  • Course Website: https://cs61c.org/su20/
  • Recordings: Youtube
  • Textbook: None
  • Assignments: 11 Labs, 4 Projects, the course website has specific requirements

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS61C-summer20 - GitHub


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/体系结构/CSAPP/index.html b/en/体系结构/CSAPP/index.html index dbc47d8b..32226072 100644 --- a/en/体系结构/CSAPP/index.html +++ b/en/体系结构/CSAPP/index.html @@ -1,2 +1,16 @@ CMU 15-213: CSAPP - CSDIY.wiki
Skip to content

CMU CS15213: CSAPP

Descriptions

  • Offered by: CMU
  • Prerequisites: CS61A, CS61B
  • Programming Languages: C
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

This course is one of CMU's most reputable courses, and is known for its extensive content and difficult projects. The course covers assembly language, computer architecture, operating systems, compilation and linking, parallelism, networking, etc. As an introductory course of computer system, it has both breadth and depth, and does require considerable perseverance and coding skills if you learn it on your own.

The textbook for this course, known as CSAPP, was written by Professor Bryant, Dean of the School of Computer Science at CMU. This is also the first computer textbook that I read carefully from the start to the end, although it was tough, I gained a lot from it.

Peking University purchased the copyright of the course and opened a similar one, but you can have access to all of the course resources on its official homepage (see the link below for details).

This course is so famous that you can easily have access to the project solutions on the Internet. But if you really want to practice your coding skills, it is highly recommended to implement the projects on your own.

After completing this course, your understanding of computer systems will definitely go up a notch.

Course Resources

If you have trouble with Chapter 7 Linking, I recommend reading the book Programmer's Self-Cultivation, subtitled link. load and library. This book can complete our understanding of program linking, and I believe after reading this book you will have a deeper comprehension of program linking, ELF files, and dynamic libraries. It is highly recommended to be read as a supplementary material after reading CSAPP and having a certain understanding of computer systems.


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/体系结构/DDCA/index.html b/en/体系结构/DDCA/index.html index f3083d6d..fc849000 100644 --- a/en/体系结构/DDCA/index.html +++ b/en/体系结构/DDCA/index.html @@ -1,2 +1,16 @@ Digital Design and Computer Architecture - CSDIY.wiki
Skip to content

Digital Design and Computer Architecture

Descriptions

  • Offered by: ETH Zurich
  • Prerequisites: CS50 or same level course; Better have a basic knowledge of C
  • Programming Languages: C, Verilog, MIPS, LC3
  • Difficulty: 🌟🌟🌟
  • Class Hour: 100 hours

In this course, Onur Mutlu, a great expert in the field of Computer Architecture, will teach you about digital circuits and computer architecture. The course is entirely from the perspective of a computer designer, starting with transistors and logic gates and extending to microarchitecture, caches, and virtual memory. It also covers many of the latest research advances in the field of computer architecture. After learning, you will master digital circuits, hardware description language Verilog, MIPS instruction set, CPU design and performance analysis, pipelining, cache, virtual memory, and so on.

There are 9 labs in the course. You will use the Basys 3 FPGA board and Vivado to design and synthesize the circuits, starting from combinational and sequential circuits, and eventually assembly into a complete CPU. Except for assignment solutions, all the course materials are open source.

Course Resources


Last update: October 10, 2022
Back to top
\ No newline at end of file diff --git a/en/体系结构/N2T/index.html b/en/体系结构/N2T/index.html index d84af7a9..e45dd839 100644 --- a/en/体系结构/N2T/index.html +++ b/en/体系结构/N2T/index.html @@ -1,2 +1,16 @@ Coursera: Nand2Tetris - CSDIY.wiki
Skip to content

Coursera: Nand2Tetris

Descriptions

  • Offered by: Hebrew University of Jerusalem
  • Prerequisites: None
  • Programming Languages: Chosen by the course taker
  • Difficulty: 🌟🌟🌟
  • Class Hour: 40 hours

As one of the most popular courses on Coursera, tens of thousands of people give it a full score, and over four hundred colleges and high schools teach it. It guides the students who may have no preparatory knowledge in computer science to build a whole computer from Nand logic gates and finally run the Tetris game on it.

Sounds cool, right? It's even cooler when you implement it!

The course is divided into hardware modules and software modules respectively.

In the hardware modules, you will dive into a world based on 0 and 1, create various logic gates from Nand gates, and construct a CPU step by step to run a simplified instruction set designed by the course instructors.

In the software modules, you will first write a compiler to compile a high-level language Jack which is designed by the instructors into byte codes that can run on virtual machines. Then you will further translate the byte codes into assembly language that can run on the CPU you create in the hardware modules. You will also develop a simple operating system that enables your computer to support GUI.

Finally, you can use Jack to create the Tetris game, compile it into assembly language, run it on your self-made CPU, and interact with it through the OS built by yourself. After taking this course, you will have a comprehensive and profound understanding of the entire computer architecture, which might be extremely helpful to your subsequent learning.

You may think that the course is too difficult. Don't worry, because it is completely designed for laymen. In the instructors' expectations, even high school students can understand the content. So as long as you keep pace with the syllabus, you can finish it within a month.

This course extracts the essence of computers while omitting the tedious and complex details in modern computer systems that are designed for efficiency and performance. Surely you will enjoy the elegance and magic of computers in a relaxing and jolly journey.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig are maintained in PKUFlyingPig/NandToTetris - GitHub.


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/使用指南/index.html b/en/使用指南/index.html index 2e40abe0..b019e8b3 100644 --- a/en/使用指南/index.html +++ b/en/使用指南/index.html @@ -1,2 +1,16 @@ 如何使用这本书 - CSDIY.wiki
Skip to content

如何使用这本书

随着贡献者的不断增多,本书的内容也不断扩展,想把书中所有的课程全部学完是不切实际也没有必要的,甚至会起到事倍功半的反效果,吃力而不讨好。为了更好地贴合读者,让这本书真正为你所用,我将读者按照需求大致分为了如下三类,大家可以结合切身实际,精准地规划属于自己的自学方案。

初入校园

如果你刚刚进入大学校园或者还在低年级,并且就读的是计算机方向或者想要转到计算机方向,那么你很幸运,因为学习是你的本业,你可以有充足的时间和自由来学习自己感兴趣的东西,不会有工作的压力和生活的琐碎,不必过于纠结“学了有没有用”,“能不能找到工作”这类功利的想法。那么该如何安排自己的学业呢?我觉得首要的一点就是要打破在高中形成的“按部就班”式的被动学习。作为一个小镇做题家,我深知国内大部分高中会把大家一天当中的每一分钟都安排得满满当当,你只需要被动地跟着课表按部就班地完成一个个既定的任务。只要足够认真,结果都不会太差。但步入大学的校门,自由度一下子变大了许多。首先所有的课外时间基本都由你自由支配,没有人为你整理知识点,总结提纲,考试也不像高中那般模式化。如果你还抱着高中那种“乖学生”的心态,老老实实按部就班,结果未必如你所愿。因为专业培养方案未必就是合理,老师的教学未必就会负责,认真出席课堂未必就能听懂,甚至考试内容未必就和讲的有关系。说句玩笑话,你或许会觉得全世界都与你为敌,而你只能指望自己。

那么现状就是这么个现状,你想改变,也得先活过去,并且拥有足够的能力去质疑它。而在低年级,打好基础很重要。这里的基础是全方面的,课内的知识固然重要,但计算机很大程度上还是强调实践,因此有很多课本外的能力需要培养,而这恰恰是国内的计算机本科教育很欠缺的一点。我根据个人的体验总结出了下面几点建议,供大家参考。

其一就是了解如何写“优雅”的代码。国内的很多大一编程入门课都会讲成极其无聊的语法课,其效果还不如直接让学生看官方文档。事实上,在刚开始接触编程的时候,让学生试着去了解什么样的代码是优雅的,什么样的代码 "have bad taste" 是大有裨益的。一般来说,编程入门课会先介绍过程式编程(例如 C 语言)。但即便是面向过程编程,模块化封装 的思想也极其重要。如果你只想着代码能在 OpenJudge 上通过,写的时候图省事,用大段的复制粘贴和臃肿的 main 函数,长此以往,你的代码质量将一直如此。一旦接触稍微大一点的项目,无尽的 debug 和沟通维护成本将把你吞没。因此,写代码时不断问自己,是否有大量重复的代码?当前函数是否过于复杂(Linux 提倡每个函数只需要做好一件事)?这段代码能抽象成一个函数吗?一开始你可能觉得很不习惯,甚至觉得这么简单的题需要如此大费周章吗?但记住好的习惯是无价的,C 语言初中生都能学会,凭什么公司要招你去当程序员呢?

学过面向过程编程后,大一下学期一般会讲面向对象编程(例如 C++ 或 Java)。这里非常推荐大家看 MIT 6.031: Software Construction 这门课的 Notes,会以 Java 语言为例非常详细地讲解如何写出“优雅”的代码。例如 Test-Driven 的开发、函数 Specification 的设计、异常的处理等等等等。除此之外,既然接触了面向对象,那么了解一些常见的设计模式也是很有必要的。因为国内的面向对象课程同样很容易变成极其无聊的语法课,让学生纠结于各种继承的语法,甚至出一些无聊的脑筋急转弯一样的题目,殊不知这些东西在地球人的开发中基本不会用到。面向对象的精髓是让学生学会自己将实际的问题抽象成若干类和它们之间的关系,而设计模式则是前人总结出来的一些精髓的抽象方法。这里推荐大话设计模式 这本书,写得非常浅显易懂。

其二就是尝试学习一些能提高生产力的工具和技能,例如 Git、Shell、Vim。这里强烈推荐学习 MIT missing semester 这门课,也许一开始接触这些工具用起来会很不习惯,但强迫自己用,熟练之后开发效率会直线提高。此外,还有很多应用也能极大提高的你生产力。一条定律是:一切需要让手离开键盘的操作,都应该想办法去除。例如切换应用、打开文件、浏览网页这些都有相关插件可以实现快捷操作(例如 Mac 上的 Alfred)。如果你发现某个操作每天都会用到,并且用时超过1秒,那就应该想办法把它缩减到0.1秒。毕竟以后数十年你都要和电脑打交道,形成一套顺滑的工作流是事半功倍的。最后,学会盲打!如果你还需要看着键盘打字,那么赶紧上网找个教程学会盲打,这将极大提高你的开发效率。

其三就是平衡好课内和自学。我们质疑现状,但也得遵守规则,毕竟绩点在保研中还是相当重要的。因此在大一,我还是建议大家尽量按照自己的课表学习,但辅以一些优质的课外资源。例如微积分线代可以参考 MIT 18.01/18.02MIT 18.06 的课程 Notes。假期可以通过 UCB CS61A 来学习 Python。同时做到上面第一、第二点说的,注重好的编程习惯和实践能力的培养。就个人经验,大一的数学课学分占比相当大,而且数学考试的内容方差是很大的,不同学校不同老师风格迥异,自学也许能让你领悟数学的本质,但未必能给你一个好成绩。因此考前最好有针对性地刷往年题,充分应试。

在升入大二之后,计算机方向的专业课将居多,此时大家可以彻底放飞自我,进入自学的殿堂了。具体可以参考 一份仅供参考的CS学习规划,这是我根据自己三年自学经历总结提炼出来的全套指南,每门课的特点以及为什么要上这门课我都做了简单的介绍。对于你课表上的每个课程,这份规划里应该都会有相应的国外课程,而且在质量上我相信基本是全方位的碾压。由于计算机方向的专业知识基本是一样的,而且高质量的课程会让你从原理上理解知识点,对于国内大多照本宣科式的教学来说基本是降维打击。一般来说只要考前将老师“辛苦”念了一学期的 PPT 拿来突击复习两天,取得一个不错的卷面分数并不困难。如果有课程大作业,则可以尽量将国外课程的 Lab 或者 Project 修改一番以应付课内的需要。我当时上操作系统课,发现老师还用着早已被国外学校淘汰的课程实验,便邮件老师换成了自己正在学习的 MIT 6.S081 的 xv6 Project,方便自学的同时还无意间推动了课程改革。总之,灵活变通是第一要义,你的目标是用最方便、效率最高的方式掌握知识,所有与你这一目标违背的所谓规定都可以想方设法地去“糊弄”。凭着这份糊弄劲儿,我大三之后基本没有去过线下课堂(大二疫情在家呆了大半年),对绩点也完全没有影响。

最后,希望大家少点浮躁和功利,多一些耐心和追求。很多人发邮件问我自学需不需要很强的自制力,我觉得得关键得看你自己想要什么。如果你依然抱着会一门编程语言便能月薪过万的幻想,想分一杯互联网的红利,那么我说再多也是废话。其实我最初的自学并没有太多功利的想法,只是单纯的好奇和本能的求知欲。自学的过程也没有所谓的“头悬梁,锥刺股”,该吃吃,该玩玩,不知不觉才发现竟然攒下了这么多资料。现如今中美的对抗已然成为趋势,而我们还在“卑微”地“师夷长技”,感叹国外高质量课程的同时也时常会有一种危机感。这一切靠谁来改变呢?靠的是刚刚入行的你们。所以,加油吧,少年!

删繁就简

如果你已经本科毕业开始读研或者走上了工作岗位,亦或是从事着其他领域的工作想要利用业余时间转码,那么你也许并没有充足的业余时间来系统地学完 一份仅供参考的CS学习规划 里的内容,但又想弥补本科时期欠下的基础。考虑到这部分读者通常有一定的编程经验,入门课程没有必要再重复学习。而且从实用角度来说,由于工作的大体方向已经确定,确实没有太大必要对于每个计算机分支都有特别深入的研究,更应该侧重一些通用性的原则和技能。因此我结合自身经历,选取了个人感觉最重要也是质量最高的几门核心专业课,希望能更好地加深读者对计算机的理解。学完这些课程,无论你具体从事的是什么工作,我相信你将不可能沦为一个普通的调包侠,而是对计算机的底层运行逻辑有更深入的了解。

课程方向 课程名
离散数学和概率论 UCB CS70 : discrete Math and probability theory
数据结构与算法 Coursera: Algorithms I & II
软件工程 MIT 6.031: Software Construction
全栈开发 MIT web development course
计算机系统导论 CMU CS15213: CSAPP
体系结构入门 Coursera: Nand2Tetris
体系结构进阶 CS61C: Great Ideas in Computer Architecture
数据库原理 CMU 15-445: Introduction to Database System
计算机网络 Computer Networking: A Top-Down Approach
人工智能 Harvard CS50: Introduction to AI with Python
深度学习 Coursera: Deep Learning

心有所属

如果你对于计算机领域的核心专业课都掌握得相当扎实,而且已经确定了自己的工作或研究方向,那么书中还有很多未在 一份仅供参考的CS学习规划 提到的课程供你探索。

随着贡献者的不断增多,左侧的目录中将不断增加新的分支,例如 机器学习进阶机器学习系统。并且同一个分支下都有若干同类型课程,它们来自不同的学校,有着不同的侧重点和课程实验,例如 操作系统 分支下就包含了麻省理工、伯克利还有南京大学三个学校的课程。如果你想深耕一个领域,那么学习这些同类的课程会给你不同的角度来看待类似的知识。同时,本书作者还计划联系一些相关领域的科研工作者来分享某个细分领域的科研学习路径,让 CS自学指南 在追求广度的同时,实现深度上的提高。

如果你想贡献这方面的内容,欢迎和作者邮件联系 zhongyinmin@pku.edu.cn


Last update: October 24, 2022
Back to top
\ No newline at end of file diff --git a/en/后记/index.html b/en/后记/index.html index 4ea591fd..9d7dda8b 100644 --- a/en/后记/index.html +++ b/en/后记/index.html @@ -1,2 +1,16 @@ Postscript - CSDIY.wiki
Skip to content

后记

从最初的想法开始,到断断续续完成这本书,再到树洞的热烈反响,我很激动,但也五味杂陈。原来在北大这个园子里,也有那么多人,对自己的本科生涯并不满意。而这里,可是囊括了中国非常优秀的一帮年轻人。所以问题出在哪里?我不知道。

我只是个籍籍无名的本科生呀,只是一个单纯的求学者,我的目标只是想快乐地、自由地、高质量地掌握那些专业知识,我想,正在看这本书的大多数本科生也是如此,谁想付出时间但却收效甚微呢?又是谁迫使大家带着痛苦去应付呢?我不知道。

我写这本书绝不是为了鼓励大家翘课自学,试问谁不想在课堂上和那么多优秀的同学济济一堂,热烈讨论呢?谁不想遇到问题直接找老师答疑解惑呢?谁不想辛苦学习的成果可以直接化作学校承认的学分绩点呢?可如果一个兢兢业业、按时到堂的学生收获的却是痛苦,而那个一学期只有考试会出席的学生却学得自得其乐,这公平吗?我不知道。

我只是不甘,不甘心这些通过高考战胜无数人进入高校的学子本可以收获一个更快乐的本科生涯,但现实却留给了他们遗憾。我反问自己,本科教育究竟应该带给我们什么呢?是学完所有这些课程吗?倒也未必,它也许只适合我这种nerd。但我觉得,本科教育至少得展现它应有的诚意,一种分享知识的诚意,一种以人为本的诚意,一种注重学生体验的诚意。它至少不应该是一种恶意,一种拼比知识的恶意,一种胜者为王的恶意,一种让人学无所得的恶意。但这一切能改变吗?我不知道。

我只知道我做了应该做的事情,学生们会用脚投票,树洞的关注量和回帖数证明了这样一份资料是有价值的,也道出了国内CS本科教育和国外的差距。也许这样的改变是微乎其微的,但别忘了我只是一个籍籍无名的本科生,是北大信科一千多名本科生中的普通一员,是中国几百万在读本科生中的一分子,如果有更多的人站出来,每个人做一点点,也许是分享一个帖子,也许是当一门课的助教,也许是精心设计一门课的lab,更或许是将来获得教职之后开设一门高质量的课程,出版一本经典的教材。本科教育真的有什么技术壁垒吗?我看未必,教育靠的是诚意,靠的是育人之心。

今天是2021年12月12日,我期待在不久的将来这个帖子会被遗忘,大家可以满心欢喜地选着自己培养方案上的课程,做着学校自行设计的各类编程实验,课堂没有签到也能济济一堂,学生踊跃地发言互动,大家的收获可以和努力成正比,那些曾经的遗憾和痛苦可以永远成为历史。我真的很期待那一天,真的真的真的很期待。

PKUFlyingPig

2021年12月12日写于燕园


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/培养方案Pro/index.html b/en/培养方案Pro/index.html index 0f5d60b4..13af8ab9 100644 --- a/en/培养方案Pro/index.html +++ b/en/培养方案Pro/index.html @@ -1,2 +1,16 @@ 培养方案Pro - CSDIY.wiki

培养方案Pro

under construction.


Last update: November 30, 2021
Back to top
\ No newline at end of file diff --git a/en/好书推荐/index.html b/en/好书推荐/index.html index 5f15b5eb..b2e771a1 100644 --- a/en/好书推荐/index.html +++ b/en/好书推荐/index.html @@ -7,4 +7,18 @@ 同板块下的顺序要求: 先中文后英文,同种语言先开源后闭源,最后按从基础到深入或者字母序。 -->

由于版权原因,下面列举的图书中除了开源资源提供了链接,其他的资源请大家自行通过 libgenz-lib 查找。

资源汇总

系统入门

操作系统

计算机网络

分布式系统

数据库系统

编译原理

计算机编程语言

体系结构

理论计算机科学

密码学

逆向工程

计算机图形学

游戏引擎

软件工程

设计模式

深度学习

计算机视觉

机器人

面试


Last update: November 30, 2022
Back to top
\ No newline at end of file diff --git a/en/并行与分布式系统/CS149/index.html b/en/并行与分布式系统/CS149/index.html index 8d3fe118..f9877dcf 100644 --- a/en/并行与分布式系统/CS149/index.html +++ b/en/并行与分布式系统/CS149/index.html @@ -1,2 +1,16 @@ CMU 15-418/Stanford CS149: Parallel Computing - CSDIY.wiki
Skip to content

CMU 15-418/Stanford CS149: Parallel Computing

Descriptions

  • Offered by: CMU and Stanford
  • Prerequisites: Computer Architecture, C++
  • Programming Languages: C++
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

The professor Kayvon Fatahalian used to teach course 15-418 at CMU. After he became an assistant professor at Stanford, he offered a similar course, CS149 at Stanford. In general, the 15-418 version is more comprehensive and has lecture recordings, but CS149's programming assignments are more fashionable. Personally, I watched the recordings of 15-418 but completed the assignments of CS149.

The goal of this course is to provide a deep understanding of the fundamental principles and engineering trade-offs involved in designing modern parallel computing systems, as well as to teach how to utilize hardwares and software programming frameworks (such as CUDA, MPI, OpenMP, etc.) for writing high-performance parallel programs. Due to the complexity of parallel computing architecture, this course involves a lot of advanced computer architecture and network communication content, the knowledge is quite low-level and hardcore. Meanwhile, the five assignments develop your understanding and application of upper-level abstraction through software, specifically by analyzing bottlenecks in parallel programs, writing multi-threaded synchronization code, learning CUDA programming, OpenMP programming, and the popular Spark framework, etc. It really combines theory and practice perfectly.

Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS149-parallel-computing - GitHub


Last update: October 21, 2022
Back to top
\ No newline at end of file diff --git a/en/并行与分布式系统/MIT6.824/index.html b/en/并行与分布式系统/MIT6.824/index.html index 1fcd11c2..6d093902 100644 --- a/en/并行与分布式系统/MIT6.824/index.html +++ b/en/并行与分布式系统/MIT6.824/index.html @@ -1,2 +1,16 @@ MIT 6.824: Distributed System - CSDIY.wiki
Skip to content

MIT6.824: Distributed System

Descriptions

  • Offered by: MIT
  • Prerequisites: Computer Architecture, Parallel Computing
  • Programming Languages: Go
  • Difficulty: 🌟🌟🌟🌟🌟🌟
  • Class Hour: 200 hours

This course, the same as MIT 6.S081, comes from the renowned MIT PDOS Lab. The instructor, Professor Robert Morris, was once a famous hacker who created 'Morris', the first worm virus in the world.

Each lecture will discuss a classic paper in the field of distributed systems, teaching you the important principles and key techniques of distributed systems design and implementation. The Project is known for its difficulty. In four programming assignments, you will implement a KV-store framework step by step based on the Raft consensus algorithm, allowing you to experience the randomness and complexity to implement and debug a distributed system.

This course is so famous that you can easily have access to the project solutions on the Internet. It is highly recommended to implement the projects on your own.

Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/MIT6.824 - GitHub

@OneSizeFitsQuorum has written a Lab Documentation that quite clearly describes many of the details to be considered when implementing lab 1-4 and challenge 1-2, you can read when you encounter bottlenecks ~ ~


Last update: October 22, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/CMake/index.html b/en/必学工具/CMake/index.html index dda1e75f..bc0e3661 100644 --- a/en/必学工具/CMake/index.html +++ b/en/必学工具/CMake/index.html @@ -1,2 +1,16 @@ CMake - CSDIY.wiki
Skip to content

CMake

Why CMake

Similar to GNU make, CMake is a cross-platform tool designed to build, test and package software. It uses CMakeLists.txt to define build configuration, and have more functionalities compared to GNU make. It is highly recommended to learn GNU Make and get familiar with Makefile first before learning CMake.

How to learn CMake

Compare to Makefile, CMakeLists.txt is more obscure and difficult to understand and use. Nowadays many IDEs (e.g., Visual Studio, CLion) offer functionalities to generate CMakeLists.txt automatically, but it's still necessary to manage basic usage of CMakeLists.txt. Besides Official CMake Tutorial, this one-hour video tutorial (in Chinese) presented by IPADS group at SJTU is also a good learning resource.


Last update: November 29, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/Docker/index.html b/en/必学工具/Docker/index.html index d2ae44f5..ec3b7d47 100644 --- a/en/必学工具/Docker/index.html +++ b/en/必学工具/Docker/index.html @@ -1,2 +1,16 @@ Docker - CSDIY.wiki
Skip to content

Docker

为什么使用 Docker

使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。

Docker 的出现让环境配置变得(或许)不再折磨。简单来说 Docker 使用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的环境配置被打包为一个个 image 可以自由运行在不同平台的一个个 container 中,这极大地节省了所有人的时间成本。

如何学习 Docker

Docker 官方文档当然是最好的初学教材,但最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。Docker 在工业界发展迅猛并已经非常成熟,你可以下载它的桌面端并使用图形界面。

当然,如果你像我一样,是一个疯狂的造轮子爱好者,那不妨自己亲手写一个迷你 Docker 来加深理解。

KodeKloud Docker for the Absolute Beginner 全面的介绍了 Docker 的基础功能,并且有大量的配套练习,同时提供免费的云环境来完成练习。其余的云相关的课程如 Kubernetes 需要付费,但个人强烈推荐:讲解非常仔细,适合从 0 开始的新手;有配套的 Kubernetes 的实验环境,不用被搭建环境劝退。


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/GNU_Make/index.html b/en/必学工具/GNU_Make/index.html index b8757e09..dc2ab61c 100644 --- a/en/必学工具/GNU_Make/index.html +++ b/en/必学工具/GNU_Make/index.html @@ -1,2 +1,16 @@ GNU Make - CSDIY.wiki
Skip to content

GNU Make

为什么学 GNU Make

大家第一次写 hello world 程序的时候一定都记得,在编辑完 helloworld.c 之后,需要用 gcc 编译生成可执行文件,然后再执行(如果你不理解前面这段话,请先自行谷歌 gcc 编译 并理解相关内容)。但如果你的项目由成百上千个 C 源文件组成,并且星罗棋布在各个子目录下,你该如何将它们编译链接到一起呢?假如你的项目编译一次需要半个小时(大型项目相当常见),而你只修改了一个分号,是不是还需要再等半个小时呢?

这时候 GNU Make 就闪亮登场了,它能让你在一个脚本里(即所谓的 Makefile)定义整个编译流程以及各个目标文件与源文件之间的依赖关系,并且只重新编译你的修改会影响到的部分,从而降低编译的时间。

如何学习 GNU Make

这里有一篇写得深入浅出的文档供大家参考。

GNU Make 掌握起来相对容易,但用好它需要不断的练习。将它融入到自己的日常开发中,勤于学习和模仿其他优秀开源项目里的 Makefile 的写法,总结出适合自己的 template,久而久之,你对 GNU Make 的使用会愈加纯熟。


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/Git/index.html b/en/必学工具/Git/index.html index c25572f5..e8e36367 100644 --- a/en/必学工具/Git/index.html +++ b/en/必学工具/Git/index.html @@ -1,2 +1,16 @@ Git - CSDIY.wiki
Skip to content

Git

Why Git

Git is a distributed version control system. The father of Linux, Linus Torvalds developed Git to maintain the version control of Linux, replacing the centralized version control tools which were difficult and costly to use.

The design of Git is very elegant, but beginners usually find it very difficult to use without understanding its internal logic. It is very easy to mess up the version history if misusing the commands.

Git is a powerful tool and when you finally master it, you will find all the effort paid off.

How to learn Git

Different from Vim, I don't suggest beginners use Git rashly without fully understanding it, because its inner logic can not be acquainted by practicing. Here is my recommended learning path:

  1. Read this Git tutorial in English, or you can watch this Git tutorial (by 尚硅谷) in Chinese.
  2. Read Chap1 - Chap5 of this open source book Pro Git. Yes, to learn Git, you need to read a book.
  3. Now that you have understood its principles and most of its usages, it's time to consolidate those commands by practicing. How to use Git properly is a kind of philosophy. I recommend reading this blog How to Write a Git Commit Message.
  4. You are now in love with Git and are not content with only using it, you want to build a Git by yourself! Great, that's exactly what I was thinking. This tutorial will satisfy you!
  5. What? Building your own Git is not enough? Seems that you are also passionate about reinventing the wheels. These two GitHub projects, build-your-own-x and project-based-learning, collected many wheel-reinventing tutorials, e.g., text editor, virtual machine, docker, TCP and so on.

Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/GitHub/index.html b/en/必学工具/GitHub/index.html index 17f4d2e4..cba71169 100644 --- a/en/必学工具/GitHub/index.html +++ b/en/必学工具/GitHub/index.html @@ -1,2 +1,16 @@ GitHub - CSDIY.wiki
Skip to content

GitHub

GitHub 是什么

从功能上来说,GitHub 是一个在线代码托管平台。你可以将你的本地 Git 仓库托管到 GitHub 上,供多人同时开发浏览。但现如今 GitHub 的意义已远不止如此,它已经演变为一个非常活跃且资源极为丰富的开源交流社区。全世界的软件开发者在 GitHub 上分享各式各样种类繁多的开源软件。大到工业级的深度学习框架 PyTorch, TensorFlow,小到几十行的实用脚本,既有硬核的知识分享,也有保姆级的教程指导,甚至很多技术书籍也在 GitHub上开源(例如诸位正在看的这本——如果我厚着脸皮勉强称之为书的话)。闲来无事逛逛 GitHub 已经成为了我日常生活的一部分。

在 GitHub 里,星星是对一个项目至高无上的肯定,如果你觉得这本书对你有用的话,欢迎通过右上角的链接进入仓库主页献出你宝贵的星星✨。

如何使用 GitHub

如果你还从未在 GitHub 上建立过自己的远程仓库,也没有克隆过别人的代码,那么我建议你从 GitHub的官方教程开始自己的开源之旅。

如果你想时刻关注 GitHub 上一些有趣的开源项目,那么我向你重磅推荐 HelloGitHub 这个网站以及它的同名微信公众号。它会定期收录 GitHub 上近期开始流行的或者非常有趣的开源项目,让你有机会第一时间接触各类优质资源。

GitHub 之所以成功,我想是得益于“我为人人,人人为我”的开源精神,得益于知识分享的快乐。如果你也想成为下一个万人敬仰的开源大佬,或者下一个 star 破万的项目作者。那就把你在开发过程中灵感一现的 idea 化作代码,展示在 GitHub 上吧~

不过需要提醒的是,开源社区不是法外之地,很多开源软件并不是可以随意复制分发甚至贩卖的,了解各类开源协议并遵守,不仅是法律的要求,更是每个开源社区成员的责任。


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/LaTeX/index.html b/en/必学工具/LaTeX/index.html index 0168f125..b4881130 100644 --- a/en/必学工具/LaTeX/index.html +++ b/en/必学工具/LaTeX/index.html @@ -1,2 +1,16 @@ LaTeX - CSDIY.wiki
Skip to content

LaTeX

为什么学 LaTeX

如果你需要写论文,那么请直接跳到下一节,因为你不学也得学。

LaTeX 是一种基于 TeX 的排版系统,由图灵奖得主 Lamport 开发,而 Tex 则是由 Knuth 最初开发,这两位都是计算机界的巨擘。当然开发者强并不是我们学习 LaTeX 的理由,LaTeX 和常见的所见即所得的 Word 文档最大的区别就是用户只需要关注写作的内容,而排版则完全交给软件自动完成。这让没有任何排版经验的普通人得以写出排版非常专业的论文或文章。

Berkeley计算机系教授 Christos Papadimitriou 曾说过一句半开玩笑的话:

Every time I read a LaTeX document, I think, wow, this must be correct!

如何学习 LaTeX

推荐的学习路线如下:

  • LaTeX 的环境配置是个比较头疼的问题。如果你本地配置 LaTeX 环境出现了问题,可以考虑使用 Overleaf 这个在线 LaTeX 编辑网站。站内不仅有各种各样的 LaTeX 模版供你选择,还免去了环境配置的难题。
  • 阅读下面三篇 Tutorial: Part-1, Part-2, Part-3
  • 学习 LaTeX 最好的方式当然是写论文,不过从一门数学课入手用 LaTeX 写作业也是一个不错的选择。

Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/Scoop/index.html b/en/必学工具/Scoop/index.html index 24375be5..fbb9eafd 100644 --- a/en/必学工具/Scoop/index.html +++ b/en/必学工具/Scoop/index.html @@ -9,4 +9,18 @@ irm get.scoop.sh -outfile 'install.ps1'

使用 Scoop

Scoop 的官方文档对于新手非常友好,相对于在此处赘述更推荐阅读 官方文档快速入门

Q&A

Scoop 能配置镜像源吗?

Scoop 社区仅维护安装配置,所有的软件都是从该软件官方提供的下载链接进行下载,所以无法提供镜像源。如果因为你的网络环境导致多次下载失败,那么你需要一点点 魔法

为什么找不到 Java8?

原因同上,官方已不再提供 Java8 的下载链接,推荐使用 ojdkbuild8 替代。

我需要安装 python2 该如何操作?

对于已经过时弃用的软件,Scoop 社区会将其从 ScoopInstaller/Main 中移除并将其添加到 ScoopInstaller/Versions 中。如果你需要这些软件的话需要手动添加 bucket:

scoop bucket add versions
 scoop install python27
 

Last update: December 21, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/Vim/index.html b/en/必学工具/Vim/index.html index 33307ec3..9273963d 100644 --- a/en/必学工具/Vim/index.html +++ b/en/必学工具/Vim/index.html @@ -1,2 +1,16 @@ Vim - CSDIY.wiki
Skip to content

Vim

Why Vim

In my opinion, the Vim editor has the following benefits:

  • It keeps your finger on the keyboard throughout the development and moving the cursor without the arrow keys keeps your fingers in the best position for typing.
  • Convenient file switching and panel controls allow you to edit multiple files simultaneously or even different locations of the same file.
  • Vim's macros can batch repeat operations (e.g. add tabs to multi-lines, etc.)
  • Vim is well-suited for Linux servers without GUI. When you connect to a remote server through ssh, you can only develop from the command line because there is no GUI (of course, many IDEs such as PyCharm now provide ssh plugins to solve this problem).
  • A rich ecology of plugins gives you the world's most fancy command-line editor.

How to learn Vim

Unfortunately Vim does have a pretty steep learning curve and it took me a few weeks to get used to developing with Vim. You'll feel very uncomfortable at first, but once you get past the initial stages, trust me, you'll fall in love with Vim.

There is a vast amount of learning material available on Vim, but the best way to master it is to use it in your daily development, no need to learn all the fancy advanced Vim tricks right away. The recommended learning path is as follows:

  • Read This tutorial first to understand the basic Vim concepts and usage.
  • Use Vim's own vimtutor to practice. After installing Vim, type vimtutor directly into the command line to enter the practice program.
  • Then you can force yourself to use Vim for development, and you can install Vim plugins in your favorite IDE.
  • Once you're fully comfortable with Vim, a new world opens up to you, and you can configure your own Vim on demand (by modifying the .vimrc file), and there are countless resources on the Internet to learn from.
  • If you want to know more about how to customize Vim to suit your needs, Learn Vim Script the Hard Way is a perfect start point.

Remapping Keys

Ctrl and Esc keys are probably two of the most used keys in Vim. However, these two keys are pretty far away from home row. In order to make it easier to reach these keys, you can remap CapsLock to Esc or Ctrl.

On Windows, Powertoys or AutoHotkey can be used to achieve this goal.
On macOS, you can remap keys in system settings, see this page.

A better solution is to make CapsLock function as Esc and Ctrl simultaneously. Click CapsLock to send Esc, hold CapsLock to use it as Ctrl key.

On Windows, this AutoHotKey gist does just this.
On macOS, this karabiner rule does the magic.

  • Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
  • Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.

Last update: December 5, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/thesis/index.html b/en/必学工具/thesis/index.html index fcbf8dde..5a7a1120 100644 --- a/en/必学工具/thesis/index.html +++ b/en/必学工具/thesis/index.html @@ -1,2 +1,16 @@ 毕业论文 - CSDIY.wiki
Skip to content

毕业论文

为什么写这份教程

2022年,我本科毕业了。在开始动手写毕业论文的时候,我尴尬地发现,我对 Word 的掌握程度仅限于调节字体、保存导出这些傻瓜功能。曾想转战 Latex,但论文的段落格式要求调整起来还是用 Word 更为方便,经过一番痛苦缠斗之后,总算是有惊无险地完成了论文的写作和答辩。为了不让后来者重蹈覆辙,遂把相关资源整理成一份开箱即用的文档,供大家参考。

如何用 Word 写毕业论文

正如将大象装进冰箱需要三步,用 Word 写毕业论文也只需要简单三步:

  • 确定论文的格式要求:通常学院都会下发毕业论文的格式要求(各级标题的字体字号、图例和引用的格式等等),如果更为贴心的话甚至会直接给出论文模版(如是此情况请直接跳转到下一步)。很不幸的是,我的学院并没有下发标准的论文格式要求,还提供了一份格式混乱几乎毫无用处的论文模版膈应我,被逼无奈之下我找到了北京大学研究生的论文格式要求,并按照其要求制作了一份模版,大家需要的话自取,本人不承担无法毕业等任何责任。

  • 学习 Word 排版:到达这一步的童鞋分为两类,一是已经拥有了学院提供的标准模版,二是只有一份虚无缥缈的格式要求。那现在当务之急就是学习基础的 Word 排版技术,对于前者可以学会使用模版,对于后者则可以学会制作模版。此时切记不要雄心勃勃地选择一个十几个小时的 Word 教学视频开始头悬梁锥刺股,因为生产一份应付毕业的学术垃圾只要学半小时能上手就够了。我当时看的一个 B 站的教学视频,短小精悍非常实用,全长半小时极速入门。

  • 生产学术垃圾:最容易的一步,大家八仙过海,各显神通吧,祝大家毕业顺利~~


Last update: June 19, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/tools/index.html b/en/必学工具/tools/index.html index 13afdeb5..61990986 100644 --- a/en/必学工具/tools/index.html +++ b/en/必学工具/tools/index.html @@ -1,2 +1,16 @@ 实用工具箱 - CSDIY.wiki
Skip to content

实用工具箱

下载工具

设计工具

  • excalidraw: 一款手绘风格的绘图工具,非常适合绘制课程报告或者PPT内的示意图。
  • tldraw: 一个绘图工具,适合画流程图,架构图等。
  • origamiway: 手把手教你怎么折纸。
  • thingiverse: 囊括各类 2D/3D 设计资源,其 STL 文件下载可直接 3D 打印。
  • iconfont: 国内最大的图标和插画资源库,可用于开发或绘制系统架构图。
  • turbosquid: 可以购买各式各样的模型。
  • flaticon: 可下载免费且高质量的图标。
  • 标准地图服务系统: 可以下载官方标准地图。

编程相关

  • sqlfiddle: 一个简易的在线 SQL Playground。
  • sqlzoo:在线练习 sql 语句。
  • godbolt: 非常方便的编译器探索工具。你可以写一段 C/C++ 代码,选择一款编译器,然后便可以观察生成的具体汇编代码。
  • explainshell: 你是否曾为一段 shell 代码的具体含义感到困扰?manpage 看半天还是不明所以?试试这个网站!
  • regex101: 正则表达式调试网站,支持各种编程语言的匹配标准。
  • typingtom: 针对程序员的打字练习/测速网站。
  • wrk: 网站压测工具。
  • gbmb: 数据单位转换。
  • tools: 在线工具合集。
  • github1s: 用网页版 VS Code 在线阅读 GitHub 代码。
  • visualgo: 算法可视化网站。
  • DataStructureVisual: 数据结构可视化网站。
  • Data Structure Visualizations: 数据结构与算法的可视化网站。
  • learngitbranching: 可视化学习 git。
  • UnicodeCharacter: Unicode 字符集网站。

学习网站

杂项


Last update: December 15, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/workflow/index.html b/en/必学工具/workflow/index.html index 83de4fae..c24d60ea 100644 --- a/en/必学工具/workflow/index.html +++ b/en/必学工具/workflow/index.html @@ -1,2 +1,16 @@ 日常学习工作流 - CSDIY.wiki
Skip to content

日常学习工作流

Contributed by @HardwayLinka

计算机领域的知识覆盖面很广并且更新速度很快,因此保持终身学习的习惯很重要。但在日常开发和学习的过程中,我们获取知识的来源相对复杂且细碎。有成百上千页的文档手册,也有寥寥数语的博客,甚至闲暇时手机上划过的某则新闻和公众号都有可能包含我们感兴趣的知识。因此,如何利用现有的各类工具,形成一套适合自己的学习工作流,将不同来源的知识碎片整合进属于自己的知识库,方便之后的查阅与复习,就显得尤为重要。经过两年工作之余的学习后,我磨合出了以下学习工作流:

底层核心逻辑

一开始我学习新知识时会参考中文博客,但在代码实践时往往会发现漏洞和bug。我逐渐意识到我参考的信息可能是错误的,毕竟发博客的门槛低,文章可信度不高,于是我开始查阅一些相关的中文书籍。

中文书籍的确是比较全面且系统地讲解了知识点,但众所周知,计算机技术更迭迅速,又因为老美在 CS 方面一直都是灯塔,所以一般中文书籍里的内容会滞后于当前最新的知识,导致我跟着中文书籍实践会出现软件版本差异的问题。这时我开始意识到一手信息的重要性,有些中文书籍是翻译英文书籍的,一般翻译一本书也要一两年,这会导致信息传递的延迟,还有就是翻译的过程中信息会有损失。如果一本中文书籍不是翻译的呢,那么它大概率也参考了其他书籍,参考的过程会带有对英文原著中语义理解的偏差。

于是我就顺其自然地开始翻阅英文书籍。不得不说,英文书籍内容的质量整体是比中文书籍高的。后来随着学习的层层深入,以知识的时效性和完整性出发,我发现 源代码 > 官方文档 > 英文书籍 > 英文博客 > 中文博客,最后我得出了一张 信息损失图

虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。

现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。

选择合适的笔记软件

工作流的骨架围绕 单个知识点多参考源,勤于提问给多个知识点之间建立联系 的底层核心逻辑建立。我们写论文其实就是遵循这个底层逻辑的。论文一般会有脚注去解释一些关键字,并且论文末尾会有多个参考的来源,但是我们平时写笔记会随意得多,因此需要更灵活的方式。

平时写代码习惯在 IDE 里一键跳转,把相关的函数和实现很好地联系在了一起。你也许会想,如果笔记也能像代码那样可以跳转就好了。现在市面上 双链笔记软件 就可以很好地解决这一痛点,例如 Roam Research、Logseq、Notion 和 Obsidian。Roam Research 和 Logseq 都是基于大纲结构的笔记软件,而 大纲结构 是劝退我使用这两款软件的原因。一是 大纲结构 做笔记容易使文章纵向篇幅太长,二是如果嵌套结构过多会占横向的篇幅。Notion 页面打开慢,弃之。最终我选择了 Obsidian,原因如下:

  • Obsidian 基于本地,打开速度快,且可存放很多电子书。我的笔记本是 32g 内存的华硕天选一代,拿来跑 Obsidian 可以快到飞起
  • Obsidian 基于 Markdown。这也是一个优势,如果笔记软件写的笔记格式是自家的编码格式,那么不方便其他第三方拓展,也不方便将笔记用其他软件打开,比如 qq 音乐下载歌曲有自己的格式,其他播放器播放不了,这挺恶心人的
  • Obsidian 有丰富的插件生态,并且这个生态既大又活跃,即插件数量多,且热门插件的 star 多,开发者会反馈用户 issue,版本会持续迭代。借助这些插件,可以使 Osidian 达到 all in one 的效果,即各类知识来源可以统一整合于一处

信息的来源

Obsidian 的插件使其可以支持 pdf 格式,而其本身又支持 Markdown 格式。如果想要 all in one,那么可以基于这两个格式,将其他格式文件转换为 pdf 或者 Markdown。 那么现在就面临着两个问题:

  • 有什么格式
  • 怎么转换为 pdf 或 Markdown

有什么格式

文件格式依托于其展示的平台,所以在看有什么格式之前,可以罗列一下我平时获取信息的来源:

可以看到主要分为文章论文电子书课程四类,包含的格式主要有 网页pdfmobiazwazw3

怎么转换为 pdf 或 Markdown

在线的文章和课程等大多以网页形式呈现,而将网页转换为 Markdown 可以使用剪藏软件,它可以将网页文章转换为多种文本格式文件。我选择的工具是简悦,使用简悦可以将几乎所有平台的文章很好地剪藏为 Markdown 并且导入到 Obsidian。

对于论文和电子书而言如果格式本身就是 pdf 则万事大吉,但如果是其他格式则可以使用 calibre 进行转换:

现在利用 Obsidian 的 pdf 插件和其原生的 markdown 支持就可以畅快无比地做笔记并且在这些文章的对应章节进行无缝衔接地引用跳转啦(具体操作参考下文的“信息的处理”模块)。

如何统一管理信息来源

对于 pdf 等文件类资源可以本地或者云端存储,而网页类资源则可以分门别类地放入浏览器的收藏夹,或者剪藏成 markdown 格式的笔记,但是网页浏览器不能实现移动端的网页收藏。为了实现跨端网页收藏我选用了 Cubox,在手机端看到感兴趣的网页时只需小手一划,便能将网页统一保存下来。虽然免费版只能收藏 100 个网页,但其实够用了,还可以在收藏满时督促自己赶紧剪藏消化掉这些网页,让收藏不吃灰。

除此之外,回想一下我们平时收藏的网页,就会发现有很多并不是像知乎、掘金这类有完整功能的博客平台,更多的是个人建的小站,而这些小站往往没有移动端应用,这样平时刷手机的时候也看不到,放到浏览器的收藏夹里又容易漏了看,有新文章发布我们也不能第一时间收到通知,这个时候就需要一种叫 RSS 的通信协议。

RSS(英文全称:RDF Site Summary 或 Really Simple Syndication),中文译作简易信息聚合,也称聚合内容,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。电脑端可以借助 RSSHub Radar 来快速发现和生成 RSS 订阅源,接着使用 Feedly 来订阅这些 RSS 订阅源(RSSHub RadarFeedly 在 chrome 浏览器中均有官方插件)。

到这里为止,收集信息的流程已经比较完备了。但资料再多,分类规整得再漂亮,也得真正内化成自己的才管用。因此在收集完信息后就得进一步地处理信息,即阅读这些信息,如果是英文信息的话还得搞懂英文的语义,加粗高亮重点句子段落,标记有疑问的地方,发散联想相关的知识点,最后写上自己的总结。那么在这过程中需要使用到什么工具呢?

信息的处理

英文信息

面对英文的资料,我以前是用 有道词典 来划词翻译,遇到句子的话就使用谷歌翻译,遇到大段落时就使用 deepl,久而久之,发现这样看英语文献太慢了,得用三个工具才能满足翻译这一个需求,如果有一个工具能够同时实现对单词、句子和段落的划词翻译就好了。我联想到研究生们应该会经常接触英语文献,于是我就搜 研究生 + 翻译软件,在检索结果里我最终选择了 Quicker + 沙拉查词 这个搭配来进行划词翻译。

使用这套组合可以实现在浏览器外的其他软件内进行划词翻译,并且支持单词、句子和段落的翻译,以及每次的翻译会有多个翻译平台的结果。btw,如果查单词时不着急的话,可以顺便看看 科林斯高阶 的翻译,这个词典的优点就是会用英文去解释英文,可以提供多个上下文帮助你理解,对于学习英文单词也有帮助,因为用英文解释英文才更接近英语的思维。

多媒体信息

处理完文本类的信息后,我们还得思考一下怎么处理多媒体类的信息。此处的多媒体我特指英文视频,因为我没有用播客或录音学习的习惯,而且我已经基本不看中文教程了。现在很多国外名校公开课都是以视频的形式,如果能对视频进行做笔记会不会有帮助呢?不知道大家有没这样的想法,就是如果能把老师上课讲的内容转换成文本就好了,因为平时学习时我们看书的速度往往会比老师讲课的速度快。刚好 Language Reactor 这个软件可以将油管和网飞内视频的字幕导出来,同时附上中文翻译。

我们可以把 Language Reactor 导出的字幕复制到 Obsidian 里面作为文章来读。除了出于学习的需求,也可以在平时看油管的视频时打开这个插件,这个插件可以同时显示中英文字幕,并且可以单击选中英文字幕中你认为生僻的单词后显示单词释义。

但阅读文本对于一些抽象的知识点来说并不是效率最高的学习方式。俗话说,一图胜千言,能不能将某一段知识点的文本和对应的图片甚至视频画面操作联系起来呢?我在浏览 Obsidian 的插件市场时,发现了一个叫 Media Extended 的插件,这个插件可以在你的笔记里添加跳转到视频指定时间进度的链接,相当于把你的笔记和视频连接起来了!这刚好可以和我上文提到的生成视频中英文字幕搭配起来,即每一句字幕对应一个时间,并且能根据时间点跳转到视频的指定进度,如此一来如果需要在文章中展示记录了操作过程的视频的话,就不需要自己去截取对应的视频片段,而是直接在文章内就能跳转!

Obsidian 里还有一个很强大的插件,叫 Annotator,它可以实现笔记内跳转到 pdf 原文

现在,使用 Obsidian 自带的双链功能,可以实现笔记间相互跳转,结合上述两个插件,可以实现笔记到多媒体的跳转,信息的处理过程已经完备。一般我们学习的过程相当于上山和下山,刚学的时候就好像上山,很陌生、吃力,所谓学而时习之,复习或练习的过程就像下山,没有陌生感,不见得轻松,但非走不可。那么如何把复习这一过程纳入工作流的环节里呢?

信息的回顾

Obsidian 内已经有一个连接 Anki 的插件,Anki 就是大名鼎鼎的、基于间隔重复的记忆软件。使用该插件可以截取笔记的片段导出到 Anki 并变成一张卡片,卡片内也有跳转回笔记原文的链接

总结

这个工作流是在我这两年业余时间学习时所慢慢形成的,在学习过程中因为对一些重复性的过程而感到厌倦,正是这种厌倦产生了某种特定的需求,恰好在平时网上冲浪时了解到的一些工具满足了我这些需求。不要为了虚无的满足感而将工具强行拼凑到自己的工作流中,人生苦短,做实事最紧要。

btw,此篇文章是讲解工作流的演化思路,如果对此工作流的实现细节感兴趣,建议阅读完本文后再按顺序阅读以下文章

  1. 3000 + 小时积累的学习工作流
  2. Obsidian 的高级玩法 | 打造能跳转到任何格式文件的笔记

Last update: October 21, 2022
Back to top
\ No newline at end of file diff --git a/en/必学工具/翻墙/index.html b/en/必学工具/翻墙/index.html index df72616c..751e601d 100644 --- a/en/必学工具/翻墙/index.html +++ b/en/必学工具/翻墙/index.html @@ -1,2 +1,16 @@ 翻墙 - CSDIY.wiki
Skip to content

翻墙

此链接出现在这里纯属二进制 bit 的随意组合,与本人毫无关系。


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/操作系统/CS162/index.html b/en/操作系统/CS162/index.html index dad118f2..42375c04 100644 --- a/en/操作系统/CS162/index.html +++ b/en/操作系统/CS162/index.html @@ -1,2 +1,16 @@ UCB CS162: Operating System - CSDIY.wiki
Skip to content

CS162: Operating System

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, CS61B, CS61C
  • Programming Languages: C, x86 Assembly
  • Difficulty: 🌟🌟🌟🌟🌟🌟
  • Class Hour: 200 hours+

The course impressed me in two aspects:

Firstly, the textbook: Operating Systems: Principles and Practice (2nd Edition) is written in an insightful but easy-to-understand way, well compensated for the lack of theoretical knowledge in MIT6.S081, I highly recommend you to read this book.

Secondly, the project for this course Pintos is a great journey for system hackers. Pintos is a toy operating system developed at Stanford for educational use. The author Ben Pfaff even published a paper to explain the design principles of Pintos.

Unlike the small but comprehensive design philosophy in MIT's xv6 labs, Pintos emphasizes system design and implementation more. The codebase is about 10,000 LOC and only provides the basic functions of a working operating system. The four projects let you add scheduler (Project1), system calls (Project2), virtual memory (Project3), and the file system (Project4) to this extremely simple operating system. All projects leave a a big design space for students and require more than 2000 LOC. Based on the feedback from Stanford students, the latter two projects take over 40 hours per person even in teams of 3-4 people.

Although it is tough, Stanford, Berkeley, JHU and many other top U.S. colleges have chosen Pintos as their OS course project. If you're really interested in operating systems, it will greatly improve your ability to write and debug low-level system code. For me, it is an invaluable experience to design, implement, and debug a large system independently.

Pintos will also be introduced as a course project in Peking University's OS Course. In the Spring 2022 semester, I worked with another TA to write a comprehensive lab documentation and provided a docker image for the ease of cross-platform development. In the last semester before graduation, I hope such an attempt can make more people fall in love with systems and contribute to the field of systems in China.

Course Resources

Personal Resources

Since the Operating System Course at PKU uses the project, my implementation is not open source to prevent plagiarism.


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/操作系统/MIT6.S081/index.html b/en/操作系统/MIT6.S081/index.html index da2c8c7b..60ce5d80 100644 --- a/en/操作系统/MIT6.S081/index.html +++ b/en/操作系统/MIT6.S081/index.html @@ -1,2 +1,16 @@ MIT 6.S081: Operating System Engineering - CSDIY.wiki
Skip to content

MIT 6.S081: Operating System Engineering

Descriptions

  • Offered by: MIT
  • Prerequisites: Computer Architecture + Solid C Programming Skills + RISC-V Assembly
  • Programming Languages: C, RISC-V
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

This is the undergraduate operating system course at MIT, offered by the well-known PDOS Group. One of the instructors, Robert Morris, was once a famous hacker who created 'Morris', the first worm virus in the world.

The predecessor of this course was the famous MIT6.828. The same instructors at MIT created an educational operating system called JOS based on x86, which has been adopted by many other famous universities. While after the birth of RISC-V, they implemented it based on RISC-V, and offered MIT 6.S081. RISC-V is lightweight and user-friendly, so students don't have to struggle with the confusing legacy features in x86 as in JOS, but focus on the operating system design and implementation.

The instructors have also written a tutorial, elaborately explaining the ideas of design and details of the implementation of xv6 operating system.

The teaching style of this course is also interesting, the instructors guided the students to understand the numerous technical challenges and design principles in the operating systems by going through the xv6 source code, instead of merely teaching theoretical knowledge. Weekly Labs will let you add new features to xv6, which focus on enhancing students' practical skills. There are 11 labs in total during the whole semester which give you the chance to understand every aspect of the operating systems, bringing a great sense of achievement. Each lab has a complete framework for testing, some tests are more than a thousand lines of code, which shows how much effort the instructors have made to teach this course well.

In the second half of the course, the instructors will discuss a couple of classic papers in the operating system field, covering file systems, system security, networking, virtualization, and so on, giving you a chance to have a taste of the cutting edge research directions in the academic field.

Course Resources

xv6 Resources

Complementary Resources

All resources used and assignments implemented by @PKUFlyingPig when learning this course are in PKUFlyingPig/MIT6.S081-2020fall - GitHub.

@KuangjuX documented his solutions with detailed explanations and complementary knowledge. Moreover, @KuangjuX has reimplemented the xv6 operating system in Rust which contains more detailed reviews and discussions about xv6.

Some Blogs for References


Last update: October 28, 2022
Back to top
\ No newline at end of file diff --git a/en/操作系统/NJUOS/index.html b/en/操作系统/NJUOS/index.html index fd086715..85854b84 100644 --- a/en/操作系统/NJUOS/index.html +++ b/en/操作系统/NJUOS/index.html @@ -1,2 +1,16 @@ NJU OS: Operating System Design and Implementation - CSDIY.wiki
Skip to content

NJU OS: Operating System Design and Implementation

课程简介

  • 所属大学:南京大学
  • 先修要求:体系结构 + 扎实的 C 语言功底
  • 编程语言:C 语言
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:150 小时

之前一直听说南大的蒋炎岩老师开设的操作系统课程讲得很好,久闻不如一见,这学期有幸在 B 站观看了蒋老师的课程视频,确实收获良多。蒋老师作为非常年轻的老师,有着丰富的一线代码的经验,因此课程讲授有着满满的 Hacker 风格,课上经常“一言不合”就在命令行里开始写代码,很多重要知识点也都配有生动直白的代码示例。让我印象最为深刻的就是老师为了让学生更好地理解动态链接库的设计思想,甚至专门实现了一个迷你的可执行文件与一系列的二进制工具,让很多困扰我多年的问题都得到了解答。

这门课的讲授思路也非常有趣,蒋老师先从“程序就是状态机”这一视角入手,为“万恶之源”并发程序建立了状态机的转化模型,并在此基础上讲授了并发控制的常见手段以及并发bug的应对方法。接着蒋老师将操作系统看作一系列对象(进程/线程、地址空间、文件、设备等等)以及操作它们的 API (系统调用)并结合丰富的实际例子介绍了操作系统是如何利用这系列对象虚拟化硬件资源并给应用软件提供各类服务的。最后的可持久化部分,蒋老师从 1-bit 的存储介质讲起,一步步构建起各类存储设备,并通过设备驱动抽象出一组接口来方便地设计与实现文件系统。我之前虽然上过许多门操作系统的课程,但这种讲法确实独此一家,让我收获了很多独到的视角来看待系统软件。

这门课除了在理论知识的讲授部分很有新意外,注重实践也是蒋老师的一大特点。在课堂和编程作业里,蒋老师会有意无意地培养大家阅读源码、查阅手册的能力,这也是计算机从业者必备的技能。在完成第五个 MiniLab 期间,我第一次仔仔细细阅读了微软的 FAT 文件系统手册,收获了一次非常有价值的经历。

编程作业共由 5个 MiniLab 和 4个 OSLab 组成。美中不足的是作业的评测机是不对校外开放的,不过在邮件“骚扰”后蒋老师还是非常慷慨地让我成功蹭课。由于课余时间有限我只完成了 5个 MiniLab,总体体验非常棒。尤其是第二个协程实验让我印象最为深刻,在不到百行的小实验里深刻体验了上下文切换的美妙与“可怕”。另外其实几个 MiniLab 都能非常方便地进行本地测试,就算没有评测机也不影响自学,因此希望大家不要聚众“骚扰”老师以图蹭课。

最后再次感谢蒋老师设计并开放了这样一门非常棒的操作系统课程,这也是本书收录的第一门国内高校自主开设的计算机课程。正是有蒋老师这些年轻的新生代教师在繁重的 Tenure 考核之余的用爱发电,才让无数学子收获了难忘的本科生涯。也期待国内能有更多这样的良心好课,我也会第一时间收录进本书中让更多人受益。

课程资源

资源汇总

按蒋老师的要求,我的作业实现没有开源。


Last update: June 10, 2022
Back to top
\ No newline at end of file diff --git a/en/数学基础/MITLA/index.html b/en/数学基础/MITLA/index.html index 55c9c75c..c671e831 100644 --- a/en/数学基础/MITLA/index.html +++ b/en/数学基础/MITLA/index.html @@ -1,2 +1,16 @@ MIT18.06: Linear Algebra - CSDIY.wiki
Skip to content

MIT18.06: Linear Algebra

Descriptions

  • Offered by: MIT
  • Prerequisites: English
  • Programming languages: None
  • Difficulty: 🌟🌟🌟
  • Class Hour: Varying from person to person

Gilbert Strang, a great mathematician at MIT, still insists on teaching in his eighties. His classic text book Introduction to Linear Algebra has been adopted as an official textbook by Tsinghua University. After reading the PDF version, I felt deeply guilty and spent more than 200 yuan to purchase a genuine version in English as collection. The cover of this book is attached below. If you can fully understand the mathematical meaning of the cover picture, then your understanding of linear algebra will definitely reach a new height.

image

In addition to the course materials, the famous Youtuber 3Blue1Brown's video series The Essence of Linear Algebra are also great learning resources.

Resources


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/数学基础/MITmaths/index.html b/en/数学基础/MITmaths/index.html index 5a1cb535..6d66d90e 100644 --- a/en/数学基础/MITmaths/index.html +++ b/en/数学基础/MITmaths/index.html @@ -1,2 +1,16 @@ MIT18.01/18.02: Calculus - CSDIY.wiki
Skip to content

MIT Calculus Course

Descriptions

  • Offered by: MIT
  • Prerequisites: English
  • Programming Languages: None
  • Difficulty: 🌟🌟
  • Class Hour: Varying from person to person

The calculus course at MIT consists of MIT18.01: Single Variable Calculus and MIT18.02: Multivariable Calculus. If you are confident in your math, you can just read the course notes, which are written in a very simple and vivid way, so that you will not be tired of doing homework but can really see the essence of calculus.

In addition to the course materials, the famous Youtuber 3Blue1Brown's video series The Essence of Calculus are also great learning resources.

Course Resources

  • Course Website: 18.01, 18.02
  • Recordings: refer to course website
  • Textbook: refer to course website
  • Assignments: refer to course website

Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/数学基础/information/index.html b/en/数学基础/information/index.html index f9a4ec5e..e8313b16 100644 --- a/en/数学基础/information/index.html +++ b/en/数学基础/information/index.html @@ -1,2 +1,16 @@ MIT6.050J: Information theory and Entropy - CSDIY.wiki
Skip to content

MIT6.050J: Information theory and Entropy

Descriptions

  • Offered by: MIT
  • Prerequisites: None
  • Programming Languages: None
  • Difficulty: 🌟🌟🌟
  • Class Hour: 100 hours

This is MIT's introductory information theory course for freshmen, Professor Penfield has written a special textbook for this course as course notes, which is in-depth and interesting.

Course Resources


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/6.042J/index.html b/en/数学进阶/6.042J/index.html index 2237afdd..ee70dcda 100644 --- a/en/数学进阶/6.042J/index.html +++ b/en/数学进阶/6.042J/index.html @@ -1,2 +1,16 @@ MIT 6.042J: Mathematics for Computer Science - CSDIY.wiki
Skip to content

MIT 6.042J: Mathematics for Computer Science

Descriptions

  • Offered by: MIT
  • Prerequisites: Calculus, Linear Algebra
  • Programming Languages: Python preferred
  • Difficulty: 🌟🌟🌟
  • Class Hour: 50-70 hours

This is MIT‘s discrete mathematics and probability course taught by the notable Tom Leighton (co-founder of Akamai). It is very useful for learning algorithms subsequently.

Course Resources


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/CS126/index.html b/en/数学进阶/CS126/index.html index a46b9130..53422fa5 100644 --- a/en/数学进阶/CS126/index.html +++ b/en/数学进阶/CS126/index.html @@ -1,2 +1,16 @@ UCB CS126: probability theory - CSDIY.wiki
Skip to content

UCB CS126 : Probability theory

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS70, Calculus, Linear Algebra
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 100 hours

This is Berkeley's advanced probability course, which involves relatively advanced theoretical content such as statistics and stochastic processes, so a solid mathematical foundation is required. But as long as you stick with it you will certainly take your mastery of probability theory to a new level.

The course is designed by Professor Jean Walrand, who has written an accompanying textbook, Probability in Electrical Engineering and Computer Science, in which each chapter uses a specific algorithm as a practical example to demonstrate the application of theory in practice. Such as PageRank, Route Planing, Speech Recognition, etc. The book is open source and can be downloaded as a free PDF or Epub version.

Jean Walrand has also created accompanying Python implementations of the examples throughout the book, which are published online as Jupyter Notebook that readers can modify, debug and run them online interactively.

In addition to the Homework, nine Labs will allow you to use probability theory to solve practical problems in Python.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/EECS126 - GitHub


Last update: September 30, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/CS70/index.html b/en/数学进阶/CS70/index.html index df00af93..1e7d02c4 100644 --- a/en/数学进阶/CS70/index.html +++ b/en/数学进阶/CS70/index.html @@ -1,2 +1,16 @@ UCB CS70: discrete Math and probability theory - CSDIY.wiki
Skip to content

UCB CS70: Discrete Math and Probability Theory

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: None
  • Programming Languages: None
  • Difficulty: 🌟🌟🌟
  • Class Hour: 60 hours

This is Berkeley's introductory discrete mathematics course. The biggest highlight of this course is that it not only teaches you theoretical knowledge, but also introduce the applications of theoretical knowledge in practical algorithms in each module. In this way, students majoring in CS can understand the essence of theoretical knowledge and use it in practice rather than struggle with cold formal mathematical symbols.

Specific theory-algorithm correspondences are listed below.

  • Logic proof: stable matching algorithm
  • Graph theory: network topology design
  • Basic number theory: RSA algorithm
  • Polynomial ring: error-correcting code design
  • Probability theory: Hash table design, load balancing, etc.

The course notes are also written in a very in-depth manner, with derivations of formulas and practical examples, providing a good reading experience.

Course Resources

  • Course Website: http://www.eecs70.org/
  • Textbook: refer to the course website
  • Assignments: refer to the course website

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/UCB-CS70 - GitHub


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html b/en/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html index dd66d8d8..a9ded713 100644 --- a/en/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html +++ b/en/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html @@ -1,2 +1,16 @@ The Information Theory, Patter Recognition, and Neural Networks - CSDIY.wiki
Skip to content

The Information Theory, Patter Recognition, and Neural Networks

Descriptions

  • Offered by: Cambridge
  • Prerequisites: Calculus, Linear Algebra, Probabilities and Statistics
  • Programming Languages: Anything would be OK, Python preferred
  • Difficulty: 🌟🌟🌟
  • Class Hour: 30-50 hours

This is a course on information theory taught by Sir David MacKay at the University of Cambridge. The professor is a very famous scholar in information theory and neural networks, and the textbook for the course is a classic work in the field of information theory. Unfortunately, those whom God loves die young ...

Course Resources

R.I.P Prof. David MacKay


Last update: September 29, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/convex/index.html b/en/数学进阶/convex/index.html index f92dc3e9..372902c9 100644 --- a/en/数学进阶/convex/index.html +++ b/en/数学进阶/convex/index.html @@ -1,2 +1,16 @@ Standford EE364A: Convex Optimization - CSDIY.wiki
Skip to content

Stanford EE364A: Convex Optimization

Descriptions

  • Offered by: Stanford
  • Prerequisites: Python, Calculus, Linear Algebra, Probability Theory, Numerical Analysis
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

Professor Stephen Boyd is a great expert in the field of convex optimization and his textbook Convex Optimization has been adopted by many prestigious universities. His team has also developed a programming framework for solving common convex optimization problems in Python, Julia, and other popular programming languages, and its homework assignments also use this programming framework to solve real-life convex optimization problems.

In practice, you will deeply understand that for the same problem, a small change in the modeling process can make a world of difference in the difficulty of solving the equation. It is an art to make the equations you formulate "convex".

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPic/Standford_CVX101 - GitHub


Last update: September 29, 2022
Back to top
\ No newline at end of file diff --git a/en/数学进阶/numerical/index.html b/en/数学进阶/numerical/index.html index dfb76d6c..38f7a344 100644 --- a/en/数学进阶/numerical/index.html +++ b/en/数学进阶/numerical/index.html @@ -1,2 +1,16 @@ MIT18.330: Introduction to numerical analysis - CSDIY.wiki
Skip to content

MIT18.330 : Introduction to numerical analysis

Descriptions

  • Offered by: MIT
  • Prerequisites: Calculus, Linear Algebra, Probability theory
  • Programming Languages: Julia
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

While the computational power of computers has been helping people to push boundaries of science, there is a natural barrier between the discrete nature of computers and this continuous world, and how to use discrete representations to estimate and approximate those mathematically continuous concepts is an important theme in numerical analysis.

This course will explore various numerical analysis methods in the areas of floating-point representation, equation solving, linear algebra, calculus, and differential equations, allowing you to understand (1) how to design estimation (2) how to estimate errors (3) how to implement algorithms in Julia. There are also plenty of programming assignments to practice these ideas.

The designers of this course have also written an open source textbook for this course (see the link below) with plenty of Julia examples.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPic/MIT18.330 - GitHub


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/数据库系统/15445/index.html b/en/数据库系统/15445/index.html index 17d823b5..dce94c43 100644 --- a/en/数据库系统/15445/index.html +++ b/en/数据库系统/15445/index.html @@ -1,2 +1,16 @@ CMU 15-445: Database Systems - CSDIY.wiki
Skip to content

CMU 15-445: Database Systems

Descriptions

  • Offered by: CMU
  • Prerequisites: C++, Data Structures and Algorithms
  • Programming Languages: C++
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

This is an introductory course on databases at CMU taught by Andy Pavlo, a great expert in the field of databases. It teaches the basic topics of database systems from the bottom up, covering storage management, indexing, query processing, concurrency control, transactions, and so on.

The course project Bustub is an educational database system developed at CMU by the course instructors. During the semester, you will modify this database to implement the functions mentioned above. Moreover, as a well-written project in C++, Bustub obeys many modern development best practices, such as code specification, unit testing, cmake module build, etc. So it can be an excellent open source project to study.

Resources

  • Course Website: Fall2019, Fall2020, Fall2021
  • Assignments: refer to the course website
  • Textbook: Database System Concepts
  • Assignments: 4 Projects

In Fall 2019, the second Project is to implement a hash table, and the fourth Project is to implement Logging, Recovery, and Checkpoints in your database system.

In Fall 2020, the second Project is to implement B+Tree dynamic index structure, and the fourth Project is to implement concurrency control.

In Fall 2021, the first Project is to implement a buffer pool, the second Project is to implement a hash table, and the fourth Project is to implement concurrency control.

If you have more time you can try them all, and when you do not understand the textbook very well, trying to implement the real system will deepen your understanding.

Personal Resources

All the resources and assignments used by @ysj1173886760 in this course are maintained in ysj1173886760/Learning:db - GitHub

Due to Andy's request, the repository does not contain the source code for the project, only the solution for homework. In particular, for Homework1, @ysj1173886760 wrote a shell script to help you evaluate your solution automatically.

After the course, it is recommended to read the paper Architecture Of a Database System. This paper provides an overview of the overall architecture of database systems so that you can have a more comprehensive view of the database.

Advanced courses

CMU15-721 is a graduate-level course on advanced database system topics. It mainly focuses on the in-memory database, and each class has a corresponding paper to read. It is suitable for those who wish to do research in the field of databases. @ysj1173886760 is currently following up on this course and will create a pull request here after completing it to provide advanced guidance.


Last update: October 31, 2022
Back to top
\ No newline at end of file diff --git a/en/数据库系统/CS122/index.html b/en/数据库系统/CS122/index.html index 327dc4ec..d7ab87b6 100644 --- a/en/数据库系统/CS122/index.html +++ b/en/数据库系统/CS122/index.html @@ -1,2 +1,16 @@ Caltech CS122: Database System Implementation - CSDIY.wiki
Skip to content

Caltech CS 122: Database System Implementation

课程简介

  • 所属大学:Caltech
  • 先修要求:无
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

加州理工的这门课,不同于没有提供 SQL 层功能的 CMU15-445 课程。CS122 课程 Lab 的侧重点在于 SQL 层的相关实现,涉及查询优化器的各个模块,比如SQL的解析,Translate,如何实现 Join,统计信息以及代价估计,子查询实现,Agg,Group By 的实现等。除此之外,还有 B+树,WAL 相关实验。本门课程适合在学完 CMU15-445 课程之后,对查询优化相关内容有兴趣的同学。

下面介绍一下这门课的前 3 个 Assignment 也就是实验 Lab 所要实现的功能:

Assignment1

  • 为 NanoDB 提供 delete,update 语句的支持。
  • 为 Buffer Pool Manager 添加合适的 pin/unpin 代码。
  • 提升 insert 语句的性能, 同时不使数据库文件大小过分膨胀。

Assignment2

  • 实现一个简单的计划生成器,将各种已经 Parser 过的 SQL 语句转化为可执行的执行计划。
  • 使用 nested-loop join 算法,实现支持 inner- and outer-join 的 Join 计划节点。
  • 添加一些单元测试, 保证 inner- and outer-join 功能实现正确。

Assignment3

  • 完成收集表的统计信息。
  • 完成各种计划节点的计划成本计算。
  • 计算可出现在执行计划中的各种谓词的选择性。
  • 根据谓词更新计划节点输出的元组统计信息。

剩余 Assignment 和 Challenges 可以查看课程介绍,推荐使用 IDEA 打开工程,Maven 构建,注意日志相关配置。

课程资源


Last update: September 6, 2022
Back to top
\ No newline at end of file diff --git a/en/数据库系统/CS186/index.html b/en/数据库系统/CS186/index.html index 581ca081..5c7d6f2e 100644 --- a/en/数据库系统/CS186/index.html +++ b/en/数据库系统/CS186/index.html @@ -1,2 +1,16 @@ UCB CS186: Introduction to Database System - CSDIY.wiki
Skip to content

UCB CS186: Introduction to Database System

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, CS61B, CS61C
  • Programming Languages: Java
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

How to write SQL queries? How are SQL commands disassembled, optimized, and transformed into on-disk query commands step by step? How to implement a high-concurrency database? How to implement database failure recovery? What is NoSQL? This course elaborates on the internal details of relational databases. Besides the theoretical knowledge, you will use Java to implement a real relational database that supports SQL concurrent query, B+ tree index, and failure recovery.

From a practical point of view, you will have the opportunity to write SQL queries and NoSQL queries in course projects, which is very helpful for building full-stack projects.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS186 - GitHub.


Last update: October 2, 2022
Back to top
\ No newline at end of file diff --git a/en/数据库系统/CS346/index.html b/en/数据库系统/CS346/index.html index fc9d9ca3..28162f90 100644 --- a/en/数据库系统/CS346/index.html +++ b/en/数据库系统/CS346/index.html @@ -1,2 +1,16 @@ Stanford CS346: Database System Implementation - CSDIY.wiki
Skip to content

Stanford CS 346: Database System Implementation

课程简介

  • 所属大学:Stanford
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

RedBase 是 cs346 的一个项目,实现了一个简易的数据库系统,项目是高度结构化的。整个项目能够被分为以下几个部分(同时也是 4 个 lab 需要进行完善): 1. The record management component:记录管理组件。 2. The index component:B+ 索引管理。 3. The System Management Component:ddl语句、命令行工具、数据加载命令、元数据管理。 4. The Query Language Component:在这个部分需要实现 RQL Redbase 查询语言。RQL 要实现 select、insert、delete、update 语句。 5. Extension Component:除了上述数据库系统的基本功能组件,还需要实现一个扩展组件,可以是Blob类型、 网络模块、连接算法、CBO优化器、OLAP、事务等。

RedBase 适合在学完 CMU-15445 后继续学习数据库系统中的其他组件,因为其代码量不多,可以方便的根据需要扩展代码。同时代码完全由 C++ 编写,也可以用于练习 C++ 编程技巧。

课程资源


Last update: October 28, 2022
Back to top
\ No newline at end of file diff --git a/en/数据科学/Data100/index.html b/en/数据科学/Data100/index.html index 08a712c1..6605624b 100644 --- a/en/数据科学/Data100/index.html +++ b/en/数据科学/Data100/index.html @@ -1,2 +1,16 @@ UCB Data100: Principles and Techniques of Data Science - CSDIY.wiki
Skip to content

UCB Data100: Principles and Techniques of Data Science

Description

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, Linear Algebra
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟
  • Class Hour: 80 hours

This is Berkeley's introductory course in data science, covering the basics of data cleaning, feature extraction, data visualization, machine learning and inference, as well as common data science tools such as Pandas, Numpy, and Matplotlib. The course is also rich in interesting programming assignments, which is one of the highlights of the course.

Resources


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/数据结构与算法/Algo/index.html b/en/数据结构与算法/Algo/index.html index f0227264..1e5779d0 100644 --- a/en/数据结构与算法/Algo/index.html +++ b/en/数据结构与算法/Algo/index.html @@ -1,2 +1,16 @@ Coursera: Algorithms I & II - CSDIY.wiki
Skip to content

Coursera: Algorithms I & II

Descriptions

  • Offered by: Princeton
  • Prerequisites: CS61A
  • Programming Languages: Java
  • Difficulty: 🌟🌟🌟
  • Class Hour: 60 hours

This is the highest rated algorithms course on Coursera, and Robert Sedgewick has the magic to make even the most complex algorithms incredibly easy to understand. To be honest, the KMP and network flow algorithms that I have been struggling with for years were made clear to me in this course, and I can even write derivations and proofs for both of them two years later.

Do you feel that you forget the algorithms quickly after learning them? I think the key to fully grasping an algorithm lies in understanding the three points as follows:

  • Why should do this? (Correctness derivation, or the essence of the entire algorithm.)
  • How to implement it? (Talk is cheap. Show me the code.)
  • How to use it to solve practical problems? (Bridge the gap between theory and real life.)

The composition of this course covers the three points above very well. Watching the course videos and reading the professor's textbook will help you understand the essence of the algorithm and allow you to tell others why the algorithm should look like this in very simple and vivid terms.

After understanding the algorithms, you can read the professor's code implementation of all the data structures and algorithms taught in the course. Note that these codes are not demos, but production-ready, time-efficient implementations. They have extensive annotations and comments, and the modularization is also quite good. I learned a lot by just reading the codes.

Finally, the most exciting part of the course is the 10 high-quality projects, all with real-world backgrounds, rich test cases, and an automated scoring system (code style is also a part of the scoring). You'll get a taste of algorithms in real life.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/Princeton-Algorithm - GitHub.


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/数据结构与算法/CS170/index.html b/en/数据结构与算法/CS170/index.html index e90dcc40..44c7cfe3 100644 --- a/en/数据结构与算法/CS170/index.html +++ b/en/数据结构与算法/CS170/index.html @@ -1,2 +1,16 @@ UCB CS170: Efficient Algorithms and Intractable Problems - CSDIY.wiki
Skip to content

CS170: Efficient Algorithms and Intractable Problems

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61B, CS70
  • Programming Languages: LaTeX
  • Difficulty: 🌟🌟🌟
  • Class Hour: 60 hours

This is Berkeley's algorithm design and analysis course. It focuses on the theoretical foundations and complexity analysis of algorithms, covering Divide-and-Conquer, Graph Algorithms, Shortest Paths, Spanning Trees, Greedy Algorithms, Dynamic programming, Union Finds, Linear Programming, Network Flows, NP-Completeness, Randomized Algorithms, Hashing, etc.

The textbook for this course is well written and very suitable as a reference book. In addition, this class has written assignments and is recommended to use LaTeX. You can take this opportunity to practice your LaTeX skills.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/UCB-CS170 - GitHub


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/数据结构与算法/CS61B/index.html b/en/数据结构与算法/CS61B/index.html index ca9481bf..633eac26 100644 --- a/en/数据结构与算法/CS61B/index.html +++ b/en/数据结构与算法/CS61B/index.html @@ -1,2 +1,16 @@ UCB CS61B: Data Structures and Algorithms - CSDIY.wiki
Skip to content

CS61B: Data Structures and Algorithms

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A
  • Programming Languages: Java
  • Difficulty: 🌟🌟🌟
  • Class Hour: 60 hours

It is the second course of UC Berkeley's CS61 series. It mainly focuses on the design of data structures and algorithms as well as giving students the opportunity to be exposed to thousands of lines of engineering code and gain a preliminary understanding of software engineering through Java.

I took the version for 2018 Spring. Josh Hug, the instructor, generously made the autograder open-source. You can use gradescope invitation code published on the website for free and easily test your implementation.

All programming assignments in this course are done in Java. Students without Java experience don't have to worry. There will be detailed tutorials in the course from the configuration of IDEA to the core syntax and features of Java.

The quality of homework in this class is also unparalleled. The 14 labs will allow you to implement most of the data structures mentioned in the class by yourself, and the 10 homework will allow you to use data structures and algorithms to solve practical problems. In addition, there are 3 projects that give you the opportunity to be exposed to thousands of lines of engineering code and enhance your Java skills in practice.

Resources

Course Resources

  • Course Website: https://sp18.datastructur.es/
  • Recordings: refer to the course website
  • Textbook: None
  • Assignments: Slightly different every year. In the spring semester of 2018, there are 14 Labs, 10 Homework and 3 Projects. Please refer to the course website for specific requirements.

Personal resources

All resources and homework implementations used by @PKUFlyingPig in this course are summarized in PKUFlyingPig/CS61B - GitHub.


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习/CS189/index.html b/en/机器学习/CS189/index.html index 31e20a3f..1a9466f2 100644 --- a/en/机器学习/CS189/index.html +++ b/en/机器学习/CS189/index.html @@ -1,2 +1,16 @@ UCB CS189: Introduction to Machine Learning - CSDIY.wiki
Skip to content

CS189: Introduction to Machine Learning

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS188, CS70
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 Hours

I did not take this course but used its lecture notes as reference books. From the course website, I think it is better than CS299 because all the assignments and autograder are open source. Also, this course is quite theoretical and in-depth.

Course Resources


Last update: October 18, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习/CS229/index.html b/en/机器学习/CS229/index.html index ebd09415..6700f5f5 100644 --- a/en/机器学习/CS229/index.html +++ b/en/机器学习/CS229/index.html @@ -1,2 +1,16 @@ Stanford CS229: Machine Learning - CSDIY.wiki
Skip to content

CS229: Machine Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:高数,概率论,Python,需要较深厚的数学功底
  • 编程语言:无
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

同样是吴恩达讲授,但是这是一门研究生课程,所以更偏重数学理论,不满足于调包而想深入理解算法本质,或者有志于从事机器学习理论研究的同学可以学习这门课程。课程网站上提供了所有的课程 notes,写得非常专业且理论,需要一定的数学功底。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS229 - GitHub 中。


Last update: September 6, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习/ML/index.html b/en/机器学习/ML/index.html index cad8d11c..949ff402 100644 --- a/en/机器学习/ML/index.html +++ b/en/机器学习/ML/index.html @@ -1,2 +1,16 @@ Coursera: Machine Learning - CSDIY.wiki
Skip to content

Coursera: Machine Learning

Descriptions

  • Offered by: Stanford
  • Prerequisites: entry level of AI and proficient in Python
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟
  • Class Hour: 100 hours

When it comes to Andrew Ng, no one in the AI community should be unaware of him. He is one of the founders of the famous online education platform Coursera, and also a famous professor at Stanford. This introductory machine learning course must be one of his famous works (the other is his deep learning course), and has hundreds of thousands of learners on Coursera (note that these are people who paid for the certificate, which costs several hundred dollars), and the number of nonpaying learners should be far more than that.

The class is extremely friendly to novices, and Andrew has the ability to make machine learning as straightforward as 1+1=2. You'll learn about linear regression, logistic regression, support vector machines, unsupervised learning, dimensionality reduction, anomaly detection, and recommender systems, etc. and solidify your understanding with hands-on programming. The quality of the assignments needs no word to say. With detailed code frameworks and practical background, you can use what you've learned to solve real problems.

Of course, as a public mooc, the difficulty of this course has been deliberately lowered, and many mathematical derivations are skimmed over. If you are interested in machine learning theory and want to investigate the mathematical theory behind these algorithms, you can refer to CS229 and CS189.

Course Resources

Personal Resources

My implementation is lost in system reinstallation. However, the course is so famous that you can easily find related resources online. Also, course material is available on Coursera.


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习系统/CMU10-414/index.html b/en/机器学习系统/CMU10-414/index.html index 2d1cb061..a7c93917 100644 --- a/en/机器学习系统/CMU10-414/index.html +++ b/en/机器学习系统/CMU10-414/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这是 CMU 2022年秋季学期开设的一门新课,聚焦于深度学习框架的具体实现,课程 Project 会实现一个迷你的类似于 Pytorch 深度学习框架。课程免费提供了面向非 CMU 学生的在线版本,9月13日正式授课,作者持续跟进中。

课程资源

资源汇总

TBA


Last update: September 7, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习系统/MLC/index.html b/en/机器学习系统/MLC/index.html index 779a830d..da79feb4 100644 --- a/en/机器学习系统/MLC/index.html +++ b/en/机器学习系统/MLC/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这门课是机器学习编译领域的顶尖学者陈天奇在2022年暑期开设的一门在线课程。其实机器学习编译无论在工业界还是学术界仍然是一个非常前沿且快速更迭的领域,国内外此前还没有为这个方向专门开设的相关课程。因此如果对机器学习编译感兴趣想有个全貌性的感知的话,可以学习一下这门课。

本课程主要以 Apache TVM 这一主流的机器学习编译框架为例(陈天奇是这个框架的创始人之一),聚焦于如何将开发模式下(如 Tensorflow, Pytorch, Jax)的各类机器学习模型,通过一套普适的抽象和优化算法,变换为拥有更高性能并且适配各类底层硬件的部署模式。课程讲授的知识点都是相对 High-Level 的宏观概念,同时每节课都会有一个配套的 Jupyter Notebook 来通过具体的代码讲解知识点,因此如果从事 TVM 相关的编程开发的话,这门课有丰富且规范的代码示例以供参考。

所有的课程资源全部开源并且有中文和英文两个版本,B站和油管分别有中文和英文的课程录影。

课程资源


Last update: September 5, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习进阶/CMU10-708/index.html b/en/机器学习进阶/CMU10-708/index.html index de10304d..42a69314 100644 --- a/en/机器学习进阶/CMU10-708/index.html +++ b/en/机器学习进阶/CMU10-708/index.html @@ -1,2 +1,16 @@ CMU 10-708: Probabilistic Graphical Models - CSDIY.wiki
Skip to content

CMU 10-708: Probabilistic Graphical Models

课程简介

  • 所属大学:CMU
  • 先修要求:Machine Learning, Deep Learning, Reinforcement Learning
  • 课程难度:🌟🌟🌟🌟🌟
  • 课程网站:https://sailinglab.github.io/pgm-spring-2019/
  • 这个网站包含了所有的资源:slides, nots, video, homework, project

这门课程是 CMU 的图模型基础 + 进阶课,授课老师为 Eric P. Xing,涵盖了图模型基础,与神经网络的结合,在强化学习中的应用,以及非参数方法。相当硬核


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习进阶/CS229M/index.html b/en/机器学习进阶/CS229M/index.html index ddc38629..592125ea 100644 --- a/en/机器学习进阶/CS229M/index.html +++ b/en/机器学习进阶/CS229M/index.html @@ -1,2 +1,16 @@ Stanford STATS214 / CS229M: Machine Learning Theory - CSDIY.wiki
Skip to content

STATS214 / CS229M: Machine Learning Theory

课程简介

经典学习理论 + 最新深度学习理论,非常硬核。授课老师之前是 Percy Liang,现在是 Tengyu Ma


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习进阶/STA4273/index.html b/en/机器学习进阶/STA4273/index.html index 3415c04a..a308ca21 100644 --- a/en/机器学习进阶/STA4273/index.html +++ b/en/机器学习进阶/STA4273/index.html @@ -1,2 +1,16 @@ U Toronto STA 4273 Winter 2021: Minimizing Expectations - CSDIY.wiki
Skip to content

STA 4273 Winter 2021: Minimizing Expectations

课程简介

这是一门较为进阶的 Ph.D. 研究课程,核心内容是 inference 和 control 之间的关系。授课老师为 Chris Maddison (AlphaGo founding member, NeurIPS 14 best paper)


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习进阶/STAT8201/index.html b/en/机器学习进阶/STAT8201/index.html index 329f47b5..d6a8a1d7 100644 --- a/en/机器学习进阶/STAT8201/index.html +++ b/en/机器学习进阶/STAT8201/index.html @@ -1,2 +1,16 @@ Columbia STAT 8201: Deep Generative Models - CSDIY.wiki
Skip to content

Columbia STAT 8201: Deep Generative Models

课程简介

这门课是一门 PhD 讨论班,每周的内容是展示 + 讨论论文,授课老师是 John Cunningham。Deep Generative Models (深度生成模型) 是图模型与神经网络的结合,也是现代机器学习最重要的方向之一


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/机器学习进阶/roadmap/index.html b/en/机器学习进阶/roadmap/index.html index 6768ae32..11e46015 100644 --- a/en/机器学习进阶/roadmap/index.html +++ b/en/机器学习进阶/roadmap/index.html @@ -1,2 +1,16 @@ 进阶路线图 - CSDIY.wiki
Skip to content

机器学习进阶

此路线图适用于已经学过了基础机器学习 (ML, NLP, CV, RL) 的同学 (高年级本科生或低年级研究生),已经发表过至少一篇顶会论文 (NeurIPS, ICML, ICLR, ACL, EMNLP, NAACL, CVPR, ICCV) 想要走机器学习科研路线的选手。

此路线的目标是为读懂与发表机器学习顶会论文打下理论基础,特别是 Probabilistic Methods 这个 track 下的文章

机器学习进阶可能存在多种不同的学习路线,此路线只能代表作者 Yao Fu 所理解的最佳路径,侧重于贝叶斯学派下的概率建模方法,也会涉及到各项相关学科的交叉知识。

必读教材

  • PRML: Pattern Recognition and Machine Learning. Christopher Bishop
  • 经典贝叶斯学派教材
  • AoS: All of Statistics. Larry Wasserman
  • 经典频率学派教材

所以这两本书刚好相辅相成

字典

  • MLAPP: Machine Learning: A Probabilistic Perspective. Kevin Murphy
  • Convex Optimization. Stephen Boyd and Lieven Vandenberghe

进阶书籍

  • W&J: Graphical Models, Exponential Families, and Variational Inference. Martin Wainwright and Michael Jordan
  • Theory of Point Estimation. E. L. Lehmann and George Casella

如何阅读

Guidelines

  • 必读教材就是一定要读的教材
  • 字典的意思是,一般情况下不管它,但当遇到了不懂的概念的时候,就去字典里面查(而不是维基百科)
  • 进阶书籍先不读,先读完必读书籍。必读书籍一般都是要前前后后反复看过 N 遍才算读完
  • 读的过程中,最重要的读法就是对比阅读 (contrastive-comparative reading):同时打开两本书讲同一主题的章节,然后对比相同点和不同点和联系
  • 读的过程中,尽量去回想之前读过的论文,比较论文和教材的相同点与不同点

基础路径

  • 先读 AoS 第六章: Models, Statistical Inference and Learning,这一部分是最基础的科普
  • 然后读 PRML 第 10, 11 章
  • 第 10 章的内容是 Variational Inference, 第 11 章的内容是 MCMC, 这两种方法是贝叶斯推断的两条最主要路线
  • 如果在读 PRML 的过程中发现有任何不懂的名词,就去翻前面的章节。很大概率能够在第 3,4 章找到相对应的定义;如果找不到或者不够详细,就去查 MLAPP
  • AoS 第 8 章 (Parametric Inference) 和第 11 章 (Bayesian Inference) 也可以作为参考。最好的方法是多本书对比阅读,流程如下
    • 假设我在读 PRML 第 10 章的时候发现了一个不懂的词:posterior inference
    • 于是我往前翻,翻到了第 3 章 (Linear Model for Regression),看到了最简单的 posterior
    • 然后我接着翻 AoS,翻到了第 11 章,也有对 posterior 的描述
    • 然后我对比 PRML 第 10 章,第 3 章,AoS 第 11 章,三处不同地方对 posterior 的解读,比较其相同点和不同点和联系
  • 读完 PRML 第 10 和 11 章之后,接着读 AoS 第 24 章 (Simulation Methods),然后把它和 PRML 第 11 章对比阅读 -- 这俩都是讲 MCMC
  • 如果到此处发现还有基础概念读不懂,就回到 PRML 第 3 章,把它和 AoS 第 11 章对比阅读
  • Again,对比阅读非常重要,一定要把不同本书的类似内容同时摆在面前相互对比,这样可以显著增强记忆
  • 然后读 PRML 第 13 章(跳过第 12 章),这一章可以和 MLAPP 的第 17, 18 章对比阅读
  • MLAPP 第 17 章是 PRML 第 13.2 章的详细版,主要讲 HMM
  • MLAPP 第 18 章是 PRML 第 13.3 章的详细版,主要讲 LDS
  • 读完 PRML 第 13 章之后,再去读 PRML 第 8 章 (Graphical Models) -- 此时这部分应该会读得很轻松
  • 以上的内容可以进一步对照 CMU 10-708 PGM 课程材料

到目前为止,应该能够掌握

  • 概率模型的基础定义
  • 精准推断 - Sum-Product
  • 近似推断 - MCMC
  • 近似推断 - VI

然后就可以去做更进阶的内容


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/CS224n/index.html b/en/深度学习/CS224n/index.html index f742194a..4e1ac3c3 100644 --- a/en/深度学习/CS224n/index.html +++ b/en/深度学习/CS224n/index.html @@ -1,2 +1,16 @@ Stanford CS224n: Natural Language Processing - CSDIY.wiki
Skip to content

CS224n: Natural Language Processing

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 NLP 入门课程,由自然语言处理领域的巨佬 Chris Manning 领衔教授(word2vec 算法的开创者)。内容覆盖了词向量、RNN、LSTM、Seq2Seq 模型、机器翻译、注意力机制、Transformer 等等 NLP 领域的核心知识点。

5 个编程作业难度循序渐进,分别是词向量、word2vec 算法、Dependency parsing、机器翻译以及 Transformer 的 fine-tune。

最终的大作业是在 Stanford 著名的 SQuAD 数据集上训练 QA 模型,有学生的大作业甚至直接发表了顶会论文。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS224n - GitHub 中。


Last update: September 6, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/CS224w/index.html b/en/深度学习/CS224w/index.html index e478e193..050a7e1c 100644 --- a/en/深度学习/CS224w/index.html +++ b/en/深度学习/CS224w/index.html @@ -1,2 +1,16 @@ Stanford CS224w: Machine Learning with Graphs - CSDIY.wiki
Skip to content

CS224w: Machine Learning with Graphs

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python, LaTeX
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的图神经网络入门课,这门课我没有上过,但众多做 GNN 的朋友都向我力荐过这门课,想必 Stanford 的课质量还是一如既往地有保证的。另外就是这门课的授课老师非常年轻帅气:)

课程资源


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/CS230/index.html b/en/深度学习/CS230/index.html index 41c30f0a..670c246b 100644 --- a/en/深度学习/CS230/index.html +++ b/en/深度学习/CS230/index.html @@ -1,2 +1,16 @@ Coursera: Deep Learning - CSDIY.wiki
Skip to content

Coursera: Deep Learning

Descriptions

  • Offered by: Stanford
  • Prerequisites: fundamental machine learning + Python
  • Programming Language: Python
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 80 hours

Yet another popular online course offered by Andrew Ng on Coursera. It has attracted many learners and can be seen as the Bible of fundamental deep learning. The course provides well-covered projects, with clear but thorough instructions. The course starts from basic neural networks, to CNN, RNN, and all the way to Transformer, which has been a hot topic these days. After learning this course, you'll be equipped with the basic knowledge and skills for deep learning, and you may want to participate in Kaggle competitions to practice your skills with real tasks.

Couse Resources


Last update: October 25, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/CS231/index.html b/en/深度学习/CS231/index.html index 4b8c076f..f454481a 100644 --- a/en/深度学习/CS231/index.html +++ b/en/深度学习/CS231/index.html @@ -1,2 +1,16 @@ Stanford CS231n: CNN for Visual Recognition - CSDIY.wiki
Skip to content

CS231n: CNN for Visual Recognition

课程简介

  • 所属大学:Stanford
  • 先修要求:机器学习基础
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 CV 入门课,由计算机领域的巨佬李飞飞院士领衔教授(CV 领域划时代的著名数据集 ImageNet 的研究团队),但其内容相对基础且友好,如果上过 CS230 的话可以直接上手 Project 作为练习。

课程资源


Last update: April 3, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/CS285/index.html b/en/深度学习/CS285/index.html index 8b2d9fe2..37fab2ea 100644 --- a/en/深度学习/CS285/index.html +++ b/en/深度学习/CS285/index.html @@ -1,2 +1,16 @@ UCB CS285: Deep Reinforcement Learning - CSDIY.wiki
Skip to content

CS285: Deep Reinforcement Learning

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS188, CS189
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

CS285 这一课程现由 Sergey Levine 教授讲授,课程内容覆盖了深度强化学习领域的各方面内容,适合有一定机器学习基础的同学进行学习,具体要求包括了解马尔可夫决策过程(MDP)等。整门课程中含有较多的公式,上课前需要有一定的心理准备。此外,教授会根据每年最新的研究进展更新课程内容以及作业,课程中能感受到教授尝试将深度强化学习领域的所有基础知识以及最近的发展在短短的数节课中进行传达。

有关课程内容获取,22Fall 的授课方式为课前观看提前录制的视频,课上主要为 Q&A 环节,教授选择部分或者所有视频内的知识进行讲解同时回答学生现场提出的问题,因此所提供的课程视频链接实际上是已经包含了所有内容。课程作业则由5个编程作业组成,每一次作业主要为复现经典模型以及进行模型间的对比,偶尔也包含一些对最近提出的模型的复现,最后递交一份报告。考虑到作业本身已经提供了框架,且都是根据 hint 进行代码填空,因此作业难度并不大。

总的来说,该课程适合新手入门深度强化学习。虽然学到后面越来越感觉到难,但整门课下来个人感觉还是收获颇丰。

(另外 Levine 教授人真的很 nice)

课程资源


Last update: November 11, 2022
Back to top
\ No newline at end of file diff --git a/en/深度学习/LHY/index.html b/en/深度学习/LHY/index.html index 5e712e0c..0b9fe738 100644 --- a/en/深度学习/LHY/index.html +++ b/en/深度学习/LHY/index.html @@ -1,2 +1,16 @@ 国立台湾大学:李宏毅机器学习 - CSDIY.wiki
Skip to content

国立台湾大学:李宏毅机器学习

课程简介

  • 所属大学:國立台灣大學
  • 先修要求:熟练掌握 Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

李宏毅老师是国立台湾大学的教授,其风趣幽默的授课风格深受大家喜爱,并且尤其喜欢在 PPT 中插入宝可梦等动漫元素,是个非常可爱的老师。

这门课挂着机器学习的牌子,但其课程内容之广实在令人咋舌,其作业一共包含 15 个 lab,分别是 Regression、Classification、CNN、Self-Attention、Transformer、GAN、BERT、Anomaly Detection、Explainable AI、Attack、Adaptation、 RL、Compression、Life-Long Learning 以及 Meta Learning。可谓是包罗万象,能让学生对于深度学习的绝大多数领域都有一定了解,从而可以进一步选择想要深入的方向进行学习。

大家也大可不必担心作业的难度,因为所有作业都会提供助教的示例代码,帮你完成数据处理、模型搭建等,你只需要在其基础上进行适量的修改即可。这也是一个学习别人优质代码的极好机会,大家需要水课程大作业的话,这里也是一个不错的资料来源。

课程资源


Last update: October 13, 2022
Back to top
\ No newline at end of file diff --git a/en/电子基础/EE16/index.html b/en/电子基础/EE16/index.html index 283863e2..93944cd8 100644 --- a/en/电子基础/EE16/index.html +++ b/en/电子基础/EE16/index.html @@ -1,2 +1,16 @@ EE16A&B: Designing Information Devices and Systems I&II - CSDIY.wiki
Skip to content

UCB EE16A&B: Designing Information Devices and Systems I&II

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: None
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟
  • Class Hour: 150 hours

This introductory class for freshmen majoring in electronics at UC Berkeley teaches the fundamentals of circuitry. Through a variety of hands-on labs, students will experience collecting information from the environment through sensors and analyzing it to make predictions. Due to the COVID-19, all labs have remote online version, making them ideal for self-study.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/EE16A - GitHub.


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/电子基础/Signals_and_Systems_AVO/index.html b/en/电子基础/Signals_and_Systems_AVO/index.html index 3ba2e13d..02057945 100644 --- a/en/电子基础/Signals_and_Systems_AVO/index.html +++ b/en/电子基础/Signals_and_Systems_AVO/index.html @@ -1,2 +1,16 @@ MIT 6.007 Signals and Systems - CSDIY.wiki
Skip to content

MIT 6.007 Signals and Systems

Descriptions

  • Offered by: MIT
  • Prerequisites: Calculus, Linear Algebra
  • Programming Languages: Matlab Preferred
  • Difficulty: 🌟🌟
  • Class Hour: 50-70 hours

The name of the instructor: Prof. Alan V. Oppenheim

Okay, enough reason to take this class.

Course Resources


Last update: September 27, 2022
Back to top
\ No newline at end of file diff --git a/en/电子基础/signal/index.html b/en/电子基础/signal/index.html index 3e8c0c5f..b2cb6100 100644 --- a/en/电子基础/signal/index.html +++ b/en/电子基础/signal/index.html @@ -1,2 +1,16 @@ UCB EE120 : Signal and Systems - CSDIY.wiki
Skip to content

UCB EE120: Signal and Systems

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, CS70, Calculus, Linear Algebra
  • Programming Languages: Python
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 100 hours

The highlight of this course is the six exciting labs that will allow you to use signals and systems theory to solve practical problems in Python. For example, in lab3 you will implement the FFT algorithm and compare the performance with Numpy's official implementation. In lab4 you will infer the heart rate by processing the video of fingers. Lab5 is the most awesome one where you will reduce the noise in the photos taken by the Hubble telescope to recover the brilliant and bright starry sky. In lab6 you will build a feedback system to stabilize the pole on the cart.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/UCB-EE120 - GitHub


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/程序语言设计/CS242/index.html b/en/程序语言设计/CS242/index.html index 64e72698..a51798e5 100644 --- a/en/程序语言设计/CS242/index.html +++ b/en/程序语言设计/CS242/index.html @@ -1,2 +1,16 @@ CS242 - CSDIY.wiki

CS242


Last update: December 9, 2021
Back to top
\ No newline at end of file diff --git a/en/系统安全/CS161/index.html b/en/系统安全/CS161/index.html index 8e82ffe8..bcb6c112 100644 --- a/en/系统安全/CS161/index.html +++ b/en/系统安全/CS161/index.html @@ -1,2 +1,16 @@ UCB CS161: Computer Security - CSDIY.wiki
Skip to content

UCB CS161: Computer Security

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: CS61A, CS61B, CS61C
  • Programming Languages: C, Go
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 150 Hours

Computer Security course from UC Berkeley, devided into 5 parts:

  • Security principles: how to design a secure system
  • Memory safety: buffer overflow attack
  • Cryptography: symmetric encryption, asymmetric encryption, MAC, digital signature .........
  • Web: SQL-injection, XSS, XSRF .......
  • Networking: attacks for each layer

The most impressive part to me is Project2, which requires you to design and implement a secure file sharing system in Go. It took me three full days to complete this extremely difficult project, with over 3 thousand lines of code. Such an intensive development experience can greatly enhance your ability to design and implement a secure system.

In 2020 summer semester, the lecture recordings are posted publicly, which can be found in the links below.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/UCB-CS161 - GitHub.


Last update: October 14, 2022
Back to top
\ No newline at end of file diff --git a/en/系统安全/MIT6.858/index.html b/en/系统安全/MIT6.858/index.html index d942d831..3d95df90 100644 --- a/en/系统安全/MIT6.858/index.html +++ b/en/系统安全/MIT6.858/index.html @@ -1,2 +1,16 @@ MIT 6.858: Computer System Security - CSDIY.wiki
Skip to content

MIT 6.858: Computer System Security

Descriptions

  • Offered by: MIT
  • Prerequisites: Computer Architecture, basic knowledge about programming and computer system
  • Programming Languages: C, Python
  • Difficulty:🌟🌟🌟🌟🌟
  • Class Hour: 150 hours

This is MIT's Computer Systems Security course. Lectures cover threat models, attacks that compromise security, and techniques for achieving security, based on recent research papers. Topics include operating system (OS) security, capabilities, information flow control, language security, network protocols, hardware security, and security in web applications.

Assignments include labs that involve implementing and compromising a secure web server and web application, and a group final project:

  • Lab 1: you will explore the zoobar web application, and use buffer overflow attacks to break its security properties.
  • Lab 2: you will improve the zoobar web application by using privilege separation, so that if one component is compromised, the adversary doesn't get control over the whole web application.
  • Lab 3: you will build a program analysis tool based on symbolic execution to find bugs in Python code such as the zoobar web application.
  • Lab 4: you will improve the zoobar application against browser attacks.

I mainly did Lab 3 in this course. Lab 3 requires you to traverse all the branches of a program by concolic execution, and it is not difficult to do once you understand the idea of symbolic execution. This Lab visually demonstrates the use of symbolic execution.

In the Final Project, you will build a remote file system, SecFS, that provides both confidentiality and integrity in the face of a completely untrusted server. Reference Papers: SUNDR

Resources


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/AUT1400/index.html b/en/编程入门/AUT1400/index.html index 5488e6a5..b1716ef2 100644 --- a/en/编程入门/AUT1400/index.html +++ b/en/编程入门/AUT1400/index.html @@ -1,2 +1,16 @@ AmirKabir University of Technology AP1400-2: Advanced Programming - CSDIY.wiki
Skip to content

Amirkabir University of Technology 1400-2: Advanced Programming Course

课程简介

  • 所属大学:Amirkabir University of Technology
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:50 小时

无意中发现的一个 C++ 课程。课程的 homework 质量很高,每个 homework 相互独立结构简单,且有完善的单元测试,非常适合用来学习 C++ 的编程。本课程共 7 个 homework,如下所示:

  1. 实现一个 Matrix 类以及相关函数。

  2. 实现一个模拟加密货币客户端/服务端执行过程的程序。

  3. 实现一个 Binary Search Tree (BST)。

  4. 实现 C++ 中的 SharedPtr 和 UniquePtr 智能指针。

  5. 使用继承和多态实现多个类。

  6. 使用 STL 库解决 4 个问题。

  7. 是个 python 项目,有兴趣的可以看看。

没找到课程的主页,只有在 github 有 homework 的源码(名字为 AP1400-2-HW 的那几个)。

课程资源


Last update: November 4, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/CS106B_CS106X/index.html b/en/编程入门/CS106B_CS106X/index.html index 570bf0d4..1a60c366 100644 --- a/en/编程入门/CS106B_CS106X/index.html +++ b/en/编程入门/CS106B_CS106X/index.html @@ -1,2 +1,16 @@ Stanford CS106B/X - CSDIY.wiki
Skip to content

Stanford CS106B/X: Programming Abstractions in C++

Descriptions

  • Offered by: Stanford
  • Prerequisites: CS50/CS106A/CS61A or equivalent
  • Programming Languages: C++
  • Difficulty: 🌟🌟
  • Class Hour: 50-70 hours

CS106B/X are advanced programming courses at Stanford. CS106X is more difficult and in-depth than CS106B, but the main content is similar. Based on programming assignments in C++ language, students will develop the ability to solve real-world problems through programming abstraction. It also covers some simple data structures and algorithms, but is generally not as systematic as a specialized data structures course.

Resources


Last update: September 21, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/CS106L/index.html b/en/编程入门/CS106L/index.html index 526ba77e..ebfc7915 100644 --- a/en/编程入门/CS106L/index.html +++ b/en/编程入门/CS106L/index.html @@ -1,2 +1,16 @@ Stanford CS106L: Standard C++ Programming - CSDIY.wiki
Skip to content

CS106L: Stanford C++ Programming

Descriptions

  • Offered by: Stanford
  • Prerequisites: better if you are already proficient in a programming language
  • Programming Languages: C++
  • Difficulty: 🌟🌟🌟
  • Class Hour: 20 hours

I've been writing C++ code since freshman year, and it wasn't until I finished this class that I realized the C++ code I was writing was probably just C + cin/cout.

This class will dive into a lot of standard C++ features and syntax that will allow you to write quality C++ code. Techniques such as auto binding, uniform initialization, lambda function, move semantics, RAII, etc. have been used repeatedly in my coding career since then and are very useful.

It is worth mentioning that in this class, you will implement a HashMap (similar to unordered_map in STL), which almost ties the whole course together and is a great test of coding skills. Especially after the implementation of iterator, I started to understand why Linus is so sarcastic about C/C++, because it is really hard to write correctly.

In short, the course is not difficult but very informative which requires you to consolidate repeatedly in later practice. The reason why Stanford offers a single C++ programming class is that many of the subsequent CS courses' projects are based on C++. For example, CS144 Computer Networks and CS143 Compilers. Both of these courses are included in this book.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig are maintained in PKUFlyingPig/CS106L - GitHub.


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/CS110L/index.html b/en/编程入门/CS110L/index.html index f54fac3b..6d677f57 100644 --- a/en/编程入门/CS110L/index.html +++ b/en/编程入门/CS110L/index.html @@ -1,2 +1,16 @@ Stanford CS110L: Safety in Systems Programming - CSDIY.wiki
Skip to content

CS110L: Safety in Systems Programming

Descriptions

  • Offered by: Stanford
  • Prerequisites: basic knowledge about programming and computer system
  • Programming Languages: Rust
  • Difficulty: 🌟🌟🌟
  • Class Hour: 30 hours

In this course, you will learn a fantastic language, Rust.

If you have studied C and have some knowledge of systems programming, you should have heard about memory leaks and the danger of pointers, but C's high efficiency makes it impossible to be replaced by other higher-level languages with garbage collection such as Java in system-level programming. Whereas Rust aims to make up for C's lack of security while having competitive efficiency. Therefore, Rust was designed from a system programmer's point of view. By learning Rust, you will learn the principles to write safer and more elegant system code (e.g., operating systems, etc.).

The latter part of this course focuses on the topic of concurrency, where you will systematically learn multi-processing, multi-threading, event-driven programming, and several other techniques. In the second project, you will compare the pros and cons of each method.

Personally, I find the concept of "futures" in Rust fascinating and elegant, and mastering this idea will help you in your following systems-related courses. In addition, Tsinghua University's operating system lab, rCore is based on Rust. You can see the documentation for more details.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS110L - GitHub

Due to the rapid evolution of Rust, the libraries used in the 2020 version of the course project are obsolete, so @fung-hwang tried to adapt these libraries (in November 2022). His adaptation advice and completed assignments are maintained in fung-hwang/CS110L-2020spr - GitHub. It is possible that Rust and these libraries will have changed again when you start to learn CS110L, but you can still refer to this repo for help.


Last update: December 4, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/CS50/index.html b/en/编程入门/CS50/index.html index f0357895..475822fc 100644 --- a/en/编程入门/CS50/index.html +++ b/en/编程入门/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50: This is CS50x - CSDIY.wiki
Skip to content

CS50: This is CS50x

Descriptions

  • Offered by: Harvard
  • Prerequisites: None
  • Programming Languages: C, Python, SQL, HTML, CSS, JavaScript
  • Difficulty: 🌟🌟
  • Class Hour: 20 hours

This course has been voted the most popular public course by Harvard students for many years. Professor Malan is very passionate in class. I still remember the scene where he tears up the Yellow pages to explain the dichotomy method. Since this is a university-wide public course, the contents are pretty friendly to beginners and even if you already have some programming experience, all the programming assignments are quite exciting and worth a try.

Course Resources


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/CS61A/index.html b/en/编程入门/CS61A/index.html index 9561bd96..924c0235 100644 --- a/en/编程入门/CS61A/index.html +++ b/en/编程入门/CS61A/index.html @@ -1,2 +1,16 @@ UCB CS61A: Structure and Interpretation of Computer Programs - CSDIY.wiki
Skip to content

CS61A: Structure and Interpretation of Computer Programs

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: None
  • Programming Languages: Python, Scheme, SQL
  • Difficulty: 🌟🌟
  • Class Hour: 50 hours

This is the first course in the Berkeley CS61 series, and my introductory course to Python.

The CS61 series is composed of introductory courses to the CS major at Berkeley, where

  • CS61A: Emphasizes abstraction and equips students to use programs to solve real-world problems without focusing on the underlying hardware details.
  • CS61B: Focuses on algorithms and data structures and the construction of large-scale programs, where students combine knowledge of algorithms and data structures with the Java language to build large-scale projects at the thousand-line code level (such as a simple Google Maps, a two-dimensional version of Minecraft).
  • CS61C: Focusing on computer architecture, students will understand how high-level languages (e.g. C) are converted step-by-step into machine-understandable bit strings and executed on CPUs. Students will learn about the RISC-V architecture and implement a CPU on their own by using Logism.

CS61B and CS61C are both included in this guidebook.

Going back to CS61A, you will note that this is not just a programming language class, but goes deeper into the principles of program construction and operation. Finally you will implement an interpreter for Scheme in Python in Project 4. In addition, abstraction will be a major theme in this class, as you will learn about functional programming, data abstraction, object orientation, etc. to make your code more readable and modular. Of course, learning a programming language is also a big part of this course. You will master three programming languages, Python, Scheme, and SQL, and in learning and comparing them, you will be equiped with the ability to quickly master a new programming language.

Note: If you have no prior programming experience at all, getting started with CS61A requires a relatively high level of learning ability and self-discipline. To avoid the frustration of a struggling experience, you may choose a more friendly introductory programming course at first. For example, CS10 at Berkeley or CS50 at Harvard are both good choices.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS61A - GitHub


Last update: September 30, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/Duke-Coursera-Intro-C/index.html b/en/编程入门/Duke-Coursera-Intro-C/index.html index 8ff9b397..00c755dd 100644 --- a/en/编程入门/Duke-Coursera-Intro-C/index.html +++ b/en/编程入门/Duke-Coursera-Intro-C/index.html @@ -1,2 +1,16 @@ Duke University: Introductory C Programming Specialization - CSDIY.wiki
Skip to content

Introductory C Programming Specialization

Descriptions

  • Offered by: Duke
  • Prerequisites: None
  • Programming Languages: C
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 110 hours

This is an excellent course which I benefited a lot from.

  • The course teaches fundamental concepts such as frame, stack memory, heap memory, etc.
  • There are great programming assignments to deepen and reinforce your understanding of the hardest part in C, like pointers.
  • The course provides excellent practice in GDB, Valgrind, and the assignments will cover some basic Git exercises.
  • The course instructor recommends using Emacs for homework, so it's a good opportunity to learn Emacs. If you already know how to use Vim, I suggest you use Evil. This way you don't lose the editing capabilities of Vim, and you get to experience the power of Emacs. Having both Emacs and Vim in your kit will increase your efficiency considerably. Emacs' org-mode, smooth integration of GDB, etc., are convenient for developers.
  • It may require payment, but I think it's worth it.
  • Although this is an introductory course, it has both breadth and depth.

Course Resources

Personal Resources

All the resources and assignments used by in this course are maintained in Duke Coursera Intro C. Several assignments have not been completed so far for time reasons.


Last update: October 3, 2022
Back to top
\ No newline at end of file diff --git a/en/编程入门/MIT-Missing-Semester/index.html b/en/编程入门/MIT-Missing-Semester/index.html index ad5b6675..377fefb7 100644 --- a/en/编程入门/MIT-Missing-Semester/index.html +++ b/en/编程入门/MIT-Missing-Semester/index.html @@ -1,2 +1,16 @@ MIT-Missing-Semester - CSDIY.wiki
Skip to content

MIT: The Missing Semester of Your CS Education

Descriptions

  • Offered by: MIT
  • Prerequisites: None
  • Programming Languages: Shell
  • Difficulty: 🌟🌟
  • Class Hour: 10 hours

Just as the course name indicated, this course will teach the missing things in the university courses. It will cover shell programming, git, vim editor, tmux, ssh, sed, awk and even how to beautify your terminal. Trust me, this will be your first step to become a hacker!

Resources


Last update: September 18, 2022
Back to top
\ No newline at end of file diff --git a/en/编译原理/6035/index.html b/en/编译原理/6035/index.html index 9529f23f..deb9bd75 100644 --- a/en/编译原理/6035/index.html +++ b/en/编译原理/6035/index.html @@ -1,2 +1,16 @@ 6035 - CSDIY.wiki

6035


Last update: December 9, 2021
Back to top
\ No newline at end of file diff --git a/en/编译原理/CS143/index.html b/en/编译原理/CS143/index.html index ad5b356e..12af1728 100644 --- a/en/编译原理/CS143/index.html +++ b/en/编译原理/CS143/index.html @@ -1,2 +1,16 @@ Stanford CS143: Compilers - CSDIY.wiki
Skip to content

Stanford CS143: Compilers

Descriptions

  • Offered by: Stanford University
  • Prerequisite: Computer Architecture
  • Programming Languages: Java or C++
  • Difficulty: 🌟🌟🌟🌟🌟
  • Learning Hours: 150

This course aims to impart the principles of compiler construction for programming languages to students. The instructors have designed a “COOL language”, namely Class-Object-Oriented-Language. By study and practice, you will design and implement a compiler, which can translate the human-readable COOL language into machine-readable MIPS assembly which can be run on the SPIM emulator.

Following the Dragon Book, the theoretical part of the course covers lexical analysis, syntax analysis, semantics analysis, runtime environments, register allocation, optimization, and code generation. The practical part, accordingly, is divided into 4 steps: 3 for the frontend and 1 for the backend. The difficulty is considered gradual, increasing at a proper rate. Should you have enough time and interest even after completing all the required work, there’s a huge room left for you to do optimization.

Course Resources

Collection of Course Resources

@skyzluo has been maintaining a repo of course resources used and reference implementations of programming labs: skyzluo/CS143-Compilers-Stanford - GitHub.


Last update: November 17, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/15462/index.html b/en/计算机图形学/15462/index.html index 06b0431f..7c19069f 100644 --- a/en/计算机图形学/15462/index.html +++ b/en/计算机图形学/15462/index.html @@ -1,2 +1,16 @@ CMU 15-462 - CSDIY.wiki
Skip to content

CMU 15-462 : COMPUTER GRAPHICS

Descriptions

  • Offered by: CMU
  • Prerequisites: Basic vector calculus and linear algebra , basic C/C++ programming skills.
  • Programming Languages: C/C++
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

This course provides a comprehensive introduction to computer graphics. It focuses on fundamental concepts and techniques, and their cross-cutting relationship to multiple problem domains in graphics (rendering, animation, geometry, imaging). Topics include: sampling, aliasing, interpolation, rasterization, geometric transformations, parameterization, visibility, compositing, filtering, convolution, curves & surfaces, geometric data structures, subdivision, meshing, spatial hierarchies, ray tracing, radiometry, reflectance, light fields, geometric optics, Monte Carlo rendering, importance sampling, camera models, high-performance ray tracing, differential equations, time integration, numerical differentiation, physically-based animation, optimization, numerical linear algebra, inverse kinematics, Fourier methods, data fitting, example-based synthesis.

Course Resources


Last update: December 15, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/CS148/index.html b/en/计算机图形学/CS148/index.html index 26478e96..56e8cbf5 100644 --- a/en/计算机图形学/CS148/index.html +++ b/en/计算机图形学/CS148/index.html @@ -1,2 +1,16 @@ Stanford CS148 - CSDIY.wiki
Skip to content

Stanford CS148

课程简介

  • 所属大学:Stanford
  • 先修要求:线性代数,高等数学,Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

官方介绍:

这是一门计算机图形学的入门课程,这门课的一开始使用 Blender 去生成图像,并且理解底层的数学知识,包括三角形、法向量、插值、纹理映射、凹凸贴图等等。之后会介绍光线和颜色以及它们如何影响计算机的显示和打印。同时也会介绍 BRDF 以及一些基本的光照和着色模型。课程的最后,会涉及到光线追踪、反走样、加速结构等内容。

具体课程信息可以查看课程网站

这门课程比起 GAMES101 浅一些,编程语言使用的是 Python,对于不熟悉 C++ 的同学比较友好。

课程资源


Last update: June 6, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/CS184/index.html b/en/计算机图形学/CS184/index.html index afba1499..f26ee366 100644 --- a/en/计算机图形学/CS184/index.html +++ b/en/计算机图形学/CS184/index.html @@ -1,2 +1,16 @@ CS184 - CSDIY.wiki

CS184


Last update: December 9, 2021
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/GAMES101/index.html b/en/计算机图形学/GAMES101/index.html index 3f4cbf4b..924dc327 100644 --- a/en/计算机图形学/GAMES101/index.html +++ b/en/计算机图形学/GAMES101/index.html @@ -1,2 +1,16 @@ GAMES101 - CSDIY.wiki
Skip to content

GAMES101

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++
  • 编程语言:C++
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

官方介绍:

本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。通过本课程,你可以学习到计算机图形学背后的数学和物理知识,并锻炼实际的编程能力。 作为入门,本课程会尽可能的覆盖图形学的方方面面,把每一部分的基本概念都尽可能说清楚,让大家对计算机图形学有一个完整的、自上而下的全局把握。全局的理解很重要,学完本课程后,你会了解到图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法。从本课程的标题,大家还可以看到“现代”二字,也就是说,这门课所要给大家介绍的都是现代化的知识,也都是现代图形学工业界需要的图形学基础。

GAMES101 是国内相当有名的图形学公开课。和大家印象中满是数学和算法的图形学不同,这门课以十分生动的方式带我们进入了图形学这个领域的大门。

每个project代码量都不会很多,但是却都十分有趣。在做这些project的过程中,我们会实现简单的光栅化,并渲染一个简易的模型,我们还会实现光线追踪,以追求渲染更好的质量。每个project中还有选做的拓展作业,可以让我们渲染的模型具有更好的质量,更快的渲染速度。

喜欢玩游戏的同学应该对实时光线追踪有一定的了解,这门课的老师闫令琪就对这一技术有直接的推动作用。

跟着课程的视频,做完每一个project,相信你会和我一样对图形学,以及现代的渲染技术产生浓厚的兴趣。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在ysj1173886760/Learning: graphics/GAMES101 - GitHub 中。


Last update: September 6, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/GAMES103/index.html b/en/计算机图形学/GAMES103/index.html index ad69501b..c469fee2 100644 --- a/en/计算机图形学/GAMES103/index.html +++ b/en/计算机图形学/GAMES103/index.html @@ -1,2 +1,16 @@ GAMES103 - CSDIY.wiki
Skip to content

GAMES103

课程简介

  • 所属大学:Style3D/OSU
  • 先修要求:线性代数,高等数学,大学物理,编程能力,基本图形知识
  • 编程语言:C#
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:50 小时

官方介绍:

本课程将作为基于物理的计算机动画技术入门,着重介绍各种基础的物理动画模拟技术。

该课程主要涵盖四个方向,分别为:1)刚体模拟;2)质点弹簧、约束与布料模拟;3)基于有限元的弹性体模拟;4)流体模拟。

本课程内容将不会涉及具体的物理模拟引擎,但会讨论各种引擎背后的技术,以及它们的优缺点等等。由于开发学习物理模拟需要一定的数学基础,课程初始阶段也会花一定的时间复习必备的数学知识。顺利完成课程之后,同学们应该会对基础的物理模拟技术有深入理解,对高级的模拟技术也会有部分接触。

图形学可粗略分为渲染、模拟、几何三个领域。GAMES101 和 GAMES202 主要以渲染为主,而对于物理模拟,GAMES103 则是很棒的学习资源。

课程资源

资源汇总

@indevn 在学习这门课中用到的所有资源和作业要求都汇总在 GAMES103 Unoffical 中。对于作业的具体实现,在知乎上有很多相关文章进行了细致讲解可以参考。


Last update: September 6, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机图形学/GAMES202/index.html b/en/计算机图形学/GAMES202/index.html index 3279b1c1..8789dcbb 100644 --- a/en/计算机图形学/GAMES202/index.html +++ b/en/计算机图形学/GAMES202/index.html @@ -1,2 +1,16 @@ GAMES202 - CSDIY.wiki
Skip to content

GAMES202

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++,GAMES101
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:60 小时

官方介绍:

本课程将全面地介绍现代实时渲染中的关键问题与解决方法。由于实时渲染 (>30 FPS) 对速度要求极高,因此本课程的关注点将是在苛刻的时间限制下,人们如何打破速度与质量之间的权衡,同时保证实时的高速度与照片级的真实感。

本课程将以专题的形式呈现,课程内容会覆盖学术界与工业界的前沿内容,包括:(1)实时软阴影的渲染;(2)环境光照;(3)基于预计算或无预计算的全局光照;(4)基于物理的着色模型与方法;(5)实时光线追踪;(6)抗锯齿与超采样;以及一些常见的加速方式等等。

除了最新最全的内容之外,本课程与其它任何实时渲染的教程还有一个重要的区别,那就是本课程不会讲授任何与游戏引擎的使用相关的内容,并且不会特别强调具体的着色器实现技术,而主要讲授实时渲染背后的科学与知识。本课程的目标是在你学习完这门课的时候,你将有深厚的功底去开发一个属于你自己的实时渲染引擎。

作为 GAMES101 的进阶课程,难度有一定的提升,但不会很大,相信完成了 GAMES101 的同学都有能力完成这门课程。每个 project 代码量都不会很多,但是都需要一定的思考。

课程资源


Last update: May 11, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机网络/CS144/index.html b/en/计算机网络/CS144/index.html index 5bb884ea..280d0e2d 100644 --- a/en/计算机网络/CS144/index.html +++ b/en/计算机网络/CS144/index.html @@ -1,2 +1,16 @@ Stanford CS144: Computer Network - CSDIY.wiki
Skip to content

CS144: Computer Network

Introduction

  • Offered by: Stanford
  • Prerequisites: Computer System Fundamentals, CS106L
  • Programming Language: C++
  • Difficulty: 🌟🌟🌟🌟🌟
  • Class Hour: 100 hours

One of the lecturers of this course is Professor Nick McKeown, a giant in the field of Networking. At the end of each chapter of MOOC, he will interview an executive in the industry or an expert in the academia, which can certainly broaden your horizons.

In the projects, you will use C++ to build the entire TCP/IP protocol stack, the IP router, and the ARP protocol step by step from scratch. Finally, you will replace Linux Kernel's protocol stack with your own and use socket programming to communicate with your classmates, which is really amazing and exciting.

Resources

Reference


Last update: September 22, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机网络/topdown/index.html b/en/计算机网络/topdown/index.html index 9d63b5b5..d934deaf 100644 --- a/en/计算机网络/topdown/index.html +++ b/en/计算机网络/topdown/index.html @@ -1,2 +1,16 @@ Computer Networking: A Top-Down Approach - CSDIY.wiki
Skip to content

Computer Networking: A Top-Down Approach

Descriptions

  • Offered by: UMass
  • Prerequisites: basic knowledge about computer system
  • Programming Languages: None
  • Difficulty: 🌟🌟🌟
  • Class Hour: 40 hours

Computer Networking: A Top-Down Approach is a classic textbook in the field of computer networking. The two authors, Jim Kurose and Keith Ross, have carefully crafted a course website to support the textbook, with lecture recordings, interactive online questions, and WireShark labs for network packet analysis. The only pity is that this course doesn't have hardcore programming assignments, and Stanford's CS144 makes up for that.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/Computer-Network-A-Top-Down-Approach - GitHub.


Last update: September 25, 2022
Back to top
\ No newline at end of file diff --git a/en/计算机网络/topdown_ustc/index.html b/en/计算机网络/topdown_ustc/index.html index 0cdd2a8b..79a98018 100644 --- a/en/计算机网络/topdown_ustc/index.html +++ b/en/计算机网络/topdown_ustc/index.html @@ -1,2 +1,16 @@ USTC Computer Networking:A Top-Down Approach - CSDIY.wiki
Skip to content

USTC Computer Networking:A Top-Down Approach

Descriptions

  • Offered by: USTC
  • Instructor: Quan Zheng, Jian Yang
  • Prerequisites: operating system (not required)
  • Programming Languages: None
  • Difficulty: 🌟🌟🌟
  • Class Hour: 40 hours

This course is a well-known computer networking course on the Chinese Internet, it adopts the renowned textbook: Computer Networking: A Top-Down Approach, 7th Edition. This a practical course that is not limited to theoretical knowledge, but it is Strongly recommended to read the textbook before watching videos, otherwise you may not catch up with the course easily.

The course covers the majority of the textbook and also includes exam content, so enjoy it.

The recordings of the lectures were uploaded by Prof. Zheng himself on Bilibili. Moreover, he has been answering questions in the comments below the videos since 2020, which is very patient and responsible.

Resources


Last update: October 24, 2022
Back to top
\ No newline at end of file diff --git a/en/软件工程/6031/index.html b/en/软件工程/6031/index.html index 225bed0d..479c4290 100644 --- a/en/软件工程/6031/index.html +++ b/en/软件工程/6031/index.html @@ -1,2 +1,16 @@ MIT 6.031: Software Construction - CSDIY.wiki
Skip to content

MIT 6.031: Software Construction

Descriptions

  • Offered by: MIT
  • Prerequisites: better if you are already proficient in a programming language
  • Programming Languages: Java
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

The goal of this course is for you to learn how to write high quality code, and what is meant by high quality is to meet the following three targets:

Safe from bugs. Correctness (correct behavior right now) and defensiveness (correct behavior in the future) are required in any software we build.

Easy to understand. The code has to communicate to future programmers who need to understand it and make changes in it (fixing bugs or adding new features). That future programmer might be you, months or years from now. You’ll be surprised how much you forget if you don’t write it down, and how much it helps your own future self to have a good design.

Ready for change. Software always changes. Some designs make it easy to make changes; others require throwing away and rewriting a lot of code.

To achieve this, the instructors write a book explaining many of the core principles of software construction and valuable lessons learned from the past. The book covers many practical topics such as how to write comments and specifications, how to design abstract data structures, and many parallel programming caveats. You will explore all of these ideas in the programming assignments.

In the 2016 spring, the course open-sourced all of its programming assignments, and the textbook can be found on the latest website (see links below).

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/ MIT6.031-Software-Engineering - GitHub

@pengzhangzhi completed the assignments and took some notes, maintained at pengzhangzhi/self-taught-CS/Software Construction - Github


Last update: October 16, 2022
Back to top
\ No newline at end of file diff --git a/en/软件工程/CS169/index.html b/en/软件工程/CS169/index.html index c33ad042..3e07d1e3 100644 --- a/en/软件工程/CS169/index.html +++ b/en/软件工程/CS169/index.html @@ -1,2 +1,16 @@ UCB CS169: software engineering - CSDIY.wiki
Skip to content

UCB CS169: software engineering

Descriptions

  • Offered by: UC Berkeley
  • Prerequisites: None
  • Programming Languages: Ruby/JavaScript
  • Difficulty: 🌟🌟🌟🌟
  • Class Hour: 100 hours

This is Berkeley's software engineering course. Unlike many traditional software engineering courses that emphasize UML diagrams, plans, and documents, this course adopts agile development methodologies and uses the cloud platform to provide software as a service. The instructors wrote a textbook Software as a service to explain the concept of SaaS and agile development. Also, there are plenty of programming assignments using Ruby + Rails framework.

This course is available on Edx, an online education platform sponsored by MIT and Harvard, where you can search for the course Agile SaaS Development and learn it yourself. The course content follows the textbook's order and takes you to build software step by step in an agile development way and deploy it on the cloud platform for free.

Course Resources

Personal Resources

All the resources and assignments used by @PKUFlyingPig in this course are maintained in PKUFlyingPig/CS169-Software-Engineering - GitHub


Last update: October 8, 2022
Back to top
\ No newline at end of file diff --git a/index.html b/index.html index 715d7db6..9d259945 100644 --- a/index.html +++ b/index.html @@ -1,2 +1,16 @@ CS自学指南
跳转至

Image title

前言

最近更新:英文版正在建设中,增加陈天奇机器学习编译,增加 CMU 机器学习系统, 增加 学习工作流

这是一本计算机的自学指南,也是对自己大学三年自学生涯的一个纪念。

这同时也是一份献给北大信科学弟学妹们的礼物。如果这本书能对你们的信科生涯有哪怕一丝一毫的帮助,都是对我极大的鼓励和慰藉。

本书目前包括了以下部分(如果你有其他好的建议,或者想加入贡献者的行列,欢迎邮件 zhongyinmin@pku.edu.cn 或者在 issue 里提问):

  • 必学工具:IDE, 翻墙, StackOverflow, Git, GitHub, Vim, LaTeX, GNU Make, 实用工具 ...
  • 环境配置:PC端以及服务器端开发环境配置、各类运维相关教材及资料 ...
  • 经典书籍推荐:看过 CSAPP 这本书的同学一定感叹好书的重要,我将列举推荐自己看过的计算机领域的必看好书与资源链接。
  • 国外高质量 CS 课程汇总:我将把我上过的所有高质量的国外 CS 课程分门别类进行汇总,并给出相关的自学建议,大部分课程都会有一个独立的仓库维护相关的资源以及我的作业实现。

梦开始的地方 —— CS61A

大一入学时我是一个对计算机一无所知的小白,装了几十个 G 的 Visual Studio 天天和 OJ 你死我活。凭着高中的数学底子我数学课学得还不错,但在专业课上对竞赛大佬只有仰望。提到编程我只会打开那笨重的 IDE,新建一个我也不知道具体是干啥的命令行项目,然后就是 cin, cout, for 循环,然后 CE, RE, WA 循环。当时的我就处在一种拼命想学好但不知道怎么学,课上认真听讲但题还不会做,课后做作业完全是用时间和它硬耗的痛苦状态。我至今电脑里还存着自己大一上学期计算概论大作业的源代码 —— 一个 1200 行的 C++ 文件,没有头文件、没有类、没有封装、没有 unit test、没有 Makefile、没有 Git,唯一的优点是它确实能跑,缺点是“能跑”的补集。我一度怀疑我是不是不适合学计算机,因为童年对于极客的所有想象,已经被我第一个学期的体验彻底粉碎了。

这一切的转机发生在我大一的寒假,我心血来潮想学习 Python。无意间看到知乎有人推荐了 CS61A 这门课,说是 UC Berkeley 的大一入门课程,讲的就是 Python。我永远不会忘记那一天,打开 CS61A 课程网站的那个瞬间,就像哥伦布发现了新大陆一样,我开启了新世界的大门。

我一口气 3 个星期上完了这门课,它让我第一次感觉到原来 CS 可以学得如此充实而有趣,原来这世上竟有如此精华的课程。

为避免有崇洋媚外之嫌,我单纯从一个学生的视角来讲讲自学 CS61A 的体验:

  • 独立搭建的课程网站: 一个网站将所有课程资源整合一体,条理分明的课程 schedule、所有 slides, hw, discussion 的文件链接、详细明确的课程给分说明、历年的考试题与答案。这样一个网站抛开美观程度不谈,既方便学生,也让资源公正透明。

  • 课程教授亲自编写的教材:CS61A 这门课的开课老师将MIT的经典教材 Structure and Interpretation of Computer Programs (SICP) 用Python这门语言进行改编(原教材基于 Scheme 语言),保证了课堂内容与教材内容的一致性,同时补充了更多细节,可以说诚意满满。而且全书开源,可以直接线上阅读。

  • 丰富到让人眼花缭乱的课程作业:14 个 lab 巩固随堂知识点,10 个 homework,还有 4 个代码量均上千行的 project。与大家熟悉的 OJ 和 Word 文档式的作业不同,所有作业均有完善的代码框架,保姆级的作业说明。每个 Project 都有详尽的 handout 文档、全自动的评分脚本。CS61A 甚至专门开发了一个自动化的作业提交评分系统(据说还发了论文)。当然,有人会说“一个 project 几千行代码大部分都是助教帮你写好的,你还能学到啥?”。此言差矣,作为一个刚刚接触计算机,连安装 Python 都磕磕绊绊的小白来说,这样完善的代码框架既可以让你专注于巩固课堂上学习到的核心知识点,又能有“我才学了一个月就能做一个小游戏了!”的成就感,还能有机会阅读学习别人高质量的代码,从而为自己所用。我觉得在低年级,这种代码框架可以说百利而无一害。唯一的害也许是苦了老师和助教,因为开发这样的作业可想而知需要相当的时间投入。

  • 每周 Discussion 讨论课,助教会讲解知识难点和考试例题:类似于北京大学 ICS 的小班研讨,但习题全部用 LaTeX 撰写,相当规范且会明确给出 solution。

这样的课程,你完全不需要任何计算机的基础,你只需要努力、认真、花时间就够了。此前那种有劲没处使的感觉,那种付出再多时间却得不到回报的感觉,从此烟消云散。这太适合我了,我从此爱上了自学。

试想如果有人能把艰深的知识点嚼碎嚼烂,用生动直白的方式呈现给你,还有那么多听起来就很 fancy,种类繁多的 project 来巩固你的理论知识,你会觉得他们真的是在倾尽全力想方设法地让你完全掌握这门课,你会觉得不学好它简直是对这些课程建设者的侮辱。

如果你觉得我在夸大其词,那么不妨从 CS61A 开始,因为它是我的梦开始的地方。

为什么写这本书

在我2020年秋季学期担任《深入理解计算机系统》(CSAPP)这门课的助教时,我已经自学一年多了。这一年多来我无比享受这种自学模式,为了分享这种快乐,我为自己的小班同学做过一个 CS自学资料整理仓库。当时纯粹是心血来潮,因为我也不敢公然鼓励大家翘课自学。

但随着又一年时间的维护,这个仓库的内容已经相当丰富,基本覆盖了计科、智能系、软工系的绝大多数课程,我也为每个课程都建了各自的 GitHub 仓库,汇总我用到的自学资料以及作业实现。

直到大四开始凑学分毕业的时候,我打开自己的培养方案,我发现它已经是我这个自学仓库的子集了,而这距离我开始自学也才两年半而已。于是,一个大胆的想法在我脑海中浮现:也许,我可以打造一个自学式的培养方案,把我这三年自学经历中遇到的坑、走过的路记录下来,以期能为后来的学弟学妹们贡献自己的一份微薄之力。

如果大家可以在三年不到的时间里就能建立起整座CS的基础大厦,能有相对扎实的数学功底和代码能力,经历过数十个千行代码量的 Project 的洗礼,掌握至少 C/C++/Java/JS/Python/Go/Rust 等主流语言,对算法、电路、体系、网络、操统、编译、人工智能、机器学习、计算机视觉、自然语言处理、强化学习、密码学、信息论、博弈论、数值分析、统计学、分布式、数据库、图形学、Web开发、云服务、超算等等方面均有涉猎。我想,你将有足够的底气和自信选择自己感兴趣的方向,无论是就业还是科研,你都将有相当的竞争力。

因为我坚信,既然你能坚持听我 BB 到这里,你一定不缺学好 CS 的能力,你只是没有一个好的老师,给你讲一门好的课程。而我,将力图根据我三年的体验,为你挑选这样的课程。

自学的好处

对我来说,自学最大的好处就在于可以完全根据自己的进度来调整学习速度。对于一些疑难知识点,我可以反复回看视频,在网上谷歌相关的内容,上 StackOverflow 提问题,直到完全将它弄明白。而对于自己掌握得相对较快的内容,则可以两倍速甚至三倍速略过。

自学的另一大好处就是博采众长。计算机系的几大核心课程:体系、网络、操统、编译,每一门我基本都上过不同大学的课程,不同的教材、不同的知识点侧重、不同的 project 将会极大丰富你的视野,也会让你理解错误的一些内容得到及时纠正。

自学的第三个好处是时间自由,具体原因省略。

自学的坏处

当然,作为 CS 自学主义的忠实拥趸,我不得不承认自学也有它的坏处。

第一就是交流沟通的不便。我其实是一个很热衷于提问的人,对于所有没有弄明白的点,我都喜欢穷追到底。但当你面对着屏幕听到老师讲了一个你没明白的知识点的时候,你无法顺着网线到另一端向老师问个明白。我努力通过独立思考和善用 Google 来缓解这一点,但是,如果能有几个志同道合的伙伴结伴自学,那将是极好的。关于交流群的建立,大家可以参考仓库 README 中的教程。

第二就是这些自学的课程基本都是英文的。从视频到slides到作业全是英文,所以有一定的门槛。不过我觉得这个挑战如果你克服了的话对你是极为有利的。因为在当下,虽然我很不情愿,但也不得不承认,在计算机领域,很多优质的文档、论坛、网站都是全英文的。养成英文阅读的习惯,在赤旗插遍世界之前,还是有一定好处的(狗头保命)。

第三,也是我觉得最困难的一点,就是自律。因为没有 DDL 有时候真的是一件可怕的事情,特别是随着学习的深入,国外的很多课程是相当虐的。你得有足够的驱动力强迫自己静下心来,阅读几十页的 Project Handout,理解上千行的代码框架,忍受数个小时的 debug 时光。而这一切,没有学分,没有绩点,没有老师,没有同学,只有一个信念 —— 你在变强。

这本书适合谁

正如我在前言里说的,任何有志于自学计算机的朋友都可以参考这本书。如果你已经有了一定的计算机基础,只是对某个特定的领域感兴趣,可以选择性地挑选你感兴趣的内容进行学习。当然,如果你是一个像我当年一样对计算机一无所知的小白,初入大学的校门,我希望这本书能成为你的攻略,让你花最少的时间掌握你所需要的知识和能力。某种程度上,这本书更像是一个根据我的体验来排序的课程搜索引擎,帮助大家足不出户,体验世界顶级名校的计算机优质课程。

当然,作为一个还未毕业的本科生,我深感自己没有能力也没有权利去宣扬一种学习方式,我只是希望这份资料能让那些同样有自学之心和毅力朋友可以少走些弯路,收获更丰富、更多样、更满足的学习体验。

特别鸣谢

在这里,我怀着崇敬之心真诚地感谢所有将课程资源无偿开源的各位教授们。这些课程倾注了他们数十年教学生涯的积淀和心血,他们却选择无私地让所有人享受到如此高质量的CS教育。没有他们,我的大学生活不会这样充实而快乐。很多教授在我给他们发了感谢邮件之后,甚至会回复上百字的长文,真的让我无比感动。他们也时刻激励着我,做一件事,就得用心做好,无论是科研,还是为人。

你也想加入到贡献者的行列

一个人的力量终究是有限的,这本书也是我在繁重的科研之余熬夜抽空写出来的,难免有不够完善之处。另外,由于个人做的是系统方向,很多课程侧重系统领域,对于数学、理论计算机、高级算法相关的内容则相对少些。如果有大佬想在其他领域分享自己的自学经历与资源,可以直接在项目中发起 Pull Request,也欢迎和我邮件联系(zhongyinmin@pku.edu.cn)。

关于交流群的建立

方法参见仓库的 README.md


最后更新: October 21, 2022
Back to top
\ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 0486b4cafbcd43586de864bf4a9112991f3a4c25..0fe70e4886b4f9579e3aa4a63d26fb5651b3ce85 100644 GIT binary patch delta 15 WcmZn{Y!_sc@8;lW_`Q*>kploDCj_hj delta 15 WcmZn{Y!_sc@8;mxkiU_wkploBiv&;r diff --git a/zh/CS学习规划/index.html b/zh/CS学习规划/index.html index b587c57a..e76de675 100644 --- a/zh/CS学习规划/index.html +++ b/zh/CS学习规划/index.html @@ -1,2 +1,16 @@ 一个仅供参考的CS学习规划 - CS自学指南
跳转至

一个仅供参考的 CS 学习规划

计算机领域方向庞杂,知识浩如烟海,每个细分领域如果深究下去都可以说学无止境。因此,一个清晰明确的学习规划是非常重要的。我在多年自学的尝试中也走过不少弯路,最终提炼出了下面的内容,供大家参考。

不过,在开始学习之前,先向小白们强烈推荐一个科普向系列视频 Crash Course: Computer Science,在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面:计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想等等等等。正如它的口号所说的 Computers are not magic!,希望看完这个视频之后,大家能对计算机科学有个全貌性地感知,从而怀着兴趣去面对下面浩如烟海的更为细致且深入的学习内容。

必学工具

俗话说:磨刀不误砍柴工。如果你是一个刚刚接触计算机的24k纯小白,学会一些工具将会让你事半功倍。

学会提问:也许你会惊讶,提问也算计算机必备技能吗,还放在第一条?我觉得在开源社区中,学会提问是一项非常重要的能力,它包含两方面的事情。其一是会变相地培养你自主解决问题的能力,因为从形成问题、描述问题并发布、他人回答、最后再到理解回答这个周期是非常长的,如果遇到什么鸡毛蒜皮的事情都希望别人最好远程桌面手把手帮你完成,那计算机的世界基本与你无缘了。其二,如果真的经过尝试还无法解决,可以借助开源社区的帮助,但这时候如何通过简洁的文字让别人瞬间理解你的处境以及目的,就显得尤为重要。推荐阅读提问的智慧这篇文章,这不仅能提高你解决问题的概率和效率,也能让开源社区里无偿提供解答的人们拥有一个好心情。

MIT-Missing-Semester 这门课覆盖了这些工具中绝大部分,而且有相当详细的使用指导,强烈建议小白学习。

翻墙:由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 99% 的问题。因此,学会翻墙几乎是一个内地 CSer 的必备技能。(考虑到法律问题,这个文档提供的翻墙方式仅对拥有北大邮箱的用户适用)。

命令行:熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程,它源于 Quora 的一个提问,但在各路大神的贡献努力下已经成为了一个 GitHub 十万 stars 的顶流项目,被翻译成了十几种语言。教程不长,非常建议大家反复通读,在实践中内化吸收。同时,掌握 Shell 脚本编程也是一项不容忽视的技术,可以参考这个教程

IDE (Integrated Development Environment):集成开发环境,说白了就是你写代码的地方。作为一个码农,IDE 的重要性不言而喻,但由于很多 IDE 是为大型工程项目设计的,体量较大,功能也过于丰富。其实如今一些轻便的文本编辑器配合丰富的插件生态基本可以满足日常的轻量编程需求。个人常用的编辑器是 VS Code 和 Sublime(前者的插件配置非常简单,后者略显复杂但颜值很高)。当然对于大型项目我还是会采用略重型的 IDE,例如 Pycharm (Python),IDEA (Java) 等等(免责申明:所有的 IDE 都是世界上最好的 IDE)。

Vim:一款命令行编辑工具。这是一个学习曲线有些陡峭的编辑器,不过学会它我觉得是非常有必要的,因为它将极大地提高你的开发效率。现在绝大多数 IDE 也都支持 Vim 插件,让你在享受现代开发环境的同时保留极客的炫酷(yue)。

Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的童鞋必须掌握的神器之一。

GitHub:基于 Git 的代码托管平台。全世界最大的代码开源社区,大佬集聚地。

GNU Make:一款工程构建工具。善用 GNU Make 会让你养成代码模块化的习惯,同时也能让你熟悉一些大型工程的编译链接流程。

CMake:一款功能比 GNU Make 更为强大的构建工具,建议掌握 GNU Make 之后再加以学习。

LaTex逼格提升 论文排版工具。

Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。

实用工具箱:除了上面提到的这些在开发中使用频率极高的工具之外,我还收集了很多实用有趣的免费工具,例如一些下载工具、设计工具、学习网站等等。

Thesis:毕业论文 Word 写作教程。

好书推荐

私以为一本好的教材应当是以人为本的,而不是炫技式的理论堆砌。告诉读者“是什么”固然重要,但更好的应当是教材作者将其在这个领域深耕几十年的经验融汇进书中,向读者娓娓道来“为什么”以及未来应该“怎么做”。

链接戳这里

环境配置

你以为的开发 —— 在 IDE 里疯狂码代码数小时。

实际上的开发 —— 配环境配几天还没开始写代码。

PC 端环境配置

如果你是 Mac 用户,那么你很幸运,这份指南 将会手把手地带你搭建起整套开发环境。如果你是 Windows 用户,在开源社区的努力下,你同样可以获得与其他平台类似的体验:Scoop

另外大家可以参考一份灵感来自 6.NULL MIT-Missing-Semester环境配置指南,重点在于终端的美化配置。此外还包括常用软件源(如 GitHub, Anaconda, PyPI 等)的加速与替换以及一些 IDE 的配置与激活教程。

服务器端环境配置

推荐一个非常不错的 GitHub 项目 DevOps-Guide,其中涵盖了非常多的运维方面的基础知识和教程,例如 Docker, Kubernetes, Linux, CI-CD, GitHub Actions 等等。

课程地图

正如这章开头提到的,这份课程地图仅仅是一个仅供参考的课程规划,我作为一个临近毕业的本科生。深感自己没有权利也没有能力向别人宣扬“应该怎么学”。因此如果你觉得以下的课程分类与选择有不合理之处,我全盘接受,并深感抱歉。你可以在下一节定制属于你的课程地图

以下课程类别中除了含有 基础入门 字眼的以外,并无明确的先后次序,大家只要满足某个课程的先修要求,完全可以根据自己的需要和喜好选择想要学习的课程。

数学基础

微积分与线性代数

作为大一新生,学好微积分线代是和写代码至少同等重要的事情,相信已经有无数的前人经验提到过这一点,但我还是要不厌其烦地再强调一遍:学好微积分线代真的很重要!你也许会吐槽这些东西岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻骨铭心的程度。如果觉得老师课上讲的内容晦涩难懂,不妨参考 MIT 的 Calculus Course18.06: Linear Algebra 的课程 notes,至少于我而言,它帮助我深刻理解了微积分和线性代数的许多本质。顺道再安利一个油管数学网红 3Blue1Brown,他的频道有很多用生动形象的动画阐释数学本质内核的视频,兼具深度和广度,质量非常高。

信息论入门

作为计算机系的学生,及早了解一些信息论的基础知识,我觉得是大有裨益的。但大多信息论课程都面向高年级本科生甚至研究生,对新手极不友好。而 MIT 的 6.050J: Information theory and Entropy 这门课正是为大一新生量身定制的,几乎没有先修要求,涵盖了编码、压缩、通信、信息熵等等内容,非常有趣。

数学进阶

离散数学与概率论

集合论、图论、概率论等等是算法推导与证明的重要工具,也是后续高阶数学课程的基础。但我觉得这类课程的讲授很容易落入理论化与形式化的窠臼,让课堂成为定理结论的堆砌,而无法使学生深刻把握理论的本质,进而造成学了就背,考了就忘的怪圈。如果能在理论教学中穿插算法运用实例,学生在拓展算法知识的同时也能窥见理论的力量和魅力。

UCB CS70 : discrete Math and probability theoryUCB CS126 : Probability theory 是 UC Berkeley 的概率论课程,前者覆盖了离散数学和概率论基础,后者则涉及随机过程以及深入的理论内容。两者都非常注重理论和实践的结合,有丰富的算法实际运用实例,后者还有大量的 Python 编程作业来让学生运用概率论的知识解决实际问题。

数值分析

作为计算机系的学生,培养计算思维是很重要的,实际问题的建模、离散化,计算机的模拟、分析,是一项很重要的能力。而这两年开始风靡的,由 MIT 打造的 Julia 编程语言以其 C 一样的速度和 Python 一样友好的语法在数值计算领域有一统天下之势,MIT 的许多数学课程也开始用 Julia 作为教学工具,把艰深的数学理论用直观清晰的代码展示出来。

ComputationalThinking 是 MIT 开设的一门计算思维入门课,所有课程内容全部开源,可以在课程网站直接访问。这门课利用 Julia 编程语言,在图像处理、社会科学与数据科学、气候学建模三个 topic 下带领学生理解算法、数学建模、数据分析、交互设计、图例展示,让学生体验计算与科学的美妙结合。内容虽然不难,但给我最深刻的感受就是,科学的魅力并不是故弄玄虚的艰深理论,不是诘屈聱牙的术语行话,而是用直观生动的案例,用简练深刻的语言,让每个普通人都能理解。

上完上面的体验课之后,如果意犹未尽的话,不妨试试 MIT 的 18.330 : Introduction to numerical analysis,这门课的编程作业同样会用 Julia 编程语言,不过难度和深度上都上了一个台阶。内容涉及了浮点编码、Root finding、线性系统、微分方程等等方面,整门课的主旨就是让你利用离散化的计算机表示去估计和逼近一个数学上连续的概念。这门课的教授还专门撰写了一本配套的开源教材 Fundamentals of Numerical Computation,里面附有丰富的 Julia 代码实例和严谨的公式推导。

如果你还意犹未尽的话,还有 MIT 的数值分析研究生课程 18.335: Introduction to numerical method 供你参考。

微分方程

如果世间万物的运动发展都能用方程来刻画和描述,这是一件多么酷的事情呀!虽然几乎任何一所学校的 CS 培养方案中都没有微分方程相关的必修课程,但我还是觉得掌握它会赋予你一个新的视角来审视这个世界。

由于微分方程中往往会用到很多复变函数的知识,所以大家可以参考 MIT18.04: Complex variables functions 的课程 notes 来补齐先修知识。

MIT18.03: differential equations 主要覆盖了常微分方程的求解,在此基础之上 MIT18.152: Partial differential equations 则会深入偏微分方程的建模与求解。掌握了微分方程这一有力工具,相信对于你的实际问题的建模能力以及从众多噪声变量中把握本质的直觉都会有很大帮助。

数学高阶

作为计算机系的学生,我经常听到数学无用论的论断,对此我不敢苟同但也无权反对,但若凡事都硬要争出个有用和无用的区别来,倒也着实无趣,因此下面这些面向高年级甚至研究生的数学课程,大家按兴趣自取所需。

凸优化

Standford EE364A: Convex Optimization

信息论

MIT6.441: Information Theory

应用统计学

MIT18.650: Statistics for Applications

初等数论

MIT18.781: Theory of Numbers

密码学

Standford CS255: Cryptography

编程入门

Languages are tools, you choose the right tool to do the right thing. Since there's no universally perfect tool, there's no universally perfect language.

Shell

Python

C++

Rust

OCaml

电子基础

电路基础

作为计算机系的学生,了解一些基础的电路知识,感受从传感器收集数据到数据分析再到算法预测整条流水线,对于后续知识的学习以及计算思维的培养还是很有帮助的。EE16A&B: Designing Information Devices and Systems I&II 是伯克利 EE 学生的大一入门课,其中 EE16A 注重通过电路从实际环境中收集和分析数据,而 EE16B 则侧重从这些收集到的数据进行分析并做出预测行为。

信号与系统

信号与系统是一门我觉得非常值得一上的课,最初学它只是为了满足我对傅里叶变换的好奇,但学完之后我才不禁感叹,傅立叶变换给我提供了一个全新的视角去看待这个世界,就如同微分方程一样,让你沉浸在用数学去精确描绘和刻画这个世界的优雅与神奇之中。

MIT 6.003: signal and systems 提供了全部的课程录影、书面作业以及答案。也可以去看这门课的远古版本

UCB EE120: Signal and Systems 关于傅立叶变换的 notes 写得非常好,并且提供了6 个非常有趣的 Python 编程作业,让你实践中运用信号与系统的理论与算法。

数据结构与算法

算法是计算机科学的核心,也是几乎一切专业课程的基础。如何将实际问题通过数学抽象转化为算法问题,并选用合适的数据结构在时间和内存大小的限制下将其解决是算法课的永恒主题。如果你受够了老师的照本宣科,那么我强烈推荐伯克利的 UCB CS61B: Data Structures and Algorithms 和普林斯顿的 Coursera: Algorithms I & II,这两门课的都讲得深入浅出并且会有丰富且有趣的编程实验将理论与知识结合起来。此外,对一些更高级的算法以及 NP 问题感兴趣的同学可以学习伯克利的算法设计与分析课程 UCB CS170: Efficient Algorithms and Intractable Problems

软件工程

入门课

一份“能跑”的代码,和一份高质量的工业级代码是有本质区别的。因此我非常推荐低年级的同学学习一下 MIT 6.031: Software Construction 这门课,它会以 Java 语言为基础,以丰富细致的阅读材料和精心设计的编程练习传授如何编写不易出 bug、简明易懂、易于维护修改的高质量代码。大到宏观数据结构设计,小到如何写注释,遵循这些前人总结的细节和经验,对于你此后的编程生涯大有裨益。

专业课

当然,如果你想系统性地上一门软件工程的课程,那我推荐的是伯克利的 UCB CS169: software engineering。但需要提醒的是,和大多学校(包括贵校)的软件工程课程不同,这门课不会涉及传统的 design and document 模式,即强调各种类图、流程图及文档设计,而是采用近些年流行起来的小团队快速迭代 Agile Develepment 开发模式以及利用云平台的 Software as a service 服务模式。

体系结构

入门课

从小我就一直听说,计算机的世界是由 01 构成的,我不理解但大受震撼。如果你的内心也怀有这份好奇,不妨花一到两个月的时间学习 Coursera: Nand2Tetris 这门无门槛的计算机课程。这门麻雀虽小五脏俱全的课程会从 01 开始让你亲手造出一台计算机,并在上面运行俄罗斯方块小游戏。一门课里涵盖了编译、虚拟机、汇编、体系结构、数字电路、逻辑门等等从上至下、从软至硬的各类知识,非常全面。难度上也是通过精心的设计,略去了众多现代计算机复杂的细节,提取出了最核心本质的东西,力图让每个人都能理解。在低年级,如果就能从宏观上建立对整个计算机体系的鸟瞰图,是大有裨益的。

专业课

当然,如果想深入现代计算机体系结构的复杂细节,还得上一门大学本科难度的课程 UCB CS61C: Great Ideas in Computer Architecture。UC Berkeley 作为 RISC-V 架构的发源地,在体系结构领域算得上首屈一指。其课程非常注重实践,你会在 Project 中手写汇编构造神经网络,从零开始搭建一个 CPU,这些实践都会让你对计算机体系结构有更为深入的理解,而不是仅停留于“取指译码执行访存写回”的单调背诵里。

系统入门

计算机系统是一个庞杂而深刻的主题,在深入学习某个细分领域之前,对各个领域有一个宏观概念性的理解,对一些通用性的设计原则有所知晓,会让你在之后的深入学习中不断强化一些最为核心乃至哲学的概念,而不会桎梏于复杂的内部细节和各种 trick。因为在我看来,学习系统最关键的还是想让你领悟到这些最核心的东西,从而能够设计和实现出属于自己的系统。

MIT6.033: System Engineering 是 MIT 的系统入门课,主题涉及了操作系统、网络、分布式和系统安全,除了知识点的传授外,这门课还会讲授一些写作和表达上的技巧,让你学会如何设计并向别人介绍和分析自己的系统。这本书配套的教材 Principles of Computer System Design: An Introduction 也写得非常好,推荐大家阅读。

CMU 15-213: Introduction to Computer System 是 CMU 的系统入门课,内容覆盖了体系结构、操作系统、链接、并行、网络等等,兼具广度和深度,配套的教材 Computer Systems: A Programmer's Perspective 也是质量极高,强烈建议阅读。

操作系统

没有什么能比自己写个内核更能加深对操作系统的理解了。

操作系统作为各类纷繁复杂的底层硬件虚拟化出一套规范优雅的抽象,给所有应用软件提供丰富的功能支持。了解操作系统的设计原则和内部原理对于一个不满足于当调包侠的程序员来说是大有裨益的。出于对操作系统的热爱,我上过国内外很多操作系统课程,它们各有侧重和优劣,大家可以根据兴趣各取所需。

MIT 6.S081: Operating System Engineering,MIT 著名 PDOS 实验室出品,11 个 Project 让你在一个实现非常优雅的类Unix操作系统xv6上增加各类功能模块。这门课也让我深刻认识到,做系统不是靠 PPT 念出来的,是得几万行代码一点点累起来的。

UCB CS162: Operating System,伯克利的操作系统课,采用和 Stanford 同样的 Project —— 一个教学用操作系统 Pintos。我作为北京大学2022年春季学期操作系统实验班的助教,引入并改善了这个 Project,课程资源也会全部开源,具体参见课程网站

NJU: Operating System Design and Implementation,南京大学的蒋炎岩老师开设的操作系统课程。蒋老师以其独到的系统视角结合丰富的代码示例将众多操作系统的概念讲得深入浅出,此外这门课的全部课程内容都是中文的,非常方便大家学习。

并行与分布式系统

想必这两年各类 CS 讲座里最常听到的话就是“摩尔定律正在走向终结”,此话不假,当单核能力达到上限时,多核乃至众核架构如日中天。硬件的变化带来的是上层编程逻辑的适应与改变,要想充分利用硬件性能,编写并行程序几乎成了程序员的必备技能。与此同时,深度学习的兴起对计算机算力与存储的要求都达到了前所未有的高度,大规模集群的部署和优化也成为热门技术话题。

并行计算

CMU 15-418/Stanford CS149: Parallel Computing

分布式系统

MIT 6.824: Distributed System

系统安全

不知道你当年选择计算机是不是因为怀着一个中二的黑客梦想,但现实却是成为黑客道阻且长。

理论课程

UCB CS161: Computer Security 是伯克利的系统安全课程,会涵盖栈攻击、密码学、网站安全、网络安全等等内容。

实践课程

掌握这些理论知识之后,还需要在实践中培养和锻炼这些“黑客素养”。CTF 夺旗赛是一项比较热门的系统安全比赛,赛题中会融会贯通地考察你对计算机各个领域知识的理解和运用。北大今年也成功举办了第 0 届和第 1 届,鼓励大家后期踊跃参与,在实践中提高自己。下面列举一些我平时学习(摸鱼)用到的资源:

计算机网络

没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了。

大名鼎鼎的 Stanford CS144: Computer Network,8 个 Project 带你实现整个 TCP/IP 协议栈。

如果你只是想在理论上对计算机网络有所了解,那么推荐计网著名教材《自顶向下方法》的配套学习资源 Computer Networking: A Top-Down Approach

数据库系统

没有什么能比自己写个关系型数据库更能加深对数据库系统的理解了。

CMU 的著名数据库神课 CMU 15-445: Introduction to Database System 会通过 4 个 Project 带你为一个用于教学的关系型数据库 bustub 添加各种功能。实验的评测框架也免费开源了,非常适合大家自学。此外课程实验会用到 C++11 的众多新特性,也是一个锻炼 C++ 代码能力的好机会。

Berkeley 作为著名开源数据库 postgres 的发源地也不遑多让,UCB CS186: Introduction to Database System 会让你用 Java 语言实现一个支持 SQL 并发查询、B+ 树索引和故障恢复的关系型数据库。

编译原理

没有什么能比自己写个编译器更能加深对编译器的理解了。

Stanford CS143: Compilers 带你手写编译器。

Web开发

前后端开发很少在计算机的培养方案里被重视,但其实掌握这项技能还是好处多多的,例如搭建自己的个人主页,抑或是给自己的课程项目做一个精彩的展示网页。

两周速成版

MIT web development course

系统学习版

Stanford CS142: Web Applications

计算机图形学

数据科学

其实数据科学和机器学习与深度学习有着很紧密的联系,但可能更侧重于实践。Berkeley 的 UCB Data100: Principles and Techniques of Data Science 通过丰富的编程练习让你在实践中掌握各类数据分析工具和算法,并带领你体验从海量的数据集中提取出想要的结果,并对未来的数据或用户的行为做出相应的预测。但这只是一门基础课,如果想学习工业级别的数据挖掘与分析技术,可以尝试 Stanford 的大数据挖掘课程 CS246: Mining Massive Data Sets

人工智能

近十年人工智能应该算是计算机界最火爆的领域。如果你不满足于整日听各路媒体争相报道人工智能相关的进展,而想真正一探究竟,那么非常推荐学习 Harvard 神课 CS50 系列的人工智能课程 Harvard CS50: Introduction to AI with Python。课程短小精悍,覆盖了传统人工智能领域的几大分支,并配有丰富有趣的 Python 编程练习来巩固你对人工智能算法的理解。美中不足的是这门课因为面向在线自学者的缘故内容较为精简,并且不会涉及特别深入的数学理论,如果想要系统深入地学习还需要一门本科生难度的课程,例如 Berkeley 的 UCB CS188: Introduction to Artificial Intelligence。这门课的 Project 复刻了经典游戏糖豆人,让你运用人工智能算法玩游戏,非常有趣。

机器学习

机器学习领域近些年最重要的进展就是发展出了基于神经网络的深度学习分支,但其实很多基于统计学习的算法依然在数据分析领域有着广泛的应用。如果你之前从未接触过机器学习的相关知识,而且不想一开始就陷入艰深晦涩的数学证明,那么不妨先从 Andrew Ng (吴恩达)的 Coursera: Machine Learning 学起。这门课在机器学习领域基本无人不晓,吴恩达以其深厚的理论功底和出色的表达能力把很多艰深的算法讲得深入浅出,并且非常实用。其配套的作业也是质量相当上乘,可以帮助你快速入门。

但上过这门课只能让你从宏观上对机器学习这一领域有一定了解,如果想真正理解那些“神奇”算法背后的数学原理甚至从事相关领域的科研工作,那么还需要一门更“数学”的课程,例如 Stanford CS229: Machine Learning 或者 UCB CS189: Introduction to Machine Learning

深度学习

前几年 AlphaGo 的大热让深度学习进入了大众的视野,不少大学甚至专门成立了相关专业。很多计算机的其他领域也会借助深度学习的技术来做研究,因此基本不管你干啥多少都会接触到一些神经网络、深度学习相关的技术需求。如果想快速入门,同样推荐 Andrew Ng (吴恩达)的 Coursera: Deep Learning,质量无需多言,Coursera 上罕见的满分课程。此外如果你觉得英文课程学习起来有难度,推荐李宏毅老师的 国立台湾大学:机器学习 课程。这门课打着机器学习的名号,却囊括了深度学习领域的几乎所有方向,非常全面,很适合你从宏观上对这个领域有一个大致的了解。而且老师本人也非常幽默,课堂金句频出。

当然因为深度学习领域发展非常迅速,已经拥有了众多研究分支,如果想要进一步深入,可以按需学习下面罗列的代表课程,

计算机视觉

Stanford CS231n: CNN for Visual Recognition

自然语言处理

Stanford CS224n: Natural Language Processing

图神经网络

Stanford CS224w: Machine Learning with Graphs

强化学习

UCB CS285: Deep Reinforcement Learning

定制属于你的课程地图

授人以鱼不如授人以渔。

以上的课程规划难免带有强烈的个人偏好,不一定适合所有人,更多是起到抛砖引玉的作用。如果你想挑选自己感兴趣的方向和内容加以学习,可以参考我在下面列出来的资源。


最后更新: November 2, 2022
Back to top
\ No newline at end of file diff --git a/zh/Web开发/CS142/index.html b/zh/Web开发/CS142/index.html index 7e1ae272..8abb189b 100644 --- a/zh/Web开发/CS142/index.html +++ b/zh/Web开发/CS142/index.html @@ -1,2 +1,16 @@ Stanford CS142: Web Applications - CS自学指南
跳转至

Stanford CS142: Web Applications

课程简介

  • 所属大学:Stanford
  • 先修要求:有一定的编程经验
  • 编程语言:JavaScript/HTML/CSS
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

斯坦福的 Web 应用开发课程,内容覆盖了 HTML, CSS, JavaScript, ReactJs, NodeJS, ExpressJS, Web安全等等。8 个 Project 会让你在实战中锻炼自己的 Web 开发技巧。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/Web开发/fullstackopen/index.html b/zh/Web开发/fullstackopen/index.html index 876237d8..d2f5c992 100644 --- a/zh/Web开发/fullstackopen/index.html +++ b/zh/Web开发/fullstackopen/index.html @@ -1,2 +1,16 @@ University of Helsinki: Full Stack open 2022 - CS自学指南
跳转至

University of Helsinki: Full Stack open 2022

课程简介

  • 所属大学:University of Helsinki
  • 先修要求:具备良好的编程技能、基本的网络编程和数据库知识,并且了解使用 Git 这个版本控制系统的基础知识。
  • 编程语言:JavaScript/HTML/CSS/NoSQL/SQL
  • 课程难度:🌟🌟
  • 预计学时:因人而异

本课程是介绍如何使用 JavaScript 开发现代Web应用程序。 课程的重点是使用 ReactJS 构建单页面应用程序(SPA),并使用由 Node.js 构建 REST API。该课程还包含介绍 GraphQL 的部分,这是 REST API 的现代替代方案。

课程还包括测试、配置和环境管理,以及使用 MongoDB 来存储应用的数据。

课程资源


最后更新: September 7, 2022
Back to top
\ No newline at end of file diff --git a/zh/Web开发/mitweb/index.html b/zh/Web开发/mitweb/index.html index 9751e33b..2464f570 100644 --- a/zh/Web开发/mitweb/index.html +++ b/zh/Web开发/mitweb/index.html @@ -1,2 +1,16 @@ MIT web development course - CS自学指南
跳转至

MIT Web Development Crash Course

课程简介

  • 所属大学:MIT
  • 先修要求:掌握至少一门编程语言
  • 编程语言:JavaScript/HTML/CSS/NoSQL
  • 课程难度:🌟🌟🌟
  • 预计学时:因人而异

MIT 在每年 1 月份会有一个为期 4 周的 Independent Activities Period (IAP),在这个月里,MIT 的学生和老师可以自由地开设很多有趣的课程,而这门网站开发课程就是其中之一。

在一个月的时间里,你会从零开始掌握一个网站的设计、搭建、美化、交互等等核心内容,基本覆盖了 Web 开发的前后端大部分技术栈。如果你不需要系统地学习网络开发,而只是出于兴趣想把它加入自己的技能包里,那么这门课将非常适合你。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/index.html b/zh/index.html index c53a173b..03a725d3 100644 --- a/zh/index.html +++ b/zh/index.html @@ -1,2 +1,16 @@ 前言 - CS自学指南
跳转至

Image title

前言

最近更新:英文版正在建设中,增加陈天奇机器学习编译,增加 CMU 机器学习系统, 增加 学习工作流

这是一本计算机的自学指南,也是对自己大学三年自学生涯的一个纪念。

这同时也是一份献给北大信科学弟学妹们的礼物。如果这本书能对你们的信科生涯有哪怕一丝一毫的帮助,都是对我极大的鼓励和慰藉。

本书目前包括了以下部分(如果你有其他好的建议,或者想加入贡献者的行列,欢迎邮件 zhongyinmin@pku.edu.cn 或者在 issue 里提问):

  • 必学工具:IDE, 翻墙, StackOverflow, Git, GitHub, Vim, LaTeX, GNU Make, 实用工具 ...
  • 环境配置:PC端以及服务器端开发环境配置、各类运维相关教材及资料 ...
  • 经典书籍推荐:看过 CSAPP 这本书的同学一定感叹好书的重要,我将列举推荐自己看过的计算机领域的必看好书与资源链接。
  • 国外高质量 CS 课程汇总:我将把我上过的所有高质量的国外 CS 课程分门别类进行汇总,并给出相关的自学建议,大部分课程都会有一个独立的仓库维护相关的资源以及我的作业实现。

梦开始的地方 —— CS61A

大一入学时我是一个对计算机一无所知的小白,装了几十个 G 的 Visual Studio 天天和 OJ 你死我活。凭着高中的数学底子我数学课学得还不错,但在专业课上对竞赛大佬只有仰望。提到编程我只会打开那笨重的 IDE,新建一个我也不知道具体是干啥的命令行项目,然后就是 cin, cout, for 循环,然后 CE, RE, WA 循环。当时的我就处在一种拼命想学好但不知道怎么学,课上认真听讲但题还不会做,课后做作业完全是用时间和它硬耗的痛苦状态。我至今电脑里还存着自己大一上学期计算概论大作业的源代码 —— 一个 1200 行的 C++ 文件,没有头文件、没有类、没有封装、没有 unit test、没有 Makefile、没有 Git,唯一的优点是它确实能跑,缺点是“能跑”的补集。我一度怀疑我是不是不适合学计算机,因为童年对于极客的所有想象,已经被我第一个学期的体验彻底粉碎了。

这一切的转机发生在我大一的寒假,我心血来潮想学习 Python。无意间看到知乎有人推荐了 CS61A 这门课,说是 UC Berkeley 的大一入门课程,讲的就是 Python。我永远不会忘记那一天,打开 CS61A 课程网站的那个瞬间,就像哥伦布发现了新大陆一样,我开启了新世界的大门。

我一口气 3 个星期上完了这门课,它让我第一次感觉到原来 CS 可以学得如此充实而有趣,原来这世上竟有如此精华的课程。

为避免有崇洋媚外之嫌,我单纯从一个学生的视角来讲讲自学 CS61A 的体验:

  • 独立搭建的课程网站: 一个网站将所有课程资源整合一体,条理分明的课程 schedule、所有 slides, hw, discussion 的文件链接、详细明确的课程给分说明、历年的考试题与答案。这样一个网站抛开美观程度不谈,既方便学生,也让资源公正透明。

  • 课程教授亲自编写的教材:CS61A 这门课的开课老师将MIT的经典教材 Structure and Interpretation of Computer Programs (SICP) 用Python这门语言进行改编(原教材基于 Scheme 语言),保证了课堂内容与教材内容的一致性,同时补充了更多细节,可以说诚意满满。而且全书开源,可以直接线上阅读。

  • 丰富到让人眼花缭乱的课程作业:14 个 lab 巩固随堂知识点,10 个 homework,还有 4 个代码量均上千行的 project。与大家熟悉的 OJ 和 Word 文档式的作业不同,所有作业均有完善的代码框架,保姆级的作业说明。每个 Project 都有详尽的 handout 文档、全自动的评分脚本。CS61A 甚至专门开发了一个自动化的作业提交评分系统(据说还发了论文)。当然,有人会说“一个 project 几千行代码大部分都是助教帮你写好的,你还能学到啥?”。此言差矣,作为一个刚刚接触计算机,连安装 Python 都磕磕绊绊的小白来说,这样完善的代码框架既可以让你专注于巩固课堂上学习到的核心知识点,又能有“我才学了一个月就能做一个小游戏了!”的成就感,还能有机会阅读学习别人高质量的代码,从而为自己所用。我觉得在低年级,这种代码框架可以说百利而无一害。唯一的害也许是苦了老师和助教,因为开发这样的作业可想而知需要相当的时间投入。

  • 每周 Discussion 讨论课,助教会讲解知识难点和考试例题:类似于北京大学 ICS 的小班研讨,但习题全部用 LaTeX 撰写,相当规范且会明确给出 solution。

这样的课程,你完全不需要任何计算机的基础,你只需要努力、认真、花时间就够了。此前那种有劲没处使的感觉,那种付出再多时间却得不到回报的感觉,从此烟消云散。这太适合我了,我从此爱上了自学。

试想如果有人能把艰深的知识点嚼碎嚼烂,用生动直白的方式呈现给你,还有那么多听起来就很 fancy,种类繁多的 project 来巩固你的理论知识,你会觉得他们真的是在倾尽全力想方设法地让你完全掌握这门课,你会觉得不学好它简直是对这些课程建设者的侮辱。

如果你觉得我在夸大其词,那么不妨从 CS61A 开始,因为它是我的梦开始的地方。

为什么写这本书

在我2020年秋季学期担任《深入理解计算机系统》(CSAPP)这门课的助教时,我已经自学一年多了。这一年多来我无比享受这种自学模式,为了分享这种快乐,我为自己的小班同学做过一个 CS自学资料整理仓库。当时纯粹是心血来潮,因为我也不敢公然鼓励大家翘课自学。

但随着又一年时间的维护,这个仓库的内容已经相当丰富,基本覆盖了计科、智能系、软工系的绝大多数课程,我也为每个课程都建了各自的 GitHub 仓库,汇总我用到的自学资料以及作业实现。

直到大四开始凑学分毕业的时候,我打开自己的培养方案,我发现它已经是我这个自学仓库的子集了,而这距离我开始自学也才两年半而已。于是,一个大胆的想法在我脑海中浮现:也许,我可以打造一个自学式的培养方案,把我这三年自学经历中遇到的坑、走过的路记录下来,以期能为后来的学弟学妹们贡献自己的一份微薄之力。

如果大家可以在三年不到的时间里就能建立起整座CS的基础大厦,能有相对扎实的数学功底和代码能力,经历过数十个千行代码量的 Project 的洗礼,掌握至少 C/C++/Java/JS/Python/Go/Rust 等主流语言,对算法、电路、体系、网络、操统、编译、人工智能、机器学习、计算机视觉、自然语言处理、强化学习、密码学、信息论、博弈论、数值分析、统计学、分布式、数据库、图形学、Web开发、云服务、超算等等方面均有涉猎。我想,你将有足够的底气和自信选择自己感兴趣的方向,无论是就业还是科研,你都将有相当的竞争力。

因为我坚信,既然你能坚持听我 BB 到这里,你一定不缺学好 CS 的能力,你只是没有一个好的老师,给你讲一门好的课程。而我,将力图根据我三年的体验,为你挑选这样的课程。

自学的好处

对我来说,自学最大的好处就在于可以完全根据自己的进度来调整学习速度。对于一些疑难知识点,我可以反复回看视频,在网上谷歌相关的内容,上 StackOverflow 提问题,直到完全将它弄明白。而对于自己掌握得相对较快的内容,则可以两倍速甚至三倍速略过。

自学的另一大好处就是博采众长。计算机系的几大核心课程:体系、网络、操统、编译,每一门我基本都上过不同大学的课程,不同的教材、不同的知识点侧重、不同的 project 将会极大丰富你的视野,也会让你理解错误的一些内容得到及时纠正。

自学的第三个好处是时间自由,具体原因省略。

自学的坏处

当然,作为 CS 自学主义的忠实拥趸,我不得不承认自学也有它的坏处。

第一就是交流沟通的不便。我其实是一个很热衷于提问的人,对于所有没有弄明白的点,我都喜欢穷追到底。但当你面对着屏幕听到老师讲了一个你没明白的知识点的时候,你无法顺着网线到另一端向老师问个明白。我努力通过独立思考和善用 Google 来缓解这一点,但是,如果能有几个志同道合的伙伴结伴自学,那将是极好的。关于交流群的建立,大家可以参考仓库 README 中的教程。

第二就是这些自学的课程基本都是英文的。从视频到slides到作业全是英文,所以有一定的门槛。不过我觉得这个挑战如果你克服了的话对你是极为有利的。因为在当下,虽然我很不情愿,但也不得不承认,在计算机领域,很多优质的文档、论坛、网站都是全英文的。养成英文阅读的习惯,在赤旗插遍世界之前,还是有一定好处的(狗头保命)。

第三,也是我觉得最困难的一点,就是自律。因为没有 DDL 有时候真的是一件可怕的事情,特别是随着学习的深入,国外的很多课程是相当虐的。你得有足够的驱动力强迫自己静下心来,阅读几十页的 Project Handout,理解上千行的代码框架,忍受数个小时的 debug 时光。而这一切,没有学分,没有绩点,没有老师,没有同学,只有一个信念 —— 你在变强。

这本书适合谁

正如我在前言里说的,任何有志于自学计算机的朋友都可以参考这本书。如果你已经有了一定的计算机基础,只是对某个特定的领域感兴趣,可以选择性地挑选你感兴趣的内容进行学习。当然,如果你是一个像我当年一样对计算机一无所知的小白,初入大学的校门,我希望这本书能成为你的攻略,让你花最少的时间掌握你所需要的知识和能力。某种程度上,这本书更像是一个根据我的体验来排序的课程搜索引擎,帮助大家足不出户,体验世界顶级名校的计算机优质课程。

当然,作为一个还未毕业的本科生,我深感自己没有能力也没有权利去宣扬一种学习方式,我只是希望这份资料能让那些同样有自学之心和毅力朋友可以少走些弯路,收获更丰富、更多样、更满足的学习体验。

特别鸣谢

在这里,我怀着崇敬之心真诚地感谢所有将课程资源无偿开源的各位教授们。这些课程倾注了他们数十年教学生涯的积淀和心血,他们却选择无私地让所有人享受到如此高质量的CS教育。没有他们,我的大学生活不会这样充实而快乐。很多教授在我给他们发了感谢邮件之后,甚至会回复上百字的长文,真的让我无比感动。他们也时刻激励着我,做一件事,就得用心做好,无论是科研,还是为人。

你也想加入到贡献者的行列

一个人的力量终究是有限的,这本书也是我在繁重的科研之余熬夜抽空写出来的,难免有不够完善之处。另外,由于个人做的是系统方向,很多课程侧重系统领域,对于数学、理论计算机、高级算法相关的内容则相对少些。如果有大佬想在其他领域分享自己的自学经历与资源,可以直接在项目中发起 Pull Request,也欢迎和我邮件联系(zhongyinmin@pku.edu.cn)。

关于交流群的建立

方法参见仓库的 README.md


最后更新: October 21, 2022
Back to top
\ No newline at end of file diff --git a/zh/人工智能/CS188/index.html b/zh/人工智能/CS188/index.html index 3f89ab49..b5e4f2ca 100644 --- a/zh/人工智能/CS188/index.html +++ b/zh/人工智能/CS188/index.html @@ -1,2 +1,16 @@ UCB CS188: Introduction to Artificial Intelligence - CS自学指南
跳转至

CS188: Introduction to Artificial Intelligence

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS70
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:50 小时

伯克利的人工智能入门课,课程 notes 写得非常深入浅出,基本不需要观看课程视频。课程内容的安排基本按照人工智能的经典教材 Artificial intelligence: A Modern Approach 的章节顺序,覆盖了搜索剪枝、约束满足问题、马尔可夫决策过程、强化学习、贝叶斯网络、隐马尔可夫模型以及基础的机器学习和神经网络的相关内容。

2018年秋季学期的版本免费开放了 gradescope,大家可以在线完成书面作业并实时得到测评结果。同时课程的 6 个 Project 也是质量爆炸,复现了经典的 Packman(吃豆人)小游戏,会让你利用学到的 AI 知识,去实现相关算法,让你的吃豆人在迷宫里自由穿梭,躲避鬼怪,收集豆子。

课程资源

  • 课程网站:Fall 2022Fall 2018
  • 课程视频:Fall 2022Fall 2018,每节课的链接详见课程网站
  • 课程教材:Artificial intelligence: A Modern Approach
  • 课程作业:在线测评书面作业和 Projects,详见课程网站

最后更新: December 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/人工智能/CS50/index.html b/zh/人工智能/CS50/index.html index a4cddd28..7a3a0922 100644 --- a/zh/人工智能/CS50/index.html +++ b/zh/人工智能/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50's Introduction to AI with Python - CS自学指南
跳转至

CS50’s Introduction to AI with Python

课程简介

  • 所属大学:Harvard
  • 先修要求:基本概率论 + Python基础
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:30 小时

一门非常基础的AI入门课,让人眼前一亮的是12个设计精巧的编程作业,都会用学到的AI知识去实现一个简易的游戏AI,比如用强化学习训练一个Nim游戏的AI,用alpha-beta剪枝去扫雷等等,非常适合新手入门或者大佬休闲。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/cs50_ai - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/人工智能/CYJ/index.html b/zh/人工智能/CYJ/index.html index 3e32f8d2..c11b88ad 100644 --- a/zh/人工智能/CYJ/index.html +++ b/zh/人工智能/CYJ/index.html @@ -1,2 +1,16 @@ 智能计算系统 - CS自学指南
跳转至

智能计算系统

课程简介

  • 所属大学:中国科学院大学
  • 先修要求:体系结构,深度学习
  • 编程语言:Python, C++, BCL
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时+

智能计算系统是智能的核心物质载体,每年全球要制造数以十亿计的智能计算系统(包括智能手机、智能服务器、智能可穿戴设备等),需要大量的智能计算系统的设计者和开发者。智能计算系统人才的培养直接关系到我国智能产业的核心竞争力。因此,对智能计算系统的认识和理解是智能时代计算机类专业学生培养方案中不可或缺的重要组成部分,是计算机类专业学生的核心竞争力。

国内的陈云霁老师开的课,在其他若干个大学也都有开对应的课程。这门课用一个个实验带大家以一个完整的视野理解人工智能的技术栈。从上层的深度学习框架,到用底层语言编写算子,再到硬件中 MLU 的设计,让大家形成系统思维,体会自上而下,融会贯通的乐趣。

我做了其中的 2,3,4,5 这几个实验,其中综合实验和硬件实验没有做,如果有做了的同学欢迎大家补上你的链接。

个人体会是第三章实现算子的实验让我对深度学习框架的了解加深了很多。第五章的实验BCL语言编写算子如果了解 CUDA 的话会感觉很熟悉。

推荐去买一本教材看一看,会让我们理解整体的技术栈。熟悉深度学习的同学可以直接从第五章开始看,看看深度学习框架底层到底是什么样的。

我因为这门课的启发,参考一本书(书名在仓库中)写了一个简易的深度学习框架。在这个框架里可以看到智能计算系统实验中的一些影子。同时受到 build-your-own-x 系列的启发,我也打算写一下教程,教大家写一个自己的深度学习框架。代码用 Python 写的,代码量较少,适合有一定基础的同学阅读。之后打算添加更多的算子,有望实现一个较为全面的框架,并希望移植到 C++ 中,以兼顾性能与开发效率。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在 ysj1173886760/Learning: ai-system - GitHub 中。


最后更新: November 14, 2022
Back to top
\ No newline at end of file diff --git a/zh/体系结构/CS61C/index.html b/zh/体系结构/CS61C/index.html index e50614c9..3e222e1b 100644 --- a/zh/体系结构/CS61C/index.html +++ b/zh/体系结构/CS61C/index.html @@ -1,2 +1,16 @@ UCB CS61C: Great Ideas in Computer Architecture - CS自学指南
跳转至

CS61C: Great Ideas in Computer Architecture

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利 CS61 系列的最后一门课程,深入计算机的硬件细节,带领学生逐步理解 C 语言是如何一步步转化为 RISC-V 汇编并在 CPU 上执行的。和 Nand2Tetris 不同,这门课 在难度和深度上都会提高很多,具体会涉及到流水线、Cache、虚存以及并发相关的内容。

这门课的 Project 也非常新颖有趣。Project1 会让你用 C 语言写一个小程序,20 年秋季学期是著名的游戏 Game of Life。Project2 会让你用 RISC-V 汇编编写一个神经网络,用来 识别 MNIST 手写数字,非常锻炼你对汇编代码的理解和运用。Project3 中你会用 Logisim 这个数字电路模拟软件搭建出一个二级流水线的 CPU,并在上面运行 RISC-V 汇编代码。Project4 会让你使用 OpenMP, SIMD 等方法并行优化矩阵运算,实现一个简易的 Numpy。

总而言之,这是个人上过的最好的计算机体系结构的课程。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61C-summer20 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/体系结构/CSAPP/index.html b/zh/体系结构/CSAPP/index.html index d6514a4c..ae92307e 100644 --- a/zh/体系结构/CSAPP/index.html +++ b/zh/体系结构/CSAPP/index.html @@ -1,2 +1,16 @@ CMU 15-213: CSAPP - CS自学指南
跳转至

CMU CS15213: CSAPP

课程简介

  • 所属大学:CMU
  • 先修要求:CS61A, CS61B
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

CMU 大名鼎鼎的镇系神课,以其内容庞杂,Project 巨难而闻名遐迩。课程内容覆盖了汇编语言、体系结构、操作系统、编译链接、并行、网络等,作为系统入门课,兼具深度和广度,如果自学确实需要相当的毅力和代码功底。

这门课配合的教材由 CMU 计算机系主任 Bryant 教授执笔,也即所谓的 CSAPP。这也是我第一本认认真真一页一页读过去的计算机教材,虽然很难啃,但着实收获良多。

北大购买了这门课的版权并开设了 Introduction to Computer System 这门课,但其实 CSAPP 所有的课程资源和实验代码都能在它的官方主页上访问到(具体参见下方链接)。

这门课由于过于出名,全世界的码农争相学习,导致其 Project 的答案在网上几乎唾手可得。但如果你真的想锻炼自己的代码能力,希望你不要借鉴任何第三方代码。

认真学完这一门课,你对计算机系统的理解绝对会上升一个台阶。

课程资源

英语有困难的同学可以参考B站UP主九曲阑干对 CSAPP 的中文讲解(据说CMU的中国留学生也在CMU的课堂上看这个视频呢)。另外如果大家在看完 CSAPP 后对书中的第七章链接有一定的疑问,推荐阅读《程序员的自我修养》这本书,书的副标题是链接,装载与库。这本书能够帮助我们完善对程序链接的理解,相信你在看完这本书以后可以对程序的链接,ELF 文件,动态库都将有一个更加深入的理解。十分推荐在读完 CSAPP,对计算机系统有一定的了解以后作为补充资料来阅读。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/体系结构/DDCA/index.html b/zh/体系结构/DDCA/index.html index 9ad25a23..245308b8 100644 --- a/zh/体系结构/DDCA/index.html +++ b/zh/体系结构/DDCA/index.html @@ -1,2 +1,16 @@ Digital Design and Computer Architecture - CS自学指南
跳转至

Digital Design and Computer Architecture

课程简介

  • 所属大学:ETH Zurich
  • 先修要求:CS50 或同阶课程,最好有 C 语言基础。
  • 编程语言:C,Verilog,MIPS 汇编,LC3 汇编
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

体系结构领域的大牛 Onur Mutlu 来教你数字电路和计算机体系结构。课程完全从计算机设计的角度出发,从晶体管、逻辑门开始,一直讲解到微架构、缓存和虚拟内存,还会介绍 很多体系结构领域最新的研究进展。课程共有 9 个 lab,使用 Basys 3 FPGA 开发板(可自行购买)和 Xilinx 公司的 Vivado 软件(可在官网免费下载使用)进行电路设计,从组合电路 和时序电路开始,一直到最后部署一个完整的 CPU。课程资料除了 lab 答案和当期考试答案之外全部开源,学完之后你可以掌握计算机相关的数字电路,Verilog 硬件描述语言,MIPS 与 C 之间的转换关系,MIPS 单周期多周期流水线 CPU 的设计和性能分析,缓存,虚拟内存等重要概念。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/体系结构/N2T/index.html b/zh/体系结构/N2T/index.html index aaa0dfb8..f74bfe07 100644 --- a/zh/体系结构/N2T/index.html +++ b/zh/体系结构/N2T/index.html @@ -1,2 +1,16 @@ Coursera: Nand2Tetris - CS自学指南
跳转至

Coursera: Nand2Tetris

课程简介

  • 所属大学:希伯来大学
  • 先修要求:无
  • 编程语言:任选一个编程语言
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

Coursera 上被数万人评为满分,在全球四百多所高校、高中被采用,让一个完全没有计算机基础的人从与非门开始造一台计算机,并在上面运行俄罗斯方块小游戏。

听起来就很酷对不对?实现起来更酷!这门课分为硬件和软件两个部分。在硬件部分,你将进入 01 的世界,用与非门构造出逻辑电路,并逐步搭建出一个 CPU 来运行一套课程作者定义的简易汇编代码。在软件部分,你将编写一个编译器,将作者开发的一个名为Jack的高级语言编译为可以运行在虚拟机上的字节码,然后进一步翻译为汇编代码。你还将开发一个简易的 OS,让你的计算机支持输入输出图形界面。至此,你可以用 Jack 开发一个俄罗斯方块的小游戏,将它编译为汇编代码,运行在你用与非门搭建出的 CPU 上,通过你开发的 OS 进行交互。学完这门课程,你将对整个计算机的体系结构有一个全局且深刻的理解,对于你后续课程的学习有着莫大的帮助。

你也许会担心课程会不会很难,但这门课面向的人群是完全没有计算机基础的人,课程作者的目标是让高中生都能理解。因此,只要你按部就班跟着课程规划走,一个月内学完应该绰绰有余。麻雀虽小但是五脏俱全,这门课很好地提取出了计算机的本质,而不过多地陷于现代计算机为了性能而设计出的众多复杂细节。让学习者能在轻松愉快的学习体验中感受计算机的优雅与神奇。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/NandToTetris - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/使用指南/index.html b/zh/使用指南/index.html index 9f47f9c9..7f83e10c 100644 --- a/zh/使用指南/index.html +++ b/zh/使用指南/index.html @@ -1,2 +1,16 @@ 如何使用这本书 - CS自学指南
跳转至

如何使用这本书

随着贡献者的不断增多,本书的内容也不断扩展,想把书中所有的课程全部学完是不切实际也没有必要的,甚至会起到事倍功半的反效果,吃力而不讨好。为了更好地贴合读者,让这本书真正为你所用,我将读者按照需求大致分为了如下三类,大家可以结合切身实际,精准地规划属于自己的自学方案。

初入校园

如果你刚刚进入大学校园或者还在低年级,并且就读的是计算机方向或者想要转到计算机方向,那么你很幸运,因为学习是你的本业,你可以有充足的时间和自由来学习自己感兴趣的东西,不会有工作的压力和生活的琐碎,不必过于纠结“学了有没有用”,“能不能找到工作”这类功利的想法。那么该如何安排自己的学业呢?我觉得首要的一点就是要打破在高中形成的“按部就班”式的被动学习。作为一个小镇做题家,我深知国内大部分高中会把大家一天当中的每一分钟都安排得满满当当,你只需要被动地跟着课表按部就班地完成一个个既定的任务。只要足够认真,结果都不会太差。但步入大学的校门,自由度一下子变大了许多。首先所有的课外时间基本都由你自由支配,没有人为你整理知识点,总结提纲,考试也不像高中那般模式化。如果你还抱着高中那种“乖学生”的心态,老老实实按部就班,结果未必如你所愿。因为专业培养方案未必就是合理,老师的教学未必就会负责,认真出席课堂未必就能听懂,甚至考试内容未必就和讲的有关系。说句玩笑话,你或许会觉得全世界都与你为敌,而你只能指望自己。

那么现状就是这么个现状,你想改变,也得先活过去,并且拥有足够的能力去质疑它。而在低年级,打好基础很重要。这里的基础是全方面的,课内的知识固然重要,但计算机很大程度上还是强调实践,因此有很多课本外的能力需要培养,而这恰恰是国内的计算机本科教育很欠缺的一点。我根据个人的体验总结出了下面几点建议,供大家参考。

其一就是了解如何写“优雅”的代码。国内的很多大一编程入门课都会讲成极其无聊的语法课,其效果还不如直接让学生看官方文档。事实上,在刚开始接触编程的时候,让学生试着去了解什么样的代码是优雅的,什么样的代码 "have bad taste" 是大有裨益的。一般来说,编程入门课会先介绍过程式编程(例如 C 语言)。但即便是面向过程编程,模块化封装 的思想也极其重要。如果你只想着代码能在 OpenJudge 上通过,写的时候图省事,用大段的复制粘贴和臃肿的 main 函数,长此以往,你的代码质量将一直如此。一旦接触稍微大一点的项目,无尽的 debug 和沟通维护成本将把你吞没。因此,写代码时不断问自己,是否有大量重复的代码?当前函数是否过于复杂(Linux 提倡每个函数只需要做好一件事)?这段代码能抽象成一个函数吗?一开始你可能觉得很不习惯,甚至觉得这么简单的题需要如此大费周章吗?但记住好的习惯是无价的,C 语言初中生都能学会,凭什么公司要招你去当程序员呢?

学过面向过程编程后,大一下学期一般会讲面向对象编程(例如 C++ 或 Java)。这里非常推荐大家看 MIT 6.031: Software Construction 这门课的 Notes,会以 Java 语言为例非常详细地讲解如何写出“优雅”的代码。例如 Test-Driven 的开发、函数 Specification 的设计、异常的处理等等等等。除此之外,既然接触了面向对象,那么了解一些常见的设计模式也是很有必要的。因为国内的面向对象课程同样很容易变成极其无聊的语法课,让学生纠结于各种继承的语法,甚至出一些无聊的脑筋急转弯一样的题目,殊不知这些东西在地球人的开发中基本不会用到。面向对象的精髓是让学生学会自己将实际的问题抽象成若干类和它们之间的关系,而设计模式则是前人总结出来的一些精髓的抽象方法。这里推荐大话设计模式 这本书,写得非常浅显易懂。

其二就是尝试学习一些能提高生产力的工具和技能,例如 Git、Shell、Vim。这里强烈推荐学习 MIT missing semester 这门课,也许一开始接触这些工具用起来会很不习惯,但强迫自己用,熟练之后开发效率会直线提高。此外,还有很多应用也能极大提高的你生产力。一条定律是:一切需要让手离开键盘的操作,都应该想办法去除。例如切换应用、打开文件、浏览网页这些都有相关插件可以实现快捷操作(例如 Mac 上的 Alfred)。如果你发现某个操作每天都会用到,并且用时超过1秒,那就应该想办法把它缩减到0.1秒。毕竟以后数十年你都要和电脑打交道,形成一套顺滑的工作流是事半功倍的。最后,学会盲打!如果你还需要看着键盘打字,那么赶紧上网找个教程学会盲打,这将极大提高你的开发效率。

其三就是平衡好课内和自学。我们质疑现状,但也得遵守规则,毕竟绩点在保研中还是相当重要的。因此在大一,我还是建议大家尽量按照自己的课表学习,但辅以一些优质的课外资源。例如微积分线代可以参考 MIT 18.01/18.02MIT 18.06 的课程 Notes。假期可以通过 UCB CS61A 来学习 Python。同时做到上面第一、第二点说的,注重好的编程习惯和实践能力的培养。就个人经验,大一的数学课学分占比相当大,而且数学考试的内容方差是很大的,不同学校不同老师风格迥异,自学也许能让你领悟数学的本质,但未必能给你一个好成绩。因此考前最好有针对性地刷往年题,充分应试。

在升入大二之后,计算机方向的专业课将居多,此时大家可以彻底放飞自我,进入自学的殿堂了。具体可以参考 一份仅供参考的CS学习规划,这是我根据自己三年自学经历总结提炼出来的全套指南,每门课的特点以及为什么要上这门课我都做了简单的介绍。对于你课表上的每个课程,这份规划里应该都会有相应的国外课程,而且在质量上我相信基本是全方位的碾压。由于计算机方向的专业知识基本是一样的,而且高质量的课程会让你从原理上理解知识点,对于国内大多照本宣科式的教学来说基本是降维打击。一般来说只要考前将老师“辛苦”念了一学期的 PPT 拿来突击复习两天,取得一个不错的卷面分数并不困难。如果有课程大作业,则可以尽量将国外课程的 Lab 或者 Project 修改一番以应付课内的需要。我当时上操作系统课,发现老师还用着早已被国外学校淘汰的课程实验,便邮件老师换成了自己正在学习的 MIT 6.S081 的 xv6 Project,方便自学的同时还无意间推动了课程改革。总之,灵活变通是第一要义,你的目标是用最方便、效率最高的方式掌握知识,所有与你这一目标违背的所谓规定都可以想方设法地去“糊弄”。凭着这份糊弄劲儿,我大三之后基本没有去过线下课堂(大二疫情在家呆了大半年),对绩点也完全没有影响。

最后,希望大家少点浮躁和功利,多一些耐心和追求。很多人发邮件问我自学需不需要很强的自制力,我觉得得关键得看你自己想要什么。如果你依然抱着会一门编程语言便能月薪过万的幻想,想分一杯互联网的红利,那么我说再多也是废话。其实我最初的自学并没有太多功利的想法,只是单纯的好奇和本能的求知欲。自学的过程也没有所谓的“头悬梁,锥刺股”,该吃吃,该玩玩,不知不觉才发现竟然攒下了这么多资料。现如今中美的对抗已然成为趋势,而我们还在“卑微”地“师夷长技”,感叹国外高质量课程的同时也时常会有一种危机感。这一切靠谁来改变呢?靠的是刚刚入行的你们。所以,加油吧,少年!

删繁就简

如果你已经本科毕业开始读研或者走上了工作岗位,亦或是从事着其他领域的工作想要利用业余时间转码,那么你也许并没有充足的业余时间来系统地学完 一份仅供参考的CS学习规划 里的内容,但又想弥补本科时期欠下的基础。考虑到这部分读者通常有一定的编程经验,入门课程没有必要再重复学习。而且从实用角度来说,由于工作的大体方向已经确定,确实没有太大必要对于每个计算机分支都有特别深入的研究,更应该侧重一些通用性的原则和技能。因此我结合自身经历,选取了个人感觉最重要也是质量最高的几门核心专业课,希望能更好地加深读者对计算机的理解。学完这些课程,无论你具体从事的是什么工作,我相信你将不可能沦为一个普通的调包侠,而是对计算机的底层运行逻辑有更深入的了解。

课程方向 课程名
离散数学和概率论 UCB CS70 : discrete Math and probability theory
数据结构与算法 Coursera: Algorithms I & II
软件工程 MIT 6.031: Software Construction
全栈开发 MIT web development course
计算机系统导论 CMU CS15213: CSAPP
体系结构入门 Coursera: Nand2Tetris
体系结构进阶 CS61C: Great Ideas in Computer Architecture
数据库原理 CMU 15-445: Introduction to Database System
计算机网络 Computer Networking: A Top-Down Approach
人工智能 Harvard CS50: Introduction to AI with Python
深度学习 Coursera: Deep Learning

心有所属

如果你对于计算机领域的核心专业课都掌握得相当扎实,而且已经确定了自己的工作或研究方向,那么书中还有很多未在 一份仅供参考的CS学习规划 提到的课程供你探索。

随着贡献者的不断增多,左侧的目录中将不断增加新的分支,例如 机器学习进阶机器学习系统。并且同一个分支下都有若干同类型课程,它们来自不同的学校,有着不同的侧重点和课程实验,例如 操作系统 分支下就包含了麻省理工、伯克利还有南京大学三个学校的课程。如果你想深耕一个领域,那么学习这些同类的课程会给你不同的角度来看待类似的知识。同时,本书作者还计划联系一些相关领域的科研工作者来分享某个细分领域的科研学习路径,让 CS自学指南 在追求广度的同时,实现深度上的提高。

如果你想贡献这方面的内容,欢迎和作者邮件联系 zhongyinmin@pku.edu.cn


最后更新: October 24, 2022
Back to top
\ No newline at end of file diff --git a/zh/后记/index.html b/zh/后记/index.html index f814ec6c..40e321f0 100644 --- a/zh/后记/index.html +++ b/zh/后记/index.html @@ -1,2 +1,16 @@ 后记 - CS自学指南
跳转至

后记

从最初的想法开始,到断断续续完成这本书,再到树洞的热烈反响,我很激动,但也五味杂陈。原来在北大这个园子里,也有那么多人,对自己的本科生涯并不满意。而这里,可是囊括了中国非常优秀的一帮年轻人。所以问题出在哪里?我不知道。

我只是个籍籍无名的本科生呀,只是一个单纯的求学者,我的目标只是想快乐地、自由地、高质量地掌握那些专业知识,我想,正在看这本书的大多数本科生也是如此,谁想付出时间但却收效甚微呢?又是谁迫使大家带着痛苦去应付呢?我不知道。

我写这本书绝不是为了鼓励大家翘课自学,试问谁不想在课堂上和那么多优秀的同学济济一堂,热烈讨论呢?谁不想遇到问题直接找老师答疑解惑呢?谁不想辛苦学习的成果可以直接化作学校承认的学分绩点呢?可如果一个兢兢业业、按时到堂的学生收获的却是痛苦,而那个一学期只有考试会出席的学生却学得自得其乐,这公平吗?我不知道。

我只是不甘,不甘心这些通过高考战胜无数人进入高校的学子本可以收获一个更快乐的本科生涯,但现实却留给了他们遗憾。我反问自己,本科教育究竟应该带给我们什么呢?是学完所有这些课程吗?倒也未必,它也许只适合我这种nerd。但我觉得,本科教育至少得展现它应有的诚意,一种分享知识的诚意,一种以人为本的诚意,一种注重学生体验的诚意。它至少不应该是一种恶意,一种拼比知识的恶意,一种胜者为王的恶意,一种让人学无所得的恶意。但这一切能改变吗?我不知道。

我只知道我做了应该做的事情,学生们会用脚投票,树洞的关注量和回帖数证明了这样一份资料是有价值的,也道出了国内CS本科教育和国外的差距。也许这样的改变是微乎其微的,但别忘了我只是一个籍籍无名的本科生,是北大信科一千多名本科生中的普通一员,是中国几百万在读本科生中的一分子,如果有更多的人站出来,每个人做一点点,也许是分享一个帖子,也许是当一门课的助教,也许是精心设计一门课的lab,更或许是将来获得教职之后开设一门高质量的课程,出版一本经典的教材。本科教育真的有什么技术壁垒吗?我看未必,教育靠的是诚意,靠的是育人之心。

今天是2021年12月12日,我期待在不久的将来这个帖子会被遗忘,大家可以满心欢喜地选着自己培养方案上的课程,做着学校自行设计的各类编程实验,课堂没有签到也能济济一堂,学生踊跃地发言互动,大家的收获可以和努力成正比,那些曾经的遗憾和痛苦可以永远成为历史。我真的很期待那一天,真的真的真的很期待。

PKUFlyingPig

2021年12月12日写于燕园


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/培养方案Pro/index.html b/zh/培养方案Pro/index.html index 3b6a810e..00b4ad90 100644 --- a/zh/培养方案Pro/index.html +++ b/zh/培养方案Pro/index.html @@ -1,2 +1,16 @@ 培养方案Pro - CS自学指南

培养方案Pro

under construction.


最后更新: November 30, 2021
Back to top
\ No newline at end of file diff --git a/zh/好书推荐/index.html b/zh/好书推荐/index.html index 289031a0..117f6083 100644 --- a/zh/好书推荐/index.html +++ b/zh/好书推荐/index.html @@ -7,4 +7,18 @@ 同板块下的顺序要求: 先中文后英文,同种语言先开源后闭源,最后按从基础到深入或者字母序。 -->

由于版权原因,下面列举的图书中除了开源资源提供了链接,其他的资源请大家自行通过 libgenz-lib 查找。

资源汇总

系统入门

操作系统

计算机网络

分布式系统

数据库系统

编译原理

计算机编程语言

体系结构

理论计算机科学

密码学

逆向工程

计算机图形学

游戏引擎

软件工程

设计模式

深度学习

计算机视觉

机器人

面试


最后更新: November 30, 2022
Back to top
\ No newline at end of file diff --git a/zh/并行与分布式系统/CS149/index.html b/zh/并行与分布式系统/CS149/index.html index 4df79624..7b9ba6b4 100644 --- a/zh/并行与分布式系统/CS149/index.html +++ b/zh/并行与分布式系统/CS149/index.html @@ -1,2 +1,16 @@ CMU 15-418/Stanford CS149: Parallel Computing - CS自学指南
跳转至

CMU 15-418/Stanford CS149: Parallel Computing

课程简介

  • 所属大学:CMU 和 Stanford
  • 先修要求:计算机体系结构,熟悉 C++
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

Kayvon Fatahalian 教授此前在 CMU 开了 15-418 这门课,后来他成为 Stanford 的助理教授后又开了类似的课程 CS149。但总体来说,15-418 包含的课程内容更丰富,并且有课程回放,但 CS149 的编程作业更 fashion 一些。我个人是观看的 15-418 的课程录影但完成的 CS149 的作业。

这门课会带你深入理解现代并行计算架构的设计原则与必要权衡,并学会如何充分利用硬件资源以及软件编程框架(例如 CUDA,MPI,OpenMP 等)编写高性能的并行程序。由于并行计算架构的复杂性,这门课会涉及诸多高级体系结构与网络通信的内容,知识点相当底层且硬核。与此同时,5 个编程作业则是从软件的层面培养学生对上层抽象的理解与运用,具体会让你分析并行程序的瓶颈、编写多线程同步代码、学习 CUDA 编程、OpenMP 编程以及前段时间大热的 Spark 框架等等。真正意义上将理论与实践完美地结合在了一起。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS149-parallel-computing - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/并行与分布式系统/MIT6.824/index.html b/zh/并行与分布式系统/MIT6.824/index.html index b697b9f5..06af12d7 100644 --- a/zh/并行与分布式系统/MIT6.824/index.html +++ b/zh/并行与分布式系统/MIT6.824/index.html @@ -1,2 +1,16 @@ MIT 6.824: Distributed System - CS自学指南
跳转至

MIT6.824: Distributed System

课程简介

  • 所属大学:MIT
  • 先修要求:计算机体系结构,并行编程
  • 编程语言:Go
  • 课程难度:🌟🌟🌟🌟🌟🌟
  • 预计学时:200 小时

这门课和 MIT 6.S081 一样,出品自 MIT 大名鼎鼎的 PDOS 实验室,授课老师 Robert Morris 教授曾是一位顶尖黑客,世界上第一个蠕虫病毒 Morris 病毒就是出自他之手。

这门课每节课都会精读一篇分布式系统领域的经典论文,并由此传授分布式系统设计与实现的重要原则和关键技术。同时其课程 Project 也是以其难度之大而闻名遐迩,4 个编程作业循序渐进带你实现一个基于 Raft 共识算法的 KV-store 框架,让你在痛苦的 debug 中体会并行与分布式带来的随机性和复杂性。

同样,这门课由于太过出名,网上答案无数,希望大家不要参考,而是力图自主实现整个 Project。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.824 - GitHub 中。

@OneSizeFitsQuorumLab 文档 较为清晰地介绍了实现 lab 1-4 和 challenge 1-2 时需要考虑的许多细节,在遇到瓶颈期时可以阅读一下~~


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/CMake/index.html b/zh/必学工具/CMake/index.html index 2f992c7e..fa5db2b9 100644 --- a/zh/必学工具/CMake/index.html +++ b/zh/必学工具/CMake/index.html @@ -1,2 +1,16 @@ CMake - CS自学指南
跳转至

CMake

为什么学习 CMake

CMake 是类似于 GNU make 的跨平台自动软件构建工具,使用 CMakeLists.txt 定义构建规则,相比于 make 它提供了更多的功能,在各种软件构建上广泛使用。强烈建议学习使用 GNU Make 和熟悉 Makefile 后再学习 CMake

如何学习 CMake

CMakeLists.txtMakefile 更为抽象,理解和使用难度也更大。现阶段很多 IDE (如 Visual Studio, CLion) 提供了自动生成 CMakeLists.txt 的功能,但掌握 CMakeLists.txt 的基本用法仍然很有必要。除了 CMake 官方 Tutorial 外,上海交通大学 IPADS 组新人培训也提供了大约一小时的视频教程


最后更新: July 8, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/Docker/index.html b/zh/必学工具/Docker/index.html index 6a36165d..4a8e2504 100644 --- a/zh/必学工具/Docker/index.html +++ b/zh/必学工具/Docker/index.html @@ -1,2 +1,16 @@ Docker - CS自学指南
跳转至

Docker

为什么使用 Docker

使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。

Docker 的出现让环境配置变得(或许)不再折磨。简单来说 Docker 使用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的环境配置被打包为一个个 image 可以自由运行在不同平台的一个个 container 中,这极大地节省了所有人的时间成本。

如何学习 Docker

Docker 官方文档当然是最好的初学教材,但最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。Docker 在工业界发展迅猛并已经非常成熟,你可以下载它的桌面端并使用图形界面。

当然,如果你像我一样,是一个疯狂的造轮子爱好者,那不妨自己亲手写一个迷你 Docker 来加深理解。

KodeKloud Docker for the Absolute Beginner 全面的介绍了 Docker 的基础功能,并且有大量的配套练习,同时提供免费的云环境来完成练习。其余的云相关的课程如 Kubernetes 需要付费,但个人强烈推荐:讲解非常仔细,适合从 0 开始的新手;有配套的 Kubernetes 的实验环境,不用被搭建环境劝退。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/GNU_Make/index.html b/zh/必学工具/GNU_Make/index.html index 6c68b8ba..b89bb7f3 100644 --- a/zh/必学工具/GNU_Make/index.html +++ b/zh/必学工具/GNU_Make/index.html @@ -1,2 +1,16 @@ GNU Make - CS自学指南
跳转至

GNU Make

为什么学 GNU Make

大家第一次写 hello world 程序的时候一定都记得,在编辑完 helloworld.c 之后,需要用 gcc 编译生成可执行文件,然后再执行(如果你不理解前面这段话,请先自行谷歌 gcc 编译 并理解相关内容)。但如果你的项目由成百上千个 C 源文件组成,并且星罗棋布在各个子目录下,你该如何将它们编译链接到一起呢?假如你的项目编译一次需要半个小时(大型项目相当常见),而你只修改了一个分号,是不是还需要再等半个小时呢?

这时候 GNU Make 就闪亮登场了,它能让你在一个脚本里(即所谓的 Makefile)定义整个编译流程以及各个目标文件与源文件之间的依赖关系,并且只重新编译你的修改会影响到的部分,从而降低编译的时间。

如何学习 GNU Make

这里有一篇写得深入浅出的文档供大家参考。

GNU Make 掌握起来相对容易,但用好它需要不断的练习。将它融入到自己的日常开发中,勤于学习和模仿其他优秀开源项目里的 Makefile 的写法,总结出适合自己的 template,久而久之,你对 GNU Make 的使用会愈加纯熟。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/Git/index.html b/zh/必学工具/Git/index.html index 508dac56..a762b73a 100644 --- a/zh/必学工具/Git/index.html +++ b/zh/必学工具/Git/index.html @@ -1,2 +1,16 @@ Git - CS自学指南
跳转至

Git

为什么使用 Git

Git 是一款分布式的代码版本控制工具,Linux 之父 Linus 嫌弃当时主流的中心式的版本控制工具太难用还要花钱,就自己开发出了 Git 用来维护 Linux 的版本(给大佬跪了)。

Git 的设计非常优雅,但初学者通常因为很难理解其内部逻辑因此会觉得非常难用。对 Git 不熟悉的初学者很容易出现因为误用命令将代码给控制版本控制没了的状况(好吧是我)。

但相信我,和 Vim 一样,Git 是一款你最终掌握之后会感叹“它值得!”的神器。

如何学习 Git

和 Vim 不同,我不建议初学者在一知半解的情况下贸然使用 Git,因为它的内部逻辑并不能熟能生巧,而是需要花时间去理解。我推荐的学习路线如下:

  1. 阅读这篇 Git tutorial,视频的话可以看这个尚硅谷Git教程
  2. 阅读这本开源书籍 Pro Git 的 Chapter1 - Chapter5,是的没错,学 Git 需要读一本书(捂脸)。
  3. 此时你已经掌握了 Git 的原理和绝大部分用法,接下来就可以在实践中反复巩固 Git 的命令了。但用好它同样是一门哲学,我个人觉得这篇如何写好 Commit Message 的博客非常值得一读。
  4. 好的此时你已经爱上了 Git,你已经不满足于学会它了,你想自己实现一个 Git!巧了,我当年也有这样的想法,这篇 tutorial 可以满足你!
  5. 什么?光实现一个 Git 无法满足你?小伙子/小仙女有前途,巧的是我也喜欢造轮子,这两个 GitHub 项目 build-your-own-xproject-based-learning 收录了你能想到的各种造轮子教程,比如:自己造个编辑器、自己写个虚拟机、自己写个 docker、自己写个 TCP 等等等等。

最后更新: May 12, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/GitHub/index.html b/zh/必学工具/GitHub/index.html index ddc19a18..0226a8ca 100644 --- a/zh/必学工具/GitHub/index.html +++ b/zh/必学工具/GitHub/index.html @@ -1,2 +1,16 @@ GitHub - CS自学指南
跳转至

GitHub

GitHub 是什么

从功能上来说,GitHub 是一个在线代码托管平台。你可以将你的本地 Git 仓库托管到 GitHub 上,供多人同时开发浏览。但现如今 GitHub 的意义已远不止如此,它已经演变为一个非常活跃且资源极为丰富的开源交流社区。全世界的软件开发者在 GitHub 上分享各式各样种类繁多的开源软件。大到工业级的深度学习框架 PyTorch, TensorFlow,小到几十行的实用脚本,既有硬核的知识分享,也有保姆级的教程指导,甚至很多技术书籍也在 GitHub上开源(例如诸位正在看的这本——如果我厚着脸皮勉强称之为书的话)。闲来无事逛逛 GitHub 已经成为了我日常生活的一部分。

在 GitHub 里,星星是对一个项目至高无上的肯定,如果你觉得这本书对你有用的话,欢迎通过右上角的链接进入仓库主页献出你宝贵的星星✨。

如何使用 GitHub

如果你还从未在 GitHub 上建立过自己的远程仓库,也没有克隆过别人的代码,那么我建议你从 GitHub的官方教程开始自己的开源之旅。

如果你想时刻关注 GitHub 上一些有趣的开源项目,那么我向你重磅推荐 HelloGitHub 这个网站以及它的同名微信公众号。它会定期收录 GitHub 上近期开始流行的或者非常有趣的开源项目,让你有机会第一时间接触各类优质资源。

GitHub 之所以成功,我想是得益于“我为人人,人人为我”的开源精神,得益于知识分享的快乐。如果你也想成为下一个万人敬仰的开源大佬,或者下一个 star 破万的项目作者。那就把你在开发过程中灵感一现的 idea 化作代码,展示在 GitHub 上吧~

不过需要提醒的是,开源社区不是法外之地,很多开源软件并不是可以随意复制分发甚至贩卖的,了解各类开源协议并遵守,不仅是法律的要求,更是每个开源社区成员的责任。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/LaTeX/index.html b/zh/必学工具/LaTeX/index.html index bcf25fb0..573a710f 100644 --- a/zh/必学工具/LaTeX/index.html +++ b/zh/必学工具/LaTeX/index.html @@ -1,2 +1,16 @@ LaTeX - CS自学指南
跳转至

LaTeX

为什么学 LaTeX

如果你需要写论文,那么请直接跳到下一节,因为你不学也得学。

LaTeX 是一种基于 TeX 的排版系统,由图灵奖得主 Lamport 开发,而 Tex 则是由 Knuth 最初开发,这两位都是计算机界的巨擘。当然开发者强并不是我们学习 LaTeX 的理由,LaTeX 和常见的所见即所得的 Word 文档最大的区别就是用户只需要关注写作的内容,而排版则完全交给软件自动完成。这让没有任何排版经验的普通人得以写出排版非常专业的论文或文章。

Berkeley计算机系教授 Christos Papadimitriou 曾说过一句半开玩笑的话:

Every time I read a LaTeX document, I think, wow, this must be correct!

如何学习 LaTeX

推荐的学习路线如下:

  • LaTeX 的环境配置是个比较头疼的问题。如果你本地配置 LaTeX 环境出现了问题,可以考虑使用 Overleaf 这个在线 LaTeX 编辑网站。站内不仅有各种各样的 LaTeX 模版供你选择,还免去了环境配置的难题。
  • 阅读下面三篇 Tutorial: Part-1, Part-2, Part-3
  • 学习 LaTeX 最好的方式当然是写论文,不过从一门数学课入手用 LaTeX 写作业也是一个不错的选择。

最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/Scoop/index.html b/zh/必学工具/Scoop/index.html index 40bc6432..336385ac 100644 --- a/zh/必学工具/Scoop/index.html +++ b/zh/必学工具/Scoop/index.html @@ -9,4 +9,18 @@ irm get.scoop.sh -outfile 'install.ps1'

使用 Scoop

Scoop 的官方文档对于新手非常友好,相对于在此处赘述更推荐阅读 官方文档快速入门

Q&A

Scoop 能配置镜像源吗?

Scoop 社区仅维护安装配置,所有的软件都是从该软件官方提供的下载链接进行下载,所以无法提供镜像源。如果因为你的网络环境导致多次下载失败,那么你需要一点点 魔法

为什么找不到 Java8?

原因同上,官方已不再提供 Java8 的下载链接,推荐使用 ojdkbuild8 替代。

我需要安装 python2 该如何操作?

对于已经过时弃用的软件,Scoop 社区会将其从 ScoopInstaller/Main 中移除并将其添加到 ScoopInstaller/Versions 中。如果你需要这些软件的话需要手动添加 bucket:

scoop bucket add versions
 scoop install python27
 

最后更新: December 21, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/Vim/index.html b/zh/必学工具/Vim/index.html index 3a4cc7f8..af8332e3 100644 --- a/zh/必学工具/Vim/index.html +++ b/zh/必学工具/Vim/index.html @@ -1,2 +1,16 @@ Vim - CS自学指南
跳转至

Vim

为什么学习 Vim

在我看来 Vim 编辑器有如下的好处:

  • 让你的整个开发过程手指不需要离开键盘,而且光标的移动不需要方向键使得你的手指一直处在打字的最佳位置。
  • 方便的文件切换以及面板控制可以让你同时开发多份文件甚至同一个文件的不同位置。
  • Vim 的宏操作可以批量化处理重复操作(例如多行 tab,批量加双引号等等)
  • Vim 是很多服务器自带的命令行编辑器,当你通过 ssh 连接远程服务器之后,由于没有图形界面,只能在命令行里进行开发(当然现在很多 IDE 如 PyCharm 提供了 ssh 插件可以解决这个问题)。
  • 异常丰富的插件生态,让你拥有世界上最花里胡哨的命令行编辑器。

如何学习 Vim

不幸的是 Vim 的学习曲线确实相当陡峭,我花了好几个星期才慢慢适应了用 Vim 进行开发的过程。最开始你会觉得非常不适应,但一旦熬过了初始阶段,相信我,你会爱上 Vim。

Vim 的学习资料浩如烟海,但掌握它最好的方式还是将它用在日常的开发过程中,而不是一上来就去学各种花里胡哨的高级 Vim 技巧。个人推荐的学习路线如下:

  • 先阅读这篇 tutorial,掌握基本的 Vim 概念和使用方式。
  • 用 Vim 自带的 vimtutor 进行练习,安装完 Vim 之后直接在命令行里输入 vimtutor 即可进入练习程序。
  • 最后就是强迫自己使用 Vim 进行开发,IDE 里可以安装 Vim 插件。
  • 等你完全适应 Vim 之后新的世界便向你敞开了大门,你可以按需配置自己的 Vim(修改 .vimrc 文件),网上有数不胜数的资源可以借鉴。
  • 如果你想对配置 Vim 有更加深入的了解,Learn Vim Script the Hard Way 是一个很好的资源。

关于键位映射

用 Vim 编辑代码的时候会频繁用到 ESC 和 CTRL 键, 但是这两个键都离 home row 很远, 可以把 CapsLock 键映射到 Esc 或者 Ctrl 键,让手更舒服一些。

Windows 系统可以使用 Powertoys 或者 AutoHotkey 重映射键位。
MacOS 系统提供了重映射键位的设置,另外也可以使用 Karabiner-Elements 重映射。

但更佳的做法是同时将 CapsLock 映射为 Ctrl 和 Esc,点按为 Esc,按住为 Ctrl。

Windows 系统下,这个AutoHotKey gist 实现了这个功能。
MacOS 可以导入这个 karabiner rule 重映射。

推荐参考资料

  • Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
  • Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.

最后更新: December 5, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/thesis/index.html b/zh/必学工具/thesis/index.html index 2fb03e2b..1e2ee7bc 100644 --- a/zh/必学工具/thesis/index.html +++ b/zh/必学工具/thesis/index.html @@ -1,2 +1,16 @@ 毕业论文 - CS自学指南
跳转至

毕业论文

为什么写这份教程

2022年,我本科毕业了。在开始动手写毕业论文的时候,我尴尬地发现,我对 Word 的掌握程度仅限于调节字体、保存导出这些傻瓜功能。曾想转战 Latex,但论文的段落格式要求调整起来还是用 Word 更为方便,经过一番痛苦缠斗之后,总算是有惊无险地完成了论文的写作和答辩。为了不让后来者重蹈覆辙,遂把相关资源整理成一份开箱即用的文档,供大家参考。

如何用 Word 写毕业论文

正如将大象装进冰箱需要三步,用 Word 写毕业论文也只需要简单三步:

  • 确定论文的格式要求:通常学院都会下发毕业论文的格式要求(各级标题的字体字号、图例和引用的格式等等),如果更为贴心的话甚至会直接给出论文模版(如是此情况请直接跳转到下一步)。很不幸的是,我的学院并没有下发标准的论文格式要求,还提供了一份格式混乱几乎毫无用处的论文模版膈应我,被逼无奈之下我找到了北京大学研究生的论文格式要求,并按照其要求制作了一份模版,大家需要的话自取,本人不承担无法毕业等任何责任。

  • 学习 Word 排版:到达这一步的童鞋分为两类,一是已经拥有了学院提供的标准模版,二是只有一份虚无缥缈的格式要求。那现在当务之急就是学习基础的 Word 排版技术,对于前者可以学会使用模版,对于后者则可以学会制作模版。此时切记不要雄心勃勃地选择一个十几个小时的 Word 教学视频开始头悬梁锥刺股,因为生产一份应付毕业的学术垃圾只要学半小时能上手就够了。我当时看的一个 B 站的教学视频,短小精悍非常实用,全长半小时极速入门。

  • 生产学术垃圾:最容易的一步,大家八仙过海,各显神通吧,祝大家毕业顺利~~


最后更新: June 19, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/tools/index.html b/zh/必学工具/tools/index.html index 69222c45..04df71ff 100644 --- a/zh/必学工具/tools/index.html +++ b/zh/必学工具/tools/index.html @@ -1,2 +1,16 @@ 实用工具箱 - CS自学指南
跳转至

实用工具箱

下载工具

设计工具

  • excalidraw: 一款手绘风格的绘图工具,非常适合绘制课程报告或者PPT内的示意图。
  • tldraw: 一个绘图工具,适合画流程图,架构图等。
  • origamiway: 手把手教你怎么折纸。
  • thingiverse: 囊括各类 2D/3D 设计资源,其 STL 文件下载可直接 3D 打印。
  • iconfont: 国内最大的图标和插画资源库,可用于开发或绘制系统架构图。
  • turbosquid: 可以购买各式各样的模型。
  • flaticon: 可下载免费且高质量的图标。
  • 标准地图服务系统: 可以下载官方标准地图。

编程相关

  • sqlfiddle: 一个简易的在线 SQL Playground。
  • sqlzoo:在线练习 sql 语句。
  • godbolt: 非常方便的编译器探索工具。你可以写一段 C/C++ 代码,选择一款编译器,然后便可以观察生成的具体汇编代码。
  • explainshell: 你是否曾为一段 shell 代码的具体含义感到困扰?manpage 看半天还是不明所以?试试这个网站!
  • regex101: 正则表达式调试网站,支持各种编程语言的匹配标准。
  • typingtom: 针对程序员的打字练习/测速网站。
  • wrk: 网站压测工具。
  • gbmb: 数据单位转换。
  • tools: 在线工具合集。
  • github1s: 用网页版 VS Code 在线阅读 GitHub 代码。
  • visualgo: 算法可视化网站。
  • DataStructureVisual: 数据结构可视化网站。
  • Data Structure Visualizations: 数据结构与算法的可视化网站。
  • learngitbranching: 可视化学习 git。
  • UnicodeCharacter: Unicode 字符集网站。

学习网站

杂项


最后更新: December 15, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/workflow/index.html b/zh/必学工具/workflow/index.html index 23baf6ab..fd5b6050 100644 --- a/zh/必学工具/workflow/index.html +++ b/zh/必学工具/workflow/index.html @@ -1,2 +1,16 @@ 日常学习工作流 - CS自学指南
跳转至

日常学习工作流

Contributed by @HardwayLinka

计算机领域的知识覆盖面很广并且更新速度很快,因此保持终身学习的习惯很重要。但在日常开发和学习的过程中,我们获取知识的来源相对复杂且细碎。有成百上千页的文档手册,也有寥寥数语的博客,甚至闲暇时手机上划过的某则新闻和公众号都有可能包含我们感兴趣的知识。因此,如何利用现有的各类工具,形成一套适合自己的学习工作流,将不同来源的知识碎片整合进属于自己的知识库,方便之后的查阅与复习,就显得尤为重要。经过两年工作之余的学习后,我磨合出了以下学习工作流:

底层核心逻辑

一开始我学习新知识时会参考中文博客,但在代码实践时往往会发现漏洞和bug。我逐渐意识到我参考的信息可能是错误的,毕竟发博客的门槛低,文章可信度不高,于是我开始查阅一些相关的中文书籍。

中文书籍的确是比较全面且系统地讲解了知识点,但众所周知,计算机技术更迭迅速,又因为老美在 CS 方面一直都是灯塔,所以一般中文书籍里的内容会滞后于当前最新的知识,导致我跟着中文书籍实践会出现软件版本差异的问题。这时我开始意识到一手信息的重要性,有些中文书籍是翻译英文书籍的,一般翻译一本书也要一两年,这会导致信息传递的延迟,还有就是翻译的过程中信息会有损失。如果一本中文书籍不是翻译的呢,那么它大概率也参考了其他书籍,参考的过程会带有对英文原著中语义理解的偏差。

于是我就顺其自然地开始翻阅英文书籍。不得不说,英文书籍内容的质量整体是比中文书籍高的。后来随着学习的层层深入,以知识的时效性和完整性出发,我发现 源代码 > 官方文档 > 英文书籍 > 英文博客 > 中文博客,最后我得出了一张 信息损失图

虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。

现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。

选择合适的笔记软件

工作流的骨架围绕 单个知识点多参考源,勤于提问给多个知识点之间建立联系 的底层核心逻辑建立。我们写论文其实就是遵循这个底层逻辑的。论文一般会有脚注去解释一些关键字,并且论文末尾会有多个参考的来源,但是我们平时写笔记会随意得多,因此需要更灵活的方式。

平时写代码习惯在 IDE 里一键跳转,把相关的函数和实现很好地联系在了一起。你也许会想,如果笔记也能像代码那样可以跳转就好了。现在市面上 双链笔记软件 就可以很好地解决这一痛点,例如 Roam Research、Logseq、Notion 和 Obsidian。Roam Research 和 Logseq 都是基于大纲结构的笔记软件,而 大纲结构 是劝退我使用这两款软件的原因。一是 大纲结构 做笔记容易使文章纵向篇幅太长,二是如果嵌套结构过多会占横向的篇幅。Notion 页面打开慢,弃之。最终我选择了 Obsidian,原因如下:

  • Obsidian 基于本地,打开速度快,且可存放很多电子书。我的笔记本是 32g 内存的华硕天选一代,拿来跑 Obsidian 可以快到飞起
  • Obsidian 基于 Markdown。这也是一个优势,如果笔记软件写的笔记格式是自家的编码格式,那么不方便其他第三方拓展,也不方便将笔记用其他软件打开,比如 qq 音乐下载歌曲有自己的格式,其他播放器播放不了,这挺恶心人的
  • Obsidian 有丰富的插件生态,并且这个生态既大又活跃,即插件数量多,且热门插件的 star 多,开发者会反馈用户 issue,版本会持续迭代。借助这些插件,可以使 Osidian 达到 all in one 的效果,即各类知识来源可以统一整合于一处

信息的来源

Obsidian 的插件使其可以支持 pdf 格式,而其本身又支持 Markdown 格式。如果想要 all in one,那么可以基于这两个格式,将其他格式文件转换为 pdf 或者 Markdown。 那么现在就面临着两个问题:

  • 有什么格式
  • 怎么转换为 pdf 或 Markdown

有什么格式

文件格式依托于其展示的平台,所以在看有什么格式之前,可以罗列一下我平时获取信息的来源:

可以看到主要分为文章论文电子书课程四类,包含的格式主要有 网页pdfmobiazwazw3

怎么转换为 pdf 或 Markdown

在线的文章和课程等大多以网页形式呈现,而将网页转换为 Markdown 可以使用剪藏软件,它可以将网页文章转换为多种文本格式文件。我选择的工具是简悦,使用简悦可以将几乎所有平台的文章很好地剪藏为 Markdown 并且导入到 Obsidian。

对于论文和电子书而言如果格式本身就是 pdf 则万事大吉,但如果是其他格式则可以使用 calibre 进行转换:

现在利用 Obsidian 的 pdf 插件和其原生的 markdown 支持就可以畅快无比地做笔记并且在这些文章的对应章节进行无缝衔接地引用跳转啦(具体操作参考下文的“信息的处理”模块)。

如何统一管理信息来源

对于 pdf 等文件类资源可以本地或者云端存储,而网页类资源则可以分门别类地放入浏览器的收藏夹,或者剪藏成 markdown 格式的笔记,但是网页浏览器不能实现移动端的网页收藏。为了实现跨端网页收藏我选用了 Cubox,在手机端看到感兴趣的网页时只需小手一划,便能将网页统一保存下来。虽然免费版只能收藏 100 个网页,但其实够用了,还可以在收藏满时督促自己赶紧剪藏消化掉这些网页,让收藏不吃灰。

除此之外,回想一下我们平时收藏的网页,就会发现有很多并不是像知乎、掘金这类有完整功能的博客平台,更多的是个人建的小站,而这些小站往往没有移动端应用,这样平时刷手机的时候也看不到,放到浏览器的收藏夹里又容易漏了看,有新文章发布我们也不能第一时间收到通知,这个时候就需要一种叫 RSS 的通信协议。

RSS(英文全称:RDF Site Summary 或 Really Simple Syndication),中文译作简易信息聚合,也称聚合内容,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。电脑端可以借助 RSSHub Radar 来快速发现和生成 RSS 订阅源,接着使用 Feedly 来订阅这些 RSS 订阅源(RSSHub RadarFeedly 在 chrome 浏览器中均有官方插件)。

到这里为止,收集信息的流程已经比较完备了。但资料再多,分类规整得再漂亮,也得真正内化成自己的才管用。因此在收集完信息后就得进一步地处理信息,即阅读这些信息,如果是英文信息的话还得搞懂英文的语义,加粗高亮重点句子段落,标记有疑问的地方,发散联想相关的知识点,最后写上自己的总结。那么在这过程中需要使用到什么工具呢?

信息的处理

英文信息

面对英文的资料,我以前是用 有道词典 来划词翻译,遇到句子的话就使用谷歌翻译,遇到大段落时就使用 deepl,久而久之,发现这样看英语文献太慢了,得用三个工具才能满足翻译这一个需求,如果有一个工具能够同时实现对单词、句子和段落的划词翻译就好了。我联想到研究生们应该会经常接触英语文献,于是我就搜 研究生 + 翻译软件,在检索结果里我最终选择了 Quicker + 沙拉查词 这个搭配来进行划词翻译。

使用这套组合可以实现在浏览器外的其他软件内进行划词翻译,并且支持单词、句子和段落的翻译,以及每次的翻译会有多个翻译平台的结果。btw,如果查单词时不着急的话,可以顺便看看 科林斯高阶 的翻译,这个词典的优点就是会用英文去解释英文,可以提供多个上下文帮助你理解,对于学习英文单词也有帮助,因为用英文解释英文才更接近英语的思维。

多媒体信息

处理完文本类的信息后,我们还得思考一下怎么处理多媒体类的信息。此处的多媒体我特指英文视频,因为我没有用播客或录音学习的习惯,而且我已经基本不看中文教程了。现在很多国外名校公开课都是以视频的形式,如果能对视频进行做笔记会不会有帮助呢?不知道大家有没这样的想法,就是如果能把老师上课讲的内容转换成文本就好了,因为平时学习时我们看书的速度往往会比老师讲课的速度快。刚好 Language Reactor 这个软件可以将油管和网飞内视频的字幕导出来,同时附上中文翻译。

我们可以把 Language Reactor 导出的字幕复制到 Obsidian 里面作为文章来读。除了出于学习的需求,也可以在平时看油管的视频时打开这个插件,这个插件可以同时显示中英文字幕,并且可以单击选中英文字幕中你认为生僻的单词后显示单词释义。

但阅读文本对于一些抽象的知识点来说并不是效率最高的学习方式。俗话说,一图胜千言,能不能将某一段知识点的文本和对应的图片甚至视频画面操作联系起来呢?我在浏览 Obsidian 的插件市场时,发现了一个叫 Media Extended 的插件,这个插件可以在你的笔记里添加跳转到视频指定时间进度的链接,相当于把你的笔记和视频连接起来了!这刚好可以和我上文提到的生成视频中英文字幕搭配起来,即每一句字幕对应一个时间,并且能根据时间点跳转到视频的指定进度,如此一来如果需要在文章中展示记录了操作过程的视频的话,就不需要自己去截取对应的视频片段,而是直接在文章内就能跳转!

Obsidian 里还有一个很强大的插件,叫 Annotator,它可以实现笔记内跳转到 pdf 原文

现在,使用 Obsidian 自带的双链功能,可以实现笔记间相互跳转,结合上述两个插件,可以实现笔记到多媒体的跳转,信息的处理过程已经完备。一般我们学习的过程相当于上山和下山,刚学的时候就好像上山,很陌生、吃力,所谓学而时习之,复习或练习的过程就像下山,没有陌生感,不见得轻松,但非走不可。那么如何把复习这一过程纳入工作流的环节里呢?

信息的回顾

Obsidian 内已经有一个连接 Anki 的插件,Anki 就是大名鼎鼎的、基于间隔重复的记忆软件。使用该插件可以截取笔记的片段导出到 Anki 并变成一张卡片,卡片内也有跳转回笔记原文的链接

总结

这个工作流是在我这两年业余时间学习时所慢慢形成的,在学习过程中因为对一些重复性的过程而感到厌倦,正是这种厌倦产生了某种特定的需求,恰好在平时网上冲浪时了解到的一些工具满足了我这些需求。不要为了虚无的满足感而将工具强行拼凑到自己的工作流中,人生苦短,做实事最紧要。

btw,此篇文章是讲解工作流的演化思路,如果对此工作流的实现细节感兴趣,建议阅读完本文后再按顺序阅读以下文章

  1. 3000 + 小时积累的学习工作流
  2. Obsidian 的高级玩法 | 打造能跳转到任何格式文件的笔记

最后更新: October 21, 2022
Back to top
\ No newline at end of file diff --git a/zh/必学工具/翻墙/index.html b/zh/必学工具/翻墙/index.html index 5d3ac031..f16188f7 100644 --- a/zh/必学工具/翻墙/index.html +++ b/zh/必学工具/翻墙/index.html @@ -1,2 +1,16 @@ 翻墙 - CS自学指南
跳转至

翻墙

此链接出现在这里纯属二进制 bit 的随意组合,与本人毫无关系。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/操作系统/CS162/index.html b/zh/操作系统/CS162/index.html index c4a2c267..f7c832fe 100644 --- a/zh/操作系统/CS162/index.html +++ b/zh/操作系统/CS162/index.html @@ -1,2 +1,16 @@ UCB CS162: Operating System - CS自学指南
跳转至

CS162: Operating System

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:C, x86汇编
  • 课程难度:🌟🌟🌟🌟🌟🌟
  • 预计学时:200 小时+,上不封顶

这门课让我记忆犹新的有两个部分:

首先是教材,这本书用的教材 Operating Systems: Principles and Practice (2nd Edition) 一共四卷,写得非常深入浅出,很好地弥补了 MIT6.S081 在理论知识上的些许空白,非常建议大家阅读。相关资源会分享在本书的经典书籍推荐模块。

其次是这门课的 Project —— Pintos。Pintos 是由 Ben Pfaff 等人在 x86 平台上编写的教学用操作系统,Ben Pfaff 甚至专门发了篇 paper 来阐述 Pintos 的设计思想。

和 MIT 的 xv6 小而精的 lab 设计理念不同,Pintos 更注重系统的 Design and Implementation。Pintos 本身仅一万行左右,只提供了操作系统最基本的功能。而 4 个Project,就是让你在这个极为精简的操作系统之上,分别为其增加线程调度机制 (Project1),系统调用 (Project2),虚拟内存 (Project3) 以及文件系统 (Project4)。所有的 Project 都给学生留有很大的设计空间,总代码量在 2000 行左右。根据 Stanford 学生自己的反馈,在 3-4 人组队的情况下,后两个 Project 的人均耗时也在 40 个小时以上。

虽然难度很大,但 Stanford, Berkeley, JHU 等多所美国顶尖名校的操统课程均采用了 Pintos。如果你真的对操作系统很感兴趣,Pintos 会极大地提高你编写和 debug 底层系统代码的能力。在本科阶段,能自己设计、实现并 debug 一个大型系统,是一段非常珍贵的经历。

北大 2022 年春季学期的操作系统实验班也将会首次引入 Pintos 作为课程 Project。我和该课程的另一位助教整理并完善了 Pintos 的实验文档,并利用 Docker 配置了跨平台的实验环境,想自学的同学可以按文档自行学习。在毕业前的最后一个学期,希望能用这样的尝试,让更多人爱上系统领域,为国内的系统研究添砖加瓦。

课程资源

资源汇总

由于北大的操统实验班采用了该课程的 Project,为了防止代码抄袭,我的代码实现没有开源。


最后更新: May 11, 2022
Back to top
\ No newline at end of file diff --git a/zh/操作系统/MIT6.S081/index.html b/zh/操作系统/MIT6.S081/index.html index fd6761ca..b1dba82b 100644 --- a/zh/操作系统/MIT6.S081/index.html +++ b/zh/操作系统/MIT6.S081/index.html @@ -1,2 +1,16 @@ MIT 6.S081: Operating System Engineering - CS自学指南
跳转至

MIT 6.S081: Operating System Engineering

课程简介

  • 所属大学:麻省理工学院
  • 先修要求:体系结构 + 扎实的 C 语言功底 + RISC-V 汇编语言
  • 编程语言:C, RISC-V
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

麻省理工学院大名鼎鼎的 PDOS 实验室开设的面向MIT本科生的操作系统课程。开设这门课的教授之一 —— Robert Morris 教授曾是一位顶尖黑客,世界上第一个蠕虫病毒 Morris 就是出自他之手。

这门课的前身是 MIT 著名的课程 6.828,MIT 的几位教授为了这门课曾专门开发了一个基于 x86 的教学用操作系统 JOS,被众多名校作为自己的操统课程实验。但随着 RISC-V 的横空出世,这几位教授又基于 RISC-V 开发了一个新的教学用操作系统 xv6,并开设了 MIT6.S081 这门课。由于 RISC-V 轻便易学的特点,学生不需要像此前 JOS 一样纠结于众多 x86 “特有的”为了兼容而遗留下来的复杂机制,而可以专注于操作系统层面的开发。

这几位教授还专门写了一本教程,详细讲解了 xv6 的设计思想和实现细节。

这门课的讲授也很有意思,老师会带着学生依照 xv6 的源代码去理解操作系统的众多机制和设计细节,而不是停留于理论知识。每周都会有一个 lab,让你在 xv6 上增加一些新的机制和特性,非常注重学生动手能力的培养。整个学期一共有 11 个 lab,让你全方位地深刻理解操作系统的每个部分,非常有成就感。而且所有的lab都有着非常完善的测试框架,有的测试代码甚至上千行,让人不得不佩服 MIT 的几位教授为了教好这门课所付出的心血。

这门课的后半程会讲授操作系统领域的多篇经典论文,涉及文件系统、系统安全、网络、虚拟化等等多个主题,让你有机会接触到学界最前沿的研究方向。

课程资源

xv6 补充资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.S081-2020fall - GitHub 中。

@KuangjuX 编写了 MIT 6.S081 的 lab 的题解,里面有详细的解法和补充知识。另外,@KuangjuX 还使用 Rust 语言重新实现了 xv6-riscv 操作系统:xv6-rust,里面对于 xv6-riscv 有更为详细的思考和讨论,感兴趣的同学可以看一下哦。

一些可以参考的博客


最后更新: October 28, 2022
Back to top
\ No newline at end of file diff --git a/zh/操作系统/NJUOS/index.html b/zh/操作系统/NJUOS/index.html index 56529cc1..90af7ac5 100644 --- a/zh/操作系统/NJUOS/index.html +++ b/zh/操作系统/NJUOS/index.html @@ -1,2 +1,16 @@ NJU OS: Operating System Design and Implementation - CS自学指南
跳转至

NJU OS: Operating System Design and Implementation

课程简介

  • 所属大学:南京大学
  • 先修要求:体系结构 + 扎实的 C 语言功底
  • 编程语言:C 语言
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:150 小时

之前一直听说南大的蒋炎岩老师开设的操作系统课程讲得很好,久闻不如一见,这学期有幸在 B 站观看了蒋老师的课程视频,确实收获良多。蒋老师作为非常年轻的老师,有着丰富的一线代码的经验,因此课程讲授有着满满的 Hacker 风格,课上经常“一言不合”就在命令行里开始写代码,很多重要知识点也都配有生动直白的代码示例。让我印象最为深刻的就是老师为了让学生更好地理解动态链接库的设计思想,甚至专门实现了一个迷你的可执行文件与一系列的二进制工具,让很多困扰我多年的问题都得到了解答。

这门课的讲授思路也非常有趣,蒋老师先从“程序就是状态机”这一视角入手,为“万恶之源”并发程序建立了状态机的转化模型,并在此基础上讲授了并发控制的常见手段以及并发bug的应对方法。接着蒋老师将操作系统看作一系列对象(进程/线程、地址空间、文件、设备等等)以及操作它们的 API (系统调用)并结合丰富的实际例子介绍了操作系统是如何利用这系列对象虚拟化硬件资源并给应用软件提供各类服务的。最后的可持久化部分,蒋老师从 1-bit 的存储介质讲起,一步步构建起各类存储设备,并通过设备驱动抽象出一组接口来方便地设计与实现文件系统。我之前虽然上过许多门操作系统的课程,但这种讲法确实独此一家,让我收获了很多独到的视角来看待系统软件。

这门课除了在理论知识的讲授部分很有新意外,注重实践也是蒋老师的一大特点。在课堂和编程作业里,蒋老师会有意无意地培养大家阅读源码、查阅手册的能力,这也是计算机从业者必备的技能。在完成第五个 MiniLab 期间,我第一次仔仔细细阅读了微软的 FAT 文件系统手册,收获了一次非常有价值的经历。

编程作业共由 5个 MiniLab 和 4个 OSLab 组成。美中不足的是作业的评测机是不对校外开放的,不过在邮件“骚扰”后蒋老师还是非常慷慨地让我成功蹭课。由于课余时间有限我只完成了 5个 MiniLab,总体体验非常棒。尤其是第二个协程实验让我印象最为深刻,在不到百行的小实验里深刻体验了上下文切换的美妙与“可怕”。另外其实几个 MiniLab 都能非常方便地进行本地测试,就算没有评测机也不影响自学,因此希望大家不要聚众“骚扰”老师以图蹭课。

最后再次感谢蒋老师设计并开放了这样一门非常棒的操作系统课程,这也是本书收录的第一门国内高校自主开设的计算机课程。正是有蒋老师这些年轻的新生代教师在繁重的 Tenure 考核之余的用爱发电,才让无数学子收获了难忘的本科生涯。也期待国内能有更多这样的良心好课,我也会第一时间收录进本书中让更多人受益。

课程资源

资源汇总

按蒋老师的要求,我的作业实现没有开源。


最后更新: June 10, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学基础/MITLA/index.html b/zh/数学基础/MITLA/index.html index d87d7dd6..f4bf8ace 100644 --- a/zh/数学基础/MITLA/index.html +++ b/zh/数学基础/MITLA/index.html @@ -1,2 +1,16 @@ MIT18.06: Linear Algebra - CS自学指南
跳转至

MIT18.06: Linear Algebra

课程简介

  • 所属大学:MIT
  • 先修要求:英文
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:因人而异

数学大牛 Gilbert Strang 老先生年逾古稀仍坚持授课,其经典教材 Introduction to Linear Algebra 已被清华采用为官方教材。我当时看完盗版 PDF 之后深感愧疚,含泪花了两百多买了一本英文正版收藏。下面附上此书封面,如果你能完全理解封面图的数学含义,那你对线性代数的理解一定会达到新的高度。

image

配合油管数学网红 3Blue1Brown线性代数的本质系列视频食用更佳。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学基础/MITmaths/index.html b/zh/数学基础/MITmaths/index.html index b7e094e7..30e0ab6c 100644 --- a/zh/数学基础/MITmaths/index.html +++ b/zh/数学基础/MITmaths/index.html @@ -1,2 +1,16 @@ MIT18.01/18.02: Calculus - CS自学指南
跳转至

MIT Calculus Course

课程简介

  • 所属大学:MIT
  • 先修要求:英语
  • 编程语言:无
  • 课程难度:🌟🌟
  • 预计学时:因人而异

MIT 的微积分课由 MIT18.01: Single Variable Calculus 和 MIT18.02: Multivariable Calculus 两门课组成。对自己数学基础比较自信的同学可以只看课程 notes,写得非常浅显生动并且抓住本质,让你不再疲于做题而是能够真正窥见微积分的本质魅力。

配合油管数学网红 3Blue1Brown微积分的本质系列视频食用更佳。

课程资源

  • 课程网站:18.01, 18.02
  • 课程视频:参见课程网站
  • 课程教材:参见课程 notes
  • 课程作业:书面作业及答案参见课程网站

最后更新: September 25, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学基础/information/index.html b/zh/数学基础/information/index.html index f13a2088..a37961cd 100644 --- a/zh/数学基础/information/index.html +++ b/zh/数学基础/information/index.html @@ -1,2 +1,16 @@ MIT6.050J: Information theory and Entropy - CS自学指南
跳转至

MIT6.050J: Information theory and Entropy

课程简介

  • 所属大学:MIT
  • 先修要求:无
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

MIT 面向大一新生的信息论入门课程,Penfield 教授专门为这门课写了一本教材作为课程 notes,内容深入浅出,生动有趣。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/6.042J/index.html b/zh/数学进阶/6.042J/index.html index 335345d7..2e38d974 100644 --- a/zh/数学进阶/6.042J/index.html +++ b/zh/数学进阶/6.042J/index.html @@ -1,2 +1,16 @@ MIT 6.042J: Mathematics for Computer Science - CS自学指南
跳转至

MIT 6.042J: Mathematics for Computer Science

课程简介

  • 所属大学:MIT
  • 先修要求:Calculus, Linear Algebra
  • 编程语言:Python preferred
  • 课程难度:🌟🌟🌟
  • 预计学时:50-70 小时

MIT 的离散数学以及概率综合课程,导师是大名鼎鼎的 Tom Leighton ( Akamai 的联合创始人之一)。学完之后对于后续的算法学习大有裨益。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/CS126/index.html b/zh/数学进阶/CS126/index.html index 1ba06ae7..dfed1128 100644 --- a/zh/数学进阶/CS126/index.html +++ b/zh/数学进阶/CS126/index.html @@ -1,2 +1,16 @@ UCB CS126: probability theory - CS自学指南
跳转至

UCB CS126 : Probability theory

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS70、微积分、线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利的概率论进阶课程,涉及到统计学、随机过程等理论相对深入的内容,需要相当的数学基础,我在上这门课的时候也感到有些吃力,不过坚持下来一定会让你对概率论的掌握达到一个新的高度。

同时这门课非常强调理论与实践的结合,课程设计者 Jean Walrand 教授专门写了一本配套的教材Probability in Electrical Engineering and Computer Science,书中每个章节都会以一个具体的算法实践作为例子来展示理论在实际当中的运用,例如 PageRank, Route Planing, Speech Recognition 等等,并且全书开源,可以免费下载 PDF 或者 Epub 版。

这还不算完,Jean Walrand 还为整本书里的例子设计了配套的 Python 实现,以 Jupyter Notebook 的形式在线发布,读者可以在线修改、调试和运行。

与此同时,这门课除了理论作业之外,还有 9 个编程作业,会让你用概率论的知识解决实际问题。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/EECS126 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/CS70/index.html b/zh/数学进阶/CS70/index.html index 5d9b6e37..3e915064 100644 --- a/zh/数学进阶/CS70/index.html +++ b/zh/数学进阶/CS70/index.html @@ -1,2 +1,16 @@ UCB CS70: discrete Math and probability theory - CS自学指南
跳转至

UCB CS70 : discrete Math and probability theory

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利的离散数学入门课程,个人觉得这门课最大的亮点在于并不是单纯的理论知识的讲授,而是在每个模块都会介绍理论知识在实际算法中的运用,让计算机系的学生在夯实理论基础的同时,跳脱出冰冷形式化的数学符号,在实际应用中感受和体会理论的本质。

具体的理论与算法的对应关系列举如下:

  • 逻辑证明:稳定匹配算法
  • 图论:网络拓扑设计
  • 基础数论:RSA 算法
  • 多项式环:纠错码设计
  • 概率论:哈希表设计、负载均衡等等

课程 notes 也写得非常深入浅出,公式推导与实际例子星罗棋布,阅读体验很好。

课程资源

  • 课程网站:http://www.eecs70.org/
  • 课程教材:参见课程 notes
  • 课程作业:参见课程 Schedule

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS70 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html b/zh/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html index 9553bbad..07eb2d32 100644 --- a/zh/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html +++ b/zh/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html @@ -1,2 +1,16 @@ The Information Theory, Patter Recognition, and Neural Networks - CS自学指南
跳转至

The Information Theory, Patter Recognition, and Neural Networks

课程简介

  • 所属大学:Cambridge
  • 先修要求:Calculus, Linear Algebra, Probabilities and Statistics
  • 编程语言:Anything would be OK, Python preferred
  • 课程难度:🌟🌟🌟
  • 预计学时:30-50 小时

剑桥大学 Sir David MacKay 教授的信息论课程。教授是一位十分精通信息论与神经网络的学者,课程对应教材也是信息论领域的一部经典著作。可惜天妒英才...

课程资源

R.I.P Prof. David MacKay


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/convex/index.html b/zh/数学进阶/convex/index.html index 52a73728..51105b25 100644 --- a/zh/数学进阶/convex/index.html +++ b/zh/数学进阶/convex/index.html @@ -1,2 +1,16 @@ Standford EE364A: Convex Optimization - CS自学指南
跳转至

Stanford EE364A: Convex Optimization

课程简介

  • 所属大学:Stanford
  • 先修要求:Python,微积分,线性代数,概率论,数值分析
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

Stephen Boyd 教授是凸优化领域的大牛,其编写的 Convex Optimization 这本教材被众多名校采用。另外其研究团队还专门开发了一个用于求解常见凸优化问题的编程框架,支持 Python, Julia 等主流编程语言,其课程作业也是采用这个编程框架去解决实际生活当中的凸优化问题。

在实际运用当中,你会深刻体会到对于同一个问题,建模过程中一个细小的改变,其方程的求解难度会有天壤之别,如何让你建模的方程是“凸”的,是一门艺术。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Standford_CVX101 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数学进阶/numerical/index.html b/zh/数学进阶/numerical/index.html index 56c53962..256d7574 100644 --- a/zh/数学进阶/numerical/index.html +++ b/zh/数学进阶/numerical/index.html @@ -1,2 +1,16 @@ MIT18.330: Introduction to numerical analysis - CS自学指南
跳转至

MIT18.330 : Introduction to numerical analysis

课程简介

  • 所属大学:MIT
  • 先修要求:微积分,线性代数,概率论
  • 编程语言:Julia
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

计算机强大的计算能力帮助人们在科学领域不断突破边界,不过计算机的离散本质和这个连续的世界有着天然鸿沟,而如何用离散的表示去估计和逼近那些数学上连续的概念,则是数值分析的重要主题。

这门课会在浮点表示、方程求解、线性代数、微积分、微分方程等领域探讨各类数值分析方法,让你在 Julia 的编程实践中反复体悟(1)如何建立估计(2)如何估计误差(3)如何用算法实现估计 这一系列步骤。

这门课的设计者还编写了配套的开源教材(参见下方链接),里面有丰富的 Julia 实例。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT18.330 - GitHub 中。


最后更新: September 26, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据库系统/15445/index.html b/zh/数据库系统/15445/index.html index 69e1609b..db664d80 100644 --- a/zh/数据库系统/15445/index.html +++ b/zh/数据库系统/15445/index.html @@ -1,2 +1,16 @@ CMU 15-445: Database Systems - CS自学指南
跳转至

CMU 15-445: Database Systems

课程简介

  • 所属大学:CMU
  • 先修要求:C++,数据结构与算法
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

作为 CMU 数据库的入门课,这门课由数据库领域的大牛 Andy Pavlo 讲授(“这个世界上我只在乎两件事,一是我的老婆,二就是数据库”)。15-445 会自底向上地教你数据库系统的基本组成部分:存储、索引、查询,以及并发事务控制。 这门课的亮点在于 CMU db 专门为此课开发了一个教学用的关系型数据库 bustub,并要求你对这个数据库的组成部分进行修改,实现上述部件的功能。此外 bustub 作为一个 C++ 编写的中小型项目涵盖了程序构建、代码规范、单元测试等众多要求,可以作为一个优秀的开源项目学习。

课程资源

  • 课程网站:Fall2019, Fall2020, Fall2021
  • 课程视频:课程网站免费观看
  • 课程教材:Database System Concepts
  • 课程作业:4 个 Project

在 Fall2019 中,第二个 Project 是做哈希索引,第四个 Project 是做日志与恢复。

在 Fall2020 中,第二个 Project 是做 B 树,第四个 Project 是做并发控制。

在 Fall2021 中,第一个 Project 是做缓存池管理,第二个 Project 是做哈希索引,第四个 Project 是做并发控制。

如果大家有精力的话可以都去尝试一下,或者在对书中内容理解不是很透彻的时候,尝试用代码写一个会加深你的理解。

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在 ysj1173886760/Learning: db - GitHub 中。

由于 Andy 的要求,仓库中没有 Project 的实现,只有 Homework 的 Solution。特别的,对于 Homework1,@ysj1173886760 还写了一个 Shell 脚本来帮大家执行自动判分。

另外在课程结束后,推荐阅读一篇论文 Architecture Of a Database System,对应的中文版也在上述仓库中。论文里综述了数据库系统的整体架构,让大家可以对数据库有一个更加全面的视野。

后续课程

CMU15-721 主要讲主存数据库有关的内容,每节课都有对应的 paper 要读,推荐给希望进阶数据库的小伙伴。@ysj1173886760 目前也在跟进这门课,完成后会在这里提 PR 以提供进阶的指导。


最后更新: October 31, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据库系统/CS122/index.html b/zh/数据库系统/CS122/index.html index a53aaa31..6fe7586a 100644 --- a/zh/数据库系统/CS122/index.html +++ b/zh/数据库系统/CS122/index.html @@ -1,2 +1,16 @@ Caltech CS122: Database System Implementation - CS自学指南
跳转至

Caltech CS 122: Database System Implementation

课程简介

  • 所属大学:Caltech
  • 先修要求:无
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

加州理工的这门课,不同于没有提供 SQL 层功能的 CMU15-445 课程。CS122 课程 Lab 的侧重点在于 SQL 层的相关实现,涉及查询优化器的各个模块,比如SQL的解析,Translate,如何实现 Join,统计信息以及代价估计,子查询实现,Agg,Group By 的实现等。除此之外,还有 B+树,WAL 相关实验。本门课程适合在学完 CMU15-445 课程之后,对查询优化相关内容有兴趣的同学。

下面介绍一下这门课的前 3 个 Assignment 也就是实验 Lab 所要实现的功能:

Assignment1

  • 为 NanoDB 提供 delete,update 语句的支持。
  • 为 Buffer Pool Manager 添加合适的 pin/unpin 代码。
  • 提升 insert 语句的性能, 同时不使数据库文件大小过分膨胀。

Assignment2

  • 实现一个简单的计划生成器,将各种已经 Parser 过的 SQL 语句转化为可执行的执行计划。
  • 使用 nested-loop join 算法,实现支持 inner- and outer-join 的 Join 计划节点。
  • 添加一些单元测试, 保证 inner- and outer-join 功能实现正确。

Assignment3

  • 完成收集表的统计信息。
  • 完成各种计划节点的计划成本计算。
  • 计算可出现在执行计划中的各种谓词的选择性。
  • 根据谓词更新计划节点输出的元组统计信息。

剩余 Assignment 和 Challenges 可以查看课程介绍,推荐使用 IDEA 打开工程,Maven 构建,注意日志相关配置。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据库系统/CS186/index.html b/zh/数据库系统/CS186/index.html index 53b8d3d3..adc046eb 100644 --- a/zh/数据库系统/CS186/index.html +++ b/zh/数据库系统/CS186/index.html @@ -1,2 +1,16 @@ UCB CS186: Introduction to Database System - CS自学指南
跳转至

UCB CS186: Introduction to Database System

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

如何编写 SQL 查询?SQL 命令是如何被一步步拆解、优化、转变为一个个磁盘查询指令的?如何实现高并发的数据库?如何实现数据库的故障恢复?什么又是非关系型数据库?这门课会带你深入理解关系型数据库的内部细节,并在掌握理论知识之后,动手用 Java 实现一个支持 SQL 并发查询、B+ 树 Index 和故障恢复的关系型数据库。

从实用角度来说,这门课还会在编程作业中锻炼你编写 SQL 查询以及 NoSQL 查询的能力,对于构建一些全栈的工程项目很有帮助。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS186 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据库系统/CS346/index.html b/zh/数据库系统/CS346/index.html index bfebcedb..99efb29f 100644 --- a/zh/数据库系统/CS346/index.html +++ b/zh/数据库系统/CS346/index.html @@ -1,2 +1,16 @@ Stanford CS346: Database System Implementation - CS自学指南
跳转至

Stanford CS 346: Database System Implementation

课程简介

  • 所属大学:Stanford
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

RedBase 是 cs346 的一个项目,实现了一个简易的数据库系统,项目是高度结构化的。整个项目能够被分为以下几个部分(同时也是 4 个 lab 需要进行完善): 1. The record management component:记录管理组件。 2. The index component:B+ 索引管理。 3. The System Management Component:ddl语句、命令行工具、数据加载命令、元数据管理。 4. The Query Language Component:在这个部分需要实现 RQL Redbase 查询语言。RQL 要实现 select、insert、delete、update 语句。 5. Extension Component:除了上述数据库系统的基本功能组件,还需要实现一个扩展组件,可以是Blob类型、 网络模块、连接算法、CBO优化器、OLAP、事务等。

RedBase 适合在学完 CMU-15445 后继续学习数据库系统中的其他组件,因为其代码量不多,可以方便的根据需要扩展代码。同时代码完全由 C++ 编写,也可以用于练习 C++ 编程技巧。

课程资源


最后更新: October 28, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据科学/Data100/index.html b/zh/数据科学/Data100/index.html index 8ed345b4..4743c98d 100644 --- a/zh/数据科学/Data100/index.html +++ b/zh/数据科学/Data100/index.html @@ -1,2 +1,16 @@ UCB Data100: Principles and Techniques of Data Science - CS自学指南
跳转至

UCB Data100: Principles and Techniques of Data Science

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A,线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

伯克利的数据科学入门课程,内容相对基础,覆盖了数据清洗、特征提取、数据可视化以及机器学习和推理的基础内容,也会讲授 Pandas, Numpy, Matplotlib 等数据科学常用工具。其丰富有趣的编程作业也是这门课的一大亮点。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据结构与算法/Algo/index.html b/zh/数据结构与算法/Algo/index.html index d6f9837b..57a30dd8 100644 --- a/zh/数据结构与算法/Algo/index.html +++ b/zh/数据结构与算法/Algo/index.html @@ -1,2 +1,16 @@ Coursera: Algorithms I & II - CS自学指南
跳转至

Coursera: Algorithms I & II

课程简介

  • 所属大学:Princeton
  • 先修要求:CS61A
  • 编程语言:Java
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

这是 Coursera 上评分最高的算法课程。Robert Sedgewick 教授有一种魔力,可以将无论多么复杂的算法讲得极为生动浅显。实不相瞒,困扰我多年的 KMP 以及网络流算法都是在这门课上让我茅塞顿开的,时隔两年我甚至还能写出这两个算法的推导与证明。

你是否觉得算法学了就忘呢?我觉得让你完全掌握一个算法的核心在于理解三点:

  • 为什么这么做?(正确性推导,抑或是整个算法的核心本质)
  • 如何实现它?(光学不用假把式)
  • 用它解决实际问题(学以致用才是真本事)

这门课的构成就非常好地契合了上述三个步骤。观看课程视频并且阅读教授的开源课本有助于你理解算法的本质,让你也可以用非常 生动浅显的话语向别人讲述为什么这个算法得长这个样子。

在理解算法之后,你可以阅读教授对于课程中讲授的所有数据结构与算法的代码实现。 注意,这些实现可不是 demo 性质的,而是工业级的高效实现,从注释到变量命名都非常严谨,模块化也做得相当好,是质量很高的代码。我从这些代码中收获良多。

最后,就是这门课最激动人心的部分了,10 个高质量的 Project,并且全都有实际问题的背景描述,丰富的测试样例,自动的评分系统(代码风格也是评分的一环)。让你在实际生活中 领略算法的魅力。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Princeton-Algorithm - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据结构与算法/CS170/index.html b/zh/数据结构与算法/CS170/index.html index 15fb7c72..e4a0db15 100644 --- a/zh/数据结构与算法/CS170/index.html +++ b/zh/数据结构与算法/CS170/index.html @@ -1,2 +1,16 @@ UCB CS170: Efficient Algorithms and Intractable Problems - CS自学指南
跳转至

CS170: Efficient Algorithms and Intractable Problems

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61B, CS70
  • 编程语言:LaTeX
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利的算法设计课,更注重算法的理论基础与复杂度分析。课程内容涵盖了分治、图算法、最短路、生成树、贪心、动规、并查集、线性规划、网络流、NP 问题、随机算法、哈希算法等等。

这门课的教材写的很好,证明浅显易懂,非常适合作为工具书查阅。另外,这门课只有书面作业,并且推荐用 LaTeX 编写,大家可以借此机会锻炼自己的 LaTeX 技巧。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS170 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/数据结构与算法/CS61B/index.html b/zh/数据结构与算法/CS61B/index.html index 05f20852..0450d7e4 100644 --- a/zh/数据结构与算法/CS61B/index.html +++ b/zh/数据结构与算法/CS61B/index.html @@ -1,2 +1,16 @@ UCB CS61B: Data Structures and Algorithms - CS自学指南
跳转至

CS61B: Data Structures and Algorithms

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A
  • 编程语言:Java
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利 CS61 系列的第二门课程,注重数据结构与算法的设计,同时让学生有机会接触上千行的工程代码,通过 Java 初步领会软件工程的思想。

我上的是 2018 年春季学期的版本,该课的开课老师 Josh Hug 教授慷慨地将 autograder 开源了,大家可以通过网站公开的邀请码在 gradescope 免费加入课程,从而方便地测评自己的代码。

这门课所有的编程作业都是使用 Java 完成的。没有 Java 基础的同学也不用担心,课程会有保姆级的教程,从 IDEA(一款主流的 Java 编程环境)的配置讲起,把 Java 的核心语法与特性事无巨细地讲授,大家完全不用担心跟不上的问题。

这门课的作业质量也是绝绝子。14 个 lab 会让你自己实现课上所讲的绝大部分数据结构,10 个 Homework 会让你运用数据结构和算法解决实际问题, 另外还有 3 个 Project 更是让你有机会接触上千行的工程代码,在实战中磨练自己的 Java 能力。

课程资源

  • 课程网站:https://sp18.datastructur.es/
  • 课程视频:https://sp18.datastructur.es/,每节课的链接详见课程网站
  • 课程教材:无
  • 课程作业:每年略有不同,18 年春季学期有 14 个 Lab,10 个 Homework以及 3 个 Project,具体要求详见课程网站。

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61B - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习/CS189/index.html b/zh/机器学习/CS189/index.html index be85a3e7..6c2ba82d 100644 --- a/zh/机器学习/CS189/index.html +++ b/zh/机器学习/CS189/index.html @@ -1,2 +1,16 @@ UCB CS189: Introduction to Machine Learning - CS自学指南
跳转至

CS189: Introduction to Machine Learning

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS188, CS70
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

这门课我没有系统上过,只是把它的课程 notes 作为工具书查阅。不过从课程网站上来看,它比 CS229 好的是开源了所有 homework 的代码以及 gradescope 的 autograder。同样,这门课讲得相当理论且深入。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习/CS229/index.html b/zh/机器学习/CS229/index.html index c086352f..5976976d 100644 --- a/zh/机器学习/CS229/index.html +++ b/zh/机器学习/CS229/index.html @@ -1,2 +1,16 @@ Stanford CS229: Machine Learning - CS自学指南
跳转至

CS229: Machine Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:高数,概率论,Python,需要较深厚的数学功底
  • 编程语言:无
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

同样是吴恩达讲授,但是这是一门研究生课程,所以更偏重数学理论,不满足于调包而想深入理解算法本质,或者有志于从事机器学习理论研究的同学可以学习这门课程。课程网站上提供了所有的课程 notes,写得非常专业且理论,需要一定的数学功底。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS229 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习/ML/index.html b/zh/机器学习/ML/index.html index fa5b89e5..c8a9764a 100644 --- a/zh/机器学习/ML/index.html +++ b/zh/机器学习/ML/index.html @@ -1,2 +1,16 @@ Coursera: Machine Learning - CS自学指南
跳转至

Coursera: Machine Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:AI 入门 + 熟练使用 Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

说起吴恩达,在 AI 届应该无人不晓。他是著名在线教育平台 Coursera 的创始人之一,同时也是 Stanford 的网红教授。这门机器学习入门课应该算得上是他的成名作之一(另一个是深度学习课程),在 Coursera 上拥有数十万的学习者(注意这是花钱买了证书的人,一个证书几百刀),白嫖学习者数量应该是另一个数量级了。

这门课对新手极其友好,吴恩达拥有把机器学习讲成 1+1=2 一样直白的能力。你将会学习到线性回归、逻辑回归、支持向量机、无监督学习、降维、异常检测和推荐系统等等知识,并且在编程实践中夯实自己的理解。作业质量自然不必多言,保姆级代码框架,作业背景也多取自生活,让人学以致用。

当然,这门课作为一个公开慕课,难度上刻意放低了些,很多数学推导大多一带而过,如果你有志于从事机器学习理论研究,想要深究这些算法背后的数学理论,可以参考 CS229CS189

课程资源

资源汇总

当时重装系统误删了文件,我的代码实现消失在了磁盘的 01 串中。不过这门课由于太过出名,网上想搜不到答案都难,相关课程资料 Coursera 上也一应俱全。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习系统/CMU10-414/index.html b/zh/机器学习系统/CMU10-414/index.html index 2a745b22..da93c1b1 100644 --- a/zh/机器学习系统/CMU10-414/index.html +++ b/zh/机器学习系统/CMU10-414/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这是 CMU 2022年秋季学期开设的一门新课,聚焦于深度学习框架的具体实现,课程 Project 会实现一个迷你的类似于 Pytorch 深度学习框架。课程免费提供了面向非 CMU 学生的在线版本,9月13日正式授课,作者持续跟进中。

课程资源

资源汇总

TBA


最后更新: September 7, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习系统/MLC/index.html b/zh/机器学习系统/MLC/index.html index 39dc1c64..aa73dc65 100644 --- a/zh/机器学习系统/MLC/index.html +++ b/zh/机器学习系统/MLC/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这门课是机器学习编译领域的顶尖学者陈天奇在2022年暑期开设的一门在线课程。其实机器学习编译无论在工业界还是学术界仍然是一个非常前沿且快速更迭的领域,国内外此前还没有为这个方向专门开设的相关课程。因此如果对机器学习编译感兴趣想有个全貌性的感知的话,可以学习一下这门课。

本课程主要以 Apache TVM 这一主流的机器学习编译框架为例(陈天奇是这个框架的创始人之一),聚焦于如何将开发模式下(如 Tensorflow, Pytorch, Jax)的各类机器学习模型,通过一套普适的抽象和优化算法,变换为拥有更高性能并且适配各类底层硬件的部署模式。课程讲授的知识点都是相对 High-Level 的宏观概念,同时每节课都会有一个配套的 Jupyter Notebook 来通过具体的代码讲解知识点,因此如果从事 TVM 相关的编程开发的话,这门课有丰富且规范的代码示例以供参考。

所有的课程资源全部开源并且有中文和英文两个版本,B站和油管分别有中文和英文的课程录影。

课程资源


最后更新: September 5, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习进阶/CMU10-708/index.html b/zh/机器学习进阶/CMU10-708/index.html index 7a1263d9..7bbc278c 100644 --- a/zh/机器学习进阶/CMU10-708/index.html +++ b/zh/机器学习进阶/CMU10-708/index.html @@ -1,2 +1,16 @@ CMU 10-708: Probabilistic Graphical Models - CS自学指南
跳转至

CMU 10-708: Probabilistic Graphical Models

课程简介

  • 所属大学:CMU
  • 先修要求:Machine Learning, Deep Learning, Reinforcement Learning
  • 课程难度:🌟🌟🌟🌟🌟
  • 课程网站:https://sailinglab.github.io/pgm-spring-2019/
  • 这个网站包含了所有的资源:slides, nots, video, homework, project

这门课程是 CMU 的图模型基础 + 进阶课,授课老师为 Eric P. Xing,涵盖了图模型基础,与神经网络的结合,在强化学习中的应用,以及非参数方法。相当硬核


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习进阶/CS229M/index.html b/zh/机器学习进阶/CS229M/index.html index 1966bd3e..d0d06c58 100644 --- a/zh/机器学习进阶/CS229M/index.html +++ b/zh/机器学习进阶/CS229M/index.html @@ -1,2 +1,16 @@ Stanford STATS214 / CS229M: Machine Learning Theory - CS自学指南
跳转至

STATS214 / CS229M: Machine Learning Theory

课程简介

经典学习理论 + 最新深度学习理论,非常硬核。授课老师之前是 Percy Liang,现在是 Tengyu Ma


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习进阶/STA4273/index.html b/zh/机器学习进阶/STA4273/index.html index 8755b6a2..c424b1a9 100644 --- a/zh/机器学习进阶/STA4273/index.html +++ b/zh/机器学习进阶/STA4273/index.html @@ -1,2 +1,16 @@ U Toronto STA 4273 Winter 2021: Minimizing Expectations - CS自学指南
跳转至

STA 4273 Winter 2021: Minimizing Expectations

课程简介

这是一门较为进阶的 Ph.D. 研究课程,核心内容是 inference 和 control 之间的关系。授课老师为 Chris Maddison (AlphaGo founding member, NeurIPS 14 best paper)


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习进阶/STAT8201/index.html b/zh/机器学习进阶/STAT8201/index.html index 39751008..27c1e64f 100644 --- a/zh/机器学习进阶/STAT8201/index.html +++ b/zh/机器学习进阶/STAT8201/index.html @@ -1,2 +1,16 @@ Columbia STAT 8201: Deep Generative Models - CS自学指南
跳转至

Columbia STAT 8201: Deep Generative Models

课程简介

这门课是一门 PhD 讨论班,每周的内容是展示 + 讨论论文,授课老师是 John Cunningham。Deep Generative Models (深度生成模型) 是图模型与神经网络的结合,也是现代机器学习最重要的方向之一


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/机器学习进阶/roadmap/index.html b/zh/机器学习进阶/roadmap/index.html index dac41b53..53892352 100644 --- a/zh/机器学习进阶/roadmap/index.html +++ b/zh/机器学习进阶/roadmap/index.html @@ -1,2 +1,16 @@ 进阶路线图 - CS自学指南
跳转至

机器学习进阶

此路线图适用于已经学过了基础机器学习 (ML, NLP, CV, RL) 的同学 (高年级本科生或低年级研究生),已经发表过至少一篇顶会论文 (NeurIPS, ICML, ICLR, ACL, EMNLP, NAACL, CVPR, ICCV) 想要走机器学习科研路线的选手。

此路线的目标是为读懂与发表机器学习顶会论文打下理论基础,特别是 Probabilistic Methods 这个 track 下的文章

机器学习进阶可能存在多种不同的学习路线,此路线只能代表作者 Yao Fu 所理解的最佳路径,侧重于贝叶斯学派下的概率建模方法,也会涉及到各项相关学科的交叉知识。

必读教材

  • PRML: Pattern Recognition and Machine Learning. Christopher Bishop
  • 经典贝叶斯学派教材
  • AoS: All of Statistics. Larry Wasserman
  • 经典频率学派教材

所以这两本书刚好相辅相成

字典

  • MLAPP: Machine Learning: A Probabilistic Perspective. Kevin Murphy
  • Convex Optimization. Stephen Boyd and Lieven Vandenberghe

进阶书籍

  • W&J: Graphical Models, Exponential Families, and Variational Inference. Martin Wainwright and Michael Jordan
  • Theory of Point Estimation. E. L. Lehmann and George Casella

如何阅读

Guidelines

  • 必读教材就是一定要读的教材
  • 字典的意思是,一般情况下不管它,但当遇到了不懂的概念的时候,就去字典里面查(而不是维基百科)
  • 进阶书籍先不读,先读完必读书籍。必读书籍一般都是要前前后后反复看过 N 遍才算读完
  • 读的过程中,最重要的读法就是对比阅读 (contrastive-comparative reading):同时打开两本书讲同一主题的章节,然后对比相同点和不同点和联系
  • 读的过程中,尽量去回想之前读过的论文,比较论文和教材的相同点与不同点

基础路径

  • 先读 AoS 第六章: Models, Statistical Inference and Learning,这一部分是最基础的科普
  • 然后读 PRML 第 10, 11 章
  • 第 10 章的内容是 Variational Inference, 第 11 章的内容是 MCMC, 这两种方法是贝叶斯推断的两条最主要路线
  • 如果在读 PRML 的过程中发现有任何不懂的名词,就去翻前面的章节。很大概率能够在第 3,4 章找到相对应的定义;如果找不到或者不够详细,就去查 MLAPP
  • AoS 第 8 章 (Parametric Inference) 和第 11 章 (Bayesian Inference) 也可以作为参考。最好的方法是多本书对比阅读,流程如下
    • 假设我在读 PRML 第 10 章的时候发现了一个不懂的词:posterior inference
    • 于是我往前翻,翻到了第 3 章 (Linear Model for Regression),看到了最简单的 posterior
    • 然后我接着翻 AoS,翻到了第 11 章,也有对 posterior 的描述
    • 然后我对比 PRML 第 10 章,第 3 章,AoS 第 11 章,三处不同地方对 posterior 的解读,比较其相同点和不同点和联系
  • 读完 PRML 第 10 和 11 章之后,接着读 AoS 第 24 章 (Simulation Methods),然后把它和 PRML 第 11 章对比阅读 -- 这俩都是讲 MCMC
  • 如果到此处发现还有基础概念读不懂,就回到 PRML 第 3 章,把它和 AoS 第 11 章对比阅读
  • Again,对比阅读非常重要,一定要把不同本书的类似内容同时摆在面前相互对比,这样可以显著增强记忆
  • 然后读 PRML 第 13 章(跳过第 12 章),这一章可以和 MLAPP 的第 17, 18 章对比阅读
  • MLAPP 第 17 章是 PRML 第 13.2 章的详细版,主要讲 HMM
  • MLAPP 第 18 章是 PRML 第 13.3 章的详细版,主要讲 LDS
  • 读完 PRML 第 13 章之后,再去读 PRML 第 8 章 (Graphical Models) -- 此时这部分应该会读得很轻松
  • 以上的内容可以进一步对照 CMU 10-708 PGM 课程材料

到目前为止,应该能够掌握

  • 概率模型的基础定义
  • 精准推断 - Sum-Product
  • 近似推断 - MCMC
  • 近似推断 - VI

然后就可以去做更进阶的内容


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/CS224n/index.html b/zh/深度学习/CS224n/index.html index 0148061d..4998ad2b 100644 --- a/zh/深度学习/CS224n/index.html +++ b/zh/深度学习/CS224n/index.html @@ -1,2 +1,16 @@ Stanford CS224n: Natural Language Processing - CS自学指南
跳转至

CS224n: Natural Language Processing

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 NLP 入门课程,由自然语言处理领域的巨佬 Chris Manning 领衔教授(word2vec 算法的开创者)。内容覆盖了词向量、RNN、LSTM、Seq2Seq 模型、机器翻译、注意力机制、Transformer 等等 NLP 领域的核心知识点。

5 个编程作业难度循序渐进,分别是词向量、word2vec 算法、Dependency parsing、机器翻译以及 Transformer 的 fine-tune。

最终的大作业是在 Stanford 著名的 SQuAD 数据集上训练 QA 模型,有学生的大作业甚至直接发表了顶会论文。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS224n - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/CS224w/index.html b/zh/深度学习/CS224w/index.html index a70cf79f..7ea1a65d 100644 --- a/zh/深度学习/CS224w/index.html +++ b/zh/深度学习/CS224w/index.html @@ -1,2 +1,16 @@ Stanford CS224w: Machine Learning with Graphs - CS自学指南
跳转至

CS224w: Machine Learning with Graphs

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python, LaTeX
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的图神经网络入门课,这门课我没有上过,但众多做 GNN 的朋友都向我力荐过这门课,想必 Stanford 的课质量还是一如既往地有保证的。另外就是这门课的授课老师非常年轻帅气:)

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/CS230/index.html b/zh/深度学习/CS230/index.html index 4e9e7d36..dd2f95f6 100644 --- a/zh/深度学习/CS230/index.html +++ b/zh/深度学习/CS230/index.html @@ -1,2 +1,16 @@ Coursera: Deep Learning - CS自学指南
跳转至

Coursera: Deep Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:机器学习基础 + Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

吴恩达在 Coursera 开设的另一门网红课程,学习者无数,堪称圣经级的深度学习入门课。深入浅出的讲解,眼花缭乱的 Project。从最基础的神经网络,到 CNN, RNN,再到最近大热的 Transformer。学完这门课,你将初步掌握深度学习领域必备的知识和技能,并且可以在 Kaggle 中参加自己感兴趣的比赛,在实践中锻炼自己。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/CS231/index.html b/zh/深度学习/CS231/index.html index 0e7bbdf1..78723a1e 100644 --- a/zh/深度学习/CS231/index.html +++ b/zh/深度学习/CS231/index.html @@ -1,2 +1,16 @@ Stanford CS231n: CNN for Visual Recognition - CS自学指南
跳转至

CS231n: CNN for Visual Recognition

课程简介

  • 所属大学:Stanford
  • 先修要求:机器学习基础
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 CV 入门课,由计算机领域的巨佬李飞飞院士领衔教授(CV 领域划时代的著名数据集 ImageNet 的研究团队),但其内容相对基础且友好,如果上过 CS230 的话可以直接上手 Project 作为练习。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/CS285/index.html b/zh/深度学习/CS285/index.html index 31477e0a..0670ffcb 100644 --- a/zh/深度学习/CS285/index.html +++ b/zh/深度学习/CS285/index.html @@ -1,2 +1,16 @@ UCB CS285: Deep Reinforcement Learning - CS自学指南
跳转至

CS285: Deep Reinforcement Learning

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS188, CS189
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

CS285 这一课程现由 Sergey Levine 教授讲授,课程内容覆盖了深度强化学习领域的各方面内容,适合有一定机器学习基础的同学进行学习,具体要求包括了解马尔可夫决策过程(MDP)等。整门课程中含有较多的公式,上课前需要有一定的心理准备。此外,教授会根据每年最新的研究进展更新课程内容以及作业,课程中能感受到教授尝试将深度强化学习领域的所有基础知识以及最近的发展在短短的数节课中进行传达。

有关课程内容获取,22Fall 的授课方式为课前观看提前录制的视频,课上主要为 Q&A 环节,教授选择部分或者所有视频内的知识进行讲解同时回答学生现场提出的问题,因此所提供的课程视频链接实际上是已经包含了所有内容。课程作业则由5个编程作业组成,每一次作业主要为复现经典模型以及进行模型间的对比,偶尔也包含一些对最近提出的模型的复现,最后递交一份报告。考虑到作业本身已经提供了框架,且都是根据 hint 进行代码填空,因此作业难度并不大。

总的来说,该课程适合新手入门深度强化学习。虽然学到后面越来越感觉到难,但整门课下来个人感觉还是收获颇丰。

(另外 Levine 教授人真的很 nice)

课程资源


最后更新: November 11, 2022
Back to top
\ No newline at end of file diff --git a/zh/深度学习/LHY/index.html b/zh/深度学习/LHY/index.html index ae1dfdc8..10336733 100644 --- a/zh/深度学习/LHY/index.html +++ b/zh/深度学习/LHY/index.html @@ -1,2 +1,16 @@ 国立台湾大学:李宏毅机器学习 - CS自学指南
跳转至

国立台湾大学:李宏毅机器学习

课程简介

  • 所属大学:國立台灣大學
  • 先修要求:熟练掌握 Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

李宏毅老师是国立台湾大学的教授,其风趣幽默的授课风格深受大家喜爱,并且尤其喜欢在 PPT 中插入宝可梦等动漫元素,是个非常可爱的老师。

这门课挂着机器学习的牌子,但其课程内容之广实在令人咋舌,其作业一共包含 15 个 lab,分别是 Regression、Classification、CNN、Self-Attention、Transformer、GAN、BERT、Anomaly Detection、Explainable AI、Attack、Adaptation、 RL、Compression、Life-Long Learning 以及 Meta Learning。可谓是包罗万象,能让学生对于深度学习的绝大多数领域都有一定了解,从而可以进一步选择想要深入的方向进行学习。

大家也大可不必担心作业的难度,因为所有作业都会提供助教的示例代码,帮你完成数据处理、模型搭建等,你只需要在其基础上进行适量的修改即可。这也是一个学习别人优质代码的极好机会,大家需要水课程大作业的话,这里也是一个不错的资料来源。

课程资源


最后更新: October 13, 2022
Back to top
\ No newline at end of file diff --git a/zh/电子基础/EE16/index.html b/zh/电子基础/EE16/index.html index e6f2e559..54203ca1 100644 --- a/zh/电子基础/EE16/index.html +++ b/zh/电子基础/EE16/index.html @@ -1,2 +1,16 @@ EE16A&B: Designing Information Devices and Systems I&II - CS自学指南
跳转至

UCB EE16A&B: Designing Information Devices and Systems I&II

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:150 小时

UC Berkeley 电子系学生的大一入门课,通过电路基础知识的讲授,配合各类动手实操的 lab,让学生体验通过电路从环境中收集信息并进行分析,作出预测和反馈。由于疫情的缘故,所有 lab 都有远程在线版,非常适合大家在家自学。

课程资源

  • 课程网站:EE16A, EE16B
  • 课程视频:B 站搜索
  • 课程教材:参见课程 notes
  • 课程作业:参见课程主页

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/EE16A - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/电子基础/Signals_and_Systems_AVO/index.html b/zh/电子基础/Signals_and_Systems_AVO/index.html index 16638fb8..57f9479c 100644 --- a/zh/电子基础/Signals_and_Systems_AVO/index.html +++ b/zh/电子基础/Signals_and_Systems_AVO/index.html @@ -1,2 +1,16 @@ MIT 6.007 Signals and Systems - CS自学指南
跳转至

MIT 6.007 Signals and Systems

课程简介

  • 所属大学:MIT
  • 先修要求:Calculus, Linear Algebra
  • 编程语言:Matlab Preferred
  • 课程难度:🌟🌟
  • 预计学时:50-70 小时

看到课程老师的名字:Prof. Alan V. Oppenheim

好的,上这门课的理由已经足够了。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/电子基础/signal/index.html b/zh/电子基础/signal/index.html index 4a01659f..afecaa5a 100644 --- a/zh/电子基础/signal/index.html +++ b/zh/电子基础/signal/index.html @@ -1,2 +1,16 @@ UCB EE120 : Signal and Systems - CS自学指南
跳转至

UCB EE120: Signal and Systems

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS70,微积分,线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

这门课最精华的部分就是 6 个超有趣的编程作业了,会让你用 Python 通过学习到的信号与系统的理论知识,解决各类实际问题。例如 lab3 会让你实现 FFT 算法,并和 Numpy 的官方实现进行性能对比;lab4 会通过分析手指头的影像数据推断心率;lab5 就更牛了,会让你给哈勃望远镜拍到的照片进行降噪处理,恢复绚烂清晰的星空;lab6 会让你构造一个反馈系统,平衡小车上的细杆。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-EE120 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/程序语言设计/CS242/index.html b/zh/程序语言设计/CS242/index.html index ef3c7234..6f68a5c9 100644 --- a/zh/程序语言设计/CS242/index.html +++ b/zh/程序语言设计/CS242/index.html @@ -1,2 +1,16 @@ CS242 - CS自学指南

CS242


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/zh/系统安全/CS161/index.html b/zh/系统安全/CS161/index.html index a25d4fbb..e3d96e3b 100644 --- a/zh/系统安全/CS161/index.html +++ b/zh/系统安全/CS161/index.html @@ -1,2 +1,16 @@ UCB CS161: Computer Security - CS自学指南
跳转至

UCB CS161: Computer Security

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:C, Go
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

伯克利的计算机系统安全课程,课程内容分为5个部分:

  • Security principles: how to design a secure system
  • Memory safety: buffer overflow attack
  • Cryptography: symmetric encryption, asymmetric encryption, MAC, digital signature .........
  • Web: SQL-injection, XSS, XSRF .......
  • Networking: attacks for each layer

这门课让我印象最为深刻的部分是 Project2,让你用 Go 语言设计和实现一个安全的文件分享系统。我花了整整三天才完成了这个非常虐的 Project,总代码量超过 3k 行。这样密集型的开发过程,能极大地锻炼你设计和实现一个安全系统的能力。

2020 年夏季学期的版本开源了课程录影,大家可以在下面的课程网站链接里找到。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS161 - GitHub 中。


最后更新: October 14, 2022
Back to top
\ No newline at end of file diff --git a/zh/系统安全/MIT6.858/index.html b/zh/系统安全/MIT6.858/index.html index 1a0ece34..ae52cc3e 100644 --- a/zh/系统安全/MIT6.858/index.html +++ b/zh/系统安全/MIT6.858/index.html @@ -1,2 +1,16 @@ MIT 6.858: Computer System Security - CS自学指南
跳转至

MIT 6.858: Computer System Security

课程简介

  • 所属大学:MIT
  • 先修要求:计算机体系结构,对计算机系统有初步了解
  • 编程语言:C, Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

MIT 的计算机系统安全课程,实验环境是一个 Web Application Zoobar。学生学习攻防技术并应用于该 Web Application。

  • Lab 1: you will explore the zoobar web application, and use buffer overflow attacks to break its security properties.
  • Lab 2: you will improve the zoobar web application by using privilege separation, so that if one component is compromised, the adversary doesn't get control over the whole web application.
  • Lab 3: you will build a program analysis tool based on symbolic execution to find bugs in Python code such as the zoobar web application.
  • Lab 4: you will improve the zoobar application against browser attacks.

这个课我主要是做了 Lab 3。Lab 3 是通过混合符号执行来遍历程序的所有分支,理解了符号执行的思想后 Lab 并不难做。这个 Lab 直观展示符号执行这种技术的使用方法。

这个课的 Final Project 是实现 SecFS,一个远端文件系统,面对完全不可信的服务器,提供机密性和完整性。参考论文为 SUNDR

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/AUT1400/index.html b/zh/编程入门/AUT1400/index.html index 9a6387fa..baa33cf4 100644 --- a/zh/编程入门/AUT1400/index.html +++ b/zh/编程入门/AUT1400/index.html @@ -1,2 +1,16 @@ AmirKabir University of Technology AP1400-2: Advanced Programming - CS自学指南
跳转至

Amirkabir University of Technology 1400-2: Advanced Programming Course

课程简介

  • 所属大学:Amirkabir University of Technology
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:50 小时

无意中发现的一个 C++ 课程。课程的 homework 质量很高,每个 homework 相互独立结构简单,且有完善的单元测试,非常适合用来学习 C++ 的编程。本课程共 7 个 homework,如下所示:

  1. 实现一个 Matrix 类以及相关函数。

  2. 实现一个模拟加密货币客户端/服务端执行过程的程序。

  3. 实现一个 Binary Search Tree (BST)。

  4. 实现 C++ 中的 SharedPtr 和 UniquePtr 智能指针。

  5. 使用继承和多态实现多个类。

  6. 使用 STL 库解决 4 个问题。

  7. 是个 python 项目,有兴趣的可以看看。

没找到课程的主页,只有在 github 有 homework 的源码(名字为 AP1400-2-HW 的那几个)。

课程资源


最后更新: November 4, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/CS106B_CS106X/index.html b/zh/编程入门/CS106B_CS106X/index.html index dcbf0c52..5b1b3d1c 100644 --- a/zh/编程入门/CS106B_CS106X/index.html +++ b/zh/编程入门/CS106B_CS106X/index.html @@ -1,2 +1,16 @@ Stanford CS106B/X - CS自学指南
跳转至

Stanford CS106B/X: Programming Abstractions in C++

课程简介

  • 所属大学:Stanford
  • 先修要求:计算机基础 (CS50/CS106A/CS61A or equivalent)
  • 编程语言:C++
  • 课程难度:🌟🌟
  • 预计学时:50-70 小时

Stanford 的进阶编程课,CS106X 在难度和深度上会比 CS106B 有所提高,但主体内容类似。主要通过 C++ 语言让学生在实际的编程作业里培养通过编程抽象解决实际问题的能力,同时也会涉及一些简单的数据结构和算法的知识,但总体来说没有一门专门的数据结构课那么系统。

课程资源


最后更新: June 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/CS106L/index.html b/zh/编程入门/CS106L/index.html index 45c93c0e..7d161ab8 100644 --- a/zh/编程入门/CS106L/index.html +++ b/zh/编程入门/CS106L/index.html @@ -1,2 +1,16 @@ Stanford CS106L: Standard C++ Programming - CS自学指南
跳转至

CS106L: Standard C++ Programming

课程简介

  • 所属大学:Stanford
  • 先修要求:最好掌握至少一门编程语言
  • 编程语言:C++
  • 课程难度:🌟🌟🌟
  • 预计学时:20 小时

我从大一开始一直都是写的 C++ 代码,直到学完这门课我才意识到,我写的 C++ 代码大概只是 C 语言 + cin/cout 而已。

这门课会深入到很多标准 C++ 的特性和语法,让你编写出高质量的 C++ 代码。例如 auto binding, uniform initialization, lambda function, move semantics,RAII 等技巧都在我此后的代码生涯中被反复用到,非常实用。

值得一提的是,这门课的作业里你会实现一个 HashMap(类似于 STL 中的 unordered_map), 这个作业几乎把整个课程串联了起来,非常考验代码能力。特别是 iterator 的实现,做完这个作业我开始理解为什么 Linus 对 C/C++ 嗤之以鼻了,因为真的很难写对。

总的来讲这门课并不难,但是信息量很大,需要你在之后的开发实践中反复巩固。Stanford 之所以单开一门 C++ 的编程课,是因为它后续的很多 CS 课程 Project 都是基于 C++的。例如 CS144 计算机网络和 CS143 编译器。这两门课在本书中均有收录。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS106L - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/CS110L/index.html b/zh/编程入门/CS110L/index.html index 06a93c71..5b116f62 100644 --- a/zh/编程入门/CS110L/index.html +++ b/zh/编程入门/CS110L/index.html @@ -1,2 +1,16 @@ Stanford CS110L: Safety in Systems Programming - CS自学指南
跳转至

CS110L: Safety in Systems Programming

课程简介

  • 所属大学:Stanford
  • 先修要求:最好有一定的编程背景并对计算机系统有初步的认识。
  • 编程语言:Rust
  • 课程难度:🌟🌟🌟
  • 预计学时:30 小时

在这门课中你将会学习 Rust 这门神奇的语言。

如果你学过 C 并接触过一些系统编程的话,应该对 C 的内存泄漏以及指针的危险有所耳闻,但 C 的底层特性以及高效仍然让它在系统级编程中无法被例如 Java 等自带垃圾收集机制的高级语言所替代。而 Rust 的目标则是希望在 C 的高效基础上,弥补其安全不足的缺点。因此 Rust 在设计之初,就有带有很多系统编程的观点。学习 Rust,也能让你之后能用 C 语言编写出更安全更优雅的系统级代码(例如操作系统等)。

这门课的后半部分关注在并发(concurrency)这一主题上,你将会系统地掌握多进程、多线程、基于事件驱动的并发等若干并发技术,并在第二个 Project 中比较它们各自的优劣。Rust 中 “futures” 的概念非常有趣和优雅,这些基础知识对你后续对计算机系统相关课程的学习很有帮助。另外,清华大学的操统实验 rCore 就是基于 Rust 编写的,具体参见文档

课程资源

  • 课程网站:https://reberhardt.com/cs110l/spring-2020/
  • 课程视频:https://youtu.be/j7AQrtLevUE
  • 课程教材:无
  • 课程作业:共 6 个 Lab 和 2 个 Project,作业文档和代码框架详见课程网站。其中两个 Project 非常有趣,分别是:
  • 用 Rust 实现一个类似于 GDB 的 debugger
  • 用 Rust 实现一个负载均衡器

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS110L - GitHub 中。

在2022年 CS110L 没有开源作业源码的背景下,Rust 快速演进导致2020版本课程项目中所使用的库过于老旧。对此,@fung-hwang 尝试进行了适配(时间为2022.11)。其适配过程和作业实现都汇总在 fung-hwang/CS110L-2020spr - GitHub 中。也许当你开始本课程时 Rust 和这些库又发生了变化,但你仍可以参考并从中获得启发。


最后更新: December 4, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/CS50/index.html b/zh/编程入门/CS50/index.html index 9a1b7050..6fbc25f0 100644 --- a/zh/编程入门/CS50/index.html +++ b/zh/编程入门/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50: This is CS50x - CS自学指南
跳转至

CS50: This is CS50x

课程简介

  • 所属大学:Harvard
  • 先修要求:无
  • 编程语言:C, Python, SQL, HTML, CSS, JavaScript
  • 课程难度:🌟🌟
  • 预计学时:20 小时

连续多年被哈佛大学学生评为最受欢迎的公选课程。Malan 教授上课非常有激情,撕黄页讲二分法的场面让人记忆犹新(笑)。但因为它的入门以及全校公选的属性,课程内容难度比较温和,但是课程作业质量非常高而且全部免费开源,非常适合小白入门,或者大佬休闲。

课程资源


最后更新: April 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/CS61A/index.html b/zh/编程入门/CS61A/index.html index b864eab2..b5f72fb0 100644 --- a/zh/编程入门/CS61A/index.html +++ b/zh/编程入门/CS61A/index.html @@ -1,2 +1,16 @@ UCB CS61A: Structure and Interpretation of Computer Programs - CS自学指南
跳转至

CS61A: Structure and Interpretation of Computer Programs

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Python, Scheme, SQL
  • 课程难度:🌟🌟🌟
  • 预计学时:50 小时

伯克利 CS61 系列的第一门课程,也是我的 Python 入门课。

CS61 系列是伯克利 CS 专业的入门课,其中:

  • CS61A: 强调抽象,让学生掌握用程序来解决实际问题,而不关注底层的硬件细节。
  • CS61B: 注重算法与数据结构以及大规模程序的构建,学生会用 Java 语言结合算法与数据结构的知识来构建千行代码级别的大型项目(一个简易的谷歌地图,一个二维版的 Minecraft)。
  • CS61C: 关注计算机体系结构,让学生理解高级语言(例如 C)是如何一步步转换为机器可以理解的 01 串并在 CPU 执行的,学生将会学习 RISC-V 架构并自己用 Logisim 实现一个 CPU。

CS61B 和 CS61C 在本书中均有收录。

回到 CS61A,注意这不仅仅是一门编程语言课,而是会深入到程序构造与运行的原理。最后你将在第 4 个 Project 中用 Python 实现一个 Scheme 的解释器。此外,抽象将是这门课的一大主题,你将学习到函数式编程、数据抽象、面向对象等等知识来让你的代码更易读,更模块化。当然,学习编程语言也是这门课的一大内容,你将会掌握 Python、Scheme 和 SQL 这三种编程语言,在它们的学习和比较中,相信你会拥有快速掌握一门新的编程语言的能力。

注意:如果此前完全没有编程基础,直接上手 CS61A 需要一定的学习能力和自律要求。为避免课程难度过高而导致的信心挫折,可以选择一个更为友好的入门编程课程。例如伯克利的 CS10 或者哈佛大学的 CS50

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61A - GitHub 中。


最后更新: November 12, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/Duke-Coursera-Intro-C/index.html b/zh/编程入门/Duke-Coursera-Intro-C/index.html index d8c226ab..667e83ed 100644 --- a/zh/编程入门/Duke-Coursera-Intro-C/index.html +++ b/zh/编程入门/Duke-Coursera-Intro-C/index.html @@ -1,2 +1,16 @@ Duke University: Introductory C Programming Specialization - CS自学指南
跳转至

Introductory C Programming Specialization

课程简介

  • 所属大学:Duke
  • 先修要求:无
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:110 小时

非常好的课程,自我感觉收益非常大:

  • 侧重基础和基本概念:如 frame、stack memory、heap memory 等讲得很透。
  • 针对C最难掌握的指针,有好的练习和编程来加深和强化理解。
  • 非常好的 GDB,Valgrind 上手训练,作业也会涉及一些基本的 Git 练习。
  • 老师建议作业用 Emacs,所以对 Emacs 小白来说,是个不错的入门。如果你会用 Vim ,我建议你用 Evil 插件。这样你不会丢掉 Vim 的编辑功能,同时可以体会 Emacs 的强大。工具箱里同时有 Emacs 和 Vim 时,效率会有不少提高。Emacs 的 org-mode,和 GDB 的顺滑整合,等等等等,都会让你如虎添翼。
  • 虽然可能需要付费,但我觉得值。
  • 虽说课名是入门,但兼具广度和深度。

课程资源

资源汇总

@haidongji 在学习这门课中的作业实现都汇总在 Duke Coursera Intro C 中。因为时间关系,我最后一课最后一周的几个作业到目前还没有完成。


最后更新: September 30, 2022
Back to top
\ No newline at end of file diff --git a/zh/编程入门/MIT-Missing-Semester/index.html b/zh/编程入门/MIT-Missing-Semester/index.html index 3c0b0cc3..0ec34947 100644 --- a/zh/编程入门/MIT-Missing-Semester/index.html +++ b/zh/编程入门/MIT-Missing-Semester/index.html @@ -1,2 +1,16 @@ MIT-Missing-Semester - CS自学指南
跳转至

MIT-Missing-Semester

课程简介

  • 先修要求:无
  • 编程语言:shell
  • 课程难度:🌟🌟
  • 预计学时:10 小时

正如课程名字所言:“计算机教学中消失的一个学期”,这门课将会教会你许多大学的课堂上不会涉及但却对每个 CSer 无比重要的工具或者知识点。例如 Shell 编程、命令行配置、Git、Vim、tmuxssh 等等。如果你是一个计算机小白,那么我非常建议你学习一下这门课,因为它基本涉及了本书必学工具中的绝大部分内容。

除了 MIT 官方的学习资料外,北京大学图灵班开设的前沿计算实践中也开设了相关课程,资料位于这个网站下,供大家参考。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/zh/编译原理/6035/index.html b/zh/编译原理/6035/index.html index 8368b87c..1453e4e8 100644 --- a/zh/编译原理/6035/index.html +++ b/zh/编译原理/6035/index.html @@ -1,2 +1,16 @@ 6035 - CS自学指南

6035


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/zh/编译原理/CS143/index.html b/zh/编译原理/CS143/index.html index 8177d498..aaf94211 100644 --- a/zh/编译原理/CS143/index.html +++ b/zh/编译原理/CS143/index.html @@ -1,2 +1,16 @@ Stanford CS143: Compilers - CS自学指南
跳转至

Stanford CS143: Compilers

课程简介

  • 所属大学:Stanford
  • 先修要求:计算机体系结构
  • 编程语言:Java 或 C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

斯坦福的编译原理课程,设计者开发了一个 Class-Object-Oriented-Language,简称 COOL 语言。这门课的核心就是通过理论知识的学习,为 COOL 语言实现一个编译器,将 COOL 高级语言编译为 MIPS 汇编并在 Spim 这个 MIPS 模拟器上成功执行。

理论部分基本按照龙书的顺序覆盖了词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容,实践部分则相应地分为词法分析、语法分析、语义分析、代码生成四个阶段,难度循序渐进,并在优化部分给学生留下了很大的设计空间。

课程资源

资源汇总

@skyzluo 在学习这门课中用到的所有资源和作业实现都汇总在 skyzluo/CS143-Compilers-Stanford - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/15462/index.html b/zh/计算机图形学/15462/index.html index f72c3b8a..8abd757a 100644 --- a/zh/计算机图形学/15462/index.html +++ b/zh/计算机图形学/15462/index.html @@ -1,2 +1,16 @@ CMU 15-462 - CS自学指南
跳转至

CMU 15-462 : COMPUTER GRAPHICS

课程简介

  • 所属大学:CMU
  • 先修要求:基础的向量微积分和线性代数 , 基础的 C/C++ 编程能力。
  • 编程语言:C/C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

本课程全面介绍了计算机图形学。它侧重于基本概念和技术,以及它们与图形中多个问题领域(渲染、动画、几何、成像)的交叉关系。主题包括:采样、混叠、插值、光栅化、几何变换、参数化、可见性、合成、过滤、卷积、曲线和曲面、几何数据结构、细分、网格划分、空间层次结构、光线追踪、辐射测量、反射率、光场、几何光学,蒙特卡洛渲染,重要性采样,相机模型,高性能光线追踪,微分方程,时间积分,数值微分,基于物理的动画,优化,数值线性代数,逆运动学,傅立叶方法,数据拟合.

课程资源


最后更新: December 15, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/CS148/index.html b/zh/计算机图形学/CS148/index.html index 0927c6ac..eb43b42c 100644 --- a/zh/计算机图形学/CS148/index.html +++ b/zh/计算机图形学/CS148/index.html @@ -1,2 +1,16 @@ Stanford CS148 - CS自学指南
跳转至

Stanford CS148

课程简介

  • 所属大学:Stanford
  • 先修要求:线性代数,高等数学,Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

官方介绍:

这是一门计算机图形学的入门课程,这门课的一开始使用 Blender 去生成图像,并且理解底层的数学知识,包括三角形、法向量、插值、纹理映射、凹凸贴图等等。之后会介绍光线和颜色以及它们如何影响计算机的显示和打印。同时也会介绍 BRDF 以及一些基本的光照和着色模型。课程的最后,会涉及到光线追踪、反走样、加速结构等内容。

具体课程信息可以查看课程网站

这门课程比起 GAMES101 浅一些,编程语言使用的是 Python,对于不熟悉 C++ 的同学比较友好。

课程资源


最后更新: June 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/CS184/index.html b/zh/计算机图形学/CS184/index.html index e118af71..0d5016be 100644 --- a/zh/计算机图形学/CS184/index.html +++ b/zh/计算机图形学/CS184/index.html @@ -1,2 +1,16 @@ CS184 - CS自学指南

CS184


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/GAMES101/index.html b/zh/计算机图形学/GAMES101/index.html index 767444c4..8d5a7a80 100644 --- a/zh/计算机图形学/GAMES101/index.html +++ b/zh/计算机图形学/GAMES101/index.html @@ -1,2 +1,16 @@ GAMES101 - CS自学指南
跳转至

GAMES101

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++
  • 编程语言:C++
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

官方介绍:

本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。通过本课程,你可以学习到计算机图形学背后的数学和物理知识,并锻炼实际的编程能力。 作为入门,本课程会尽可能的覆盖图形学的方方面面,把每一部分的基本概念都尽可能说清楚,让大家对计算机图形学有一个完整的、自上而下的全局把握。全局的理解很重要,学完本课程后,你会了解到图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法。从本课程的标题,大家还可以看到“现代”二字,也就是说,这门课所要给大家介绍的都是现代化的知识,也都是现代图形学工业界需要的图形学基础。

GAMES101 是国内相当有名的图形学公开课。和大家印象中满是数学和算法的图形学不同,这门课以十分生动的方式带我们进入了图形学这个领域的大门。

每个project代码量都不会很多,但是却都十分有趣。在做这些project的过程中,我们会实现简单的光栅化,并渲染一个简易的模型,我们还会实现光线追踪,以追求渲染更好的质量。每个project中还有选做的拓展作业,可以让我们渲染的模型具有更好的质量,更快的渲染速度。

喜欢玩游戏的同学应该对实时光线追踪有一定的了解,这门课的老师闫令琪就对这一技术有直接的推动作用。

跟着课程的视频,做完每一个project,相信你会和我一样对图形学,以及现代的渲染技术产生浓厚的兴趣。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在ysj1173886760/Learning: graphics/GAMES101 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/GAMES103/index.html b/zh/计算机图形学/GAMES103/index.html index a7d1426b..a56213b1 100644 --- a/zh/计算机图形学/GAMES103/index.html +++ b/zh/计算机图形学/GAMES103/index.html @@ -1,2 +1,16 @@ GAMES103 - CS自学指南
跳转至

GAMES103

课程简介

  • 所属大学:Style3D/OSU
  • 先修要求:线性代数,高等数学,大学物理,编程能力,基本图形知识
  • 编程语言:C#
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:50 小时

官方介绍:

本课程将作为基于物理的计算机动画技术入门,着重介绍各种基础的物理动画模拟技术。

该课程主要涵盖四个方向,分别为:1)刚体模拟;2)质点弹簧、约束与布料模拟;3)基于有限元的弹性体模拟;4)流体模拟。

本课程内容将不会涉及具体的物理模拟引擎,但会讨论各种引擎背后的技术,以及它们的优缺点等等。由于开发学习物理模拟需要一定的数学基础,课程初始阶段也会花一定的时间复习必备的数学知识。顺利完成课程之后,同学们应该会对基础的物理模拟技术有深入理解,对高级的模拟技术也会有部分接触。

图形学可粗略分为渲染、模拟、几何三个领域。GAMES101 和 GAMES202 主要以渲染为主,而对于物理模拟,GAMES103 则是很棒的学习资源。

课程资源

资源汇总

@indevn 在学习这门课中用到的所有资源和作业要求都汇总在 GAMES103 Unoffical 中。对于作业的具体实现,在知乎上有很多相关文章进行了细致讲解可以参考。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机图形学/GAMES202/index.html b/zh/计算机图形学/GAMES202/index.html index fd5b0fff..350d69a6 100644 --- a/zh/计算机图形学/GAMES202/index.html +++ b/zh/计算机图形学/GAMES202/index.html @@ -1,2 +1,16 @@ GAMES202 - CS自学指南
跳转至

GAMES202

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++,GAMES101
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:60 小时

官方介绍:

本课程将全面地介绍现代实时渲染中的关键问题与解决方法。由于实时渲染 (>30 FPS) 对速度要求极高,因此本课程的关注点将是在苛刻的时间限制下,人们如何打破速度与质量之间的权衡,同时保证实时的高速度与照片级的真实感。

本课程将以专题的形式呈现,课程内容会覆盖学术界与工业界的前沿内容,包括:(1)实时软阴影的渲染;(2)环境光照;(3)基于预计算或无预计算的全局光照;(4)基于物理的着色模型与方法;(5)实时光线追踪;(6)抗锯齿与超采样;以及一些常见的加速方式等等。

除了最新最全的内容之外,本课程与其它任何实时渲染的教程还有一个重要的区别,那就是本课程不会讲授任何与游戏引擎的使用相关的内容,并且不会特别强调具体的着色器实现技术,而主要讲授实时渲染背后的科学与知识。本课程的目标是在你学习完这门课的时候,你将有深厚的功底去开发一个属于你自己的实时渲染引擎。

作为 GAMES101 的进阶课程,难度有一定的提升,但不会很大,相信完成了 GAMES101 的同学都有能力完成这门课程。每个 project 代码量都不会很多,但是都需要一定的思考。

课程资源


最后更新: May 11, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机网络/CS144/index.html b/zh/计算机网络/CS144/index.html index 0998cbab..1e6f3663 100644 --- a/zh/计算机网络/CS144/index.html +++ b/zh/计算机网络/CS144/index.html @@ -1,2 +1,16 @@ Stanford CS144: Computer Network - CS自学指南
跳转至

CS144: Computer Network

课程简介

  • 所属大学:Stanford
  • 先修要求:一定的计算机系统基础,CS106L
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

这门课的主讲人之一是网络领域的巨擘 Nick McKeown 教授。这位拥有自己创业公司的学界业界双巨佬会在他慕课每一章节的最后采访一位业界的高管或者学界的高人,非常开阔眼界。

在这门课的 Project 中,你将用 C++ 循序渐进地搭建出整个 TCP/IP 协议栈,实现 IP 路由以及 ARP 协议,最后利用你自己的协议栈代替 Linux Kernel 的网络协议栈和其他学生的计算机进行通信,非常 amazing!

课程资源

资源汇总


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机网络/topdown/index.html b/zh/计算机网络/topdown/index.html index 85ff1770..9cef21d9 100644 --- a/zh/计算机网络/topdown/index.html +++ b/zh/计算机网络/topdown/index.html @@ -1,2 +1,16 @@ Computer Networking: A Top-Down Approach - CS自学指南
跳转至

Computer Networking: A Top-Down Approach

课程简介

  • 所属大学:马萨诸塞大学
  • 先修要求:有一定的计算机系统基础
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

《自顶向下方法》是计算机网络领域的一本经典教材,两位作者 Jim Kurose 和 Keith Ross 精心制作了教材配套的课程网站,并且公开了自己录制的网课视频,交互式的在线章节测试,以及利用 WireShark 进行抓包分析的 lab。唯一遗憾的是这门课并没有硬核的编程作业,而 Stanford 的 CS144 能很好地弥补这一点。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Computer-Network-A-Top-Down-Approach - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/计算机网络/topdown_ustc/index.html b/zh/计算机网络/topdown_ustc/index.html index cae60afe..a288ef89 100644 --- a/zh/计算机网络/topdown_ustc/index.html +++ b/zh/计算机网络/topdown_ustc/index.html @@ -1,2 +1,16 @@ USTC Computer Networking:A Top-Down Approach - CS自学指南
跳转至

USTC Computer Networking:A Top-Down Approach

课程简介

  • 所属大学:中国科学技术大学
  • 授课教师:郑烇、杨坚
  • 先修要求:操作系统(非必需)
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

这门课应该是中文互联网上比较火的计算机网络课了,教材采用神书计算机网络(自顶向下方法),授课风格更偏向实际而非纯理论(强烈建议先阅读教材预习再看课,否则上课时可能会有些懵圈)。

课程内容包括大部分自顶向下方法里的内容,同时涵盖考试内容,可放心观看。

课程视频是郑烇老师本人在哔哩哔哩上上传的,且从2020年至今一直坚持在评论区答疑,属实负责且认真。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/软件工程/6031/index.html b/zh/软件工程/6031/index.html index 29ca5aed..3354b842 100644 --- a/zh/软件工程/6031/index.html +++ b/zh/软件工程/6031/index.html @@ -1,2 +1,16 @@ MIT 6.031: Software Construction - CS自学指南
跳转至

MIT 6.031: Software Construction

课程简介

  • 所属大学:MIT
  • 先修要求:掌握至少一门编程语言
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

这门课的目标就是让学生学会如何写出高质量的代码,所谓高质量,则是满足下面三个目标(课程设计者原话复制,以防自己翻译曲解本意):

Safe from bugs. Correctness (correct behavior right now) and defensiveness (correct behavior in the future) are required in any software we build.

Easy to understand. The code has to communicate to future programmers who need to understand it and make changes in it (fixing bugs or adding new features). That future programmer might be you, months or years from now. You’ll be surprised how much you forget if you don’t write it down, and how much it helps your own future self to have a good design.

Ready for change. Software always changes. Some designs make it easy to make changes; others require throwing away and rewriting a lot of code.

为此,这门课的设计者们精心编写了一本书来阐释诸多软件构建的核心原则与前人总结下来的宝贵经验,内容细节到如何编写注释和函数 Specification,如何设计抽象数据结构以及诸多并行编程的内容,并且会让你在精心设计的 Java 编程项目里体验和练习这些编程模式。

2016年春季学期这门课开源了其所有编程作业的代码框架,而最新的课程教材可以在其最新的教学网站上找到,具体链接参见下方。

课程资源

  • 课程网站:2021spring, 2016spring
  • 课程视频:无
  • 课程教材:参见课程网站的课程 notes
  • 课程作业:4 个编程作业 + 1 个 Project

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.031-software-construction - GitHub 中。

@pengzhangzhi 完成了这门课的作业并记录了笔记, 代码开源在 pengzhangzhi/self-taught-CS/Software Construction - Github


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/zh/软件工程/CS169/index.html b/zh/软件工程/CS169/index.html index 0e5bab29..21bbb4ca 100644 --- a/zh/软件工程/CS169/index.html +++ b/zh/软件工程/CS169/index.html @@ -1,2 +1,16 @@ UCB CS169: software engineering - CS自学指南
跳转至

UCB CS169: software engineering

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Ruby/JavaScript
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利的软件工程课程,不同于很多传统的软件工程课强调各种类图、文档设计 (plan and document 模式),这门课专注于最近逐渐流行起来的敏捷开发 (Agile Development)模式,利用云平台提供软件即服务 (software as a service)。为此,课程设计者编写了 Software as a service 这本教材,通过 Ruby/Rails 框架来阐释 SaaS 这个概念,并且有丰富的配套编程练习。

这门课在 Edx 这个由 MIT 和 Harvard 大学发起的在线教育平台全资料开源,大家可以在 Edx 自行搜索 Agile SaaS Development 这门课程进行学习。课程内容基本按照教材的顺序带你一步步以敏捷开发的方式搭建一个软件并免费部署在云平台上。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS169-Software-Engineering - GitHub 中。


最后更新: October 8, 2022
Back to top
\ No newline at end of file diff --git a/人工智能/CS188/index.html b/人工智能/CS188/index.html index 01d84f48..6b0c6470 100644 --- a/人工智能/CS188/index.html +++ b/人工智能/CS188/index.html @@ -1,2 +1,16 @@ UCB CS188: Introduction to Artificial Intelligence - CS自学指南
跳转至

CS188: Introduction to Artificial Intelligence

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS70
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:50 小时

伯克利的人工智能入门课,课程 notes 写得非常深入浅出,基本不需要观看课程视频。课程内容的安排基本按照人工智能的经典教材 Artificial intelligence: A Modern Approach 的章节顺序,覆盖了搜索剪枝、约束满足问题、马尔可夫决策过程、强化学习、贝叶斯网络、隐马尔可夫模型以及基础的机器学习和神经网络的相关内容。

2018年秋季学期的版本免费开放了 gradescope,大家可以在线完成书面作业并实时得到测评结果。同时课程的 6 个 Project 也是质量爆炸,复现了经典的 Packman(吃豆人)小游戏,会让你利用学到的 AI 知识,去实现相关算法,让你的吃豆人在迷宫里自由穿梭,躲避鬼怪,收集豆子。

课程资源

  • 课程网站:Fall 2022Fall 2018
  • 课程视频:Fall 2022Fall 2018,每节课的链接详见课程网站
  • 课程教材:Artificial intelligence: A Modern Approach
  • 课程作业:在线测评书面作业和 Projects,详见课程网站

最后更新: December 6, 2022
Back to top
\ No newline at end of file diff --git a/人工智能/CS50/index.html b/人工智能/CS50/index.html index ca534151..a82144ef 100644 --- a/人工智能/CS50/index.html +++ b/人工智能/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50's Introduction to AI with Python - CS自学指南
跳转至

CS50’s Introduction to AI with Python

课程简介

  • 所属大学:Harvard
  • 先修要求:基本概率论 + Python基础
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:30 小时

一门非常基础的AI入门课,让人眼前一亮的是12个设计精巧的编程作业,都会用学到的AI知识去实现一个简易的游戏AI,比如用强化学习训练一个Nim游戏的AI,用alpha-beta剪枝去扫雷等等,非常适合新手入门或者大佬休闲。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/cs50_ai - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/人工智能/CYJ/index.html b/人工智能/CYJ/index.html index 28034a33..fb5f8638 100644 --- a/人工智能/CYJ/index.html +++ b/人工智能/CYJ/index.html @@ -1,2 +1,16 @@ 智能计算系统 - CS自学指南
跳转至

智能计算系统

课程简介

  • 所属大学:中国科学院大学
  • 先修要求:体系结构,深度学习
  • 编程语言:Python, C++, BCL
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时+

智能计算系统是智能的核心物质载体,每年全球要制造数以十亿计的智能计算系统(包括智能手机、智能服务器、智能可穿戴设备等),需要大量的智能计算系统的设计者和开发者。智能计算系统人才的培养直接关系到我国智能产业的核心竞争力。因此,对智能计算系统的认识和理解是智能时代计算机类专业学生培养方案中不可或缺的重要组成部分,是计算机类专业学生的核心竞争力。

国内的陈云霁老师开的课,在其他若干个大学也都有开对应的课程。这门课用一个个实验带大家以一个完整的视野理解人工智能的技术栈。从上层的深度学习框架,到用底层语言编写算子,再到硬件中 MLU 的设计,让大家形成系统思维,体会自上而下,融会贯通的乐趣。

我做了其中的 2,3,4,5 这几个实验,其中综合实验和硬件实验没有做,如果有做了的同学欢迎大家补上你的链接。

个人体会是第三章实现算子的实验让我对深度学习框架的了解加深了很多。第五章的实验BCL语言编写算子如果了解 CUDA 的话会感觉很熟悉。

推荐去买一本教材看一看,会让我们理解整体的技术栈。熟悉深度学习的同学可以直接从第五章开始看,看看深度学习框架底层到底是什么样的。

我因为这门课的启发,参考一本书(书名在仓库中)写了一个简易的深度学习框架。在这个框架里可以看到智能计算系统实验中的一些影子。同时受到 build-your-own-x 系列的启发,我也打算写一下教程,教大家写一个自己的深度学习框架。代码用 Python 写的,代码量较少,适合有一定基础的同学阅读。之后打算添加更多的算子,有望实现一个较为全面的框架,并希望移植到 C++ 中,以兼顾性能与开发效率。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在 ysj1173886760/Learning: ai-system - GitHub 中。


最后更新: November 14, 2022
Back to top
\ No newline at end of file diff --git a/体系结构/CS61C/index.html b/体系结构/CS61C/index.html index 508bd59d..656d6e39 100644 --- a/体系结构/CS61C/index.html +++ b/体系结构/CS61C/index.html @@ -1,2 +1,16 @@ UCB CS61C: Great Ideas in Computer Architecture - CS自学指南
跳转至

CS61C: Great Ideas in Computer Architecture

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利 CS61 系列的最后一门课程,深入计算机的硬件细节,带领学生逐步理解 C 语言是如何一步步转化为 RISC-V 汇编并在 CPU 上执行的。和 Nand2Tetris 不同,这门课 在难度和深度上都会提高很多,具体会涉及到流水线、Cache、虚存以及并发相关的内容。

这门课的 Project 也非常新颖有趣。Project1 会让你用 C 语言写一个小程序,20 年秋季学期是著名的游戏 Game of Life。Project2 会让你用 RISC-V 汇编编写一个神经网络,用来 识别 MNIST 手写数字,非常锻炼你对汇编代码的理解和运用。Project3 中你会用 Logisim 这个数字电路模拟软件搭建出一个二级流水线的 CPU,并在上面运行 RISC-V 汇编代码。Project4 会让你使用 OpenMP, SIMD 等方法并行优化矩阵运算,实现一个简易的 Numpy。

总而言之,这是个人上过的最好的计算机体系结构的课程。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61C-summer20 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/体系结构/CSAPP/index.html b/体系结构/CSAPP/index.html index 57e9fbd4..0f261e20 100644 --- a/体系结构/CSAPP/index.html +++ b/体系结构/CSAPP/index.html @@ -1,2 +1,16 @@ CMU 15-213: CSAPP - CS自学指南
跳转至

CMU CS15213: CSAPP

课程简介

  • 所属大学:CMU
  • 先修要求:CS61A, CS61B
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

CMU 大名鼎鼎的镇系神课,以其内容庞杂,Project 巨难而闻名遐迩。课程内容覆盖了汇编语言、体系结构、操作系统、编译链接、并行、网络等,作为系统入门课,兼具深度和广度,如果自学确实需要相当的毅力和代码功底。

这门课配合的教材由 CMU 计算机系主任 Bryant 教授执笔,也即所谓的 CSAPP。这也是我第一本认认真真一页一页读过去的计算机教材,虽然很难啃,但着实收获良多。

北大购买了这门课的版权并开设了 Introduction to Computer System 这门课,但其实 CSAPP 所有的课程资源和实验代码都能在它的官方主页上访问到(具体参见下方链接)。

这门课由于过于出名,全世界的码农争相学习,导致其 Project 的答案在网上几乎唾手可得。但如果你真的想锻炼自己的代码能力,希望你不要借鉴任何第三方代码。

认真学完这一门课,你对计算机系统的理解绝对会上升一个台阶。

课程资源

英语有困难的同学可以参考B站UP主九曲阑干对 CSAPP 的中文讲解(据说CMU的中国留学生也在CMU的课堂上看这个视频呢)。另外如果大家在看完 CSAPP 后对书中的第七章链接有一定的疑问,推荐阅读《程序员的自我修养》这本书,书的副标题是链接,装载与库。这本书能够帮助我们完善对程序链接的理解,相信你在看完这本书以后可以对程序的链接,ELF 文件,动态库都将有一个更加深入的理解。十分推荐在读完 CSAPP,对计算机系统有一定的了解以后作为补充资料来阅读。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/体系结构/DDCA/index.html b/体系结构/DDCA/index.html index 36f03b62..3f373145 100644 --- a/体系结构/DDCA/index.html +++ b/体系结构/DDCA/index.html @@ -1,2 +1,16 @@ Digital Design and Computer Architecture - CS自学指南
跳转至

Digital Design and Computer Architecture

课程简介

  • 所属大学:ETH Zurich
  • 先修要求:CS50 或同阶课程,最好有 C 语言基础。
  • 编程语言:C,Verilog,MIPS 汇编,LC3 汇编
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

体系结构领域的大牛 Onur Mutlu 来教你数字电路和计算机体系结构。课程完全从计算机设计的角度出发,从晶体管、逻辑门开始,一直讲解到微架构、缓存和虚拟内存,还会介绍 很多体系结构领域最新的研究进展。课程共有 9 个 lab,使用 Basys 3 FPGA 开发板(可自行购买)和 Xilinx 公司的 Vivado 软件(可在官网免费下载使用)进行电路设计,从组合电路 和时序电路开始,一直到最后部署一个完整的 CPU。课程资料除了 lab 答案和当期考试答案之外全部开源,学完之后你可以掌握计算机相关的数字电路,Verilog 硬件描述语言,MIPS 与 C 之间的转换关系,MIPS 单周期多周期流水线 CPU 的设计和性能分析,缓存,虚拟内存等重要概念。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/体系结构/N2T/index.html b/体系结构/N2T/index.html index 8e9f3954..7c3f84fa 100644 --- a/体系结构/N2T/index.html +++ b/体系结构/N2T/index.html @@ -1,2 +1,16 @@ Coursera: Nand2Tetris - CS自学指南
跳转至

Coursera: Nand2Tetris

课程简介

  • 所属大学:希伯来大学
  • 先修要求:无
  • 编程语言:任选一个编程语言
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

Coursera 上被数万人评为满分,在全球四百多所高校、高中被采用,让一个完全没有计算机基础的人从与非门开始造一台计算机,并在上面运行俄罗斯方块小游戏。

听起来就很酷对不对?实现起来更酷!这门课分为硬件和软件两个部分。在硬件部分,你将进入 01 的世界,用与非门构造出逻辑电路,并逐步搭建出一个 CPU 来运行一套课程作者定义的简易汇编代码。在软件部分,你将编写一个编译器,将作者开发的一个名为Jack的高级语言编译为可以运行在虚拟机上的字节码,然后进一步翻译为汇编代码。你还将开发一个简易的 OS,让你的计算机支持输入输出图形界面。至此,你可以用 Jack 开发一个俄罗斯方块的小游戏,将它编译为汇编代码,运行在你用与非门搭建出的 CPU 上,通过你开发的 OS 进行交互。学完这门课程,你将对整个计算机的体系结构有一个全局且深刻的理解,对于你后续课程的学习有着莫大的帮助。

你也许会担心课程会不会很难,但这门课面向的人群是完全没有计算机基础的人,课程作者的目标是让高中生都能理解。因此,只要你按部就班跟着课程规划走,一个月内学完应该绰绰有余。麻雀虽小但是五脏俱全,这门课很好地提取出了计算机的本质,而不过多地陷于现代计算机为了性能而设计出的众多复杂细节。让学习者能在轻松愉快的学习体验中感受计算机的优雅与神奇。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/NandToTetris - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/使用指南/index.html b/使用指南/index.html index c1ec25d4..4f943a11 100644 --- a/使用指南/index.html +++ b/使用指南/index.html @@ -1,2 +1,16 @@ 如何使用这本书 - CS自学指南
跳转至

如何使用这本书

随着贡献者的不断增多,本书的内容也不断扩展,想把书中所有的课程全部学完是不切实际也没有必要的,甚至会起到事倍功半的反效果,吃力而不讨好。为了更好地贴合读者,让这本书真正为你所用,我将读者按照需求大致分为了如下三类,大家可以结合切身实际,精准地规划属于自己的自学方案。

初入校园

如果你刚刚进入大学校园或者还在低年级,并且就读的是计算机方向或者想要转到计算机方向,那么你很幸运,因为学习是你的本业,你可以有充足的时间和自由来学习自己感兴趣的东西,不会有工作的压力和生活的琐碎,不必过于纠结“学了有没有用”,“能不能找到工作”这类功利的想法。那么该如何安排自己的学业呢?我觉得首要的一点就是要打破在高中形成的“按部就班”式的被动学习。作为一个小镇做题家,我深知国内大部分高中会把大家一天当中的每一分钟都安排得满满当当,你只需要被动地跟着课表按部就班地完成一个个既定的任务。只要足够认真,结果都不会太差。但步入大学的校门,自由度一下子变大了许多。首先所有的课外时间基本都由你自由支配,没有人为你整理知识点,总结提纲,考试也不像高中那般模式化。如果你还抱着高中那种“乖学生”的心态,老老实实按部就班,结果未必如你所愿。因为专业培养方案未必就是合理,老师的教学未必就会负责,认真出席课堂未必就能听懂,甚至考试内容未必就和讲的有关系。说句玩笑话,你或许会觉得全世界都与你为敌,而你只能指望自己。

那么现状就是这么个现状,你想改变,也得先活过去,并且拥有足够的能力去质疑它。而在低年级,打好基础很重要。这里的基础是全方面的,课内的知识固然重要,但计算机很大程度上还是强调实践,因此有很多课本外的能力需要培养,而这恰恰是国内的计算机本科教育很欠缺的一点。我根据个人的体验总结出了下面几点建议,供大家参考。

其一就是了解如何写“优雅”的代码。国内的很多大一编程入门课都会讲成极其无聊的语法课,其效果还不如直接让学生看官方文档。事实上,在刚开始接触编程的时候,让学生试着去了解什么样的代码是优雅的,什么样的代码 "have bad taste" 是大有裨益的。一般来说,编程入门课会先介绍过程式编程(例如 C 语言)。但即便是面向过程编程,模块化封装 的思想也极其重要。如果你只想着代码能在 OpenJudge 上通过,写的时候图省事,用大段的复制粘贴和臃肿的 main 函数,长此以往,你的代码质量将一直如此。一旦接触稍微大一点的项目,无尽的 debug 和沟通维护成本将把你吞没。因此,写代码时不断问自己,是否有大量重复的代码?当前函数是否过于复杂(Linux 提倡每个函数只需要做好一件事)?这段代码能抽象成一个函数吗?一开始你可能觉得很不习惯,甚至觉得这么简单的题需要如此大费周章吗?但记住好的习惯是无价的,C 语言初中生都能学会,凭什么公司要招你去当程序员呢?

学过面向过程编程后,大一下学期一般会讲面向对象编程(例如 C++ 或 Java)。这里非常推荐大家看 MIT 6.031: Software Construction 这门课的 Notes,会以 Java 语言为例非常详细地讲解如何写出“优雅”的代码。例如 Test-Driven 的开发、函数 Specification 的设计、异常的处理等等等等。除此之外,既然接触了面向对象,那么了解一些常见的设计模式也是很有必要的。因为国内的面向对象课程同样很容易变成极其无聊的语法课,让学生纠结于各种继承的语法,甚至出一些无聊的脑筋急转弯一样的题目,殊不知这些东西在地球人的开发中基本不会用到。面向对象的精髓是让学生学会自己将实际的问题抽象成若干类和它们之间的关系,而设计模式则是前人总结出来的一些精髓的抽象方法。这里推荐大话设计模式 这本书,写得非常浅显易懂。

其二就是尝试学习一些能提高生产力的工具和技能,例如 Git、Shell、Vim。这里强烈推荐学习 MIT missing semester 这门课,也许一开始接触这些工具用起来会很不习惯,但强迫自己用,熟练之后开发效率会直线提高。此外,还有很多应用也能极大提高的你生产力。一条定律是:一切需要让手离开键盘的操作,都应该想办法去除。例如切换应用、打开文件、浏览网页这些都有相关插件可以实现快捷操作(例如 Mac 上的 Alfred)。如果你发现某个操作每天都会用到,并且用时超过1秒,那就应该想办法把它缩减到0.1秒。毕竟以后数十年你都要和电脑打交道,形成一套顺滑的工作流是事半功倍的。最后,学会盲打!如果你还需要看着键盘打字,那么赶紧上网找个教程学会盲打,这将极大提高你的开发效率。

其三就是平衡好课内和自学。我们质疑现状,但也得遵守规则,毕竟绩点在保研中还是相当重要的。因此在大一,我还是建议大家尽量按照自己的课表学习,但辅以一些优质的课外资源。例如微积分线代可以参考 MIT 18.01/18.02MIT 18.06 的课程 Notes。假期可以通过 UCB CS61A 来学习 Python。同时做到上面第一、第二点说的,注重好的编程习惯和实践能力的培养。就个人经验,大一的数学课学分占比相当大,而且数学考试的内容方差是很大的,不同学校不同老师风格迥异,自学也许能让你领悟数学的本质,但未必能给你一个好成绩。因此考前最好有针对性地刷往年题,充分应试。

在升入大二之后,计算机方向的专业课将居多,此时大家可以彻底放飞自我,进入自学的殿堂了。具体可以参考 一份仅供参考的CS学习规划,这是我根据自己三年自学经历总结提炼出来的全套指南,每门课的特点以及为什么要上这门课我都做了简单的介绍。对于你课表上的每个课程,这份规划里应该都会有相应的国外课程,而且在质量上我相信基本是全方位的碾压。由于计算机方向的专业知识基本是一样的,而且高质量的课程会让你从原理上理解知识点,对于国内大多照本宣科式的教学来说基本是降维打击。一般来说只要考前将老师“辛苦”念了一学期的 PPT 拿来突击复习两天,取得一个不错的卷面分数并不困难。如果有课程大作业,则可以尽量将国外课程的 Lab 或者 Project 修改一番以应付课内的需要。我当时上操作系统课,发现老师还用着早已被国外学校淘汰的课程实验,便邮件老师换成了自己正在学习的 MIT 6.S081 的 xv6 Project,方便自学的同时还无意间推动了课程改革。总之,灵活变通是第一要义,你的目标是用最方便、效率最高的方式掌握知识,所有与你这一目标违背的所谓规定都可以想方设法地去“糊弄”。凭着这份糊弄劲儿,我大三之后基本没有去过线下课堂(大二疫情在家呆了大半年),对绩点也完全没有影响。

最后,希望大家少点浮躁和功利,多一些耐心和追求。很多人发邮件问我自学需不需要很强的自制力,我觉得得关键得看你自己想要什么。如果你依然抱着会一门编程语言便能月薪过万的幻想,想分一杯互联网的红利,那么我说再多也是废话。其实我最初的自学并没有太多功利的想法,只是单纯的好奇和本能的求知欲。自学的过程也没有所谓的“头悬梁,锥刺股”,该吃吃,该玩玩,不知不觉才发现竟然攒下了这么多资料。现如今中美的对抗已然成为趋势,而我们还在“卑微”地“师夷长技”,感叹国外高质量课程的同时也时常会有一种危机感。这一切靠谁来改变呢?靠的是刚刚入行的你们。所以,加油吧,少年!

删繁就简

如果你已经本科毕业开始读研或者走上了工作岗位,亦或是从事着其他领域的工作想要利用业余时间转码,那么你也许并没有充足的业余时间来系统地学完 一份仅供参考的CS学习规划 里的内容,但又想弥补本科时期欠下的基础。考虑到这部分读者通常有一定的编程经验,入门课程没有必要再重复学习。而且从实用角度来说,由于工作的大体方向已经确定,确实没有太大必要对于每个计算机分支都有特别深入的研究,更应该侧重一些通用性的原则和技能。因此我结合自身经历,选取了个人感觉最重要也是质量最高的几门核心专业课,希望能更好地加深读者对计算机的理解。学完这些课程,无论你具体从事的是什么工作,我相信你将不可能沦为一个普通的调包侠,而是对计算机的底层运行逻辑有更深入的了解。

课程方向 课程名
离散数学和概率论 UCB CS70 : discrete Math and probability theory
数据结构与算法 Coursera: Algorithms I & II
软件工程 MIT 6.031: Software Construction
全栈开发 MIT web development course
计算机系统导论 CMU CS15213: CSAPP
体系结构入门 Coursera: Nand2Tetris
体系结构进阶 CS61C: Great Ideas in Computer Architecture
数据库原理 CMU 15-445: Introduction to Database System
计算机网络 Computer Networking: A Top-Down Approach
人工智能 Harvard CS50: Introduction to AI with Python
深度学习 Coursera: Deep Learning

心有所属

如果你对于计算机领域的核心专业课都掌握得相当扎实,而且已经确定了自己的工作或研究方向,那么书中还有很多未在 一份仅供参考的CS学习规划 提到的课程供你探索。

随着贡献者的不断增多,左侧的目录中将不断增加新的分支,例如 机器学习进阶机器学习系统。并且同一个分支下都有若干同类型课程,它们来自不同的学校,有着不同的侧重点和课程实验,例如 操作系统 分支下就包含了麻省理工、伯克利还有南京大学三个学校的课程。如果你想深耕一个领域,那么学习这些同类的课程会给你不同的角度来看待类似的知识。同时,本书作者还计划联系一些相关领域的科研工作者来分享某个细分领域的科研学习路径,让 CS自学指南 在追求广度的同时,实现深度上的提高。

如果你想贡献这方面的内容,欢迎和作者邮件联系 zhongyinmin@pku.edu.cn


最后更新: October 24, 2022
Back to top
\ No newline at end of file diff --git a/后记/index.html b/后记/index.html index e58a7622..2f10fc79 100644 --- a/后记/index.html +++ b/后记/index.html @@ -1,2 +1,16 @@ 后记 - CS自学指南
跳转至

后记

从最初的想法开始,到断断续续完成这本书,再到树洞的热烈反响,我很激动,但也五味杂陈。原来在北大这个园子里,也有那么多人,对自己的本科生涯并不满意。而这里,可是囊括了中国非常优秀的一帮年轻人。所以问题出在哪里?我不知道。

我只是个籍籍无名的本科生呀,只是一个单纯的求学者,我的目标只是想快乐地、自由地、高质量地掌握那些专业知识,我想,正在看这本书的大多数本科生也是如此,谁想付出时间但却收效甚微呢?又是谁迫使大家带着痛苦去应付呢?我不知道。

我写这本书绝不是为了鼓励大家翘课自学,试问谁不想在课堂上和那么多优秀的同学济济一堂,热烈讨论呢?谁不想遇到问题直接找老师答疑解惑呢?谁不想辛苦学习的成果可以直接化作学校承认的学分绩点呢?可如果一个兢兢业业、按时到堂的学生收获的却是痛苦,而那个一学期只有考试会出席的学生却学得自得其乐,这公平吗?我不知道。

我只是不甘,不甘心这些通过高考战胜无数人进入高校的学子本可以收获一个更快乐的本科生涯,但现实却留给了他们遗憾。我反问自己,本科教育究竟应该带给我们什么呢?是学完所有这些课程吗?倒也未必,它也许只适合我这种nerd。但我觉得,本科教育至少得展现它应有的诚意,一种分享知识的诚意,一种以人为本的诚意,一种注重学生体验的诚意。它至少不应该是一种恶意,一种拼比知识的恶意,一种胜者为王的恶意,一种让人学无所得的恶意。但这一切能改变吗?我不知道。

我只知道我做了应该做的事情,学生们会用脚投票,树洞的关注量和回帖数证明了这样一份资料是有价值的,也道出了国内CS本科教育和国外的差距。也许这样的改变是微乎其微的,但别忘了我只是一个籍籍无名的本科生,是北大信科一千多名本科生中的普通一员,是中国几百万在读本科生中的一分子,如果有更多的人站出来,每个人做一点点,也许是分享一个帖子,也许是当一门课的助教,也许是精心设计一门课的lab,更或许是将来获得教职之后开设一门高质量的课程,出版一本经典的教材。本科教育真的有什么技术壁垒吗?我看未必,教育靠的是诚意,靠的是育人之心。

今天是2021年12月12日,我期待在不久的将来这个帖子会被遗忘,大家可以满心欢喜地选着自己培养方案上的课程,做着学校自行设计的各类编程实验,课堂没有签到也能济济一堂,学生踊跃地发言互动,大家的收获可以和努力成正比,那些曾经的遗憾和痛苦可以永远成为历史。我真的很期待那一天,真的真的真的很期待。

PKUFlyingPig

2021年12月12日写于燕园


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/培养方案Pro/index.html b/培养方案Pro/index.html index 11be2456..a39992a4 100644 --- a/培养方案Pro/index.html +++ b/培养方案Pro/index.html @@ -1,2 +1,16 @@ 培养方案Pro - CS自学指南

培养方案Pro

under construction.


最后更新: November 30, 2021
Back to top
\ No newline at end of file diff --git a/好书推荐/index.html b/好书推荐/index.html index 91393457..82acb89c 100644 --- a/好书推荐/index.html +++ b/好书推荐/index.html @@ -7,4 +7,18 @@ 同板块下的顺序要求: 先中文后英文,同种语言先开源后闭源,最后按从基础到深入或者字母序。 -->

由于版权原因,下面列举的图书中除了开源资源提供了链接,其他的资源请大家自行通过 libgenz-lib 查找。

资源汇总

系统入门

操作系统

计算机网络

分布式系统

数据库系统

编译原理

计算机编程语言

体系结构

理论计算机科学

密码学

逆向工程

计算机图形学

游戏引擎

软件工程

设计模式

深度学习

计算机视觉

机器人

面试


最后更新: November 30, 2022
Back to top
\ No newline at end of file diff --git a/并行与分布式系统/CS149/index.html b/并行与分布式系统/CS149/index.html index f89a412c..d393fa8d 100644 --- a/并行与分布式系统/CS149/index.html +++ b/并行与分布式系统/CS149/index.html @@ -1,2 +1,16 @@ CMU 15-418/Stanford CS149: Parallel Computing - CS自学指南
跳转至

CMU 15-418/Stanford CS149: Parallel Computing

课程简介

  • 所属大学:CMU 和 Stanford
  • 先修要求:计算机体系结构,熟悉 C++
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

Kayvon Fatahalian 教授此前在 CMU 开了 15-418 这门课,后来他成为 Stanford 的助理教授后又开了类似的课程 CS149。但总体来说,15-418 包含的课程内容更丰富,并且有课程回放,但 CS149 的编程作业更 fashion 一些。我个人是观看的 15-418 的课程录影但完成的 CS149 的作业。

这门课会带你深入理解现代并行计算架构的设计原则与必要权衡,并学会如何充分利用硬件资源以及软件编程框架(例如 CUDA,MPI,OpenMP 等)编写高性能的并行程序。由于并行计算架构的复杂性,这门课会涉及诸多高级体系结构与网络通信的内容,知识点相当底层且硬核。与此同时,5 个编程作业则是从软件的层面培养学生对上层抽象的理解与运用,具体会让你分析并行程序的瓶颈、编写多线程同步代码、学习 CUDA 编程、OpenMP 编程以及前段时间大热的 Spark 框架等等。真正意义上将理论与实践完美地结合在了一起。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS149-parallel-computing - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/并行与分布式系统/MIT6.824/index.html b/并行与分布式系统/MIT6.824/index.html index 2fc92610..1b595b4b 100644 --- a/并行与分布式系统/MIT6.824/index.html +++ b/并行与分布式系统/MIT6.824/index.html @@ -1,2 +1,16 @@ MIT 6.824: Distributed System - CS自学指南
跳转至

MIT6.824: Distributed System

课程简介

  • 所属大学:MIT
  • 先修要求:计算机体系结构,并行编程
  • 编程语言:Go
  • 课程难度:🌟🌟🌟🌟🌟🌟
  • 预计学时:200 小时

这门课和 MIT 6.S081 一样,出品自 MIT 大名鼎鼎的 PDOS 实验室,授课老师 Robert Morris 教授曾是一位顶尖黑客,世界上第一个蠕虫病毒 Morris 病毒就是出自他之手。

这门课每节课都会精读一篇分布式系统领域的经典论文,并由此传授分布式系统设计与实现的重要原则和关键技术。同时其课程 Project 也是以其难度之大而闻名遐迩,4 个编程作业循序渐进带你实现一个基于 Raft 共识算法的 KV-store 框架,让你在痛苦的 debug 中体会并行与分布式带来的随机性和复杂性。

同样,这门课由于太过出名,网上答案无数,希望大家不要参考,而是力图自主实现整个 Project。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.824 - GitHub 中。

@OneSizeFitsQuorumLab 文档 较为清晰地介绍了实现 lab 1-4 和 challenge 1-2 时需要考虑的许多细节,在遇到瓶颈期时可以阅读一下~~


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/CMake/index.html b/必学工具/CMake/index.html index 9af88ddf..8ad81b31 100644 --- a/必学工具/CMake/index.html +++ b/必学工具/CMake/index.html @@ -1,2 +1,16 @@ CMake - CS自学指南
跳转至

CMake

为什么学习 CMake

CMake 是类似于 GNU make 的跨平台自动软件构建工具,使用 CMakeLists.txt 定义构建规则,相比于 make 它提供了更多的功能,在各种软件构建上广泛使用。强烈建议学习使用 GNU Make 和熟悉 Makefile 后再学习 CMake

如何学习 CMake

CMakeLists.txtMakefile 更为抽象,理解和使用难度也更大。现阶段很多 IDE (如 Visual Studio, CLion) 提供了自动生成 CMakeLists.txt 的功能,但掌握 CMakeLists.txt 的基本用法仍然很有必要。除了 CMake 官方 Tutorial 外,上海交通大学 IPADS 组新人培训也提供了大约一小时的视频教程


最后更新: July 8, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/Docker/index.html b/必学工具/Docker/index.html index 8bf67726..1b75f947 100644 --- a/必学工具/Docker/index.html +++ b/必学工具/Docker/index.html @@ -1,2 +1,16 @@ Docker - CS自学指南
跳转至

Docker

为什么使用 Docker

使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。

Docker 的出现让环境配置变得(或许)不再折磨。简单来说 Docker 使用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的环境配置被打包为一个个 image 可以自由运行在不同平台的一个个 container 中,这极大地节省了所有人的时间成本。

如何学习 Docker

Docker 官方文档当然是最好的初学教材,但最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。Docker 在工业界发展迅猛并已经非常成熟,你可以下载它的桌面端并使用图形界面。

当然,如果你像我一样,是一个疯狂的造轮子爱好者,那不妨自己亲手写一个迷你 Docker 来加深理解。

KodeKloud Docker for the Absolute Beginner 全面的介绍了 Docker 的基础功能,并且有大量的配套练习,同时提供免费的云环境来完成练习。其余的云相关的课程如 Kubernetes 需要付费,但个人强烈推荐:讲解非常仔细,适合从 0 开始的新手;有配套的 Kubernetes 的实验环境,不用被搭建环境劝退。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/GNU_Make/index.html b/必学工具/GNU_Make/index.html index 8b09633b..b615e8d0 100644 --- a/必学工具/GNU_Make/index.html +++ b/必学工具/GNU_Make/index.html @@ -1,2 +1,16 @@ GNU Make - CS自学指南
跳转至

GNU Make

为什么学 GNU Make

大家第一次写 hello world 程序的时候一定都记得,在编辑完 helloworld.c 之后,需要用 gcc 编译生成可执行文件,然后再执行(如果你不理解前面这段话,请先自行谷歌 gcc 编译 并理解相关内容)。但如果你的项目由成百上千个 C 源文件组成,并且星罗棋布在各个子目录下,你该如何将它们编译链接到一起呢?假如你的项目编译一次需要半个小时(大型项目相当常见),而你只修改了一个分号,是不是还需要再等半个小时呢?

这时候 GNU Make 就闪亮登场了,它能让你在一个脚本里(即所谓的 Makefile)定义整个编译流程以及各个目标文件与源文件之间的依赖关系,并且只重新编译你的修改会影响到的部分,从而降低编译的时间。

如何学习 GNU Make

这里有一篇写得深入浅出的文档供大家参考。

GNU Make 掌握起来相对容易,但用好它需要不断的练习。将它融入到自己的日常开发中,勤于学习和模仿其他优秀开源项目里的 Makefile 的写法,总结出适合自己的 template,久而久之,你对 GNU Make 的使用会愈加纯熟。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/Git/index.html b/必学工具/Git/index.html index fdca5fd4..f30f551b 100644 --- a/必学工具/Git/index.html +++ b/必学工具/Git/index.html @@ -1,2 +1,16 @@ Git - CS自学指南
跳转至

Git

为什么使用 Git

Git 是一款分布式的代码版本控制工具,Linux 之父 Linus 嫌弃当时主流的中心式的版本控制工具太难用还要花钱,就自己开发出了 Git 用来维护 Linux 的版本(给大佬跪了)。

Git 的设计非常优雅,但初学者通常因为很难理解其内部逻辑因此会觉得非常难用。对 Git 不熟悉的初学者很容易出现因为误用命令将代码给控制版本控制没了的状况(好吧是我)。

但相信我,和 Vim 一样,Git 是一款你最终掌握之后会感叹“它值得!”的神器。

如何学习 Git

和 Vim 不同,我不建议初学者在一知半解的情况下贸然使用 Git,因为它的内部逻辑并不能熟能生巧,而是需要花时间去理解。我推荐的学习路线如下:

  1. 阅读这篇 Git tutorial,视频的话可以看这个尚硅谷Git教程
  2. 阅读这本开源书籍 Pro Git 的 Chapter1 - Chapter5,是的没错,学 Git 需要读一本书(捂脸)。
  3. 此时你已经掌握了 Git 的原理和绝大部分用法,接下来就可以在实践中反复巩固 Git 的命令了。但用好它同样是一门哲学,我个人觉得这篇如何写好 Commit Message 的博客非常值得一读。
  4. 好的此时你已经爱上了 Git,你已经不满足于学会它了,你想自己实现一个 Git!巧了,我当年也有这样的想法,这篇 tutorial 可以满足你!
  5. 什么?光实现一个 Git 无法满足你?小伙子/小仙女有前途,巧的是我也喜欢造轮子,这两个 GitHub 项目 build-your-own-xproject-based-learning 收录了你能想到的各种造轮子教程,比如:自己造个编辑器、自己写个虚拟机、自己写个 docker、自己写个 TCP 等等等等。

最后更新: May 12, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/GitHub/index.html b/必学工具/GitHub/index.html index 43185fab..fabc5eb1 100644 --- a/必学工具/GitHub/index.html +++ b/必学工具/GitHub/index.html @@ -1,2 +1,16 @@ GitHub - CS自学指南
跳转至

GitHub

GitHub 是什么

从功能上来说,GitHub 是一个在线代码托管平台。你可以将你的本地 Git 仓库托管到 GitHub 上,供多人同时开发浏览。但现如今 GitHub 的意义已远不止如此,它已经演变为一个非常活跃且资源极为丰富的开源交流社区。全世界的软件开发者在 GitHub 上分享各式各样种类繁多的开源软件。大到工业级的深度学习框架 PyTorch, TensorFlow,小到几十行的实用脚本,既有硬核的知识分享,也有保姆级的教程指导,甚至很多技术书籍也在 GitHub上开源(例如诸位正在看的这本——如果我厚着脸皮勉强称之为书的话)。闲来无事逛逛 GitHub 已经成为了我日常生活的一部分。

在 GitHub 里,星星是对一个项目至高无上的肯定,如果你觉得这本书对你有用的话,欢迎通过右上角的链接进入仓库主页献出你宝贵的星星✨。

如何使用 GitHub

如果你还从未在 GitHub 上建立过自己的远程仓库,也没有克隆过别人的代码,那么我建议你从 GitHub的官方教程开始自己的开源之旅。

如果你想时刻关注 GitHub 上一些有趣的开源项目,那么我向你重磅推荐 HelloGitHub 这个网站以及它的同名微信公众号。它会定期收录 GitHub 上近期开始流行的或者非常有趣的开源项目,让你有机会第一时间接触各类优质资源。

GitHub 之所以成功,我想是得益于“我为人人,人人为我”的开源精神,得益于知识分享的快乐。如果你也想成为下一个万人敬仰的开源大佬,或者下一个 star 破万的项目作者。那就把你在开发过程中灵感一现的 idea 化作代码,展示在 GitHub 上吧~

不过需要提醒的是,开源社区不是法外之地,很多开源软件并不是可以随意复制分发甚至贩卖的,了解各类开源协议并遵守,不仅是法律的要求,更是每个开源社区成员的责任。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/LaTeX/index.html b/必学工具/LaTeX/index.html index c307da28..c7761175 100644 --- a/必学工具/LaTeX/index.html +++ b/必学工具/LaTeX/index.html @@ -1,2 +1,16 @@ LaTeX - CS自学指南
跳转至

LaTeX

为什么学 LaTeX

如果你需要写论文,那么请直接跳到下一节,因为你不学也得学。

LaTeX 是一种基于 TeX 的排版系统,由图灵奖得主 Lamport 开发,而 Tex 则是由 Knuth 最初开发,这两位都是计算机界的巨擘。当然开发者强并不是我们学习 LaTeX 的理由,LaTeX 和常见的所见即所得的 Word 文档最大的区别就是用户只需要关注写作的内容,而排版则完全交给软件自动完成。这让没有任何排版经验的普通人得以写出排版非常专业的论文或文章。

Berkeley计算机系教授 Christos Papadimitriou 曾说过一句半开玩笑的话:

Every time I read a LaTeX document, I think, wow, this must be correct!

如何学习 LaTeX

推荐的学习路线如下:

  • LaTeX 的环境配置是个比较头疼的问题。如果你本地配置 LaTeX 环境出现了问题,可以考虑使用 Overleaf 这个在线 LaTeX 编辑网站。站内不仅有各种各样的 LaTeX 模版供你选择,还免去了环境配置的难题。
  • 阅读下面三篇 Tutorial: Part-1, Part-2, Part-3
  • 学习 LaTeX 最好的方式当然是写论文,不过从一门数学课入手用 LaTeX 写作业也是一个不错的选择。

最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/Scoop/index.html b/必学工具/Scoop/index.html index 985cc758..d3aefb38 100644 --- a/必学工具/Scoop/index.html +++ b/必学工具/Scoop/index.html @@ -9,4 +9,18 @@ irm get.scoop.sh -outfile 'install.ps1'

使用 Scoop

Scoop 的官方文档对于新手非常友好,相对于在此处赘述更推荐阅读 官方文档快速入门

Q&A

Scoop 能配置镜像源吗?

Scoop 社区仅维护安装配置,所有的软件都是从该软件官方提供的下载链接进行下载,所以无法提供镜像源。如果因为你的网络环境导致多次下载失败,那么你需要一点点 魔法

为什么找不到 Java8?

原因同上,官方已不再提供 Java8 的下载链接,推荐使用 ojdkbuild8 替代。

我需要安装 python2 该如何操作?

对于已经过时弃用的软件,Scoop 社区会将其从 ScoopInstaller/Main 中移除并将其添加到 ScoopInstaller/Versions 中。如果你需要这些软件的话需要手动添加 bucket:

scoop bucket add versions
 scoop install python27
 

最后更新: December 21, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/Vim/index.html b/必学工具/Vim/index.html index cec5614b..c63a4e57 100644 --- a/必学工具/Vim/index.html +++ b/必学工具/Vim/index.html @@ -1,2 +1,16 @@ Vim - CS自学指南
跳转至

Vim

为什么学习 Vim

在我看来 Vim 编辑器有如下的好处:

  • 让你的整个开发过程手指不需要离开键盘,而且光标的移动不需要方向键使得你的手指一直处在打字的最佳位置。
  • 方便的文件切换以及面板控制可以让你同时开发多份文件甚至同一个文件的不同位置。
  • Vim 的宏操作可以批量化处理重复操作(例如多行 tab,批量加双引号等等)
  • Vim 是很多服务器自带的命令行编辑器,当你通过 ssh 连接远程服务器之后,由于没有图形界面,只能在命令行里进行开发(当然现在很多 IDE 如 PyCharm 提供了 ssh 插件可以解决这个问题)。
  • 异常丰富的插件生态,让你拥有世界上最花里胡哨的命令行编辑器。

如何学习 Vim

不幸的是 Vim 的学习曲线确实相当陡峭,我花了好几个星期才慢慢适应了用 Vim 进行开发的过程。最开始你会觉得非常不适应,但一旦熬过了初始阶段,相信我,你会爱上 Vim。

Vim 的学习资料浩如烟海,但掌握它最好的方式还是将它用在日常的开发过程中,而不是一上来就去学各种花里胡哨的高级 Vim 技巧。个人推荐的学习路线如下:

  • 先阅读这篇 tutorial,掌握基本的 Vim 概念和使用方式。
  • 用 Vim 自带的 vimtutor 进行练习,安装完 Vim 之后直接在命令行里输入 vimtutor 即可进入练习程序。
  • 最后就是强迫自己使用 Vim 进行开发,IDE 里可以安装 Vim 插件。
  • 等你完全适应 Vim 之后新的世界便向你敞开了大门,你可以按需配置自己的 Vim(修改 .vimrc 文件),网上有数不胜数的资源可以借鉴。
  • 如果你想对配置 Vim 有更加深入的了解,Learn Vim Script the Hard Way 是一个很好的资源。

关于键位映射

用 Vim 编辑代码的时候会频繁用到 ESC 和 CTRL 键, 但是这两个键都离 home row 很远, 可以把 CapsLock 键映射到 Esc 或者 Ctrl 键,让手更舒服一些。

Windows 系统可以使用 Powertoys 或者 AutoHotkey 重映射键位。
MacOS 系统提供了重映射键位的设置,另外也可以使用 Karabiner-Elements 重映射。

但更佳的做法是同时将 CapsLock 映射为 Ctrl 和 Esc,点按为 Esc,按住为 Ctrl。

Windows 系统下,这个AutoHotKey gist 实现了这个功能。
MacOS 可以导入这个 karabiner rule 重映射。

推荐参考资料

  • Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
  • Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.

最后更新: December 5, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/thesis/index.html b/必学工具/thesis/index.html index 41b33461..0355797c 100644 --- a/必学工具/thesis/index.html +++ b/必学工具/thesis/index.html @@ -1,2 +1,16 @@ 毕业论文 - CS自学指南
跳转至

毕业论文

为什么写这份教程

2022年,我本科毕业了。在开始动手写毕业论文的时候,我尴尬地发现,我对 Word 的掌握程度仅限于调节字体、保存导出这些傻瓜功能。曾想转战 Latex,但论文的段落格式要求调整起来还是用 Word 更为方便,经过一番痛苦缠斗之后,总算是有惊无险地完成了论文的写作和答辩。为了不让后来者重蹈覆辙,遂把相关资源整理成一份开箱即用的文档,供大家参考。

如何用 Word 写毕业论文

正如将大象装进冰箱需要三步,用 Word 写毕业论文也只需要简单三步:

  • 确定论文的格式要求:通常学院都会下发毕业论文的格式要求(各级标题的字体字号、图例和引用的格式等等),如果更为贴心的话甚至会直接给出论文模版(如是此情况请直接跳转到下一步)。很不幸的是,我的学院并没有下发标准的论文格式要求,还提供了一份格式混乱几乎毫无用处的论文模版膈应我,被逼无奈之下我找到了北京大学研究生的论文格式要求,并按照其要求制作了一份模版,大家需要的话自取,本人不承担无法毕业等任何责任。

  • 学习 Word 排版:到达这一步的童鞋分为两类,一是已经拥有了学院提供的标准模版,二是只有一份虚无缥缈的格式要求。那现在当务之急就是学习基础的 Word 排版技术,对于前者可以学会使用模版,对于后者则可以学会制作模版。此时切记不要雄心勃勃地选择一个十几个小时的 Word 教学视频开始头悬梁锥刺股,因为生产一份应付毕业的学术垃圾只要学半小时能上手就够了。我当时看的一个 B 站的教学视频,短小精悍非常实用,全长半小时极速入门。

  • 生产学术垃圾:最容易的一步,大家八仙过海,各显神通吧,祝大家毕业顺利~~


最后更新: June 19, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/tools/index.html b/必学工具/tools/index.html index 14962acc..53e46027 100644 --- a/必学工具/tools/index.html +++ b/必学工具/tools/index.html @@ -1,2 +1,16 @@ 实用工具箱 - CS自学指南
跳转至

实用工具箱

下载工具

设计工具

  • excalidraw: 一款手绘风格的绘图工具,非常适合绘制课程报告或者PPT内的示意图。
  • tldraw: 一个绘图工具,适合画流程图,架构图等。
  • origamiway: 手把手教你怎么折纸。
  • thingiverse: 囊括各类 2D/3D 设计资源,其 STL 文件下载可直接 3D 打印。
  • iconfont: 国内最大的图标和插画资源库,可用于开发或绘制系统架构图。
  • turbosquid: 可以购买各式各样的模型。
  • flaticon: 可下载免费且高质量的图标。
  • 标准地图服务系统: 可以下载官方标准地图。

编程相关

  • sqlfiddle: 一个简易的在线 SQL Playground。
  • sqlzoo:在线练习 sql 语句。
  • godbolt: 非常方便的编译器探索工具。你可以写一段 C/C++ 代码,选择一款编译器,然后便可以观察生成的具体汇编代码。
  • explainshell: 你是否曾为一段 shell 代码的具体含义感到困扰?manpage 看半天还是不明所以?试试这个网站!
  • regex101: 正则表达式调试网站,支持各种编程语言的匹配标准。
  • typingtom: 针对程序员的打字练习/测速网站。
  • wrk: 网站压测工具。
  • gbmb: 数据单位转换。
  • tools: 在线工具合集。
  • github1s: 用网页版 VS Code 在线阅读 GitHub 代码。
  • visualgo: 算法可视化网站。
  • DataStructureVisual: 数据结构可视化网站。
  • Data Structure Visualizations: 数据结构与算法的可视化网站。
  • learngitbranching: 可视化学习 git。
  • UnicodeCharacter: Unicode 字符集网站。

学习网站

杂项


最后更新: December 15, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/workflow/index.html b/必学工具/workflow/index.html index b5ac4836..28b5282e 100644 --- a/必学工具/workflow/index.html +++ b/必学工具/workflow/index.html @@ -1,2 +1,16 @@ 日常学习工作流 - CS自学指南
跳转至

日常学习工作流

Contributed by @HardwayLinka

计算机领域的知识覆盖面很广并且更新速度很快,因此保持终身学习的习惯很重要。但在日常开发和学习的过程中,我们获取知识的来源相对复杂且细碎。有成百上千页的文档手册,也有寥寥数语的博客,甚至闲暇时手机上划过的某则新闻和公众号都有可能包含我们感兴趣的知识。因此,如何利用现有的各类工具,形成一套适合自己的学习工作流,将不同来源的知识碎片整合进属于自己的知识库,方便之后的查阅与复习,就显得尤为重要。经过两年工作之余的学习后,我磨合出了以下学习工作流:

底层核心逻辑

一开始我学习新知识时会参考中文博客,但在代码实践时往往会发现漏洞和bug。我逐渐意识到我参考的信息可能是错误的,毕竟发博客的门槛低,文章可信度不高,于是我开始查阅一些相关的中文书籍。

中文书籍的确是比较全面且系统地讲解了知识点,但众所周知,计算机技术更迭迅速,又因为老美在 CS 方面一直都是灯塔,所以一般中文书籍里的内容会滞后于当前最新的知识,导致我跟着中文书籍实践会出现软件版本差异的问题。这时我开始意识到一手信息的重要性,有些中文书籍是翻译英文书籍的,一般翻译一本书也要一两年,这会导致信息传递的延迟,还有就是翻译的过程中信息会有损失。如果一本中文书籍不是翻译的呢,那么它大概率也参考了其他书籍,参考的过程会带有对英文原著中语义理解的偏差。

于是我就顺其自然地开始翻阅英文书籍。不得不说,英文书籍内容的质量整体是比中文书籍高的。后来随着学习的层层深入,以知识的时效性和完整性出发,我发现 源代码 > 官方文档 > 英文书籍 > 英文博客 > 中文博客,最后我得出了一张 信息损失图

虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。

现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。

选择合适的笔记软件

工作流的骨架围绕 单个知识点多参考源,勤于提问给多个知识点之间建立联系 的底层核心逻辑建立。我们写论文其实就是遵循这个底层逻辑的。论文一般会有脚注去解释一些关键字,并且论文末尾会有多个参考的来源,但是我们平时写笔记会随意得多,因此需要更灵活的方式。

平时写代码习惯在 IDE 里一键跳转,把相关的函数和实现很好地联系在了一起。你也许会想,如果笔记也能像代码那样可以跳转就好了。现在市面上 双链笔记软件 就可以很好地解决这一痛点,例如 Roam Research、Logseq、Notion 和 Obsidian。Roam Research 和 Logseq 都是基于大纲结构的笔记软件,而 大纲结构 是劝退我使用这两款软件的原因。一是 大纲结构 做笔记容易使文章纵向篇幅太长,二是如果嵌套结构过多会占横向的篇幅。Notion 页面打开慢,弃之。最终我选择了 Obsidian,原因如下:

  • Obsidian 基于本地,打开速度快,且可存放很多电子书。我的笔记本是 32g 内存的华硕天选一代,拿来跑 Obsidian 可以快到飞起
  • Obsidian 基于 Markdown。这也是一个优势,如果笔记软件写的笔记格式是自家的编码格式,那么不方便其他第三方拓展,也不方便将笔记用其他软件打开,比如 qq 音乐下载歌曲有自己的格式,其他播放器播放不了,这挺恶心人的
  • Obsidian 有丰富的插件生态,并且这个生态既大又活跃,即插件数量多,且热门插件的 star 多,开发者会反馈用户 issue,版本会持续迭代。借助这些插件,可以使 Osidian 达到 all in one 的效果,即各类知识来源可以统一整合于一处

信息的来源

Obsidian 的插件使其可以支持 pdf 格式,而其本身又支持 Markdown 格式。如果想要 all in one,那么可以基于这两个格式,将其他格式文件转换为 pdf 或者 Markdown。 那么现在就面临着两个问题:

  • 有什么格式
  • 怎么转换为 pdf 或 Markdown

有什么格式

文件格式依托于其展示的平台,所以在看有什么格式之前,可以罗列一下我平时获取信息的来源:

可以看到主要分为文章论文电子书课程四类,包含的格式主要有 网页pdfmobiazwazw3

怎么转换为 pdf 或 Markdown

在线的文章和课程等大多以网页形式呈现,而将网页转换为 Markdown 可以使用剪藏软件,它可以将网页文章转换为多种文本格式文件。我选择的工具是简悦,使用简悦可以将几乎所有平台的文章很好地剪藏为 Markdown 并且导入到 Obsidian。

对于论文和电子书而言如果格式本身就是 pdf 则万事大吉,但如果是其他格式则可以使用 calibre 进行转换:

现在利用 Obsidian 的 pdf 插件和其原生的 markdown 支持就可以畅快无比地做笔记并且在这些文章的对应章节进行无缝衔接地引用跳转啦(具体操作参考下文的“信息的处理”模块)。

如何统一管理信息来源

对于 pdf 等文件类资源可以本地或者云端存储,而网页类资源则可以分门别类地放入浏览器的收藏夹,或者剪藏成 markdown 格式的笔记,但是网页浏览器不能实现移动端的网页收藏。为了实现跨端网页收藏我选用了 Cubox,在手机端看到感兴趣的网页时只需小手一划,便能将网页统一保存下来。虽然免费版只能收藏 100 个网页,但其实够用了,还可以在收藏满时督促自己赶紧剪藏消化掉这些网页,让收藏不吃灰。

除此之外,回想一下我们平时收藏的网页,就会发现有很多并不是像知乎、掘金这类有完整功能的博客平台,更多的是个人建的小站,而这些小站往往没有移动端应用,这样平时刷手机的时候也看不到,放到浏览器的收藏夹里又容易漏了看,有新文章发布我们也不能第一时间收到通知,这个时候就需要一种叫 RSS 的通信协议。

RSS(英文全称:RDF Site Summary 或 Really Simple Syndication),中文译作简易信息聚合,也称聚合内容,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。电脑端可以借助 RSSHub Radar 来快速发现和生成 RSS 订阅源,接着使用 Feedly 来订阅这些 RSS 订阅源(RSSHub RadarFeedly 在 chrome 浏览器中均有官方插件)。

到这里为止,收集信息的流程已经比较完备了。但资料再多,分类规整得再漂亮,也得真正内化成自己的才管用。因此在收集完信息后就得进一步地处理信息,即阅读这些信息,如果是英文信息的话还得搞懂英文的语义,加粗高亮重点句子段落,标记有疑问的地方,发散联想相关的知识点,最后写上自己的总结。那么在这过程中需要使用到什么工具呢?

信息的处理

英文信息

面对英文的资料,我以前是用 有道词典 来划词翻译,遇到句子的话就使用谷歌翻译,遇到大段落时就使用 deepl,久而久之,发现这样看英语文献太慢了,得用三个工具才能满足翻译这一个需求,如果有一个工具能够同时实现对单词、句子和段落的划词翻译就好了。我联想到研究生们应该会经常接触英语文献,于是我就搜 研究生 + 翻译软件,在检索结果里我最终选择了 Quicker + 沙拉查词 这个搭配来进行划词翻译。

使用这套组合可以实现在浏览器外的其他软件内进行划词翻译,并且支持单词、句子和段落的翻译,以及每次的翻译会有多个翻译平台的结果。btw,如果查单词时不着急的话,可以顺便看看 科林斯高阶 的翻译,这个词典的优点就是会用英文去解释英文,可以提供多个上下文帮助你理解,对于学习英文单词也有帮助,因为用英文解释英文才更接近英语的思维。

多媒体信息

处理完文本类的信息后,我们还得思考一下怎么处理多媒体类的信息。此处的多媒体我特指英文视频,因为我没有用播客或录音学习的习惯,而且我已经基本不看中文教程了。现在很多国外名校公开课都是以视频的形式,如果能对视频进行做笔记会不会有帮助呢?不知道大家有没这样的想法,就是如果能把老师上课讲的内容转换成文本就好了,因为平时学习时我们看书的速度往往会比老师讲课的速度快。刚好 Language Reactor 这个软件可以将油管和网飞内视频的字幕导出来,同时附上中文翻译。

我们可以把 Language Reactor 导出的字幕复制到 Obsidian 里面作为文章来读。除了出于学习的需求,也可以在平时看油管的视频时打开这个插件,这个插件可以同时显示中英文字幕,并且可以单击选中英文字幕中你认为生僻的单词后显示单词释义。

但阅读文本对于一些抽象的知识点来说并不是效率最高的学习方式。俗话说,一图胜千言,能不能将某一段知识点的文本和对应的图片甚至视频画面操作联系起来呢?我在浏览 Obsidian 的插件市场时,发现了一个叫 Media Extended 的插件,这个插件可以在你的笔记里添加跳转到视频指定时间进度的链接,相当于把你的笔记和视频连接起来了!这刚好可以和我上文提到的生成视频中英文字幕搭配起来,即每一句字幕对应一个时间,并且能根据时间点跳转到视频的指定进度,如此一来如果需要在文章中展示记录了操作过程的视频的话,就不需要自己去截取对应的视频片段,而是直接在文章内就能跳转!

Obsidian 里还有一个很强大的插件,叫 Annotator,它可以实现笔记内跳转到 pdf 原文

现在,使用 Obsidian 自带的双链功能,可以实现笔记间相互跳转,结合上述两个插件,可以实现笔记到多媒体的跳转,信息的处理过程已经完备。一般我们学习的过程相当于上山和下山,刚学的时候就好像上山,很陌生、吃力,所谓学而时习之,复习或练习的过程就像下山,没有陌生感,不见得轻松,但非走不可。那么如何把复习这一过程纳入工作流的环节里呢?

信息的回顾

Obsidian 内已经有一个连接 Anki 的插件,Anki 就是大名鼎鼎的、基于间隔重复的记忆软件。使用该插件可以截取笔记的片段导出到 Anki 并变成一张卡片,卡片内也有跳转回笔记原文的链接

总结

这个工作流是在我这两年业余时间学习时所慢慢形成的,在学习过程中因为对一些重复性的过程而感到厌倦,正是这种厌倦产生了某种特定的需求,恰好在平时网上冲浪时了解到的一些工具满足了我这些需求。不要为了虚无的满足感而将工具强行拼凑到自己的工作流中,人生苦短,做实事最紧要。

btw,此篇文章是讲解工作流的演化思路,如果对此工作流的实现细节感兴趣,建议阅读完本文后再按顺序阅读以下文章

  1. 3000 + 小时积累的学习工作流
  2. Obsidian 的高级玩法 | 打造能跳转到任何格式文件的笔记

最后更新: October 21, 2022
Back to top
\ No newline at end of file diff --git a/必学工具/翻墙/index.html b/必学工具/翻墙/index.html index 4ac16af4..21363c19 100644 --- a/必学工具/翻墙/index.html +++ b/必学工具/翻墙/index.html @@ -1,2 +1,16 @@ 翻墙 - CS自学指南
跳转至

翻墙

此链接出现在这里纯属二进制 bit 的随意组合,与本人毫无关系。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/操作系统/CS162/index.html b/操作系统/CS162/index.html index 84d93548..dd1071a9 100644 --- a/操作系统/CS162/index.html +++ b/操作系统/CS162/index.html @@ -1,2 +1,16 @@ UCB CS162: Operating System - CS自学指南
跳转至

CS162: Operating System

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:C, x86汇编
  • 课程难度:🌟🌟🌟🌟🌟🌟
  • 预计学时:200 小时+,上不封顶

这门课让我记忆犹新的有两个部分:

首先是教材,这本书用的教材 Operating Systems: Principles and Practice (2nd Edition) 一共四卷,写得非常深入浅出,很好地弥补了 MIT6.S081 在理论知识上的些许空白,非常建议大家阅读。相关资源会分享在本书的经典书籍推荐模块。

其次是这门课的 Project —— Pintos。Pintos 是由 Ben Pfaff 等人在 x86 平台上编写的教学用操作系统,Ben Pfaff 甚至专门发了篇 paper 来阐述 Pintos 的设计思想。

和 MIT 的 xv6 小而精的 lab 设计理念不同,Pintos 更注重系统的 Design and Implementation。Pintos 本身仅一万行左右,只提供了操作系统最基本的功能。而 4 个Project,就是让你在这个极为精简的操作系统之上,分别为其增加线程调度机制 (Project1),系统调用 (Project2),虚拟内存 (Project3) 以及文件系统 (Project4)。所有的 Project 都给学生留有很大的设计空间,总代码量在 2000 行左右。根据 Stanford 学生自己的反馈,在 3-4 人组队的情况下,后两个 Project 的人均耗时也在 40 个小时以上。

虽然难度很大,但 Stanford, Berkeley, JHU 等多所美国顶尖名校的操统课程均采用了 Pintos。如果你真的对操作系统很感兴趣,Pintos 会极大地提高你编写和 debug 底层系统代码的能力。在本科阶段,能自己设计、实现并 debug 一个大型系统,是一段非常珍贵的经历。

北大 2022 年春季学期的操作系统实验班也将会首次引入 Pintos 作为课程 Project。我和该课程的另一位助教整理并完善了 Pintos 的实验文档,并利用 Docker 配置了跨平台的实验环境,想自学的同学可以按文档自行学习。在毕业前的最后一个学期,希望能用这样的尝试,让更多人爱上系统领域,为国内的系统研究添砖加瓦。

课程资源

资源汇总

由于北大的操统实验班采用了该课程的 Project,为了防止代码抄袭,我的代码实现没有开源。


最后更新: May 11, 2022
Back to top
\ No newline at end of file diff --git a/操作系统/MIT6.S081/index.html b/操作系统/MIT6.S081/index.html index 6fc24c63..9cdcda0d 100644 --- a/操作系统/MIT6.S081/index.html +++ b/操作系统/MIT6.S081/index.html @@ -1,2 +1,16 @@ MIT 6.S081: Operating System Engineering - CS自学指南
跳转至

MIT 6.S081: Operating System Engineering

课程简介

  • 所属大学:麻省理工学院
  • 先修要求:体系结构 + 扎实的 C 语言功底 + RISC-V 汇编语言
  • 编程语言:C, RISC-V
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

麻省理工学院大名鼎鼎的 PDOS 实验室开设的面向MIT本科生的操作系统课程。开设这门课的教授之一 —— Robert Morris 教授曾是一位顶尖黑客,世界上第一个蠕虫病毒 Morris 就是出自他之手。

这门课的前身是 MIT 著名的课程 6.828,MIT 的几位教授为了这门课曾专门开发了一个基于 x86 的教学用操作系统 JOS,被众多名校作为自己的操统课程实验。但随着 RISC-V 的横空出世,这几位教授又基于 RISC-V 开发了一个新的教学用操作系统 xv6,并开设了 MIT6.S081 这门课。由于 RISC-V 轻便易学的特点,学生不需要像此前 JOS 一样纠结于众多 x86 “特有的”为了兼容而遗留下来的复杂机制,而可以专注于操作系统层面的开发。

这几位教授还专门写了一本教程,详细讲解了 xv6 的设计思想和实现细节。

这门课的讲授也很有意思,老师会带着学生依照 xv6 的源代码去理解操作系统的众多机制和设计细节,而不是停留于理论知识。每周都会有一个 lab,让你在 xv6 上增加一些新的机制和特性,非常注重学生动手能力的培养。整个学期一共有 11 个 lab,让你全方位地深刻理解操作系统的每个部分,非常有成就感。而且所有的lab都有着非常完善的测试框架,有的测试代码甚至上千行,让人不得不佩服 MIT 的几位教授为了教好这门课所付出的心血。

这门课的后半程会讲授操作系统领域的多篇经典论文,涉及文件系统、系统安全、网络、虚拟化等等多个主题,让你有机会接触到学界最前沿的研究方向。

课程资源

xv6 补充资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.S081-2020fall - GitHub 中。

@KuangjuX 编写了 MIT 6.S081 的 lab 的题解,里面有详细的解法和补充知识。另外,@KuangjuX 还使用 Rust 语言重新实现了 xv6-riscv 操作系统:xv6-rust,里面对于 xv6-riscv 有更为详细的思考和讨论,感兴趣的同学可以看一下哦。

一些可以参考的博客


最后更新: October 28, 2022
Back to top
\ No newline at end of file diff --git a/操作系统/NJUOS/index.html b/操作系统/NJUOS/index.html index 524aedcb..ea6da642 100644 --- a/操作系统/NJUOS/index.html +++ b/操作系统/NJUOS/index.html @@ -1,2 +1,16 @@ NJU OS: Operating System Design and Implementation - CS自学指南
跳转至

NJU OS: Operating System Design and Implementation

课程简介

  • 所属大学:南京大学
  • 先修要求:体系结构 + 扎实的 C 语言功底
  • 编程语言:C 语言
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:150 小时

之前一直听说南大的蒋炎岩老师开设的操作系统课程讲得很好,久闻不如一见,这学期有幸在 B 站观看了蒋老师的课程视频,确实收获良多。蒋老师作为非常年轻的老师,有着丰富的一线代码的经验,因此课程讲授有着满满的 Hacker 风格,课上经常“一言不合”就在命令行里开始写代码,很多重要知识点也都配有生动直白的代码示例。让我印象最为深刻的就是老师为了让学生更好地理解动态链接库的设计思想,甚至专门实现了一个迷你的可执行文件与一系列的二进制工具,让很多困扰我多年的问题都得到了解答。

这门课的讲授思路也非常有趣,蒋老师先从“程序就是状态机”这一视角入手,为“万恶之源”并发程序建立了状态机的转化模型,并在此基础上讲授了并发控制的常见手段以及并发bug的应对方法。接着蒋老师将操作系统看作一系列对象(进程/线程、地址空间、文件、设备等等)以及操作它们的 API (系统调用)并结合丰富的实际例子介绍了操作系统是如何利用这系列对象虚拟化硬件资源并给应用软件提供各类服务的。最后的可持久化部分,蒋老师从 1-bit 的存储介质讲起,一步步构建起各类存储设备,并通过设备驱动抽象出一组接口来方便地设计与实现文件系统。我之前虽然上过许多门操作系统的课程,但这种讲法确实独此一家,让我收获了很多独到的视角来看待系统软件。

这门课除了在理论知识的讲授部分很有新意外,注重实践也是蒋老师的一大特点。在课堂和编程作业里,蒋老师会有意无意地培养大家阅读源码、查阅手册的能力,这也是计算机从业者必备的技能。在完成第五个 MiniLab 期间,我第一次仔仔细细阅读了微软的 FAT 文件系统手册,收获了一次非常有价值的经历。

编程作业共由 5个 MiniLab 和 4个 OSLab 组成。美中不足的是作业的评测机是不对校外开放的,不过在邮件“骚扰”后蒋老师还是非常慷慨地让我成功蹭课。由于课余时间有限我只完成了 5个 MiniLab,总体体验非常棒。尤其是第二个协程实验让我印象最为深刻,在不到百行的小实验里深刻体验了上下文切换的美妙与“可怕”。另外其实几个 MiniLab 都能非常方便地进行本地测试,就算没有评测机也不影响自学,因此希望大家不要聚众“骚扰”老师以图蹭课。

最后再次感谢蒋老师设计并开放了这样一门非常棒的操作系统课程,这也是本书收录的第一门国内高校自主开设的计算机课程。正是有蒋老师这些年轻的新生代教师在繁重的 Tenure 考核之余的用爱发电,才让无数学子收获了难忘的本科生涯。也期待国内能有更多这样的良心好课,我也会第一时间收录进本书中让更多人受益。

课程资源

资源汇总

按蒋老师的要求,我的作业实现没有开源。


最后更新: June 10, 2022
Back to top
\ No newline at end of file diff --git a/数学基础/MITLA/index.html b/数学基础/MITLA/index.html index e99a5e79..017ec8b4 100644 --- a/数学基础/MITLA/index.html +++ b/数学基础/MITLA/index.html @@ -1,2 +1,16 @@ MIT18.06: Linear Algebra - CS自学指南
跳转至

MIT18.06: Linear Algebra

课程简介

  • 所属大学:MIT
  • 先修要求:英文
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:因人而异

数学大牛 Gilbert Strang 老先生年逾古稀仍坚持授课,其经典教材 Introduction to Linear Algebra 已被清华采用为官方教材。我当时看完盗版 PDF 之后深感愧疚,含泪花了两百多买了一本英文正版收藏。下面附上此书封面,如果你能完全理解封面图的数学含义,那你对线性代数的理解一定会达到新的高度。

image

配合油管数学网红 3Blue1Brown线性代数的本质系列视频食用更佳。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/数学基础/MITmaths/index.html b/数学基础/MITmaths/index.html index 922fceaa..44ef1c97 100644 --- a/数学基础/MITmaths/index.html +++ b/数学基础/MITmaths/index.html @@ -1,2 +1,16 @@ MIT18.01/18.02: Calculus - CS自学指南
跳转至

MIT Calculus Course

课程简介

  • 所属大学:MIT
  • 先修要求:英语
  • 编程语言:无
  • 课程难度:🌟🌟
  • 预计学时:因人而异

MIT 的微积分课由 MIT18.01: Single Variable Calculus 和 MIT18.02: Multivariable Calculus 两门课组成。对自己数学基础比较自信的同学可以只看课程 notes,写得非常浅显生动并且抓住本质,让你不再疲于做题而是能够真正窥见微积分的本质魅力。

配合油管数学网红 3Blue1Brown微积分的本质系列视频食用更佳。

课程资源

  • 课程网站:18.01, 18.02
  • 课程视频:参见课程网站
  • 课程教材:参见课程 notes
  • 课程作业:书面作业及答案参见课程网站

最后更新: September 25, 2022
Back to top
\ No newline at end of file diff --git a/数学基础/information/index.html b/数学基础/information/index.html index 63ee2ee7..b202286d 100644 --- a/数学基础/information/index.html +++ b/数学基础/information/index.html @@ -1,2 +1,16 @@ MIT6.050J: Information theory and Entropy - CS自学指南
跳转至

MIT6.050J: Information theory and Entropy

课程简介

  • 所属大学:MIT
  • 先修要求:无
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

MIT 面向大一新生的信息论入门课程,Penfield 教授专门为这门课写了一本教材作为课程 notes,内容深入浅出,生动有趣。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/6.042J/index.html b/数学进阶/6.042J/index.html index 641879b1..f6126937 100644 --- a/数学进阶/6.042J/index.html +++ b/数学进阶/6.042J/index.html @@ -1,2 +1,16 @@ MIT 6.042J: Mathematics for Computer Science - CS自学指南
跳转至

MIT 6.042J: Mathematics for Computer Science

课程简介

  • 所属大学:MIT
  • 先修要求:Calculus, Linear Algebra
  • 编程语言:Python preferred
  • 课程难度:🌟🌟🌟
  • 预计学时:50-70 小时

MIT 的离散数学以及概率综合课程,导师是大名鼎鼎的 Tom Leighton ( Akamai 的联合创始人之一)。学完之后对于后续的算法学习大有裨益。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/CS126/index.html b/数学进阶/CS126/index.html index abb76538..0417af61 100644 --- a/数学进阶/CS126/index.html +++ b/数学进阶/CS126/index.html @@ -1,2 +1,16 @@ UCB CS126: probability theory - CS自学指南
跳转至

UCB CS126 : Probability theory

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS70、微积分、线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利的概率论进阶课程,涉及到统计学、随机过程等理论相对深入的内容,需要相当的数学基础,我在上这门课的时候也感到有些吃力,不过坚持下来一定会让你对概率论的掌握达到一个新的高度。

同时这门课非常强调理论与实践的结合,课程设计者 Jean Walrand 教授专门写了一本配套的教材Probability in Electrical Engineering and Computer Science,书中每个章节都会以一个具体的算法实践作为例子来展示理论在实际当中的运用,例如 PageRank, Route Planing, Speech Recognition 等等,并且全书开源,可以免费下载 PDF 或者 Epub 版。

这还不算完,Jean Walrand 还为整本书里的例子设计了配套的 Python 实现,以 Jupyter Notebook 的形式在线发布,读者可以在线修改、调试和运行。

与此同时,这门课除了理论作业之外,还有 9 个编程作业,会让你用概率论的知识解决实际问题。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/EECS126 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/CS70/index.html b/数学进阶/CS70/index.html index 91af0e97..6eb34cbc 100644 --- a/数学进阶/CS70/index.html +++ b/数学进阶/CS70/index.html @@ -1,2 +1,16 @@ UCB CS70: discrete Math and probability theory - CS自学指南
跳转至

UCB CS70 : discrete Math and probability theory

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利的离散数学入门课程,个人觉得这门课最大的亮点在于并不是单纯的理论知识的讲授,而是在每个模块都会介绍理论知识在实际算法中的运用,让计算机系的学生在夯实理论基础的同时,跳脱出冰冷形式化的数学符号,在实际应用中感受和体会理论的本质。

具体的理论与算法的对应关系列举如下:

  • 逻辑证明:稳定匹配算法
  • 图论:网络拓扑设计
  • 基础数论:RSA 算法
  • 多项式环:纠错码设计
  • 概率论:哈希表设计、负载均衡等等

课程 notes 也写得非常深入浅出,公式推导与实际例子星罗棋布,阅读体验很好。

课程资源

  • 课程网站:http://www.eecs70.org/
  • 课程教材:参见课程 notes
  • 课程作业:参见课程 Schedule

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS70 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html b/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html index fa76ea1c..4c8c939c 100644 --- a/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html +++ b/数学进阶/The_Information_Theory_Pattern_Recognition_and_Neural_Networks/index.html @@ -1,2 +1,16 @@ The Information Theory, Patter Recognition, and Neural Networks - CS自学指南
跳转至

The Information Theory, Patter Recognition, and Neural Networks

课程简介

  • 所属大学:Cambridge
  • 先修要求:Calculus, Linear Algebra, Probabilities and Statistics
  • 编程语言:Anything would be OK, Python preferred
  • 课程难度:🌟🌟🌟
  • 预计学时:30-50 小时

剑桥大学 Sir David MacKay 教授的信息论课程。教授是一位十分精通信息论与神经网络的学者,课程对应教材也是信息论领域的一部经典著作。可惜天妒英才...

课程资源

R.I.P Prof. David MacKay


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/convex/index.html b/数学进阶/convex/index.html index afefc9ec..cb639f99 100644 --- a/数学进阶/convex/index.html +++ b/数学进阶/convex/index.html @@ -1,2 +1,16 @@ Standford EE364A: Convex Optimization - CS自学指南
跳转至

Stanford EE364A: Convex Optimization

课程简介

  • 所属大学:Stanford
  • 先修要求:Python,微积分,线性代数,概率论,数值分析
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

Stephen Boyd 教授是凸优化领域的大牛,其编写的 Convex Optimization 这本教材被众多名校采用。另外其研究团队还专门开发了一个用于求解常见凸优化问题的编程框架,支持 Python, Julia 等主流编程语言,其课程作业也是采用这个编程框架去解决实际生活当中的凸优化问题。

在实际运用当中,你会深刻体会到对于同一个问题,建模过程中一个细小的改变,其方程的求解难度会有天壤之别,如何让你建模的方程是“凸”的,是一门艺术。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Standford_CVX101 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数学进阶/numerical/index.html b/数学进阶/numerical/index.html index fad9d1e4..59472e5c 100644 --- a/数学进阶/numerical/index.html +++ b/数学进阶/numerical/index.html @@ -1,2 +1,16 @@ MIT18.330: Introduction to numerical analysis - CS自学指南
跳转至

MIT18.330 : Introduction to numerical analysis

课程简介

  • 所属大学:MIT
  • 先修要求:微积分,线性代数,概率论
  • 编程语言:Julia
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

计算机强大的计算能力帮助人们在科学领域不断突破边界,不过计算机的离散本质和这个连续的世界有着天然鸿沟,而如何用离散的表示去估计和逼近那些数学上连续的概念,则是数值分析的重要主题。

这门课会在浮点表示、方程求解、线性代数、微积分、微分方程等领域探讨各类数值分析方法,让你在 Julia 的编程实践中反复体悟(1)如何建立估计(2)如何估计误差(3)如何用算法实现估计 这一系列步骤。

这门课的设计者还编写了配套的开源教材(参见下方链接),里面有丰富的 Julia 实例。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT18.330 - GitHub 中。


最后更新: September 26, 2022
Back to top
\ No newline at end of file diff --git a/数据库系统/15445/index.html b/数据库系统/15445/index.html index 5aaf209f..60fa9904 100644 --- a/数据库系统/15445/index.html +++ b/数据库系统/15445/index.html @@ -1,2 +1,16 @@ CMU 15-445: Database Systems - CS自学指南
跳转至

CMU 15-445: Database Systems

课程简介

  • 所属大学:CMU
  • 先修要求:C++,数据结构与算法
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

作为 CMU 数据库的入门课,这门课由数据库领域的大牛 Andy Pavlo 讲授(“这个世界上我只在乎两件事,一是我的老婆,二就是数据库”)。15-445 会自底向上地教你数据库系统的基本组成部分:存储、索引、查询,以及并发事务控制。 这门课的亮点在于 CMU db 专门为此课开发了一个教学用的关系型数据库 bustub,并要求你对这个数据库的组成部分进行修改,实现上述部件的功能。此外 bustub 作为一个 C++ 编写的中小型项目涵盖了程序构建、代码规范、单元测试等众多要求,可以作为一个优秀的开源项目学习。

课程资源

  • 课程网站:Fall2019, Fall2020, Fall2021
  • 课程视频:课程网站免费观看
  • 课程教材:Database System Concepts
  • 课程作业:4 个 Project

在 Fall2019 中,第二个 Project 是做哈希索引,第四个 Project 是做日志与恢复。

在 Fall2020 中,第二个 Project 是做 B 树,第四个 Project 是做并发控制。

在 Fall2021 中,第一个 Project 是做缓存池管理,第二个 Project 是做哈希索引,第四个 Project 是做并发控制。

如果大家有精力的话可以都去尝试一下,或者在对书中内容理解不是很透彻的时候,尝试用代码写一个会加深你的理解。

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在 ysj1173886760/Learning: db - GitHub 中。

由于 Andy 的要求,仓库中没有 Project 的实现,只有 Homework 的 Solution。特别的,对于 Homework1,@ysj1173886760 还写了一个 Shell 脚本来帮大家执行自动判分。

另外在课程结束后,推荐阅读一篇论文 Architecture Of a Database System,对应的中文版也在上述仓库中。论文里综述了数据库系统的整体架构,让大家可以对数据库有一个更加全面的视野。

后续课程

CMU15-721 主要讲主存数据库有关的内容,每节课都有对应的 paper 要读,推荐给希望进阶数据库的小伙伴。@ysj1173886760 目前也在跟进这门课,完成后会在这里提 PR 以提供进阶的指导。


最后更新: October 31, 2022
Back to top
\ No newline at end of file diff --git a/数据库系统/CS122/index.html b/数据库系统/CS122/index.html index acf65fad..94ad6a1d 100644 --- a/数据库系统/CS122/index.html +++ b/数据库系统/CS122/index.html @@ -1,2 +1,16 @@ Caltech CS122: Database System Implementation - CS自学指南
跳转至

Caltech CS 122: Database System Implementation

课程简介

  • 所属大学:Caltech
  • 先修要求:无
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

加州理工的这门课,不同于没有提供 SQL 层功能的 CMU15-445 课程。CS122 课程 Lab 的侧重点在于 SQL 层的相关实现,涉及查询优化器的各个模块,比如SQL的解析,Translate,如何实现 Join,统计信息以及代价估计,子查询实现,Agg,Group By 的实现等。除此之外,还有 B+树,WAL 相关实验。本门课程适合在学完 CMU15-445 课程之后,对查询优化相关内容有兴趣的同学。

下面介绍一下这门课的前 3 个 Assignment 也就是实验 Lab 所要实现的功能:

Assignment1

  • 为 NanoDB 提供 delete,update 语句的支持。
  • 为 Buffer Pool Manager 添加合适的 pin/unpin 代码。
  • 提升 insert 语句的性能, 同时不使数据库文件大小过分膨胀。

Assignment2

  • 实现一个简单的计划生成器,将各种已经 Parser 过的 SQL 语句转化为可执行的执行计划。
  • 使用 nested-loop join 算法,实现支持 inner- and outer-join 的 Join 计划节点。
  • 添加一些单元测试, 保证 inner- and outer-join 功能实现正确。

Assignment3

  • 完成收集表的统计信息。
  • 完成各种计划节点的计划成本计算。
  • 计算可出现在执行计划中的各种谓词的选择性。
  • 根据谓词更新计划节点输出的元组统计信息。

剩余 Assignment 和 Challenges 可以查看课程介绍,推荐使用 IDEA 打开工程,Maven 构建,注意日志相关配置。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数据库系统/CS186/index.html b/数据库系统/CS186/index.html index dbc819a3..32178c14 100644 --- a/数据库系统/CS186/index.html +++ b/数据库系统/CS186/index.html @@ -1,2 +1,16 @@ UCB CS186: Introduction to Database System - CS自学指南
跳转至

UCB CS186: Introduction to Database System

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

如何编写 SQL 查询?SQL 命令是如何被一步步拆解、优化、转变为一个个磁盘查询指令的?如何实现高并发的数据库?如何实现数据库的故障恢复?什么又是非关系型数据库?这门课会带你深入理解关系型数据库的内部细节,并在掌握理论知识之后,动手用 Java 实现一个支持 SQL 并发查询、B+ 树 Index 和故障恢复的关系型数据库。

从实用角度来说,这门课还会在编程作业中锻炼你编写 SQL 查询以及 NoSQL 查询的能力,对于构建一些全栈的工程项目很有帮助。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS186 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数据库系统/CS346/index.html b/数据库系统/CS346/index.html index ca78110d..0ead9901 100644 --- a/数据库系统/CS346/index.html +++ b/数据库系统/CS346/index.html @@ -1,2 +1,16 @@ Stanford CS346: Database System Implementation - CS自学指南
跳转至

Stanford CS 346: Database System Implementation

课程简介

  • 所属大学:Stanford
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

RedBase 是 cs346 的一个项目,实现了一个简易的数据库系统,项目是高度结构化的。整个项目能够被分为以下几个部分(同时也是 4 个 lab 需要进行完善): 1. The record management component:记录管理组件。 2. The index component:B+ 索引管理。 3. The System Management Component:ddl语句、命令行工具、数据加载命令、元数据管理。 4. The Query Language Component:在这个部分需要实现 RQL Redbase 查询语言。RQL 要实现 select、insert、delete、update 语句。 5. Extension Component:除了上述数据库系统的基本功能组件,还需要实现一个扩展组件,可以是Blob类型、 网络模块、连接算法、CBO优化器、OLAP、事务等。

RedBase 适合在学完 CMU-15445 后继续学习数据库系统中的其他组件,因为其代码量不多,可以方便的根据需要扩展代码。同时代码完全由 C++ 编写,也可以用于练习 C++ 编程技巧。

课程资源


最后更新: October 28, 2022
Back to top
\ No newline at end of file diff --git a/数据科学/Data100/index.html b/数据科学/Data100/index.html index 5ed7bb1c..11fb6c96 100644 --- a/数据科学/Data100/index.html +++ b/数据科学/Data100/index.html @@ -1,2 +1,16 @@ UCB Data100: Principles and Techniques of Data Science - CS自学指南
跳转至

UCB Data100: Principles and Techniques of Data Science

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A,线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

伯克利的数据科学入门课程,内容相对基础,覆盖了数据清洗、特征提取、数据可视化以及机器学习和推理的基础内容,也会讲授 Pandas, Numpy, Matplotlib 等数据科学常用工具。其丰富有趣的编程作业也是这门课的一大亮点。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/数据结构与算法/Algo/index.html b/数据结构与算法/Algo/index.html index 78e4edb6..24f617dd 100644 --- a/数据结构与算法/Algo/index.html +++ b/数据结构与算法/Algo/index.html @@ -1,2 +1,16 @@ Coursera: Algorithms I & II - CS自学指南
跳转至

Coursera: Algorithms I & II

课程简介

  • 所属大学:Princeton
  • 先修要求:CS61A
  • 编程语言:Java
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

这是 Coursera 上评分最高的算法课程。Robert Sedgewick 教授有一种魔力,可以将无论多么复杂的算法讲得极为生动浅显。实不相瞒,困扰我多年的 KMP 以及网络流算法都是在这门课上让我茅塞顿开的,时隔两年我甚至还能写出这两个算法的推导与证明。

你是否觉得算法学了就忘呢?我觉得让你完全掌握一个算法的核心在于理解三点:

  • 为什么这么做?(正确性推导,抑或是整个算法的核心本质)
  • 如何实现它?(光学不用假把式)
  • 用它解决实际问题(学以致用才是真本事)

这门课的构成就非常好地契合了上述三个步骤。观看课程视频并且阅读教授的开源课本有助于你理解算法的本质,让你也可以用非常 生动浅显的话语向别人讲述为什么这个算法得长这个样子。

在理解算法之后,你可以阅读教授对于课程中讲授的所有数据结构与算法的代码实现。 注意,这些实现可不是 demo 性质的,而是工业级的高效实现,从注释到变量命名都非常严谨,模块化也做得相当好,是质量很高的代码。我从这些代码中收获良多。

最后,就是这门课最激动人心的部分了,10 个高质量的 Project,并且全都有实际问题的背景描述,丰富的测试样例,自动的评分系统(代码风格也是评分的一环)。让你在实际生活中 领略算法的魅力。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Princeton-Algorithm - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数据结构与算法/CS170/index.html b/数据结构与算法/CS170/index.html index 26087249..9147cf4b 100644 --- a/数据结构与算法/CS170/index.html +++ b/数据结构与算法/CS170/index.html @@ -1,2 +1,16 @@ UCB CS170: Efficient Algorithms and Intractable Problems - CS自学指南
跳转至

CS170: Efficient Algorithms and Intractable Problems

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61B, CS70
  • 编程语言:LaTeX
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利的算法设计课,更注重算法的理论基础与复杂度分析。课程内容涵盖了分治、图算法、最短路、生成树、贪心、动规、并查集、线性规划、网络流、NP 问题、随机算法、哈希算法等等。

这门课的教材写的很好,证明浅显易懂,非常适合作为工具书查阅。另外,这门课只有书面作业,并且推荐用 LaTeX 编写,大家可以借此机会锻炼自己的 LaTeX 技巧。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS170 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/数据结构与算法/CS61B/index.html b/数据结构与算法/CS61B/index.html index 53c379fb..944a454a 100644 --- a/数据结构与算法/CS61B/index.html +++ b/数据结构与算法/CS61B/index.html @@ -1,2 +1,16 @@ UCB CS61B: Data Structures and Algorithms - CS自学指南
跳转至

CS61B: Data Structures and Algorithms

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A
  • 编程语言:Java
  • 课程难度:🌟🌟🌟
  • 预计学时:60 小时

伯克利 CS61 系列的第二门课程,注重数据结构与算法的设计,同时让学生有机会接触上千行的工程代码,通过 Java 初步领会软件工程的思想。

我上的是 2018 年春季学期的版本,该课的开课老师 Josh Hug 教授慷慨地将 autograder 开源了,大家可以通过网站公开的邀请码在 gradescope 免费加入课程,从而方便地测评自己的代码。

这门课所有的编程作业都是使用 Java 完成的。没有 Java 基础的同学也不用担心,课程会有保姆级的教程,从 IDEA(一款主流的 Java 编程环境)的配置讲起,把 Java 的核心语法与特性事无巨细地讲授,大家完全不用担心跟不上的问题。

这门课的作业质量也是绝绝子。14 个 lab 会让你自己实现课上所讲的绝大部分数据结构,10 个 Homework 会让你运用数据结构和算法解决实际问题, 另外还有 3 个 Project 更是让你有机会接触上千行的工程代码,在实战中磨练自己的 Java 能力。

课程资源

  • 课程网站:https://sp18.datastructur.es/
  • 课程视频:https://sp18.datastructur.es/,每节课的链接详见课程网站
  • 课程教材:无
  • 课程作业:每年略有不同,18 年春季学期有 14 个 Lab,10 个 Homework以及 3 个 Project,具体要求详见课程网站。

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61B - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/机器学习/CS189/index.html b/机器学习/CS189/index.html index 0908ba12..2b02d01a 100644 --- a/机器学习/CS189/index.html +++ b/机器学习/CS189/index.html @@ -1,2 +1,16 @@ UCB CS189: Introduction to Machine Learning - CS自学指南
跳转至

CS189: Introduction to Machine Learning

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS188, CS70
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

这门课我没有系统上过,只是把它的课程 notes 作为工具书查阅。不过从课程网站上来看,它比 CS229 好的是开源了所有 homework 的代码以及 gradescope 的 autograder。同样,这门课讲得相当理论且深入。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习/CS229/index.html b/机器学习/CS229/index.html index e80c2351..bfc27926 100644 --- a/机器学习/CS229/index.html +++ b/机器学习/CS229/index.html @@ -1,2 +1,16 @@ Stanford CS229: Machine Learning - CS自学指南
跳转至

CS229: Machine Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:高数,概率论,Python,需要较深厚的数学功底
  • 编程语言:无
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

同样是吴恩达讲授,但是这是一门研究生课程,所以更偏重数学理论,不满足于调包而想深入理解算法本质,或者有志于从事机器学习理论研究的同学可以学习这门课程。课程网站上提供了所有的课程 notes,写得非常专业且理论,需要一定的数学功底。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS229 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/机器学习/ML/index.html b/机器学习/ML/index.html index d94c6938..8c89df9c 100644 --- a/机器学习/ML/index.html +++ b/机器学习/ML/index.html @@ -1,2 +1,16 @@ Coursera: Machine Learning - CS自学指南
跳转至

Coursera: Machine Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:AI 入门 + 熟练使用 Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:100 小时

说起吴恩达,在 AI 届应该无人不晓。他是著名在线教育平台 Coursera 的创始人之一,同时也是 Stanford 的网红教授。这门机器学习入门课应该算得上是他的成名作之一(另一个是深度学习课程),在 Coursera 上拥有数十万的学习者(注意这是花钱买了证书的人,一个证书几百刀),白嫖学习者数量应该是另一个数量级了。

这门课对新手极其友好,吴恩达拥有把机器学习讲成 1+1=2 一样直白的能力。你将会学习到线性回归、逻辑回归、支持向量机、无监督学习、降维、异常检测和推荐系统等等知识,并且在编程实践中夯实自己的理解。作业质量自然不必多言,保姆级代码框架,作业背景也多取自生活,让人学以致用。

当然,这门课作为一个公开慕课,难度上刻意放低了些,很多数学推导大多一带而过,如果你有志于从事机器学习理论研究,想要深究这些算法背后的数学理论,可以参考 CS229CS189

课程资源

资源汇总

当时重装系统误删了文件,我的代码实现消失在了磁盘的 01 串中。不过这门课由于太过出名,网上想搜不到答案都难,相关课程资料 Coursera 上也一应俱全。


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习系统/CMU10-414/index.html b/机器学习系统/CMU10-414/index.html index 57dc6737..06243526 100644 --- a/机器学习系统/CMU10-414/index.html +++ b/机器学习系统/CMU10-414/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这是 CMU 2022年秋季学期开设的一门新课,聚焦于深度学习框架的具体实现,课程 Project 会实现一个迷你的类似于 Pytorch 深度学习框架。课程免费提供了面向非 CMU 学生的在线版本,9月13日正式授课,作者持续跟进中。

课程资源

资源汇总

TBA


最后更新: September 7, 2022
Back to top
\ No newline at end of file diff --git a/机器学习系统/MLC/index.html b/机器学习系统/MLC/index.html index 23462b61..bda2e37d 100644 --- a/机器学习系统/MLC/index.html +++ b/机器学习系统/MLC/index.html @@ -5,4 +5,18 @@ (4)自学这门课的注意点(踩过的坑、难度预警等等) (5)... ... -->

这门课是机器学习编译领域的顶尖学者陈天奇在2022年暑期开设的一门在线课程。其实机器学习编译无论在工业界还是学术界仍然是一个非常前沿且快速更迭的领域,国内外此前还没有为这个方向专门开设的相关课程。因此如果对机器学习编译感兴趣想有个全貌性的感知的话,可以学习一下这门课。

本课程主要以 Apache TVM 这一主流的机器学习编译框架为例(陈天奇是这个框架的创始人之一),聚焦于如何将开发模式下(如 Tensorflow, Pytorch, Jax)的各类机器学习模型,通过一套普适的抽象和优化算法,变换为拥有更高性能并且适配各类底层硬件的部署模式。课程讲授的知识点都是相对 High-Level 的宏观概念,同时每节课都会有一个配套的 Jupyter Notebook 来通过具体的代码讲解知识点,因此如果从事 TVM 相关的编程开发的话,这门课有丰富且规范的代码示例以供参考。

所有的课程资源全部开源并且有中文和英文两个版本,B站和油管分别有中文和英文的课程录影。

课程资源


最后更新: September 5, 2022
Back to top
\ No newline at end of file diff --git a/机器学习进阶/CMU10-708/index.html b/机器学习进阶/CMU10-708/index.html index 59b3b8d9..34918fc5 100644 --- a/机器学习进阶/CMU10-708/index.html +++ b/机器学习进阶/CMU10-708/index.html @@ -1,2 +1,16 @@ CMU 10-708: Probabilistic Graphical Models - CS自学指南
跳转至

CMU 10-708: Probabilistic Graphical Models

课程简介

  • 所属大学:CMU
  • 先修要求:Machine Learning, Deep Learning, Reinforcement Learning
  • 课程难度:🌟🌟🌟🌟🌟
  • 课程网站:https://sailinglab.github.io/pgm-spring-2019/
  • 这个网站包含了所有的资源:slides, nots, video, homework, project

这门课程是 CMU 的图模型基础 + 进阶课,授课老师为 Eric P. Xing,涵盖了图模型基础,与神经网络的结合,在强化学习中的应用,以及非参数方法。相当硬核


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习进阶/CS229M/index.html b/机器学习进阶/CS229M/index.html index 1f254ff2..ed556d0a 100644 --- a/机器学习进阶/CS229M/index.html +++ b/机器学习进阶/CS229M/index.html @@ -1,2 +1,16 @@ Stanford STATS214 / CS229M: Machine Learning Theory - CS自学指南
跳转至

STATS214 / CS229M: Machine Learning Theory

课程简介

经典学习理论 + 最新深度学习理论,非常硬核。授课老师之前是 Percy Liang,现在是 Tengyu Ma


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习进阶/STA4273/index.html b/机器学习进阶/STA4273/index.html index 5129ab60..a17270b0 100644 --- a/机器学习进阶/STA4273/index.html +++ b/机器学习进阶/STA4273/index.html @@ -1,2 +1,16 @@ U Toronto STA 4273 Winter 2021: Minimizing Expectations - CS自学指南
跳转至

STA 4273 Winter 2021: Minimizing Expectations

课程简介

这是一门较为进阶的 Ph.D. 研究课程,核心内容是 inference 和 control 之间的关系。授课老师为 Chris Maddison (AlphaGo founding member, NeurIPS 14 best paper)


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习进阶/STAT8201/index.html b/机器学习进阶/STAT8201/index.html index 2a756ec9..08bcfba2 100644 --- a/机器学习进阶/STAT8201/index.html +++ b/机器学习进阶/STAT8201/index.html @@ -1,2 +1,16 @@ Columbia STAT 8201: Deep Generative Models - CS自学指南
跳转至

Columbia STAT 8201: Deep Generative Models

课程简介

这门课是一门 PhD 讨论班,每周的内容是展示 + 讨论论文,授课老师是 John Cunningham。Deep Generative Models (深度生成模型) 是图模型与神经网络的结合,也是现代机器学习最重要的方向之一


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/机器学习进阶/roadmap/index.html b/机器学习进阶/roadmap/index.html index db112ac4..3966c3eb 100644 --- a/机器学习进阶/roadmap/index.html +++ b/机器学习进阶/roadmap/index.html @@ -1,2 +1,16 @@ 进阶路线图 - CS自学指南
跳转至

机器学习进阶

此路线图适用于已经学过了基础机器学习 (ML, NLP, CV, RL) 的同学 (高年级本科生或低年级研究生),已经发表过至少一篇顶会论文 (NeurIPS, ICML, ICLR, ACL, EMNLP, NAACL, CVPR, ICCV) 想要走机器学习科研路线的选手。

此路线的目标是为读懂与发表机器学习顶会论文打下理论基础,特别是 Probabilistic Methods 这个 track 下的文章

机器学习进阶可能存在多种不同的学习路线,此路线只能代表作者 Yao Fu 所理解的最佳路径,侧重于贝叶斯学派下的概率建模方法,也会涉及到各项相关学科的交叉知识。

必读教材

  • PRML: Pattern Recognition and Machine Learning. Christopher Bishop
  • 经典贝叶斯学派教材
  • AoS: All of Statistics. Larry Wasserman
  • 经典频率学派教材

所以这两本书刚好相辅相成

字典

  • MLAPP: Machine Learning: A Probabilistic Perspective. Kevin Murphy
  • Convex Optimization. Stephen Boyd and Lieven Vandenberghe

进阶书籍

  • W&J: Graphical Models, Exponential Families, and Variational Inference. Martin Wainwright and Michael Jordan
  • Theory of Point Estimation. E. L. Lehmann and George Casella

如何阅读

Guidelines

  • 必读教材就是一定要读的教材
  • 字典的意思是,一般情况下不管它,但当遇到了不懂的概念的时候,就去字典里面查(而不是维基百科)
  • 进阶书籍先不读,先读完必读书籍。必读书籍一般都是要前前后后反复看过 N 遍才算读完
  • 读的过程中,最重要的读法就是对比阅读 (contrastive-comparative reading):同时打开两本书讲同一主题的章节,然后对比相同点和不同点和联系
  • 读的过程中,尽量去回想之前读过的论文,比较论文和教材的相同点与不同点

基础路径

  • 先读 AoS 第六章: Models, Statistical Inference and Learning,这一部分是最基础的科普
  • 然后读 PRML 第 10, 11 章
  • 第 10 章的内容是 Variational Inference, 第 11 章的内容是 MCMC, 这两种方法是贝叶斯推断的两条最主要路线
  • 如果在读 PRML 的过程中发现有任何不懂的名词,就去翻前面的章节。很大概率能够在第 3,4 章找到相对应的定义;如果找不到或者不够详细,就去查 MLAPP
  • AoS 第 8 章 (Parametric Inference) 和第 11 章 (Bayesian Inference) 也可以作为参考。最好的方法是多本书对比阅读,流程如下
    • 假设我在读 PRML 第 10 章的时候发现了一个不懂的词:posterior inference
    • 于是我往前翻,翻到了第 3 章 (Linear Model for Regression),看到了最简单的 posterior
    • 然后我接着翻 AoS,翻到了第 11 章,也有对 posterior 的描述
    • 然后我对比 PRML 第 10 章,第 3 章,AoS 第 11 章,三处不同地方对 posterior 的解读,比较其相同点和不同点和联系
  • 读完 PRML 第 10 和 11 章之后,接着读 AoS 第 24 章 (Simulation Methods),然后把它和 PRML 第 11 章对比阅读 -- 这俩都是讲 MCMC
  • 如果到此处发现还有基础概念读不懂,就回到 PRML 第 3 章,把它和 AoS 第 11 章对比阅读
  • Again,对比阅读非常重要,一定要把不同本书的类似内容同时摆在面前相互对比,这样可以显著增强记忆
  • 然后读 PRML 第 13 章(跳过第 12 章),这一章可以和 MLAPP 的第 17, 18 章对比阅读
  • MLAPP 第 17 章是 PRML 第 13.2 章的详细版,主要讲 HMM
  • MLAPP 第 18 章是 PRML 第 13.3 章的详细版,主要讲 LDS
  • 读完 PRML 第 13 章之后,再去读 PRML 第 8 章 (Graphical Models) -- 此时这部分应该会读得很轻松
  • 以上的内容可以进一步对照 CMU 10-708 PGM 课程材料

到目前为止,应该能够掌握

  • 概率模型的基础定义
  • 精准推断 - Sum-Product
  • 近似推断 - MCMC
  • 近似推断 - VI

然后就可以去做更进阶的内容


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/CS224n/index.html b/深度学习/CS224n/index.html index 09b64e5c..184cda1b 100644 --- a/深度学习/CS224n/index.html +++ b/深度学习/CS224n/index.html @@ -1,2 +1,16 @@ Stanford CS224n: Natural Language Processing - CS自学指南
跳转至

CS224n: Natural Language Processing

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 NLP 入门课程,由自然语言处理领域的巨佬 Chris Manning 领衔教授(word2vec 算法的开创者)。内容覆盖了词向量、RNN、LSTM、Seq2Seq 模型、机器翻译、注意力机制、Transformer 等等 NLP 领域的核心知识点。

5 个编程作业难度循序渐进,分别是词向量、word2vec 算法、Dependency parsing、机器翻译以及 Transformer 的 fine-tune。

最终的大作业是在 Stanford 著名的 SQuAD 数据集上训练 QA 模型,有学生的大作业甚至直接发表了顶会论文。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS224n - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/CS224w/index.html b/深度学习/CS224w/index.html index 33467a6e..d47bd69a 100644 --- a/深度学习/CS224w/index.html +++ b/深度学习/CS224w/index.html @@ -1,2 +1,16 @@ Stanford CS224w: Machine Learning with Graphs - CS自学指南
跳转至

CS224w: Machine Learning with Graphs

课程简介

  • 所属大学:Stanford
  • 先修要求:深度学习基础 + Python
  • 编程语言:Python, LaTeX
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的图神经网络入门课,这门课我没有上过,但众多做 GNN 的朋友都向我力荐过这门课,想必 Stanford 的课质量还是一如既往地有保证的。另外就是这门课的授课老师非常年轻帅气:)

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/CS230/index.html b/深度学习/CS230/index.html index 8a515407..f09ec64c 100644 --- a/深度学习/CS230/index.html +++ b/深度学习/CS230/index.html @@ -1,2 +1,16 @@ Coursera: Deep Learning - CS自学指南
跳转至

Coursera: Deep Learning

课程简介

  • 所属大学:Stanford
  • 先修要求:机器学习基础 + Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

吴恩达在 Coursera 开设的另一门网红课程,学习者无数,堪称圣经级的深度学习入门课。深入浅出的讲解,眼花缭乱的 Project。从最基础的神经网络,到 CNN, RNN,再到最近大热的 Transformer。学完这门课,你将初步掌握深度学习领域必备的知识和技能,并且可以在 Kaggle 中参加自己感兴趣的比赛,在实践中锻炼自己。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/CS231/index.html b/深度学习/CS231/index.html index c492b67e..5c7ef679 100644 --- a/深度学习/CS231/index.html +++ b/深度学习/CS231/index.html @@ -1,2 +1,16 @@ Stanford CS231n: CNN for Visual Recognition - CS自学指南
跳转至

CS231n: CNN for Visual Recognition

课程简介

  • 所属大学:Stanford
  • 先修要求:机器学习基础
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

Stanford 的 CV 入门课,由计算机领域的巨佬李飞飞院士领衔教授(CV 领域划时代的著名数据集 ImageNet 的研究团队),但其内容相对基础且友好,如果上过 CS230 的话可以直接上手 Project 作为练习。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/CS285/index.html b/深度学习/CS285/index.html index 0bacae8a..b788a398 100644 --- a/深度学习/CS285/index.html +++ b/深度学习/CS285/index.html @@ -1,2 +1,16 @@ UCB CS285: Deep Reinforcement Learning - CS自学指南
跳转至

CS285: Deep Reinforcement Learning

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS188, CS189
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

CS285 这一课程现由 Sergey Levine 教授讲授,课程内容覆盖了深度强化学习领域的各方面内容,适合有一定机器学习基础的同学进行学习,具体要求包括了解马尔可夫决策过程(MDP)等。整门课程中含有较多的公式,上课前需要有一定的心理准备。此外,教授会根据每年最新的研究进展更新课程内容以及作业,课程中能感受到教授尝试将深度强化学习领域的所有基础知识以及最近的发展在短短的数节课中进行传达。

有关课程内容获取,22Fall 的授课方式为课前观看提前录制的视频,课上主要为 Q&A 环节,教授选择部分或者所有视频内的知识进行讲解同时回答学生现场提出的问题,因此所提供的课程视频链接实际上是已经包含了所有内容。课程作业则由5个编程作业组成,每一次作业主要为复现经典模型以及进行模型间的对比,偶尔也包含一些对最近提出的模型的复现,最后递交一份报告。考虑到作业本身已经提供了框架,且都是根据 hint 进行代码填空,因此作业难度并不大。

总的来说,该课程适合新手入门深度强化学习。虽然学到后面越来越感觉到难,但整门课下来个人感觉还是收获颇丰。

(另外 Levine 教授人真的很 nice)

课程资源


最后更新: November 11, 2022
Back to top
\ No newline at end of file diff --git a/深度学习/LHY/index.html b/深度学习/LHY/index.html index fdfffa38..2734a761 100644 --- a/深度学习/LHY/index.html +++ b/深度学习/LHY/index.html @@ -1,2 +1,16 @@ 国立台湾大学:李宏毅机器学习 - CS自学指南
跳转至

国立台湾大学:李宏毅机器学习

课程简介

  • 所属大学:國立台灣大學
  • 先修要求:熟练掌握 Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80 小时

李宏毅老师是国立台湾大学的教授,其风趣幽默的授课风格深受大家喜爱,并且尤其喜欢在 PPT 中插入宝可梦等动漫元素,是个非常可爱的老师。

这门课挂着机器学习的牌子,但其课程内容之广实在令人咋舌,其作业一共包含 15 个 lab,分别是 Regression、Classification、CNN、Self-Attention、Transformer、GAN、BERT、Anomaly Detection、Explainable AI、Attack、Adaptation、 RL、Compression、Life-Long Learning 以及 Meta Learning。可谓是包罗万象,能让学生对于深度学习的绝大多数领域都有一定了解,从而可以进一步选择想要深入的方向进行学习。

大家也大可不必担心作业的难度,因为所有作业都会提供助教的示例代码,帮你完成数据处理、模型搭建等,你只需要在其基础上进行适量的修改即可。这也是一个学习别人优质代码的极好机会,大家需要水课程大作业的话,这里也是一个不错的资料来源。

课程资源


最后更新: October 13, 2022
Back to top
\ No newline at end of file diff --git a/电子基础/EE16/index.html b/电子基础/EE16/index.html index 16ad824d..9a56250d 100644 --- a/电子基础/EE16/index.html +++ b/电子基础/EE16/index.html @@ -1,2 +1,16 @@ EE16A&B: Designing Information Devices and Systems I&II - CS自学指南
跳转至

UCB EE16A&B: Designing Information Devices and Systems I&II

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:150 小时

UC Berkeley 电子系学生的大一入门课,通过电路基础知识的讲授,配合各类动手实操的 lab,让学生体验通过电路从环境中收集信息并进行分析,作出预测和反馈。由于疫情的缘故,所有 lab 都有远程在线版,非常适合大家在家自学。

课程资源

  • 课程网站:EE16A, EE16B
  • 课程视频:B 站搜索
  • 课程教材:参见课程 notes
  • 课程作业:参见课程主页

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/EE16A - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/电子基础/Signals_and_Systems_AVO/index.html b/电子基础/Signals_and_Systems_AVO/index.html index 8ea975c3..5afb5ceb 100644 --- a/电子基础/Signals_and_Systems_AVO/index.html +++ b/电子基础/Signals_and_Systems_AVO/index.html @@ -1,2 +1,16 @@ MIT 6.007 Signals and Systems - CS自学指南
跳转至

MIT 6.007 Signals and Systems

课程简介

  • 所属大学:MIT
  • 先修要求:Calculus, Linear Algebra
  • 编程语言:Matlab Preferred
  • 课程难度:🌟🌟
  • 预计学时:50-70 小时

看到课程老师的名字:Prof. Alan V. Oppenheim

好的,上这门课的理由已经足够了。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/电子基础/signal/index.html b/电子基础/signal/index.html index 0aeba6a7..faa88fac 100644 --- a/电子基础/signal/index.html +++ b/电子基础/signal/index.html @@ -1,2 +1,16 @@ UCB EE120 : Signal and Systems - CS自学指南
跳转至

UCB EE120: Signal and Systems

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS70,微积分,线性代数
  • 编程语言:Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

这门课最精华的部分就是 6 个超有趣的编程作业了,会让你用 Python 通过学习到的信号与系统的理论知识,解决各类实际问题。例如 lab3 会让你实现 FFT 算法,并和 Numpy 的官方实现进行性能对比;lab4 会通过分析手指头的影像数据推断心率;lab5 就更牛了,会让你给哈勃望远镜拍到的照片进行降噪处理,恢复绚烂清晰的星空;lab6 会让你构造一个反馈系统,平衡小车上的细杆。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-EE120 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/程序语言设计/CS242/index.html b/程序语言设计/CS242/index.html index b011169b..4a7efd42 100644 --- a/程序语言设计/CS242/index.html +++ b/程序语言设计/CS242/index.html @@ -1,2 +1,16 @@ CS242 - CS自学指南

CS242


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/系统安全/CS161/index.html b/系统安全/CS161/index.html index 3bfafeae..fd8a35f6 100644 --- a/系统安全/CS161/index.html +++ b/系统安全/CS161/index.html @@ -1,2 +1,16 @@ UCB CS161: Computer Security - CS自学指南
跳转至

UCB CS161: Computer Security

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:CS61A, CS61B, CS61C
  • 编程语言:C, Go
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

伯克利的计算机系统安全课程,课程内容分为5个部分:

  • Security principles: how to design a secure system
  • Memory safety: buffer overflow attack
  • Cryptography: symmetric encryption, asymmetric encryption, MAC, digital signature .........
  • Web: SQL-injection, XSS, XSRF .......
  • Networking: attacks for each layer

这门课让我印象最为深刻的部分是 Project2,让你用 Go 语言设计和实现一个安全的文件分享系统。我花了整整三天才完成了这个非常虐的 Project,总代码量超过 3k 行。这样密集型的开发过程,能极大地锻炼你设计和实现一个安全系统的能力。

2020 年夏季学期的版本开源了课程录影,大家可以在下面的课程网站链接里找到。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/UCB-CS161 - GitHub 中。


最后更新: October 14, 2022
Back to top
\ No newline at end of file diff --git a/系统安全/MIT6.858/index.html b/系统安全/MIT6.858/index.html index 4ee0f06d..217d51fa 100644 --- a/系统安全/MIT6.858/index.html +++ b/系统安全/MIT6.858/index.html @@ -1,2 +1,16 @@ MIT 6.858: Computer System Security - CS自学指南
跳转至

MIT 6.858: Computer System Security

课程简介

  • 所属大学:MIT
  • 先修要求:计算机体系结构,对计算机系统有初步了解
  • 编程语言:C, Python
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

MIT 的计算机系统安全课程,实验环境是一个 Web Application Zoobar。学生学习攻防技术并应用于该 Web Application。

  • Lab 1: you will explore the zoobar web application, and use buffer overflow attacks to break its security properties.
  • Lab 2: you will improve the zoobar web application by using privilege separation, so that if one component is compromised, the adversary doesn't get control over the whole web application.
  • Lab 3: you will build a program analysis tool based on symbolic execution to find bugs in Python code such as the zoobar web application.
  • Lab 4: you will improve the zoobar application against browser attacks.

这个课我主要是做了 Lab 3。Lab 3 是通过混合符号执行来遍历程序的所有分支,理解了符号执行的思想后 Lab 并不难做。这个 Lab 直观展示符号执行这种技术的使用方法。

这个课的 Final Project 是实现 SecFS,一个远端文件系统,面对完全不可信的服务器,提供机密性和完整性。参考论文为 SUNDR

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/AUT1400/index.html b/编程入门/AUT1400/index.html index 38723ce4..aff6bc54 100644 --- a/编程入门/AUT1400/index.html +++ b/编程入门/AUT1400/index.html @@ -1,2 +1,16 @@ AmirKabir University of Technology AP1400-2: Advanced Programming - CS自学指南
跳转至

Amirkabir University of Technology 1400-2: Advanced Programming Course

课程简介

  • 所属大学:Amirkabir University of Technology
  • 先修要求:无
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:50 小时

无意中发现的一个 C++ 课程。课程的 homework 质量很高,每个 homework 相互独立结构简单,且有完善的单元测试,非常适合用来学习 C++ 的编程。本课程共 7 个 homework,如下所示:

  1. 实现一个 Matrix 类以及相关函数。

  2. 实现一个模拟加密货币客户端/服务端执行过程的程序。

  3. 实现一个 Binary Search Tree (BST)。

  4. 实现 C++ 中的 SharedPtr 和 UniquePtr 智能指针。

  5. 使用继承和多态实现多个类。

  6. 使用 STL 库解决 4 个问题。

  7. 是个 python 项目,有兴趣的可以看看。

没找到课程的主页,只有在 github 有 homework 的源码(名字为 AP1400-2-HW 的那几个)。

课程资源


最后更新: November 4, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/CS106B_CS106X/index.html b/编程入门/CS106B_CS106X/index.html index 6380c054..5be8f919 100644 --- a/编程入门/CS106B_CS106X/index.html +++ b/编程入门/CS106B_CS106X/index.html @@ -1,2 +1,16 @@ Stanford CS106B/X - CS自学指南
跳转至

Stanford CS106B/X: Programming Abstractions in C++

课程简介

  • 所属大学:Stanford
  • 先修要求:计算机基础 (CS50/CS106A/CS61A or equivalent)
  • 编程语言:C++
  • 课程难度:🌟🌟
  • 预计学时:50-70 小时

Stanford 的进阶编程课,CS106X 在难度和深度上会比 CS106B 有所提高,但主体内容类似。主要通过 C++ 语言让学生在实际的编程作业里培养通过编程抽象解决实际问题的能力,同时也会涉及一些简单的数据结构和算法的知识,但总体来说没有一门专门的数据结构课那么系统。

课程资源


最后更新: June 6, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/CS106L/index.html b/编程入门/CS106L/index.html index 014b3566..49b48030 100644 --- a/编程入门/CS106L/index.html +++ b/编程入门/CS106L/index.html @@ -1,2 +1,16 @@ Stanford CS106L: Standard C++ Programming - CS自学指南
跳转至

CS106L: Standard C++ Programming

课程简介

  • 所属大学:Stanford
  • 先修要求:最好掌握至少一门编程语言
  • 编程语言:C++
  • 课程难度:🌟🌟🌟
  • 预计学时:20 小时

我从大一开始一直都是写的 C++ 代码,直到学完这门课我才意识到,我写的 C++ 代码大概只是 C 语言 + cin/cout 而已。

这门课会深入到很多标准 C++ 的特性和语法,让你编写出高质量的 C++ 代码。例如 auto binding, uniform initialization, lambda function, move semantics,RAII 等技巧都在我此后的代码生涯中被反复用到,非常实用。

值得一提的是,这门课的作业里你会实现一个 HashMap(类似于 STL 中的 unordered_map), 这个作业几乎把整个课程串联了起来,非常考验代码能力。特别是 iterator 的实现,做完这个作业我开始理解为什么 Linus 对 C/C++ 嗤之以鼻了,因为真的很难写对。

总的来讲这门课并不难,但是信息量很大,需要你在之后的开发实践中反复巩固。Stanford 之所以单开一门 C++ 的编程课,是因为它后续的很多 CS 课程 Project 都是基于 C++的。例如 CS144 计算机网络和 CS143 编译器。这两门课在本书中均有收录。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS106L - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/CS110L/index.html b/编程入门/CS110L/index.html index 8f1cdef4..68aae99c 100644 --- a/编程入门/CS110L/index.html +++ b/编程入门/CS110L/index.html @@ -1,2 +1,16 @@ Stanford CS110L: Safety in Systems Programming - CS自学指南
跳转至

CS110L: Safety in Systems Programming

课程简介

  • 所属大学:Stanford
  • 先修要求:最好有一定的编程背景并对计算机系统有初步的认识。
  • 编程语言:Rust
  • 课程难度:🌟🌟🌟
  • 预计学时:30 小时

在这门课中你将会学习 Rust 这门神奇的语言。

如果你学过 C 并接触过一些系统编程的话,应该对 C 的内存泄漏以及指针的危险有所耳闻,但 C 的底层特性以及高效仍然让它在系统级编程中无法被例如 Java 等自带垃圾收集机制的高级语言所替代。而 Rust 的目标则是希望在 C 的高效基础上,弥补其安全不足的缺点。因此 Rust 在设计之初,就有带有很多系统编程的观点。学习 Rust,也能让你之后能用 C 语言编写出更安全更优雅的系统级代码(例如操作系统等)。

这门课的后半部分关注在并发(concurrency)这一主题上,你将会系统地掌握多进程、多线程、基于事件驱动的并发等若干并发技术,并在第二个 Project 中比较它们各自的优劣。Rust 中 “futures” 的概念非常有趣和优雅,这些基础知识对你后续对计算机系统相关课程的学习很有帮助。另外,清华大学的操统实验 rCore 就是基于 Rust 编写的,具体参见文档

课程资源

  • 课程网站:https://reberhardt.com/cs110l/spring-2020/
  • 课程视频:https://youtu.be/j7AQrtLevUE
  • 课程教材:无
  • 课程作业:共 6 个 Lab 和 2 个 Project,作业文档和代码框架详见课程网站。其中两个 Project 非常有趣,分别是:
  • 用 Rust 实现一个类似于 GDB 的 debugger
  • 用 Rust 实现一个负载均衡器

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS110L - GitHub 中。

在2022年 CS110L 没有开源作业源码的背景下,Rust 快速演进导致2020版本课程项目中所使用的库过于老旧。对此,@fung-hwang 尝试进行了适配(时间为2022.11)。其适配过程和作业实现都汇总在 fung-hwang/CS110L-2020spr - GitHub 中。也许当你开始本课程时 Rust 和这些库又发生了变化,但你仍可以参考并从中获得启发。


最后更新: December 4, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/CS50/index.html b/编程入门/CS50/index.html index 4f2e39d5..3c466a5c 100644 --- a/编程入门/CS50/index.html +++ b/编程入门/CS50/index.html @@ -1,2 +1,16 @@ Harvard CS50: This is CS50x - CS自学指南
跳转至

CS50: This is CS50x

课程简介

  • 所属大学:Harvard
  • 先修要求:无
  • 编程语言:C, Python, SQL, HTML, CSS, JavaScript
  • 课程难度:🌟🌟
  • 预计学时:20 小时

连续多年被哈佛大学学生评为最受欢迎的公选课程。Malan 教授上课非常有激情,撕黄页讲二分法的场面让人记忆犹新(笑)。但因为它的入门以及全校公选的属性,课程内容难度比较温和,但是课程作业质量非常高而且全部免费开源,非常适合小白入门,或者大佬休闲。

课程资源


最后更新: April 6, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/CS61A/index.html b/编程入门/CS61A/index.html index f04439f2..955883ea 100644 --- a/编程入门/CS61A/index.html +++ b/编程入门/CS61A/index.html @@ -1,2 +1,16 @@ UCB CS61A: Structure and Interpretation of Computer Programs - CS自学指南
跳转至

CS61A: Structure and Interpretation of Computer Programs

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Python, Scheme, SQL
  • 课程难度:🌟🌟🌟
  • 预计学时:50 小时

伯克利 CS61 系列的第一门课程,也是我的 Python 入门课。

CS61 系列是伯克利 CS 专业的入门课,其中:

  • CS61A: 强调抽象,让学生掌握用程序来解决实际问题,而不关注底层的硬件细节。
  • CS61B: 注重算法与数据结构以及大规模程序的构建,学生会用 Java 语言结合算法与数据结构的知识来构建千行代码级别的大型项目(一个简易的谷歌地图,一个二维版的 Minecraft)。
  • CS61C: 关注计算机体系结构,让学生理解高级语言(例如 C)是如何一步步转换为机器可以理解的 01 串并在 CPU 执行的,学生将会学习 RISC-V 架构并自己用 Logisim 实现一个 CPU。

CS61B 和 CS61C 在本书中均有收录。

回到 CS61A,注意这不仅仅是一门编程语言课,而是会深入到程序构造与运行的原理。最后你将在第 4 个 Project 中用 Python 实现一个 Scheme 的解释器。此外,抽象将是这门课的一大主题,你将学习到函数式编程、数据抽象、面向对象等等知识来让你的代码更易读,更模块化。当然,学习编程语言也是这门课的一大内容,你将会掌握 Python、Scheme 和 SQL 这三种编程语言,在它们的学习和比较中,相信你会拥有快速掌握一门新的编程语言的能力。

注意:如果此前完全没有编程基础,直接上手 CS61A 需要一定的学习能力和自律要求。为避免课程难度过高而导致的信心挫折,可以选择一个更为友好的入门编程课程。例如伯克利的 CS10 或者哈佛大学的 CS50

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS61A - GitHub 中。


最后更新: November 12, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/Duke-Coursera-Intro-C/index.html b/编程入门/Duke-Coursera-Intro-C/index.html index d3bd740d..3985da3b 100644 --- a/编程入门/Duke-Coursera-Intro-C/index.html +++ b/编程入门/Duke-Coursera-Intro-C/index.html @@ -1,2 +1,16 @@ Duke University: Introductory C Programming Specialization - CS自学指南
跳转至

Introductory C Programming Specialization

课程简介

  • 所属大学:Duke
  • 先修要求:无
  • 编程语言:C
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:110 小时

非常好的课程,自我感觉收益非常大:

  • 侧重基础和基本概念:如 frame、stack memory、heap memory 等讲得很透。
  • 针对C最难掌握的指针,有好的练习和编程来加深和强化理解。
  • 非常好的 GDB,Valgrind 上手训练,作业也会涉及一些基本的 Git 练习。
  • 老师建议作业用 Emacs,所以对 Emacs 小白来说,是个不错的入门。如果你会用 Vim ,我建议你用 Evil 插件。这样你不会丢掉 Vim 的编辑功能,同时可以体会 Emacs 的强大。工具箱里同时有 Emacs 和 Vim 时,效率会有不少提高。Emacs 的 org-mode,和 GDB 的顺滑整合,等等等等,都会让你如虎添翼。
  • 虽然可能需要付费,但我觉得值。
  • 虽说课名是入门,但兼具广度和深度。

课程资源

资源汇总

@haidongji 在学习这门课中的作业实现都汇总在 Duke Coursera Intro C 中。因为时间关系,我最后一课最后一周的几个作业到目前还没有完成。


最后更新: September 30, 2022
Back to top
\ No newline at end of file diff --git a/编程入门/MIT-Missing-Semester/index.html b/编程入门/MIT-Missing-Semester/index.html index 927f085a..4356cb18 100644 --- a/编程入门/MIT-Missing-Semester/index.html +++ b/编程入门/MIT-Missing-Semester/index.html @@ -1,2 +1,16 @@ MIT-Missing-Semester - CS自学指南
跳转至

MIT-Missing-Semester

课程简介

  • 先修要求:无
  • 编程语言:shell
  • 课程难度:🌟🌟
  • 预计学时:10 小时

正如课程名字所言:“计算机教学中消失的一个学期”,这门课将会教会你许多大学的课堂上不会涉及但却对每个 CSer 无比重要的工具或者知识点。例如 Shell 编程、命令行配置、Git、Vim、tmuxssh 等等。如果你是一个计算机小白,那么我非常建议你学习一下这门课,因为它基本涉及了本书必学工具中的绝大部分内容。

除了 MIT 官方的学习资料外,北京大学图灵班开设的前沿计算实践中也开设了相关课程,资料位于这个网站下,供大家参考。

课程资源


最后更新: April 3, 2022
Back to top
\ No newline at end of file diff --git a/编译原理/6035/index.html b/编译原理/6035/index.html index 7599ec46..103dc935 100644 --- a/编译原理/6035/index.html +++ b/编译原理/6035/index.html @@ -1,2 +1,16 @@ 6035 - CS自学指南

6035


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/编译原理/CS143/index.html b/编译原理/CS143/index.html index 449b5c72..4d305c9d 100644 --- a/编译原理/CS143/index.html +++ b/编译原理/CS143/index.html @@ -1,2 +1,16 @@ Stanford CS143: Compilers - CS自学指南
跳转至

Stanford CS143: Compilers

课程简介

  • 所属大学:Stanford
  • 先修要求:计算机体系结构
  • 编程语言:Java 或 C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

斯坦福的编译原理课程,设计者开发了一个 Class-Object-Oriented-Language,简称 COOL 语言。这门课的核心就是通过理论知识的学习,为 COOL 语言实现一个编译器,将 COOL 高级语言编译为 MIPS 汇编并在 Spim 这个 MIPS 模拟器上成功执行。

理论部分基本按照龙书的顺序覆盖了词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容,实践部分则相应地分为词法分析、语法分析、语义分析、代码生成四个阶段,难度循序渐进,并在优化部分给学生留下了很大的设计空间。

课程资源

资源汇总

@skyzluo 在学习这门课中用到的所有资源和作业实现都汇总在 skyzluo/CS143-Compilers-Stanford - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机图形学/15462/index.html b/计算机图形学/15462/index.html index bcb513cf..2bfec4e2 100644 --- a/计算机图形学/15462/index.html +++ b/计算机图形学/15462/index.html @@ -1,2 +1,16 @@ CMU 15-462 - CS自学指南
跳转至

CMU 15-462 : COMPUTER GRAPHICS

课程简介

  • 所属大学:CMU
  • 先修要求:基础的向量微积分和线性代数 , 基础的 C/C++ 编程能力。
  • 编程语言:C/C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

本课程全面介绍了计算机图形学。它侧重于基本概念和技术,以及它们与图形中多个问题领域(渲染、动画、几何、成像)的交叉关系。主题包括:采样、混叠、插值、光栅化、几何变换、参数化、可见性、合成、过滤、卷积、曲线和曲面、几何数据结构、细分、网格划分、空间层次结构、光线追踪、辐射测量、反射率、光场、几何光学,蒙特卡洛渲染,重要性采样,相机模型,高性能光线追踪,微分方程,时间积分,数值微分,基于物理的动画,优化,数值线性代数,逆运动学,傅立叶方法,数据拟合.

课程资源


最后更新: December 15, 2022
Back to top
\ No newline at end of file diff --git a/计算机图形学/CS148/index.html b/计算机图形学/CS148/index.html index a502fbe8..6d47c06c 100644 --- a/计算机图形学/CS148/index.html +++ b/计算机图形学/CS148/index.html @@ -1,2 +1,16 @@ Stanford CS148 - CS自学指南
跳转至

Stanford CS148

课程简介

  • 所属大学:Stanford
  • 先修要求:线性代数,高等数学,Python
  • 编程语言:Python
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

官方介绍:

这是一门计算机图形学的入门课程,这门课的一开始使用 Blender 去生成图像,并且理解底层的数学知识,包括三角形、法向量、插值、纹理映射、凹凸贴图等等。之后会介绍光线和颜色以及它们如何影响计算机的显示和打印。同时也会介绍 BRDF 以及一些基本的光照和着色模型。课程的最后,会涉及到光线追踪、反走样、加速结构等内容。

具体课程信息可以查看课程网站

这门课程比起 GAMES101 浅一些,编程语言使用的是 Python,对于不熟悉 C++ 的同学比较友好。

课程资源


最后更新: June 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机图形学/CS184/index.html b/计算机图形学/CS184/index.html index 81c448a2..ea0e84fe 100644 --- a/计算机图形学/CS184/index.html +++ b/计算机图形学/CS184/index.html @@ -1,2 +1,16 @@ CS184 - CS自学指南

CS184


最后更新: December 9, 2021
Back to top
\ No newline at end of file diff --git a/计算机图形学/GAMES101/index.html b/计算机图形学/GAMES101/index.html index 8eca5a62..6defab72 100644 --- a/计算机图形学/GAMES101/index.html +++ b/计算机图形学/GAMES101/index.html @@ -1,2 +1,16 @@ GAMES101 - CS自学指南
跳转至

GAMES101

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++
  • 编程语言:C++
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

官方介绍:

本课程将全面而系统地介绍现代计算机图形学的四大组成部分:(1)光栅化成像,(2)几何表示,(3)光的传播理论,以及(4)动画与模拟。每个方面都会从基础原理出发讲解到实际应用,并介绍前沿的理论研究。通过本课程,你可以学习到计算机图形学背后的数学和物理知识,并锻炼实际的编程能力。 作为入门,本课程会尽可能的覆盖图形学的方方面面,把每一部分的基本概念都尽可能说清楚,让大家对计算机图形学有一个完整的、自上而下的全局把握。全局的理解很重要,学完本课程后,你会了解到图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法。从本课程的标题,大家还可以看到“现代”二字,也就是说,这门课所要给大家介绍的都是现代化的知识,也都是现代图形学工业界需要的图形学基础。

GAMES101 是国内相当有名的图形学公开课。和大家印象中满是数学和算法的图形学不同,这门课以十分生动的方式带我们进入了图形学这个领域的大门。

每个project代码量都不会很多,但是却都十分有趣。在做这些project的过程中,我们会实现简单的光栅化,并渲染一个简易的模型,我们还会实现光线追踪,以追求渲染更好的质量。每个project中还有选做的拓展作业,可以让我们渲染的模型具有更好的质量,更快的渲染速度。

喜欢玩游戏的同学应该对实时光线追踪有一定的了解,这门课的老师闫令琪就对这一技术有直接的推动作用。

跟着课程的视频,做完每一个project,相信你会和我一样对图形学,以及现代的渲染技术产生浓厚的兴趣。

课程资源

资源汇总

@ysj1173886760 在学习这门课中用到的所有资源和作业实现都汇总在ysj1173886760/Learning: graphics/GAMES101 - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机图形学/GAMES103/index.html b/计算机图形学/GAMES103/index.html index 13a96807..4a5227b3 100644 --- a/计算机图形学/GAMES103/index.html +++ b/计算机图形学/GAMES103/index.html @@ -1,2 +1,16 @@ GAMES103 - CS自学指南
跳转至

GAMES103

课程简介

  • 所属大学:Style3D/OSU
  • 先修要求:线性代数,高等数学,大学物理,编程能力,基本图形知识
  • 编程语言:C#
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:50 小时

官方介绍:

本课程将作为基于物理的计算机动画技术入门,着重介绍各种基础的物理动画模拟技术。

该课程主要涵盖四个方向,分别为:1)刚体模拟;2)质点弹簧、约束与布料模拟;3)基于有限元的弹性体模拟;4)流体模拟。

本课程内容将不会涉及具体的物理模拟引擎,但会讨论各种引擎背后的技术,以及它们的优缺点等等。由于开发学习物理模拟需要一定的数学基础,课程初始阶段也会花一定的时间复习必备的数学知识。顺利完成课程之后,同学们应该会对基础的物理模拟技术有深入理解,对高级的模拟技术也会有部分接触。

图形学可粗略分为渲染、模拟、几何三个领域。GAMES101 和 GAMES202 主要以渲染为主,而对于物理模拟,GAMES103 则是很棒的学习资源。

课程资源

资源汇总

@indevn 在学习这门课中用到的所有资源和作业要求都汇总在 GAMES103 Unoffical 中。对于作业的具体实现,在知乎上有很多相关文章进行了细致讲解可以参考。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机图形学/GAMES202/index.html b/计算机图形学/GAMES202/index.html index 16e12923..218c9376 100644 --- a/计算机图形学/GAMES202/index.html +++ b/计算机图形学/GAMES202/index.html @@ -1,2 +1,16 @@ GAMES202 - CS自学指南
跳转至

GAMES202

课程简介

  • 所属大学:UCSB
  • 先修要求:线性代数,高等数学,C++,GAMES101
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:60 小时

官方介绍:

本课程将全面地介绍现代实时渲染中的关键问题与解决方法。由于实时渲染 (>30 FPS) 对速度要求极高,因此本课程的关注点将是在苛刻的时间限制下,人们如何打破速度与质量之间的权衡,同时保证实时的高速度与照片级的真实感。

本课程将以专题的形式呈现,课程内容会覆盖学术界与工业界的前沿内容,包括:(1)实时软阴影的渲染;(2)环境光照;(3)基于预计算或无预计算的全局光照;(4)基于物理的着色模型与方法;(5)实时光线追踪;(6)抗锯齿与超采样;以及一些常见的加速方式等等。

除了最新最全的内容之外,本课程与其它任何实时渲染的教程还有一个重要的区别,那就是本课程不会讲授任何与游戏引擎的使用相关的内容,并且不会特别强调具体的着色器实现技术,而主要讲授实时渲染背后的科学与知识。本课程的目标是在你学习完这门课的时候,你将有深厚的功底去开发一个属于你自己的实时渲染引擎。

作为 GAMES101 的进阶课程,难度有一定的提升,但不会很大,相信完成了 GAMES101 的同学都有能力完成这门课程。每个 project 代码量都不会很多,但是都需要一定的思考。

课程资源


最后更新: May 11, 2022
Back to top
\ No newline at end of file diff --git a/计算机网络/CS144/index.html b/计算机网络/CS144/index.html index ff1f9337..52cb364a 100644 --- a/计算机网络/CS144/index.html +++ b/计算机网络/CS144/index.html @@ -1,2 +1,16 @@ Stanford CS144: Computer Network - CS自学指南
跳转至

CS144: Computer Network

课程简介

  • 所属大学:Stanford
  • 先修要求:一定的计算机系统基础,CS106L
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:100 小时

这门课的主讲人之一是网络领域的巨擘 Nick McKeown 教授。这位拥有自己创业公司的学界业界双巨佬会在他慕课每一章节的最后采访一位业界的高管或者学界的高人,非常开阔眼界。

在这门课的 Project 中,你将用 C++ 循序渐进地搭建出整个 TCP/IP 协议栈,实现 IP 路由以及 ARP 协议,最后利用你自己的协议栈代替 Linux Kernel 的网络协议栈和其他学生的计算机进行通信,非常 amazing!

课程资源

资源汇总


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机网络/topdown/index.html b/计算机网络/topdown/index.html index 1cf452e7..c8895b78 100644 --- a/计算机网络/topdown/index.html +++ b/计算机网络/topdown/index.html @@ -1,2 +1,16 @@ Computer Networking: A Top-Down Approach - CS自学指南
跳转至

Computer Networking: A Top-Down Approach

课程简介

  • 所属大学:马萨诸塞大学
  • 先修要求:有一定的计算机系统基础
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

《自顶向下方法》是计算机网络领域的一本经典教材,两位作者 Jim Kurose 和 Keith Ross 精心制作了教材配套的课程网站,并且公开了自己录制的网课视频,交互式的在线章节测试,以及利用 WireShark 进行抓包分析的 lab。唯一遗憾的是这门课并没有硬核的编程作业,而 Stanford 的 CS144 能很好地弥补这一点。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/Computer-Network-A-Top-Down-Approach - GitHub 中。


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/计算机网络/topdown_ustc/index.html b/计算机网络/topdown_ustc/index.html index a5692b3f..015dfec2 100644 --- a/计算机网络/topdown_ustc/index.html +++ b/计算机网络/topdown_ustc/index.html @@ -1,2 +1,16 @@ USTC Computer Networking:A Top-Down Approach - CS自学指南
跳转至

USTC Computer Networking:A Top-Down Approach

课程简介

  • 所属大学:中国科学技术大学
  • 授课教师:郑烇、杨坚
  • 先修要求:操作系统(非必需)
  • 编程语言:无
  • 课程难度:🌟🌟🌟
  • 预计学时:40 小时

这门课应该是中文互联网上比较火的计算机网络课了,教材采用神书计算机网络(自顶向下方法),授课风格更偏向实际而非纯理论(强烈建议先阅读教材预习再看课,否则上课时可能会有些懵圈)。

课程内容包括大部分自顶向下方法里的内容,同时涵盖考试内容,可放心观看。

课程视频是郑烇老师本人在哔哩哔哩上上传的,且从2020年至今一直坚持在评论区答疑,属实负责且认真。

课程资源


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/软件工程/6031/index.html b/软件工程/6031/index.html index f25b1e48..ba1bda1c 100644 --- a/软件工程/6031/index.html +++ b/软件工程/6031/index.html @@ -1,2 +1,16 @@ MIT 6.031: Software Construction - CS自学指南
跳转至

MIT 6.031: Software Construction

课程简介

  • 所属大学:MIT
  • 先修要求:掌握至少一门编程语言
  • 编程语言:Java
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

这门课的目标就是让学生学会如何写出高质量的代码,所谓高质量,则是满足下面三个目标(课程设计者原话复制,以防自己翻译曲解本意):

Safe from bugs. Correctness (correct behavior right now) and defensiveness (correct behavior in the future) are required in any software we build.

Easy to understand. The code has to communicate to future programmers who need to understand it and make changes in it (fixing bugs or adding new features). That future programmer might be you, months or years from now. You’ll be surprised how much you forget if you don’t write it down, and how much it helps your own future self to have a good design.

Ready for change. Software always changes. Some designs make it easy to make changes; others require throwing away and rewriting a lot of code.

为此,这门课的设计者们精心编写了一本书来阐释诸多软件构建的核心原则与前人总结下来的宝贵经验,内容细节到如何编写注释和函数 Specification,如何设计抽象数据结构以及诸多并行编程的内容,并且会让你在精心设计的 Java 编程项目里体验和练习这些编程模式。

2016年春季学期这门课开源了其所有编程作业的代码框架,而最新的课程教材可以在其最新的教学网站上找到,具体链接参见下方。

课程资源

  • 课程网站:2021spring, 2016spring
  • 课程视频:无
  • 课程教材:参见课程网站的课程 notes
  • 课程作业:4 个编程作业 + 1 个 Project

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/MIT6.031-software-construction - GitHub 中。

@pengzhangzhi 完成了这门课的作业并记录了笔记, 代码开源在 pengzhangzhi/self-taught-CS/Software Construction - Github


最后更新: September 6, 2022
Back to top
\ No newline at end of file diff --git a/软件工程/CS169/index.html b/软件工程/CS169/index.html index 4d364c56..3bc875c7 100644 --- a/软件工程/CS169/index.html +++ b/软件工程/CS169/index.html @@ -1,2 +1,16 @@ UCB CS169: software engineering - CS自学指南
跳转至

UCB CS169: software engineering

课程简介

  • 所属大学:UC Berkeley
  • 先修要求:无
  • 编程语言:Ruby/JavaScript
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100 小时

伯克利的软件工程课程,不同于很多传统的软件工程课强调各种类图、文档设计 (plan and document 模式),这门课专注于最近逐渐流行起来的敏捷开发 (Agile Development)模式,利用云平台提供软件即服务 (software as a service)。为此,课程设计者编写了 Software as a service 这本教材,通过 Ruby/Rails 框架来阐释 SaaS 这个概念,并且有丰富的配套编程练习。

这门课在 Edx 这个由 MIT 和 Harvard 大学发起的在线教育平台全资料开源,大家可以在 Edx 自行搜索 Agile SaaS Development 这门课程进行学习。课程内容基本按照教材的顺序带你一步步以敏捷开发的方式搭建一个软件并免费部署在云平台上。

课程资源

资源汇总

@PKUFlyingPig 在学习这门课中用到的所有资源和作业实现都汇总在 PKUFlyingPig/CS169-Software-Engineering - GitHub 中。


最后更新: October 8, 2022
Back to top
\ No newline at end of file