新生指引
# 编程导航
ps:不想上课的南工人,随手拍。
# 导论
现在大家最缺的不是学习资料,而是详实的学习路线规划、方向分析,没有正确的学习路线,有力也使不出。
本文给大家总结了从 0 基础开始学习计算机的完整路线,包括:基础入门、核心课程学习、编程实践、进阶学习、职业规划等等方面。
基础入门:推荐比占的《计算机科学速成课》视频课程。作者以非常多的图示,非常生动的给大家介绍了计算机的发展历史以及体系结构概念,非常易懂。
核心课程:操作系统/组成原理/数据结构/数据库/网络。推荐了优秀的学习视频课程和书籍资料,以及方法论经验。
方向选择:给大家介绍了目前就业主流的方向,以及个方向的优劣,如何选择。
进阶学习:如何就一个方向深入学习,拓展自己的深度。
实战练兵:计算机是一门实践性很强的学科,因此必须加强实践,提高自己的编程内功。给大家推荐了一些实战的方向:项目、比赛、等等。
# 整体思路
如何针对有限的时间进行合理规划,我看很多文章上来就是给一堆书籍、一堆视频课程,我认为最重要的是捋清整体思路。也就是方法论,把握方向,然后再开始按部就班的开始自己的学习历程。
一开始就陷入海量课程和书籍,容易迷失、失去信心。
1、首先是打牢基础。
打牢基础!打牢基础!重要的事情说三遍!
基础非常重要,不管你以后从事什么方向,应用开发也好,大数据开发也要,客户端工程师也好,要想吃得开必须依赖这些基础课程:操作系统、组成原理、计算机网络、数据结构、算法、数据库,再加上学习一门语言。
这里要说明的是,很多大学计算机专业会开设诸如数学、电子电路、物理等等相关的课程,如果大家目的是找工作,那这些课程可以不用学习,把重点都放在我刚说的核心课程上。
2、明确自己的发展方向。
打牢基础后,可以开始选择自己后面的发展方向了。
以后从事哪个方向,是硬件、嵌入式还是软件?
若是软件细分的话是前端?后端?客户端?或算法?
3、进阶学习。
在基础入门后,就可以开始进阶学习了。
学习优秀的开源框架。计算机专业的好处是非常多的优秀资料都是开源的,我们只需一台电脑编可以免费获得。从优秀的框架中,学习其设计思路,代码风格,是提升自身编码水平的非常好的方式。
数据结构和算法。平常要多刷题,推荐好的刷题平台 LeetCode。
4、实战非常重要。
第二部分说到要多实战,那么大学大概有哪几种实战类型呢?
一是各种比赛,有含金量的比赛大概有 ACM、天池、kaggle、阿里中间件性能挑战赛等等,这里不全部列出来,下次我专门出个文章来跟大家讲清楚。
另外是做项目,跟着老师做项目是首选。因为有人带着,可以跟着老师和学长学到很多东西。
如果没有这样的机会,自己参与 github 开源社区也是非常不错的,社区有对应的邮件组和群聊,有非常热心的小伙伴。
# 计算机编程基础
2024 编程语言榜单
# (一)学习一门语言
初学建议选 C 语言,为什么呢?
因为 C 语言是一门偏底层的语言,能够让你了解到程序的底层机制,而且很多高校的课程也是 C 语言,很多比赛如 ACM 也是推荐 C/C++语言。C 语言学好后再学其他语言则是比较容易的事情了。
学了 C 语言后一般还会学习一门其他语言,特别是面向对象语言,常见的有 C++、Java。另外还有 python,用来做数据处理非常方便。
C 语言经典的书籍这里推荐 3 本:
第一本是《C Primer Plus》,比较适合入门。内容循序渐进,书中的每一个知识点都有很多生动简单的示例,并给出了相应的运行结果。而且每章末设计了大量复习题和编程练习,帮助巩固所学知识和提高实际编程能力。
第二本是《C 程序设计语言》,豆瓣评分 9.4 分,适合有一点基础后再来看。
进阶推荐《C 和指针》。全书共 18 章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的 C 编程话题。书中给出了很多编程技巧和提示,每章后面有针对性很强的练习。
书籍配合着视频课程一起学,效果会更好。如果只是抱着书啃,会比较枯燥。
国内浙大翁凯老师的课,看过的都说好~:
浙大 C 语言-翁凯,分为两门:
C 语言程序设计 CAP(大学先修课):https://www.icourse163.org/course/ZJU-1001614008
C 语言程序设计进阶:https://www.icourse163.org/course/ZJU-200001
第一门是面向高考结束想提前自学一点编程和大一新生的,叫大学先修课。虽然叫先修课,但是覆盖了 C 语言的主要知识点~
第二门是 C 语言程序设计进阶,会带你用 C 语言完成一些有趣的项目,比如一些图形界面小游戏。
先修课学习 C 语言语法基础,进阶课带你项目实操,搭配使用,你就是同学中的大神!
另外比较推荐的是国外杜克大学的 C 语言课程《Introductory C Programming》。
之前很多同学反馈这门课程资源找不到,这里给大家找好了 cousera 提供的课程,大家请自取:
https://www.coursera.org/specializations/c-programming
关于编辑器/IDE,推荐如下几个适合初学者的:
Visual Studio(Windows 平台)。微软出的,有点庞大。
Dev C++。没有 VS 那么复杂,是一款免费的 C/C++ IDE,内嵌 GCC 编译器,是 NOI 等比赛的指定工具。
Code::Blocks 一款开源、跨平台、免费的 C/C++ IDE,它和 Dev C++ 非常类似,小巧灵活,易于安装和卸载,不过它的界面要比 Dev C++ 复杂一些,不如 Dev C++ 来得清爽。
# (二)计算机基础内容有哪些?
计算机核心基础内容可以总结为 6 个部分:
1、操作系统(Linux)
2、计算机组成原理/系统结构
3、计算机网络
4、数据结构
5、算法
6、编程语言(推荐 C++/Java)
下面来详细介绍下每个部分需要重点学习的内容:
1、操作系统(Linux)
2、计算机组成原理/系统结构
(1)计算机基本结构。
冯·诺伊曼结构,计算机执行指令的过程。
(2)指令系统体系结构。
(3)算数逻辑单元。
逻辑运算,二进制加减法运算,ALU 的实现
(4)乘法器和除法器。
(5)单周期处理器。
(6)流水线处理器。
(7)存储层次结构。高速缓存,主存。
(8)中断和异常。
中断与异常的异同,中断处理的过程。
(9)输入和输出设备。
基本的输入输出控制方式,常用的输入输出设备类型。
3、计算机网络
网络的分层、TCP 拥塞控制等等。
常见面试题有下面这些:
OSI 七层协议和 TCP/IP 的四层模型
TCP 三次握手和四次挥手
sync flood 攻击是什么以及应对方案
TCP 的可靠性保证
TCP 和 UDP 的区别
TCP 的流量控制机制
HTTP 的几种请求方法
浏览器中输入一个 url 后总共发生了哪些事情
4、数据结构
典型的数据结构:数组、队列、栈、堆、树、哈希表、并查集、字典树,原理要知晓和理解。
并且队列、堆、栈、树这种典型数据结构能手写代码自己实现。
5、算法
排序:冒泡、插入、快排、归并、插排
分治
动态规划
搜索
回溯
这几个典型的算法一定要能熟练掌握原理并能运用,举一反三,解决实际的问题。
7、数据库
数据模型
数据库系统的结构
关系数据结构以及关系的完整性
关系代数
SQL
数据查询(单表查询、连接查询、嵌套查询)
触发器
# (三)如何进行基础内容的学习
推荐视频课程+书籍结合的方式,千万不要抱着大块头的书从头啃到尾。
看视频课程会比纯看书更生动,更容易理解。
课程平台推荐:
- 中国大学 MOCC
- 网易公开课
入门课程推荐
(1)数据结构&算法
浙江大学-《数据结构》,课程评价非常不错。
https://www.icourse163.org/course/zju-93001
配套书籍-入门推荐
《大话数据结构》
《啊哈!算法》
这两本书均是以幽默风趣的风格来讲述数据结构和算法,相对而言不会很枯燥,适合入门。
建议通过可视化的方式学习算法和数据结构,能很容易看出其基本原理、各种操作是怎么实现的。
数据结构和算法可视化学习网站这里强烈推荐:
visualgo:https://visualgo.net/zh
Data Structure Visualizations:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
(2)操作系统
推荐哈工大-《操作系统》
https://www.icourse163.org/course/HIT-1002531008
堪称操作系统课程的神作!!!李治军老师把操作系统讲的每个故事都浅显易懂,真正的深入浅出。
课程包含了进程设计与实现、虚存设计与实现、外设驱动与实现在内的 12 个配套实验,通过丰富的实践环节,使学生真正掌握设计、实现和分析完整操作系统的能力。
实验课资料
https://github.com/hoverwinter/HIT-OSLab
另外,学习操作系统一定会学 Linux,Linux 入门推荐鸟哥的私房菜-基础学习篇:
(3)计算机组成原理
华中科技大学-《计算机组成原理》:
https://www.icourse163.org/course/HUST-1003159001
我母校的课程必须上榜了!!!这真的是理论讲得最深入浅出,实践课也让人手痒的优秀课程。
被评为国家精品资源共享课和国家一流线上课程,是计算机专业系统能力培养核心课程。
(4)计算机网络
哈工大-《计算机网络》
https://www.icourse163.org/course/HIT-154005
本课程分为三个单元:“计算机网络之网尽其用”、“计算机网络之探赜索隐”和“计算机网络之危机四伏”。分别介绍了计算机网络基础、计算机网络内部原理以及网络安全威胁相关知识。
(5)数据库
人大-王珊教授《数据库》
https://www.icourse163.org/course/RUC-488001
王珊教授是国家十二五本科规划教材《数据库系统概论》的作者,本课程也是国家精品课程。
# 方向选择以及进阶学习
怎么选?选什么?
计算机专业毕业后可以从事的方向很多,对于在校学生来讲可能非常迷茫。那么怎么确定自己以后的方向呢?可以按照这个思路:
观察行业需求
待遇情况
结合自己的个人兴趣
要从事对应岗位需要满足什么要求,需要做哪些准备
1、收集信息
收集信息有几种方式:
(1)和学长学姐交流,这是最直接最有效的方式。
对于已经工作的学长学姐,经历了校园招聘以及职场的体验,亲身经历后感受会更深,视野也会更开阔。多和他们沟通,了解常见的方向有哪些,各有什么利弊,可以提前做哪些准备?
(2)提前关注以下这些网站:
招聘网站:BOSS 直聘、拉勾,观察各个公司的招聘岗位和要求以及大致待遇;
高效 BBS:观察各个公司的招聘启事,以及学长学姐的讨论和经验总结;
2、了解对应行业的要求以及发展前景
主流的方向有如下几种:
最近几年比较火热的互联网公司:
对应行业的要求是什么呢?
以阿里巴巴集团 Java 工程师为例:
确定自己的目标,找到对应技术栈的学习路径,然后学起来吧。
# 实战练兵
对于计算机专业来讲,实践是非常非常重要的。
那么有哪些实战的方式呢?
1、参加比赛
有含金量的比赛大概有如下几个:
经典算法比赛:ACM-ICPC 全球竞赛、topcoder
数据挖掘/AI 比赛:Kaggle 比赛、天池比赛、KDD-CUP、腾讯广告算法大赛
中间件-阿里巴巴中间件性能挑战赛
2、实习
实习是非常好的实践方式,一方面可以提前了解和感受互联网公司的环境、氛围,另一方面向各路大牛学习,获取一手的经验,还可以参与实际的项目。
3、github 开源项目
如果没有实习,也可以通过参与实验室项目或者 github 上的开源项目。github 上开源社区有完善的文档、协作机制,可以和很多人一起交流,开阔视野。
推荐的值得参与的 github 开源项目:
https://github.com/macrozheng/mall
https://github.com/qiurunze123/miaosha
4、刷题
主要是锻炼数据结构和算法能力、提高思维能力。
推荐用 LeetCode 或牛客。
leetcode 题解:
https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md
https://github.com/azl397985856/leetcodehttps://leetcode-solution-leetcode-pp.gitbook.io/leetcode-solution/
https://github.com/youngyangyang04/leetcode-master
5、顶尖公开课的 project
通常都非常有深度,有一步一步实现一个麻雀虽小五脏俱全能 run 起来的系统,如数据库或操作系统,或者一个 tcp 协议栈。
# 其他 tips
(1)自学能力的培养。
现在已经是互联网时代了,我们能从网络上很方便的获取大量、免费的资料,如公开课、电子书、github 上的开源代码。我们需要有从大量信息中筛选有价值信息的能力,人的精力是有限的,我们不可能面面俱到,学习一定要学经典资料。二是提升自己的自学能力,掌握学习新知识的方法论。
(2)养成写博客的习惯。
写博客对我们好处很多:
如果能讲出来让别人懂,那说明自己是真的懂了。勤总结可以不断加深我们对知识的理解;
博客也是自己的一个标签,能够让自己在以后的面试中获得加分;
(3)多和高年级的师兄师姐沟通
可以少走很多弯路。
注:本文来自https://github.com/summerjava/awosome-cs。