零、背景
在近两年高并发系统 DevOps 的过程中,
遇到了很多底层的问你题,eg: 网络、硬件、虚拟机等,
有些现象虽然知其然,但是不知其所以然,书到用时方恨少!
抱着深入学习的心态这两年看了一些相关书籍:
《计算机网络:自顶向下方法》
《操作系统精髓与设计原理》
《Java性能优化权威指南》
《Redis运维与开发》
《性能之巅》
收获甚大 所以想继续深入学习
误打误撞,看到了之前在 GitHub 关注的一个『自学计算机科学』仓库,很赞同下面这个观点
软件工程师分为两种:
- 一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;
- 另一种仅仅凭着对一些高级工具的熟悉而勉强应付。
这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。
然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,
不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。
一、资源
1.1 摘要
科目 | 为何要学 | 最佳书籍 | 最佳视频 |
---|---|---|---|
编程 | 不要做一个“永远没彻底搞懂”诸如递归等概念的程序员。 | 《计算机程序的构造和解释》 | Brian Harvey’s Berkeley CS 61A |
计算机架构 | 如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。 | 《深入理解计算机系统》 | Berkeley CS 61C |
算法与数据结构 | 如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。 | 《算法设计手册》 | Steven Skiena’s lectures |
数学知识 | 计算机科学基本上是应用数学的一个“跑偏的”分支,因此学习数学将会给你带来竞争优势。 | 《计算机科学中的数学》 | Tom Leighton’s MIT 6.042J |
操作系统 | 你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。 | 《操作系统导论》 | Berkeley CS 162 |
计算机网络 | 互联网已然势不可挡:理解工作原理才能解锁全部潜力。 | 《计算机网络:自顶向下方法》 | Stanford CS 144 |
数据库 | 对于多数重要程序,数据是其核心,然而很少人理解数据库系统的工作原理。 | 《Readings in Database Systems》 (暂无中译本) | Joe Hellerstein’s Berkeley CS 186 |
编程语言与编译器 | 若你懂得编程语言和编译器如何工作,你就能写出更好的代码,更轻松地学习新的编程语言。 | 《Crafting Interpreters》 | Alex Aiken’s course on Lagunita |
分布式系统 | 如今,多数 系统都是分布式的。 | 《数据密集型应用系统设计》 | MIT 6.824 |
1.2 详情
内容值得一看,真心建议多花功夫学好底层知识。
原文:Teach Yourself Computer Science
翻译:自学计算机科学
来自亚马逊 CTO 的博文也值得一看,操作系统经典书籍
The OS Classics