作者自己给自己的CS自学指南
仅供参考的CS自学指南 · 绝密 启用前
目录:
声明:本栏所有内容基本上是解惑真经的照抄 只是由于作者能力不足 从中挑挑拣拣出一些作者有能力或者认为自己有能力学的部分。它的诞生只是为了方便作者 如要打破砂锅还请看《万事开头难 之后会更难》最后上面的链接。而且 在看下面的所有东西之前我都建议先看看哈佛出的CS50系列课程和C语言入门来打打基础。
— 实用工具:最重要的入门部分
— 优秀教材 指不完全涵盖以下内容的书本:
— 数学基础/进阶/高阶
— 编程/电子基础
— 数据结构与算法
— 软件工程
— 体系结构
— 计算机系统基础
— 计算机操作系统
— 并行与分布式系统
— 计算机系统安全
— 计算机网络
— 数据库系统
— 编译原理
— Web开发
— 计算机图形学
— 数据科学
— 人工智能
— 机器学习-系统
— 机器学习-进阶
— 深度学习
— Zejun Fu’s Guidance
在开始学习之前 先说到:Crash Course: Computer Science 。
这个视频在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面 而且在B站上就有资源 值得一看。
Crash Course Computer Science
实用工具
磨刀不误砍柴工是古人智慧 在蠢人把它和三天打鱼两天晒网的概念混淆前它大有裨益
MIT-Missing-Semester 来自MIT的入门篇
学会提问
这是一种能力 尤其是建立在CS借由网络衍生出诸多论坛而现实中很难拖着电脑去敲门拜访的情况下。在开源社区中 学会提问是一项非常重要的能力。它包含两方面的事情:其一是会变相地培养你自主解决问题的能力 因为从形成问题 描述问题并发布 他人回答最后再到理解回答这个周期是非常长的 如果遇到什么鸡毛蒜皮的事情都希望别人最好远程桌面手把手帮你完成 那计算机的世界基本与你无缘了。其二 如果真的经过尝试还无法解决 可以借助开源社区的帮助 但这时候如何通过简洁的文字让别人瞬间理解你的处境以及目的 就显得尤为重要。针对于此请看:提问的智慧
命令行的使用
熟练使用命令行是一种常常被忽视 或被认为难以掌握的技能。但实际上 它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程 教程不长 字字珠玑。命令行的艺术
与此同时 掌握Shell脚本的编程也不容忽视
妈妈 我再也不是不认识CMD的小孩了
IDE(Integrated Development Environment):集成开发环境
说白了就是你写代码的地方 IDE 的重要性不言而喻。在这里我只选择了VScode和Pycharm 因为我当初只下了这个 但我有Anaconda全家桶 之后根据需要可以install 别的。不过我也不知道将来我会专注哪里 所以先都放上 具体还是要看原Po主文章…
Vim: 一款命令行编辑工具 这是一个学习曲线有些陡峭的编辑器。现在绝大多数 IDE 也都支持 Vim 插件。
在下了 在下了
Emacs:与 Vim 齐名的经典编辑器 同样具有极高的开发效率 同时具有更为强大的扩展性 它既可以配置为一个轻量编辑器 也可以扩展成一个个人定制的 IDE 甚至可以有更多玩法。
还没下 还没下
Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的童鞋必须掌握的神器之一。
目前进度:下载Git 然后会用快捷指令了。唉。
GitHub:基于 Git 的代码托管平台。全世界最大的代码开源社区 大佬集聚地。
神中神 伟大无需多言
GNUMake:一款工程构建工具。善用 GNU Make 会让你养成代码模块化的习惯 同时也能让你熟悉一些大型工程的编译链接流程。
🐎住 求自己不要让它吃灰
CMake:一款功能比 GNU Make 更为强大的构建工具 建议掌握 GNU Make 之后再加以学习。
我还没掌握GNU Make呢。
LaTeX:拿来逼格提升用的× 强大的论文排版工具√
这东西走进每个大学生的学习生活了已经
Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。
不会用 没下
Others:除了上面提到的这些在开发中使用频率极高的工具之外,我还收集了很多实用有趣的免费工具,例如一些下载工具、设计工具、学习网站等等。
我多么希望我能都掌握一遍(抹泪
Thesis:毕业论文 Word 写作教程。
原Po主加的 但我感觉距我甚远
优秀教材
引用:私以为一本好的教材应当是以人为本的 而不是炫技式的理论堆砌。告诉读者“是什么”固然重要 但更好的应当是教材作者将其在这个领域深耕几十年的经验融汇进书中 向读者娓娓道来“为什么”以及未来应该“怎么做”。
指向原Po主的链接 → 教材列表
进入课程部分
数学基础/进阶/高级
因为我是个数学系的学生 所以这里面的所有内容我都保留了下来。虽学不完 但是还是不能把自己当个学计算机的 数学系是最先该学的吧 拿来当作通往计算机的路(bushi
基础数学
微积分&线性代数
作为一名低年级学生 学好微积分线代是通向好绩点的必经之路 尤其对我这个数学系的学生来说。
下面是MIT的课程链接:
信息论
一个想学好计算机的学这门课是很有用的 但大多信息论的课都为高年级或研究生开设 这里的MIT课程资源则是对大一量身定制 有趣又易上手。
Information theory and Entropy
进阶数学
离散数学与概率论
这部分内容是进入高阶的重要基础 集合论/图论/概率论等等都是算法推导和证明的重要工具。
UCB CS70 : discrete Math and probability theory
UCB CS126 : Probability theory
前者覆盖了离散数学和概率论基础 后者则涉及随机过程以及深入的理论内容。
数值分析
作为计算机系的学生 培养计算思维是很重要的。实际问题的建模离散化 计算机的模拟分析 是一项很重要的能力。而这两年开始风靡的由 MIT 打造的 Julia 编程语言以其 C 一样的速度和 Python 一样友好的语法在数值计算领域有一统天下之势 MIT 的许多数学课程也开始用 Julia 作为教学工具 把艰深的数学理论用直观清晰的代码展示出来。
ComputationalThinking 是 MIT 开设的一门计算思维入门课。这门课利用 Julia 编程语言 在图像处理 社会科学与数据科学 气候学建模三个 topic 下教学
之后不妨试试 MIT 的Introduction to numerical analysis 这门课难度和深度上都上了一个台阶。内容涉及了浮点编码 Root finding 线性系统及微分方程
这门课的教授还专门撰写了一本配套的开源教材 Fundamentals of Numerical Computation 里面附有丰富的 Julia 代码实例和严谨的公式推导。
如果意犹未尽 还有 MIT 的数值分析研究生课程Introduction to numerical method 供你参考。
微分方程
此部分更偏向作者本人的数学系专业 与计算机并不相关性很强 但仍作为自学路线上的目标
MIT18.04: Complex variables functions
MIT18.03: differential equations
MIT18.152: Partial differential equations
高级数学
进入正轨后可以继续选择修行的课程 路漫漫其修远兮。最好趁着年轻学明白它们 莫等老了徒留一句 “学这玩意有啥用?”
凸优化
Standford EE364A: Convex Optimization
信息论
应用统计学
MIT18.650: Statistics for Applications
初等数论
密码学
编程/电子基础
编程入门
我想这也是伟大无需多言的重中之重
General=开头的CS50 (还记得这是啥吗?)
MIT-Missing-SemesterPython
UCB CS61A: Structure and Interpretation of Computer ProgramsC++
Stanford CS106B/X: Programming Abstractions
Stanford CS106L: Standard C++ ProgrammingRust
Stanford CS110L: Safety in Systems Programming大概不会学 学不过来也没兴趣
OCaml
Cornell CS3110: OCaml Programming Correct + Efficient + Beautiful同上
电路基础
了解一些基础的电路知识 感受从传感器收集数据到数据分析再到算法预测整条流水线 对于后续知识的学习以及计算思维的培养还是很有帮助的。这是伯克利 EE 学生的大一入门课 其中 EE16A 注重通过电路从实际环境中收集和分析数据。而 EE16B 则侧重从这些收集到的数据进行分析并做出预测行为。
EE16A&B: Designing Information Devices and Systems I&II
信号与系统
数学系的孩子可以为了里面傅里叶变换的醋而包这顿饺子 但是实际上对思维的建立是远胜过功利的学习的 不然也不会写这篇Blog
MIT课程提供了全部的课程录影 书面作业以及答案
关于傅立叶变换的 notes 写得非常好 并且提供了6 个非常有趣的 Python 编程作业让你在实践中运用信号与系统的理论与算法。
数据结构与算法
算法是计算机科学的核心 也是几乎一切专业课程的基础。如何将实际问题通过数学抽象转化为算法问题 并选用合适的数据结构在时间和内存大小的限制下将其解决是算法课的永恒主题。如果你受够了老师的照本宣科 那么我强烈推荐以下内容:
基于Java的伯克利的 UCB CS61B: Data Structures and Algorithms 和普林斯顿的 Coursera: Algorithms I & II
UCB CS61B: Data Structures and Algorithms
基于C/C++的Stanford CS106B/X: Programming Abstractions
Stanford CS106B/X: Programming Abstractions
基于Python的Introduction to Algorithms
MIT 6.006: Introduction to Algorithms
软件工程
入门
一份“能跑”的代码 和一份高质量的工业级代码是有本质区别的。因此非常推荐学习一下 MIT 6.031: Software Construction 这门课 它会以 Java 语言为基础 以丰富细致的阅读材料和精心设计的编程练习传授如何编写不易出 bug 简明易懂易于维护修改的高质量代码。
MIT 6.031: Software Construction
进阶
如果你想系统性地上一门软件工程的课程 那可以上伯克利的 UCB CS169: software engineering。但需要提醒 这门课不会涉及传统的 design and document 模式而是采用近些年流行起来的小团队快速迭代 Agile Develepment 开发模式以及利用云平台的 Software as a service 服务模式。(所以也是比较和学校内容割裂)
UCB CS169: software engineering
体系结构
入门
从小我就一直听说 计算机的世界是由 01 构成的。听后得我belike:我不理解但大受震撼。下面这门麻雀虽小五脏俱全的课程会从 01 开始让你亲手造出一台计算机 并在上面运行俄罗斯方块小游戏。一门课里涵盖了编译 虚拟机 汇编 体系结构 数字电路 逻辑门等等从上至下 从软至硬的各类知识 非常全面。难度上也是通过精心的设计 略去了众多现代计算机复杂的细节 提取出了最核心本质的东西 力图让每个人都能理解。在低年级 如果就能从宏观上建立对整个计算机体系的鸟瞰图 是大有裨益的。
进阶
UC Berkeley 作为 RISC-V 架构的发源地 在体系结构领域算得上首屈一指。其课程非常注重实践 你会在 Project 中手写汇编构造神经网络 从零开始搭建一个 CPU。这些实践都会让你不仅停留于“取指译码执行访存写回”的单调背诵里。
UCB CS61C: Great Ideas in Computer Architecture
计算机系统基础
计算机系统是一个庞杂而深刻的主题。在深入学习某个细分领域之前对各个领域有一个宏观概念性的理解 对一些通用性的设计原则有所知晓 会让你在之后的深入学习中不断强化一些最为核心乃至哲学的概念 而不会桎梏于复杂的内部细节和各种 trick。在Po主看来 学习系统最关键的还是想让你领悟到这些最核心的东西 从而能够设计和实现出属于自己的系统。
下面课程配套的教材 Principles of Computer System Design: An Introduction 也写得非常好 推荐阅读。
CMU 的系统入门课。配套的教材 Computer Systems: A Programmer’s Perspective 也是质量极高 强烈建议阅读。
CMU 15-213: Introduction to Computer System
计算机操作系统
没有什么比自己写内核更能加深对操作系统的理解
MIT 著名 PDOS 实验室出品 11 个 Project 让你在一个实现非常优雅的类Unix操作系统xv6上增加各类功能模块。做系统不是靠 PPT 念出来的 是得几万行代码一点点累起来的
MIT 6.S081: Operating System Engineering
南京大学的蒋炎岩老师开设的操作系统课程。此外 这门课的全部课程内容都是中文的。
NJU: Operating System Design and Implementation
并行与分布式系统
各类 CS 讲座里最常听到的话就是“摩尔定律正在走向终结”
硬件的变化带来的是上层编程逻辑的适应与改变 要想充分利用硬件性能 编写并行程序几乎成了程序员的必备技能。与此同时 深度学习的兴起对计算机算力与存储的要求都达到了前所未有的高度 大规模集群的部署和优化也越发热门。
并行计算
CMU 15-418/Stanford CS149: Parallel Computing
分布式系统
系统安全
选择计算机来自学紧跟时代发展是放最后的理由 最大的理由是完成我儿时中二稚嫩又未竟的梦——一名成为极客抑或黑客。这与网安系列的课程密切相关 是我一定会去学习的。即使学习需要的背景知识有点多 我也会挪着一点点往那里蹭过去的。
理论课程
伯克利的系统安全课程 会涵盖栈攻击 密码学 网站安全 网络安全等等内容
亚利桑那州立大学的系统安全课程 涉及内容全面。门槛较高 需要对 Linux C 与 Python 充分熟悉
ASU CSE466: Computer Systems Security
雪城大学的网安课程(称为 SEED Lab)。
包含详细的开源讲义 视频教程 教科书 开箱即用的基于虚拟机和 docker 的攻防环境等。目前全球有1050家研究机构在使用该项目 涵盖计算机和信息安全领域的广泛主题。
也是理论课程里高质内容最多 学时最长的
实践课程
掌握这些理论知识之后 还需要在实践中培养和锻炼。CTF 夺旗赛是一项比较热门的系统安全比赛。下面是原PKU的Po主的资源
计算机网络
如同计算机操作系统 没有什么能比自己写个 TCP/IP 协议栈更能加深对计算机网络的理解了。
资源为Stanford大名鼎鼎的课程 8 个 Project 带你实现整个 TCP/IP 协议栈
Stanford CS144: Computer Network
数据库系统
CMU 的著名数据库神课 CMU 15-445: Introduction to Database System 会通过 4 个 Project 带你为一个用于教学的关系型数据库 bustub 添加各种功能。实验的评测框架也免费开源了 非常适合大家自学。此外课程实验会用到 C++11 的众多新特性 也是一个锻炼 C++ 代码能力的好机会。
CMU 15-445: Introduction to Database System
Berkeley 作为著名开源数据库 postgres 的发源地也不遑多让
UCB CS186: Introduction to Database System会让你用 Java 语言实现一个支持 SQL 并发查询、B+ 树索引和故障恢复的关系型数据库.
编译原理
没有什么能比自己写个编译器更能加深对编译器的理解了。
Web开发
前后端开发很少在计算机的培养方案里被重视 对的 这反倒是我首先上手的 先选没用的。不过好处是可以搭建个人主页或给项目做一个精彩的展示
简要版
系统学习版
Stanford CS142: Web Applications
计算机图形学
会发现在这篇Blog后段每个章节的文字内容越来越少 这是因为越到了后面课程中讲述的越多 再像前面做出说明就显得冗余。实际上后面的课程内容非常充实 此时是堆叠能力侧生枝干的时期 而非一开始的发芽求索。
数据科学
其实数据科学和机器学习与深度学习有着很紧密的联系 但可能更侧重于实践。Berkeley通过丰富的编程练习让你在实践中掌握各类数据分析工具和算法 并带领你体验从海量的数据集中提取出想要的结果 并对未来的数据或用户的行为做出相应的预测。但这只是一门基础课 如果想学习工业级别的数据挖掘与分析技术 可以尝试 Stanford 的大数据挖掘课程 CS246 。
UCB Data100: Principles and Techniques of Data Science
CS246: Mining Massive Data Sets
人工智能
Harvard课程短小精悍 覆盖了传统人工智能领域的几大分支 并配有丰富有趣的 Python 编程练习来巩固你对人工智能算法的理解。美中不足的是这门课因为面向在线自学者的缘故内容较为精简 并且不会涉及特别深入的数学理论。
Harvard CS50: Introduction to AI with Python
如果想要系统深入地学习还需要一门本科生难度的课程 例如 Berkeley 的 UCB CS188。这门课的 Project 复刻了经典游戏糖豆人 让你运用人工智能算法玩游戏 非常有趣。
UCB CS188: Introduction to Artificial Intelligence
机器学习-系统
如果你之前从未接触过机器学习的相关知识 而且不想一开始就陷入艰深晦涩的数学证明 那么不妨先从 Andrew Ng (吴恩达)的课学起 这门课在机器学习领域基本无人不晓。
但上过这门课只能让你从宏观上对机器学习这一领域有一定了解 如果想真正理解那些“神奇”算法背后的数学原理甚至从事相关领域的科研工作 那么还需要一门更“数学”的课程:
Stanford CS229: Machine Learning
机器学习-进阶
下面的课程是更加有选择性的 对应的描述也会更加具体 但是还是没有到发顶刊的程度 那些部分的自学我把原Po主的部分删除掉 认为太过遥远。
下面这门课是机器学习编译领域的顶尖学者陈天奇在2022年暑期开设的一门在线课程。如果对机器学习编译感兴趣想有个全貌性的感知的话 可以学习一下这门课。
对智能计算系统的认识和理解是智能时代计算机类专业学生培养方案中不可或缺的重要组成部分 是计算机类专业学生的核心竞争力。
国内的陈云霁老师开的课 在其他若干个大学也都有开对应的课程。这门课用一个个实验带大家以一个完整的视野理解人工智能的技术栈。从上层的深度学习框架 到用底层语言编写算子 再到硬件中 MLU 的设计。让大家形成系统思维 体会自上而下 融会贯通的乐趣。
这门课程是 CMU 的图模型基础 + 进阶课 授课老师为 Eric P. Xing。涵盖了图模型基础 与神经网络的结合。在强化学习中的应用 以及非参数方法 相当硬核。
CMU 10-708: Probabilistic Graphical Models
这门课由 MIT 的 Song Han 教授讲授 侧重于高效的机器学习训练、推理技术。学生需要有一定的深度学习方面的知识基础。
课程主要分为三个部分 首先讲授了让神经网络轻量化的各种关键技术。课程第二部分会讲授面向特定领域场景的各种高效优化技术 例如大语言模型的推理 长上下文支持 后训练加速 多模态大语言模型 GAN 扩散模型等等。课程第三部分主要涉及各类高效训练技术,例如大规模分布式并行 自动并行优化 梯度压缩 边缘训练等等。
MIT6.5940: TinyML and Efficient Deep Learning Computing
深度学习
如果想快速入门 同样推荐 Andrew Ng (吴恩达)的 Coursera: Deep Learning 质量无需多言。
此外如果觉得英文课程学习起来有难度 推荐李宏毅老师课程。这门课打着机器学习的名号 却囊括了深度学习领域的几乎所有方向 非常全面 很适合从宏观上对这个领域有一个大致的了解。
当然因为深度学习领域发展非常迅速 已经拥有了众多研究分支 如果想要进一步深入 可以按需学习下面罗列的代表课程
计算机视觉
Stanford CS231n: CNN for Visual Recognition
自然语言处理
Stanford CS224n: Natural Language Processing
图神经网络
Stanford CS224w: Machine Learning with Graphs
强化学习
UCB CS285: Deep Reinforcement Learning
Zejun Fu’s 学习规划
越是学习到后面 学习越是线性的 因为你选定了一个方向进行孜孜不倦的研究。而前期往往并不是线性的从1到2到3 它更像是网状的知识体系 你在学一门课的时候会对另外一门知识中的章节突然有所感悟。等到你学习新的网状体系中的入门课程时感觉大部分概念都轻松找到了理解方法 甚至是学过。那就象征着你的基础强大到支撑着你继续走向更深的部分 选择某一个分支了。
以下图例仅为简要示意
太后期或边缘化的省略不计 并且只是给我自己自己自己自己自己设定的 不具有任何借鉴意义