这题我会!滑到了就别划走啦!作为一个刚毕业,目前在鹅厂工作的 CS 学长,给学弟学妹们一点学习建议。既然是学习CS,那么在这里,我粗浅的把计算机编程领域的知识分为三个部分:基础知识特定领域知识框架和开发技能基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。特定领域知识就是你从事某个细分方向时需要掌握的知识,比如做游戏引擎的需要掌握图形学;做前端的需要掌握浏览器渲染原理、前端三大件;算法工程师需要更多的数学知识。毕竟计算机各种门类挺多的,需要选个细分方向专研下去,什么都学只会什么都不精(大佬除外啦。上面那么划分可能有同学还比较疑惑,再细一点,我认为需要重点掌握学习的就是 :2-3门编程语言(1-2静态编译型 + 1-2 动态/脚本语言)算法与数据结构尤其是算法,面试工作必备!可以说算法不好,就进不了大厂,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重.System(OS、计算机组成、memory、cache等等)工程开发能力(git、linux、shell、环境搭建、部署等)计算机专业的核心课几乎都是围绕着构建上诉这些能力来的,比如:计算机学科导论和 C 语言汇编、操作系统、C++、数据结构、离散数学、数值分析和计算机组成原理计算机编译原理和数据库计算机网络与安全和软件工程还有高数、线性代数、离散数学、网络原理、网页设计、多媒体技术、汇编语言、面向对象的设计语言、Java 编程、ASP、SQL等总的来说是先学习 C 语言和 C++。教材有:C programming language-K&R、C traps and pitfalls、Algorithms in C 和 Expert C Programming学习数据结构。清华大学严蔚敏《数据结构》,目前还未找到经典的国外教材学习算法。算法导论和具体数学及其应用计算机组成原理。Computer Organization and Design The Hardware-3rd-David Patterson计算机系统。CSAPP操作系统。鸟叔的私房菜和计算机网络大学时,我看了很多计算机专业书籍,我把大学时候这些电子书库、简历模板、博客汇总、谷歌大佬的刷题笔记都打包放在这了,点击下方可以直达领取:关注公众号【编程指北】回复【05】即可领取三本BAT大佬算法笔记一、学习顺序可以直接参考网易云课堂上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的方式来学习,我相信这样的方式一定是最好的:当然了,实现一个数据库也是相当有难度的,你大概需要这些知识:SQL解析,你需要实现一个语法分析器, 《编译原理》的基础知识就用上了,不过这里自己去实现不太现实,可以参考TIDB,用Lexer & Yacc去做 SQL的解析,生成 AST。 数据需要持久化存储,这里需要考虑存储引擎,涉及到《操作系统知识》需要对外提供接口,B+树等数据结构知识,这里简单一点甚至可以直接写到文件,毕竟管理磁盘也挺恶心的。 实现索引 需要做表的Join,事务的ACID, 进阶一点,考虑如何实现 MVCC等 db的client和server之间如何访问又需要用到socket编程的知识 做这些可能有点难,不过在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/ // 进阶计算机网络// 这里就是考虑如何去实现个网络协议栈了可能不需要完全实现每一层,比如可以尝试用 UDP 去把学到的那些超时重传、ACK、滑动窗口等实现一下,这样对 TCP 理解也会更加深刻这个国外也有公开课,后面有人看再(疯狂暗示点赞哈哈哈)更新吧~一些好书&教材这里就不列太多了,免得吓到大家哈哈哈,随便来两本:《CSAPP》《程序员自我修养》《编码》《Inside the C++ Object Model》《Linux 高性能服务端编程》《计算机网络自顶向下》…更加详细的书单和下载方式可以看下这个公众号「编程指北」文章:书单推荐,少即是多mp.weixin.qq.com/s/lVre09AO05DIkoapiWY5yA大家应该也看出来了,我推荐的书偏向 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!编辑于 2021-06-11 17:19赞同 2836 条评论分享收藏喜欢收起更多回答知乎用户495 人赞同了该回答少量图预警!!!----------20160803更新--------------------国外名校计算机学习资源:MIT EECS课程列表:http://student.mit.edu/catalog/m6a.html加州大学伯克利分校EECS网站:EECS Course WEB Sites--------------------------------------------------一、课程安排看了看答案,发现竟然没有ACM的Curricula Recommendations,感觉不科学啊。戳:Curricula Recommendations
ACM的《Computing Curricula 2005》将计算类专业的课程分为了:Computer ScienceComputer EngineeringInformation SystemsInformation TechnologySoftware Engineering在网站都可以下载到对应的PDF,就不附下载链接了。如果英文看不懂,如下是中文图(图片来自网易大学计算机专业HIT《计算机专业导论》):
二、学习顺序个人感觉网易大学计算机专业安排的就挺好:
可以详细看网易教育 @孙志岗 的回答。三、经典教材1.华章图书计算机科学丛书我来安利华章科技的计算机科学丛书了,我发现这套书就和它的封面一样,有品位,有内涵,必备!基本上每本书都有配套网站,可以下载课件、习题等等,原版图书在谷歌一搜就能搜到,很方便。戳:华章图书计算机科学丛书2.Lucida程序员必读书单1.0Lucida(巩朋)是Google员工,他整理的程序员必读书单,把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。戳:程序员必读书单 1.0四、声明一千个读者就有一千个哈姆雷特。勿喷,作为文科生的我,仅仅做了一下搬运工,发表一下个人的观点。如有不足,望各位大神海涵。