如何自学CS?-程序员宅基地

640?wx_fmt=jpeg


整理 | 非主流

出品 | AI科技大本营


哪个行业的平均工资最高?


计算机。


国家统计局的数据显示,2016 年信息传输、软件和信息技术服务业年平均工资为 122478 元,首超金融行业,并于 2017 年再次夺魁。


在互联网和人工智能浪潮的推动下,一大批年轻人选择了 CS(计算机科学) 专业,这里面还包括各种转专业的学生。


此前营长也给大家推荐过很多学习资源,但是大多都是单个资源,比较零散。其实,很多读者需要的是建议,而不仅仅是资源。


特别是对于自学的小伙伴来说,为什么要学习 CS?应该学习什么?如何选择教材或者视频课程?都是让人困扰的问题。


现在,营长特意为这些小伙伴准备了一套大餐,希望能帮你厘清方向,消除困惑。



为什么要学好 CS?


首先,为什么要学习 CS?


我们知道,任何行业的从业人员的专业水平都是参差不齐的。有人将软件工程师也分成了两类:一类是对 CS 这门学科理解透彻,可以胜任各种挑战性和创新性的工作;另一类则仅仅是对一些高级工具比较熟悉而已。


虽然两者都自称为软件工程师,而且一开始的起薪都差不多,但是第一类工程师显然有更大的发展空间。


比如 WhatsApp 一天要处理 420 亿条信息(2016 年 2 月),但当时 WhatsApp 只有 57 名工程师,要完成这个挑战靠第二种类型的工程师是不太可能的。


640?wx_fmt=png

     

因此,如果你想成为第一种类型的软件工程师,踏踏实实学好 CS 才是正途。



怎样学好 CS?


在回答了为什么要学习 CS 这个问题之后,接下来要怎么学?


其实 CS 不只是编程,还涉及到很多知识。本文将重点介绍编程、计算机架构、算法和数据结构、数学、操作系统、计算机网络、数据库、计算机语言和编译器、以及分布式系统。接下来我们一一分析。


640?wx_fmt=jpeg


编程


大多数的 CS 本科课程都是从介绍计算机编程开始的。营长推荐 Structure and Interpretation of Computer Programs 这本书。


视频则推荐伯克利大学 Brian Harvey 的 SICP 课程。建议至少学完 SICP 的前三章,并把练习题做完。如果你觉得 SICP 的课程太难,可以选择 How to Design Programs。


传送门:

https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html

https://archive.org/details/ucberkeley-webcast-PL3E89002AA9B9879E?sort=titleSorter

http://www.htdp.org/


计算机系统结构


计算机系统结构是最容易被自学者忽略的,但是它其实非常重要。营长推荐 The Elements of Computing Systems 这本书,建议至少看完前 6 章并完成相应的作业。不过这本书并不是完全免费,因此也可以选择伯克利大学的 CS61C 课程:Great Ideas in Computer Architecture,而且可以下载之前的讲义。


传送门:

https://www.nand2tetris.org/

http://inst.eecs.berkeley.edu/~cs61c/sp15/



算法和数据结构


学好算法和数据结构,将有助于培养你解决问题的能力。营长推荐  The Algorithm Design Manual  这本书,但是真的很贵。不过,这本书的作者很慷慨把这本书的配套视频免费共享到了网上。如果你想练练手,则可以选择刷 Leetcode。


传送门:

http://www3.cs.stonybrook.edu/~algorith/video-lectures/

https://leetcode.com/



数学


虽然很多人对畏惧数学,但是“计算机之父”冯·诺依曼曾经说过:如果人们不相信数学有多简单,那是因为他们没意识到生活有多复杂。


640?wx_fmt=jpeg     图片来源:AZ QUOTES


跟计算机最相关的数学知识当属“离散数学”以及“线性代数”。


如果你想学好离散数学,可以阅读匈牙利的数学家 László Lovász 关于离散数学的课程讲义。如果你还想更进一步,则可以选择麻省理工的 Mathematics for Computer Science,而且有配套的视频课程。


至于线性代数,则建议从 Essence of linear algebra 视频系列开始,然后是麻省理工的相关视频课程。


传送门:

http://www.cs.elte.hu/~lovasz/dmbook.ps

https://courses.csail.mit.edu/6.042/spring17/mcs.pdf

https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/video-lectures/

https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/video-lectures/


操作系统


关于操作系统有很多经典书籍,比如 Operating System Concepts 和 Modern Operating Systems,但是都价格昂贵,这里营长给大家推荐一本免费的作为替代:Three Easy Pieces。


传送门:

http://pages.cs.wisc.edu/~remzi/OSTEP/


计算机网络


计算机网络是 CS 学科里最有价值的领域之一。营长推荐 Computer Networking: A Top-Down Approach 这本书以及搭配的练习题,不过这本书实在太贵。你也可以选择斯坦福的在线课程:Introduction to Computer Networking。想要学好计算机网络,最重要的是多做项目。


传送门:

http://www-net.cs.umass.edu/wireshark-labs/

https://lagunita.stanford.edu/courses/Engineering/Networking-SP/SelfPaced/about


数据库


自学数据库还是比较难的。营长建议自学者不要直接看教材,而是通过在线视频来学习,比如伯克利的 CS168 课程。那些想了解 RDBMS(关系型数据库管理系统)的读者,一定要看一下 Architecture of a Database System 这篇论文。此外,Readings in Database Systems 也值得一读。


传送门:

https://archive.org/details/UCBerkeley_Course_Computer_Science_186

http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf

http://www.redbook.io/


计算机语言和编译器


对于自学者,营长推荐斯坦福的在线课程:Compilers。关于练手项目,营长建议你从 Make a Lisp 开始。


传送门:

https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about

https://github.com/kanaka/mal


分布式系统


分布式系统的教材可以选择 Distributed Systems, 3rd Edition,而且是免费的。同时你也可以选择麻省理工的在线课程:6.824。而且营长还准备了一份论文清单,供你参考。


传送门:

https://www.distributed-systems.net/index.php/books/distributed-systems-3rd-edition-2017/

https://www.youtube.com/watch?v=hBWfjkGKRas&list=PLkcQbKbegkMqiWf7nF8apfMRL4P4sw8UL

http://dsrg.pdos.csail.mit.edu/papers/


其他


现在 AI 确实很火,营长以往也给大家推荐过不少学习资源,今天再给大家推荐几个:


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/84939099

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf