下面的内容都是可选的。通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。

额外书籍

你可以从以下的书单挑选你有兴趣的主题来研读。

  • UNIX 环境高级编程
    • 老,但却很棒
  • Linux 命令行大全
    • 现代选择
  • TCP-IP 详解系列
  • Head First 设计模式
    • 设计模式入门介绍
  • 设计模式:可复用面向对象软件的基础
    • 也被称为“四人帮”(Gang of Four(GOF))
    • 经典设计模式书籍
  • 算法设计手冊(Skiena)
    • 作为复习以及问题辨别
    • 这本书中算法的部分难度已经超过面试会出现的
    • 本书分为两个部分:
      • 数据结构和算法课本
        • 优点:
          • 跟其他算法课本一样是个很棒的复习素材
          • 包含作者以往解决工业及学术上问题的经验的故事
          • 含 C 语言代码示例
        • 缺点:
          • 某些地方跟《算法导论》(CLRS)一样艰深,但在某些主题,算法导论或许是更好的选择。
          • 第 7、8、9 章有点难以消化,因为某些地方并没有解释得很清楚,或者根本上我就是个学渣
          • 别会错意了,我很喜欢 Skiena 的教学方法以及他的风格。
      • 算法目录:
        • 这个部分是买这本书的最大原因
        • 我即将着手进行这部分,一旦完成这部分我会再更新上来
    • 可以在 kindle 上租
    • 解答:
    • 勘误表
  • 算法 (Jeff Erickson)
  • 编程卓越之道(第一卷):深入理解计算机
    • 该书于 2004 年出版,虽然有些过时,但是对于简单了解计算机而言,这是一个了不起的资源
    • 作者发明了高阶组合语言 HLA,所以提到,并且举了一些 HLA 的例子。里面没有用到很多,但都是很棒的组合语言的例子。
    • 这些章节值得阅读,为你提供良好的基础:
      • 第 2 章──数字表示
      • 第 3 章──二进制算术和位运算
      • 第 4 章──浮点表示
      • 第 5 章──字符表示
      • 第 6 章──内存组织和访问
      • 第 7 章──组合数据类型和内存对象
      • 第 9 章──CPU 体系结构
      • 第 10 章──指令集架构
      • 第 11 章──内存体系结构和组织
  • 算法导论
    • 重要提示:读这本书的价值有限。本书很好地回顾了算法和数据结构,但不会教你如何编写良好的代码。你必须能够有效地编写一个不错的解决方案
    • 又称 CLR,有时是 CLRS,因为 Stein 最后才加入
  • 计算机体系结构,第六版:定量方法
    • 对于更丰富、更时新(2017 年)但较长的处理方式

系统设计、可扩展性和数据处理

如果您有 4 年以上的工作经验,可以预期会遇到系统设计问题。

附加学习

我把它们加进来是为了让你成为更全方位的软件工程师,并且留意一些技术以及算法,让你拥有更大的工具箱。

编译器

Emacs and vi(m)

Unix 命令行工具

  • 下列内容包含优秀工具
  • bash
  • cat
  • grep
  • sed
  • awk
  • curl or wget
  • sort
  • tr
  • uniq
  • strace
  • tcpdump

信息论 (视频)

奇偶校验位 & 汉明码 (视频)

系统熵值(Entropy)

密码学

压缩

计算机安全

垃圾回收

并行编程

消息传递,序列化和队列系统

A*搜索算法

快速傅里叶变换

布隆过滤器

HyperLogLog

局部敏感哈希

van Emde Boas 树

增强数据结构

平衡查找树(Balanced search trees)

  • 掌握至少一种平衡查找树(并懂得如何实现):

  • “在各种平衡查找树当中,AVL 树和 2-3 树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。 这种令人特别感兴趣的数据结构,亦称伸展树(splay tree)。 它可以自我管理,且会使用轮换来移除任何访问过根节点的键。” —— Skiena

  • 因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。 虽然,通过我的阅读,我发现在面试中并不会被要求实现一棵平衡查找树。 但是,为了胜人一筹,我们还是应该看看如何去实现。在阅读了大量关于红黑树的代码后, 我才发现伸展树的实现确实会使得各方面更为高效。

    • 伸展树:插入、查找、删除函数的实现,而如果你最终实现了红黑树,那么请尝试一下:
    • 跳过删除函数,直接实现搜索和插入功能
  • 我希望能阅读到更多关于 B 树的资料,因为它也被广泛地应用到大型的数据集当中。

  • 自平衡二叉查找树

  • AVL 树

  • 伸展树

    • 实际中: 伸展树一般用于缓存、内存分配者、路由器、垃圾回收者、数据压缩、ropes (字符串的一种替代品,用于存储长串的文本字符)、 Windows NT(虚拟内存、网络及文件系统)等的实现。
    • CS 61B:伸展树(Splay trees)(视频)
    • MIT 教程:伸展树(Splay trees):
      • 该教程会过于学术,但请观看到最后的 10 分钟以确保掌握。
      • 视频
  • 红黑树

  • 2-3 查找树

  • 2-3-4 树 (亦称 2-4 树)

  • N 叉树(K 叉树、M 叉树)

    • 注意:N 或 K 指的是分支系数(即树的最大分支数):
    • 二叉树是一种分支系数为 2 的树
    • 2-3 树是一种分支系数为 3 的树
    • K 叉树
  • B 树

k-D 树

跳表

网络流

不相交集 & 联合查找

快速处理的数学

树堆 (Treap)

线性规划(Linear Programming)(视频)

几何:凸包(Geometry, Convex hull)(视频)

离散数学

一些主题的额外内容

我添加了这些内容来加强上面已经提出的一些观点,但是不想把它们放在上面,因为那样会太多。 对于一个主题来说,过度处理很容易。 你希望在本世纪被雇佣吗?

视频系列

坐下来,尽情享受。

计算机科学课程

算法实现

论文