前排提示 本文转载自公众号 良许Linux
重点三大块
计算机基础知识
特定业务技能
解决问题的能力
计算机基础知识,是根本,是任何从事编程工作的工程师都应该具备的能力,包括:计算机组成原理、计算机操作系统、计算机编译原理、数据结构与算法、各种编程语言等等。
基础知识是基本功,你基础打扎实了从事任何一个领域的工作,都会游刃有余。
特定业务技能,就是你所从事的细分领域所应具备的业务及专业技能。比如,你做嵌入式,就需要学习一些硬件知识;做算法,就需要掌握比较深的数学及算法知识;做人工智能,就要学习更多专业技能了。
现在企业的业务各不相同,所以细分出来的领域也非常多。想要做到每个领域都精通,几乎不可能。所以大部分程序员只能挑选少数几个领域进行深耕。
解决问题的能力,这个应该是各个企业都非常看重。企业是请你来解决问题,不是吃干饭,更不是来创造问题。这是程序员的软实力,你是菜鸟程序员还是资深程序员,差别就在这。
在学校里,遇到程序问题还可以跟同学们甚至老师一起讨论,但在企业里,大家都很忙,遇到问题几乎都需要自己想办法解决。
业务技能及解决问题能力,需要自己长时间的积累,以及刻意训练,甚至贯穿程序员的整个职业生涯。
而计算机基础知识,大家学习的内容都差不多,下面我就给大家总结一下,作为计算机专业的学生,应该掌握哪些基础知识。
俗话说,基础不牢,地动山摇。所以如果你想学好CS,一定要在学习编程语言、计算机组成、计算机操作系统、编译原理、数据结构/算法等等之前,先打好最基础部分。
最基础的部分一般包括以下内容:
数学
英语
这两块内容,对于任何想学习CS的专业课之前,是必修的基础课。
其实,等你工作到一定年限之后你就会发现,代码只是工具而已,不管你是用Java、Python、还是C++,其实这些语言都或多或少有相通性,最终的结果都是要用来解决实际问题的。
所以,为什么会有很多人非常擅长写代码,却成不了一个好的「软件工程师」。这也正是区别「码农」与「工程师」的关键之处。
而如果你想拥有非常好的业务能力,肯定会离不开数据结构和算法。而这两块都需要很强的数学功底。
而现在国外的计算机水平领先国内几十年,一些新技术、新框架往往都会先出现,所以你需要扎实的英文水平第一时间获取到这方面的信息。同时,如果编程过程中遇到问题,还可以在国外的论坛上得到更多的解答。
二、专业理论基础
计算机组成原理
计算机组成原理介绍了计算机的基础知识,包括计算机的各子系统(运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的技术。
学好了这门课程,你的七大姑八大姨,或者你暗恋很久的翠花,叫你修电脑的时候,就会游刃有余。
这门课程不仅介绍了计算机软硬件的相关知识,也介绍了计算机的各大基本部件的组成原理、设计方法及相互关系。
书籍推荐
- 入门系列
《计算机是怎样跑起来的》
《程序是怎样跑起来的》
《Computer Organization》
- 深入系列
《计算机组成与设计:硬件 / 软件接口》
《深入理解计算机系统》
《计算机组成:结构化方法》
《计算机体系结构:量化研究方法》
视频教程推荐
1) 国外视频
视频则推荐伯克利大学 Brian Harvey 的 SICP 课程,CS61A。建议至少学完 SICP 的前三章,并把练习题做完。
CS 61A: Structure and Interpretation of Computer Programs
如果你觉得 SICP 的课程太难,可以选择 How to Design Programs。
How to Design Programs
还有两门课也很经典:
- Harvard的CS50
CS50: Introduction to Computer Science
- MIT的6.001
mit-6.001
2) 国内视频
- 清华大学刘卫东老师的课程:
https://www.bilibili.com/video/BV1c4411w7nd?from=search&seid=12578695357351557326
- 哈工大刘宏伟(135讲)
https://www.bilibili.com/video/BV1t4411e7LH
计算机操作系统
即使不是程序员,每个人几乎每天都跟操作系统打交道(PC or phone)。简单来讲,操作系统是在为应用程序提供服务,比如:内存分配、进程调度、管理虚拟存储器,管理中断,管理磁盘,等等。
所以,对于程序员而言,你学了操作系统,你就会更加清楚如何去进行内存管理,如何进行进程调度。编写出来的程序也会比不懂操作系统的程序员更加优雅。
而且,不管对于大厂还是小公司,在面试或笔试的时候,都很经常考到操作系统,所以不管是工作还是为了应付面试,都需要好好学习一下操作系统。
书籍推荐
- 入门系列
《现代操作系统》
《操作系统导论》
- 深入系列
《深入理解计算机系统》
《自己动手写操作系统》
《操作系统真象还原》
视频教程推荐
1) 国外视频
- MIT的操作系统公开课(http://pdos.csail.mit.edu/6.828)。MIT自己基于Unix v6开发的xv6类Unix系统。除了没有视频,课表,作业,考试等都有。youtube上有第四讲以后的所有视频https://www.youtube.com/watch?v=kDRHsNauoxk&list=PLfciLKR3SgqNJKKIKUliWoNBBH1VHL3AP
- Udacity的Advanced OS公开课:Advanced Operating Systems from Udacity
- Coursera上北大操作系统原理公开课(15年3月17日开课):Advanced Operating Systems from Udacity
2) 国内视频
- 《操作系统原理》,清华大学老师的课程,讲得很浅显易懂。
https://www.bilibili.com/video/BV1uW411f72n
- 《操作系统》,哈工大李治军老师,32讲
https://www.bilibili.com/video/BV1d4411v7u7
计算机编译原理
编译简单来讲就是把高级语言翻译成计算机可识别的机器语言,但这个过程并不容易,而且,你理解这个过程也同样不容易。
编译原理是计算机技术中相当基础的一门技术,同时它也是计算科学中技术含量较高的一门学科,它和算法、数据结构、编程语言等都有非常密切的联系,对这些相关技术的深入学习提供基本的理论基础,所以学好编译原理不但对该技术非常重要,而且对于学习相关的技术也非常重要,掌握编译原理你才有机会掌握更多的技术。
编译原理非常难,而且非常枯燥,需要要很强的功底才可以入门学习。
书籍推荐
《编译器设计-第二版》
《编译原理》
视频教程推荐
1) 国外视频
- CS143: Introduction to Compilers
- CS243 - Program Analysis and Optimizations
- CS 343
- https://www.cs.cmu.edu/~410/
- 15-411: Compiler Design (Fa'12)
- 15-440/640, Spring 2015: Distributed Systems
2) 国内视频
- 《编译原理》,哈工大,81集
https://www.bilibili.com/video/BV1zW411t7YE
- 《编译原理》,东南大学,廖力老师主讲,全64讲
https://www.bilibili.com/video/BV1cW411B7DW
计算机网络
在互联网如此发达的今天,几乎没有应用软件不连接网络的,所以对于一个程序员而言,不懂计算机网络的话简直寸步难行。
学习计算机网络,你需要懂得Socket编程,知道TCP/IP网络模型,了解OSI七层网络架构,知道一个数据包是如何层层包装,再层层拆包,从客户端发送到服务端。
计算机网络应该是除操作系统与算法之外,另一个面试常考的方向。所以,准备面试的小伙伴计网也一定需要好好准备一下。
书籍推荐
《网络是怎么连接的》
《计算机网络-自顶向下方法》
《图解HTTP》
视频教程推荐
1) 国外视频
- http://www-net.cs.umass.edu/wireshark-labs/
- https://lagunita.stanford.edu/c
- Stanford的CS144
2) 国内视频
- 《计算机网络》(谢希仁第七版)-方老师
https://www.bilibili.com/video/BV1yE411G7Ma
- 《计算机网络》,哈尔滨工业大学,李全龙老师
https://www.bilibili.com/video/BV1Up411Z7hC
数据库基础
数据库当然就是存储数据的地方,很多人自称CRUD工程师,但如果你连数据库都不懂,恐怕连这个称号都担不起。
一个软件在运行过程中,需要保存大量的输入信息,同时也会产生很多中间信息,所以数据库是必不可少的一个组成部分。它无所不在,网站的背后、应用的内部,单机软件,区块链里,甚至在离数据库最远的Web浏览器中,都有它的身影。
数据库分为关系型数据库和非关系型数据库,但近年来又出现了个NewSQL的东东,也需要稍微了解一下。学习数据库,你不仅要懂得SQL语句,表设计结构这些基础部分,还要懂索引、慢查询优化,配置参数调优,更深入的还要学习SQL优化、备份与恢复、架构优化等等进阶内容。
书籍推荐
- 入门系列
《MySQL必知必会》
《SQL学习指南(第2版 修订版)》
- 深入系列
《MySQL技术内幕——InnoDB存储引擎》
《Redis设计与实现》
《ZooKeeper:分布式过程协同技术详解》
视频教程推荐
1) 国外视频
- 斯坦福的数据库公开课Introduction to Databases:http://www.db-class.org
- 伯克利的 CS168 课程
- https://archive.org/details/UCBerkeley_Course_Computer_Science_186
2) 国内视频
- 《数据库系统概论》,王珊老师,中国人民大学
https://www.bilibili.com/video/BV1pW411W7Do
三、编程语言
现在网上关于第一门编程语言的选择有很多不同的看法,主要都在争论是C还是python。虽然现在很多大V能说出很多理由选python,但是我在这里比较推荐C。
因为像python这样的高级编程语言更多的是面向API编程,或者说就是熟悉API,很容易给人造成一种假象:计算机就是调包然后各种花里胡哨。
然而C这种更偏向“底层”的语言更注重的是逻辑,可以帮你培养出非常良好的编程思维和习惯,尤其是指针章节,虽然的确新手不好理解,但是这块知识非常适合给新手初窥一下计算机系统的门径,后面学习其他语言和理论知识也是事半功倍。
而且C也没有OOP(面向对象)的特性,刚上手不推荐学很多很杂的理念,很容易把人的思维搞乱。
书籍推荐
《C程序设计语言》
C语言三剑客(《C和指针》,《C专家编程》,《C陷阱与缺陷》)
《C primer plus》
不推荐谭浩强的书,写得很烂,里面还各种错误。
视频教程推荐
1) 国外视频
如果听得懂澳大利亚的口音的话,这门课是从C语言入门编程最好的公开课。
讲课的教授幽默风趣,知识丰富。面向的学生也是大一新生。绝对值得一学。
C programming by Richard Buckland UNSW 2008
2) 国内视频
强烈推荐翁恺老师的这门公开课,讲得浅显易懂,口碑十分好!
https://www.bilibili.com/video/BV1sJ411E7St
四、数据结构与算法
4. 数据结构与算法
大家或多或少都听说过,在企业面试的时候,数据结构与算法是必考的一部分内容。所以,你如果想要进入一个心仪的公司,一定要学好数据结构与算法。
但是,难道除了面试,数据结构与算法就没有用武之地了吗?肯定不是的!即使你整天的工作就是CRUD,但是如何你不懂时间、空间复杂度,你如何更合理调用那些API?如何降低功耗,提高程序运行效率?
而且,作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。
如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。
书籍推荐
- 入门系列
《算法图解》
《大话数据结构》
- 深入系列
《算法-第四版》
《算法导论》
视频教程推荐
1) 国外视频
- Stanford: Algorithms
这门课由斯坦福大学计算机科学系教授Tim Roughgarden授课,适合至少掌握一种编程语言的编程学习者。斯坦福的课强调理论和概念上的理解。学完这门课后,对你今后面对技术面试时将会非常有利。
- UCSD:数据结构与算法
Daniel M Kane、Pavel Pevzner等五位老师共同授课,这门课程的最大特点是理论和实践的结合,你将学习到解决各种计算问题的算法技巧,并实现大约100个算法编码问题。
- Prin:Algorithms, Part I
Kevin Wayne和Robert Sedgewick共同授课,涵盖了有关算法和数据结构的基本信息,重点是Java实现的应用程序和科学性能分析。第一部分包括基本数据结构、排序和搜索算法。第二部分重点讨论了图形和字符串处理算法。
2) 国内视频
- 《数据结构》,浙江大学陈越和何钦铭教授联合授课,其大名在计算机领域可谓耳熟能详了。
https://www.bilibili.com/video/BV1JW411i731
- 《数据结构与算法C++版》,由由北京大学张铭教授等七位授课老师全力打造,国家精品公开课。
https://www.bilibili.com/video/BV1R741117bK
- 《数据结构》,武汉大学李春葆教授
https://www.bilibili.com/video/BV1gb411C71L