跳转到内容

原理

本课程没有练习,也不需要掌握任何东西,只需要学完后对计算机科学这一庞大的学科有一个基本印象即可。

课程提供两套教材,可以自行选择。

  1. 视频《计算机科学速成课》,有中文翻译的字幕。每个视频 10 分钟出头,一共 40 个视频,总时长不到 8 个小时。
  2. 书籍《编码》,纯粹的科普书,没有任何难度。

计算机科学导论这门课的目的,就是去了解计算机的各个抽象层。从简单晶体管的工作原理开始,到最后能够知道复杂软件如何运行。

请不要在这门课上花太多时间,也不要尝试去弄懂里面的每一个概念——这违背了导论课的初衷。快速搭建起对一个学科的认知框架,这才是导论课的目的。至于往框架里填内容,那是后续课程的任务。

计算机组成、计算机系统等课程都会提到逻辑设计,但介绍得比较简略。如果你对这部分内容很感兴趣,可以学习本课程以深入了解。

《数字逻辑基础与 Verilog 设计》介绍了如何使用简单的逻辑门一步步地设计出 CPU、RAM 等各种复杂的硬件。逻辑门是逻辑电路的基本元件,而逻辑电路是对电子电路的抽象——不考虑电流、电压、电阻、电容、电感等物理量,而将其简化为数学逻辑。

课程不关注电路的内部实现。但如果你对这部分内容感兴趣,好奇如何使用晶体管实现逻辑门,那么可以阅读这本教材的附录 B,但需要一定的微积分基础。

如果你对更底层的电子电路感兴趣,那么可以学习电子电路课程。该课程超出了计算机科学所研究的内容,我倾向于划给电气工程专业,因此被放在了选学部分。

本课程学习深度学习的基本原理,并使用 Python 训练一个简单的手写数字识别模型。

《深度学习入门》这本书没什么前置要求。

  • 对数学的要求很低,只要会四则运算,知道什么是函数和向量就足够了。本书会介绍导数、梯度、矩阵、卷积这些较为复杂的概念。
  • 对编程的要求也很低,即使完全不了解也行。本书会介绍 Python 的基本语法和所用库的主要函数。

本书采用项目驱动的教学方式。

  • 本书从最简陋的手写数字识别模型开始,一步步改进,最后达到让人满意的识别准确率。
  • 完成这个模型后,本书还会介绍一些比较前沿的东西来收尾。

建议跟着书本一起写这个模型。这没有任何难度,因为书里已经给出了所有的代码。

强依赖

本课程学习如何从设计者的视角理解计算机系统,并从零开始构建一台现代计算机。

《计算机系统要素》是著名公开课 Nand2Tetris 的教材。本书从最基础的逻辑门开始,到最后实现完整的编译器和操作系统。每一章都分为理论部分和实践部分。

  • 前 5 章实现计算机的硬件,后 7 章实现计算机的软件。
  • 第 4 章会介绍一门专为此课程设计的机器语言,第 5 章要用逻辑门搭建一个可以执行该机器语言的计算机平台。
  • 第 9 章会介绍一门专为此课程设计的高级语言,第 10、11 章要用任一编程语言实现可以将该高级语言翻译成机器语言的编译器。
  • 第 12 章要求用本课程设计的高级语言编写该计算机平台的操作系统。

本书的理论部分普遍较为简略,如果没有任何基础的话,完成项目可能会有点困难。

  • 如果学过逻辑设计,那么硬件部分会相对更加简单。
  • 如果不会编程语言,那么软件部分就可能无法完成。且软件部分的作业涉及编译器、操作系统、图形引擎等专业知识,普遍不简单。

尽管本书的项目指导已经非常完善,但仍有部分难点未能覆盖。

该课程自行设计的高级语言是一门基于对象的类 Java 语言。课程要求使用该语言编写程序,因此掌握一点面向对象编程可能会有所帮助。

本课程学习如何从编程者的视角理解计算机系统。

所选教材《深入理解计算机系统》就是大名鼎鼎的 CSAPP。

计算机系统是个非常庞大的概念,涵盖了协同工作的软硬件整体。本书对计算机系统的介绍非常全面。不过,对于特定的主题,比如操作系统、编译原理等,如需更加深入的理解,还是要阅读更进阶的书籍。

强依赖

《计算机网络》从顶层概念一直介绍到底层原理,内容详尽,结构清晰。

  1. 第一部分讲基础内容,即协议栈,自上而下地讲述网络体系结构的各个层次。
  2. 第二部分讲高级主题,包含无线移动网络、网络安全和多媒体网络等前沿内容。

