计算机基础知识对程序员来说有多重要？
不夸张的说这几门学科在CS的地位就好像张无忌修炼的《九阳神功》一样，是提升你的内功心法。 数据结构与算法，操作系统，计算机网络，计算机组成原理，全都属于计算机专业最重要的核心课程，把大学60%以上的精力都花在基础上绝对是值得的。 学习计算机一定不要想着速成，要下苦功夫，去啃那些经典书和源码，然后自己动手写，我大学整理了一套计算机必读的经典电子书库 画一张图来表示计算机知识体系结构，可以看出，OS、网络、计组等是地基！ 像 Vue、Js、HTML、Android、Java等这些课程，都是属于应用型的，有基础的同学花个一两周就能上手开始写，学好它们最重要的是用它们来实践，但是要写出好的软件，还是得掌握哪几门基础学科。 而且，计算机领域的学科渗透和交叉很厉害，学点底层的东西，有一门精通，你找工作就很占优势。 比如最重要的就是操作系统了，很多同学不知道学了操作系统能干嘛，反正都是调 API接口，一句话概括：“学好操作系统，能直接解决你在工作中遇到的问题”。 在实际工作中跟操作系统打交道是常事。比如程序运行期间会遭遇各种问题，很多都是和操作系统密切相关的： 除此之外，在做后台高性能服务端编程的时候，经常会用到内存、进程、线程、IO相关的知识。对于运维、测试等研发来说，很多问题也是基于操作系统的：比如给服务配置多大的内存、多大的缓存空间? 怎样根据操作系统给出的信息，判断服务器的问题出现在哪里？ 这些问题只有掌握操作系统底层知识，才能定位到原因，进一步排查监控。 而学习这些基础知识，小北学长反复强调了方法就是： 系统看书 + 深挖计算机底层 + 通过造轮子方式学习计算机基础课： 啃完一本本书, 做完一个个lab 你的编程能力不会突飞猛进, 一切都是量变最终累积成质变! 只有靠不断的看书、coding、学习优秀开源项目，构建自己的计算机知识体系，并且在特定的领域不断专研，这样才能成为一个优秀的工程师。 在大学期间我就做过很多国外的计算机硬核Lab，对我的编程能力提升非常大。 另外，在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记，是一位阿里大神写的，对于算法薄弱或者需要提高的同学都十分受用，算法一定是计算机学习的重中之重： 举几个做过的Lab例子吧： 第一个是文件系统 这个玩意挺有意思的，就是要让你自己去设计一个文件系统，比如文件、数据块、目录等等，而且你要提供创建、读写、删除、随机读、随机写等等接口，然后通过 Linux 的 VFS（虚拟文件系统） 机制挂载到 Linux 内核中，然后就可以用系统调用 open、read、write 这些来在你的文件系统上进行读写。VFS 是Linux一个机制，它规定了 IO 接口，然后你去实现这些接口，你就可以挂载在上面。通过这个东西我深入的学习和了解了文件系统，报酬也是非常值的。  第二个是SVC 就是版本管理系统，类似 SVN 和 GIT的，但是相对 GIT 做了很多简化，核心的就是创建分支、分支合并、回滚、commit 这些，通过这个我又去详细了解了 GIT 的实现原理，并且自己写了一个简单版本的 GIT，受益匪浅，也赚到了几千大洋。  第三个是操作系统的锁实现 这个就是让你基于硬件的原子指令 xchg、cmpxchg 这些实现一个锁，这个需要内联汇编、汇编等知识，简直是硬核！！！做完这个也解开了我对锁实现的一些疑惑。  更详细的可以去看看这个回答： 另外，在这里给学弟学妹们推荐一下这些基础课程的学习顺序和方式： 可以直接参考网易云课堂上CS科班的课程安排，国内几乎大部分高校都是这样：   核心就是计算机底层 + 通过造轮子方式学习计算机基础课： 国外有很多优秀的操作系统公开课，比如 mit6.828、哈佛 OS/161, 这类课程基本都是给你一个 mini os 壳，让你去完成部分操作系统的核心模块，比如线程管理、文件系统、分页、调度等。 相比纯看书，这样的学习方式无疑更加的生动和有趣。 这是课程官网： https://pdos.csail.mit.edu/6.828/2018/schedule.html 中国的知名大学，世界知名大学的操作系统课都有大实验，有一个现成的小系统让你去学习，分析。比如MIT有xv6，哈佛有，伯克利有Nachos，斯坦福有PrintOS， 清华有ucore等等。这些代码全是开源的，也都在1两万行上下，完全可以在大学期间啃下来。 国内也有一些顶尖高校也是采取类似的方式，比如清华ucore、哈工大 好像是基于 Linux 0.11魔改 哈工大： https://github.com/hoverwinter/HIT-OSLab 有些还有配套的视频，比如清华在线的慕课： https://next.xuetangx.com/course/THU08091000267/1516699 另外推荐一本可以让你从零开始写一个mini os的书《操作系统真象还原》，这本书讲得真的非常的细致。 都说很多开发是 crud ，而crud的对象就是数据库，所以好好掌握数据库的原理也是非常重要的，如果也能通过造一个简单的db的方式来学习，我相信这样的方式一定是最好的： 当然了，实现一个数据库也是相当有难度的，你大概需要这些知识： 做这些可能有点难，不过在GitHub上有教程教你如何一步步实现一个像sqllite这样的小型关系型数据， 比如这一个：https://cstack.github.io/db_tutorial/ 另外 MIT 6.830 Database Systems 也是很不错一门课 这是数据库系统的一门核心课程。由数据库的一大山头Samuel Madden教授。前半部分比较基础的数据库的知识，后半段主要在讲Distributed Databases的东西，各种consistency挺有意思，也是database比较火的研究方向。 课程链接：http://db.csail.mit.edu/6.830/ 还有 CMU 的两门 数据库课程也不错： https://15445.courses.cs.cmu.edu/fall2019/   // 初级 https://15721.courses.cs.cmu.edu/spring2019/  // 进阶 // 这里就是考虑如何去实现个网络协议栈了 课程推荐： 2. 但是国内计算机网络公开课几乎都没有实验，你想手写tcp、拳打 udp的话，建议食用 CS 144： 参考：  可能不需要完全实现每一层，比如可以尝试用 UDP 去把学到的那些超时重传、ACK、滑动窗口等实现一下，这样对 TCP 理解也会更加深刻 这个国外也有公开课，后面有人看再（疯狂暗示点赞哈哈哈）更新吧~ 这里就不列太多了，免得吓到大家哈哈哈，随便来两本： 在这里，送大家一份，自己整理的电子书库，绝不是在网上那种打包下载的，而是自己需要学到某个方向知识的时候，需要看了，去网上挨个找的，最后汇总而成。这部分我是会不断把它完善的，当成自己的小电子书库，不多，但贵在精。 大家应该也看出来了，我推荐的书偏向 C++ 方向，因为我从大三开始就偏向 Linux C++ 开发方向 前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++对象模型》、《STL源码剖析》、《C++设计与演化》、《Linux内核设计与实现》、《Linux内核完全注释》、《effecitve C++》 、《effective modern C++》、《程序员自我修养》、《Linux高性能服务端编程》、《Linux多线程服务端编程》(知乎陈硕大佬写的)...... 顺便还看了点 Muduo 源码，自己模仿着基于 Epoll 写一个 Reactor模型的 Web 静态服务器，跟着知乎 Milo 大佬写 Json 库，总之，这段时期是写了一些小”轮子“的。 （PS：知乎上有朋友问我是如何看完这么多书的，其实在之前的文章中就写了，看书我会有选择的挑章节看，不会从头看到尾的，而且大三开始课就少了，我基本就在刷这些书，其实时间还蛮多的？毕竟我也没参加什么社团、学生会之类，也没女朋友。。。 那时候会每天记录看书的进度，感觉特别有劲：   书看得越多，其实你越能找到自己的方向，大三上我就给自己学习定位： 深入C++语言（多线程）+ 存储（学习 Redis、leveldb）+ 网络编程（学习muduo，各种网络编程模型）+ 学习分布式（MIT 6.824、ddia、google 三大论文等） 基本上是沿着上面几个方向去展开学习的，有的看书，有的论文，也有的看博客看源码。 总之，知识面在大三不断扩充，自己开始关注学习 C10K、C100K 这样的后台服务器开发高性能、高并发的解决方法。 当然了，还有些到现在还没开始，比如 leveldb 的源码、6.824 的 lab，可能是变懒了...... //更多关于编程的知识，欢迎关注「编程指北」号，指南不指北！ 也可能是学习变得不那么纯碎面向技术了，变成面向工作、面向赚钱了哈哈哈。 值得一提的是，大三上我们学院有门 System Programing 的课，教材就是使用的 CSAPP，因此我之前大二草草看完的书，得以再次翻开，这一次我把附带的是个实验也挨着挨着做了，收获良多，有位运算各种奇技淫巧，有 Bomb lab 刺激的打怪通关、也知道了buffer overflow attack.... 还有实现基本的内存管理等等。 觉得不错的话，记得帮我 @编程指北 点个赞哟，祝大家都能学有所获，找到心仪的offer！ 也可以关注下我哟，致力于分享CS学习方法、校招打法、硬核技术，希望抹平CS学习的信息差，让同学们少走弯路！