理解计算机网络的原理不需要编程知识,对数学的要求也很低。不过有点准备还是更好的。

  • 套接字编程部分和部分练习都需要编程,因此最好具备编程基础。
  • 网络负载模型使用概率建模,对其进行性能分析需要借助微积分。
  • 网络层的拓扑结构用图表示,掌握离散数学对图算法的理解有所帮助。

本书对套接字编程的介绍非常简略,这部分更详细的内容可学习网络编程课程。

《数据库系统概念》全书结构清晰。除去第 1 章的绪论,本书总体上可分为四个部分。

  1. 第一部分是数据库的使用,也就是本书的第 2 章到第 5 章。主要讲数据库的数学模型,以及如何用 SQL 语言进行查询、插入、删除和更新。
  2. 第二部分是数据库的设计,也就是本书的第 6 章到第 7 章。主要讲数据库的设计范式、设计方法,以及如何用 SQL 语言创建数据库模式。
  3. 第三部分是数据库的应用,也就是本书的第 8 章到第 11 章。主要讲了数据库的两个主要应用,分别是应用程序开发和大数据分析。然后讲如何在应用程序中使用数据库,以及如何用数据库进行大数据分析。
  4. 第四部分是数据库的实现,也就是本书的第 12 章到第 23 章。主要讲了数据库系统实际上如何存储数据、查询数据,以及如何实现事务管理、并发控制等。并且最后还花了很大的篇幅讲述时下非常流行的并行和分布式数据库系统。

第三部分和第四部分的内容又多又杂。如果时间不够充裕,只读前两部分即可。其余部分可以挑感兴趣的阅读,或者当工具书进行查阅。

《人工智能》这本书很厚,堪称人工智能中的百科全书。

本书涉猎很广,提到了相当多复杂的数学概念,不过并没有深入讨论。因此本书实际的数学要求并不高,但相应的结果就是,部分理论没有介绍得很充分。

本书更适合作为工具书进行查阅,或者挑部分感兴趣的章节进行阅读。

《计算机图形学》内容相当多。

  • 前 12 章介绍了计算机图形学的主要内容以及数学方法。
  • 后 14 章介绍与图形学交叉的内容,包括随机采样、插值拟合、动画、图形硬件编程、图形用户界面设计、光学、颜色学、视觉科学等。这部分内容非常零散,且各章之间缺少联系。

建议只读前 12 章即可。后面 14 章可以挑些感兴趣的进行阅读。

《计算机体系结构》使用量化的方式研究计算机架构,探索如何通过改善架构来提升性能。

全书介绍了存储器层次结构、指令级并行、数据级并行、线程级并行、请求级并行等多种架构优化方法,内容非常全面。

《编译原理》就是著名的龙书,内容很全面,包含从词法分析、语法分析、语义分析到代码生成、代码优化的完整编译流水线。

《操作系统导论》全书结构清晰,把操作系统的功能分成了三类,并逐一介绍。

  • 虚拟化部分讨论处理器虚拟化的进程和调度,以及内存虚拟化的地址空间、地址转换、分段和分页。
  • 并发部分讨论线程、锁、条件变量和信号量。
  • 持久化部分讨论存储设备、文件系统和分布式系统。
弱依赖

《大规模并行处理器编程实战》介绍如何进行大规模并行处理器编程以实现高性能计算。全书内容相当丰富。

  • 介绍 GPU 的体系结构和计算流水线。
  • 介绍 CUDA 编程模型以及如何编写 CUDA 程序。
  • 介绍卷积、前缀和、稀疏矩阵向量乘法等多种并行模式。
  • 介绍 OpenCL、OpenACC、Thrust 等多种并行编程接口。

《数据密集型应用系统设计》详细介绍了一个数据密集型应用该如何设计。

  • 介绍关系模型、文档模型、图模型等数据模型,以及如何根据数据模型选择数据库类型。
  • 介绍事务处理系统和分析系统,以及如何根据数据访问模式优化数据存储。
  • 介绍以 JSON 为首的文本数据编码格式和以 Protocol Buffers 为首的二进制数据编码格式,并比较二者的优劣。
  • 分析分布式数据系统面临的挑战,以及主要的应对方式。
  • 比较批处理系统和流处理系统,并探讨数据系统的未来。

《计算机安全》内容非常全面,涵盖了密码学、数据库安全、云安全、软件安全、网络安全、系统安全等领域,甚至还关注了员工管理以及法律道德问题。建议作为工具书使用。

本课程学习如何设计一个易于理解、高效且符合人类认知规律的交互系统。

选择的教材为《交互设计》。本书介绍了交互设计的基本概念,且包含大量实例。

《机器学习实战》介绍如何使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习。虽然目前学术界更偏爱 PyTorch,但其核心思想都是一样的。