计算机专业大学四年应该怎么过才有意义?

写在前面

本文章已在知乎获得9104收藏+1845喜欢+1557点赞,并被知乎官方收录,是知乎热门内容。

全文共计1万+字,预计阅读15分钟。

华科&阿里学长的血泪建议!

一句话总结:打牢基础,自学成才

大学最重要事情就是要打好地基,地基打得越牢固,那以后的职业生涯的成就就越高。

但这个地基别指望学校的课程能帮你打好,要充分调动主观能动性,自学才是王道

昨天刚写完一个回答,是在说高校的计算机教育问题,有个评论挺好玩的:

图片

长文预警:本回答非常的长长长长长,因为作为一个过来人真的希望各位学弟学妹们能够少走弯路,毕竟人生没几个4年可以重来。

如果一次性看不完,建议可以先点赞&再看&收藏,防止迷路~

Part 1:重视计算机基础!

打牢基础!打牢基础!重要的事情说三遍!

基础非常重要,不管你以后从事什么方向,应用开发也好,大数据开发也要,客户端工程师也好,要想吃得开必须依赖这些基础课程:操作系统、组成原理、计算机网络、数据结构、算法、数据库

几乎各个大厂面试前2轮面试都会重点关注基础,如果基础不扎实,那么就很难进入后面的面试,把大学一半的精力花在打基础上都是值得的。

图片

计算机专业的大学生和其他专业通过几个月转行出来的程序员有一个很大的区别就是基础知识差距很大。而这些基础知识的重要性体现在多个方面:

第一个,面试,大厂面试基本都要考基础知识,比如算法。
第二个,更高纬度去发现问题,更能发现问题的本质,更好的解决问题,学习技术也能站在很好的纬度,学习到本质。
第三个,要想接触更高领域的技术,基础知识是一把利剑。

图片

推荐视频课程+书籍结合的方式,千万不要抱着大块头的书从头啃到尾。

看视频课程会比纯看书更生动,更容易理解。

另外这里强烈推荐网上的经典公开课,这些公开课久经考验,有深度,评价非常高。并附有详细的lecture和代码案例。可能一开始会觉得比较难,尤其是国外大学课程,英文讲解,而且通常比国内学校讲的有深度,但是只要坚持,收获还是非常不一样的。

基础课程推荐的视频课程和书籍有:

1、操作系统

①MIT6.268

课程官网:pdos.csail.mit.edu/6.82

网友的一些homework实现:github.com/SmallPond/MI

MIT6.828 是一门公认的硬核课程,一直以来都有很高的知名度,也广受好评,是理论与实践相结合的经典

建议是在上过学校的OS课,或者阅读过操作系统导论类再来学习这门课。最好在开始之前熟悉C和汇编,也对计算机组成有一定了解。

然后只要你跟着项目一步一步走,做完 6 个实验,就能实现一个简单的操作系统内核。

lab是这门课的重点:

Lab1: C, Assembly, Tools, and Bootstrapping. 熟悉课程使用的工具qemu,C语言,以及汇编。讲解了bootstrapping:从计算机从通电,到开始运行操作系统,这个过程中发生了什么。

Lab2: Memory management. 实现虚拟内存,分页机制。

Lab3: User-level Environments. 实现进程管理,中断机制(interrupt),系统调用(system call),缺页处理(page fault handling)等。

Lab4: Preemptive Multitasking. 实现多CPU的支持,Round-Robin进程调度,Copy-on-Write机制,抢占式多任务(preemptive multitasking), 进程间通信(IPC)。

Lab5: File system, spawn, and sh. 实现文件系统,完善sh。

Lab6: Networking. 实现网络功能。

②国内哈工大的操作系统实验课

课程地址在这里:github.com/hoverwinter/

2、计算机网络

推荐standford课程cs144结合书籍《计算机网络:自顶向下方法》

课程链接:

scs.stanford.edu/10au-c

cs144.github.io/

书籍选择《计算机网络:自顶向下方法》,豆瓣评分9.3分

图片

这位知乎大佬 @胡津铭有一个专栏讲如何自己实现一个TCP,强烈推荐: zhuanlan.zhihu.com/p/17

如果想找一本简单的入门书籍,推荐《图解TCP/IP》。

实战的话推荐《Wireshark网络分析就这么简单》,可以亲手尝试抓包分析数据报文的信息。

3、数据库

① standford CS145/CS245/CS346逐步递进的学习

课程链接:

CS145:Introduction to Databases Course Information cs145-fa20.github.io/ infolab.stanford.edu/~j

CS245:Principles of Data-Intensive Systems web.stanford.edu/class/

CS346:Database System Implementation web.stanford.edu/class/

②伯克利的数据库导论

www2.eecs.berkeley.edu/

③CMU的数据库系统

数据库系统设计域实现,涵盖数据模型、存储模型、查询语言、存储架构、事务处理、恢复、并发架构等等,并结合开源和商业数据库给出案例讲解。

15445.courses.cs.cmu.edu

④书籍推荐《数据库系统概念》

图片

4、数据结构与算法设计

①MIT 6.006 Introduction to Algorithms

MIT 6.006 是经典的数据结构和算法入门课程,涉及到排序、哈希、图论、动态规划。Lecture非常翔实,伪代码可读性强,在辅以专门的practice,用py实现的。

图片

课程链接:ocw.mit.edu/courses/ele

②书籍推荐《算法》,豆瓣评分9.4分。

内容全,源码示例多。

比如普林斯顿大学教材使用的就是这本书,然后有配套的教程网站,上面有很多文档和demo:algs4.cs.princeton.edu/

图片

视频:youtube.com/watch?

建议通过可视化的方式学习算法和数据结构,能很容易看出其基本原理、各种操作是怎么实现的。

数据结构和算法可视化学习网站这里强烈推荐:

visualgo:visualgo.net/zh

Data Structure Visualizations:cs.usfca.edu/~galles/vi

5、计算机组成原理

国外大学是怎么学习计算机组成原理的- zhihu.com/question/3883 cs.cmu.edu/~213/ web.stanford.edu/class/

关于公开课,更多的可以参考这个github项目,维护了众多推荐的公开课程资源:(star 14K) github.com/ForrestKnigh

老外OSSU组织总结的自学计算机学习路径,star 92K:https://github.com/ossu/compute

Part 2:自学能力非常重要

为什么我一定要强调自学,核心在于2点:

1、学校教不会你什么,编程技术基本靠自学

不管是科班还是非科班,如果你认为学完学校的课程就能找到一份好工作,那你想的真的太简单了,等待你的可能是“毕业就失业”,不是我吓唬你,目前国内高校计算机教育普遍存在以下问题:

①教材质量差:基本都是学校自己编的,质量不敢恭维,这里强烈推荐一定要读经典书籍,不要在这些渣渣教材上浪费时间。

②课程质量差,照本宣科:大量使用PPT而极少数会有粉笔板书,而且课程知识停留在十年前,和业界前沿技术脱轨严重。

③实践太少或者深度不够:国内课程首先是对实践不够重视,实践在最终课程考核分数中的占比非常低;其次就是核方式存在很大的问题,很多居然以word文档的方式来提交C语言实验报告。

研究生复试会考查编程能力,也就是上机题。这就要求比较强的编程能力,而且不是靠突击就可以提升的。需要提前准备,积累。

④思维陈旧,工具链落后:现在课堂上IDE还大量使用VC6.0,而在实际生产环境中要用到的一些工具,学校根本就不教。

2、工作后为了保持技术敏感度,更需要保持学习

这个行业发展太快,技术淘汰的速度也很快,3 年不学新东西就可能落伍了,工作之后发现自学能力更加重要了。

但是这里你一定要警惕自学陷进,而要掌握学习新知识的方法论,个人总结主要为以下几点:

知道自己在学什么,明确自己的学习目标;

建立自己的知识网络,比较简单的方法就是善用思维导图,把知识网络串起来;

③从大量信息中筛选有价值信息的能力,人的精力是有限的,我们不可能面面俱到,学习一定要学经典资料;

实践推动学习

Part 3:以终为始,目标导向

既然学校教不了我们什么,那么应该如何自学呢?以终为始

1、提前确定自己的目标岗位

比如说你的目标是毕业后找到一份互联网大厂Java后端的工作,你就去看大厂的招聘要求,看自己需要学什么,给自己规划路径

图片

互联网技术岗位方向一般包括但不限于以下几类:

开发类:前端,后端,客户端,基础架构,网络安全,搜索引擎,DBA,全栈等
运维类:网络,运维等
测试类:测试,测试开发
技术研究类:机器学习,大数据/数据分析/数据挖掘,自然语言处理,模式识别,人工智能等

确定自己的目标,找到对应技术栈的学习路径,然后学起来吧。

2、至少精通一门编程语言

应该了解并熟悉8门语言:C、C++、Java、Html、Css、javaScript、Shell、SQL,并且至少要精通一门以上语言。而且C语言是基础!

专业落实到工作应用层面,往往是一门实际应用如移动端(Android/iOS),后端,Web,算法,大数据,AI等等,根据自己的求职方向选择性学习

按照现在的市场来讲,Java是现在工业上运用比较多的语言,也是最好找工作的语言之一。其次是C++、Python等。就目前的形式来看,iOS和安卓等移动端开发是比较不好找工作的,但如果你确实很感兴趣,成为了这方面的大佬,那么前景也还是不错的。

列举下目前主流语言的应用场景楼主可以参考下,方便做选择:

  • java:电商、金融等后端开发,使用非常广泛(大厂代表如阿里巴巴
  • go:代表大厂字节跳动
  • C++:游戏开发、基础软件、高性能交易平台等等(腾讯使用的多)
  • swift:ios应用程序
  • perl:脚本处理
  • C:现在用的比较多的是嵌入式场景(物联网IOT)

3、多读经典书籍

少看博客,多读书。

博客只能帮你找到学习思路,真正的知识储备建立在你阅读了多少经典书籍的基础之上

相比于电子书,我本人更喜欢纸质的,一是尊重作者劳动成果,拒绝白嫖;二是阅读体验我自己觉得更好。

网上也有很多电子书,但是希望的大家不要放在网盘里落灰。有条件可以买书回来自己看,动力更足。

研究生读的一些书,老照片了,像素太低多包涵:

图片

工作之后看的一些书,只是其中一部分:

图片

学习语言的话,首先多看专业书籍,另外就是多实战,熟能生巧。

4、善用工具,学会搜索

经常逛一些比较不错的工具网站,比如google、Stack Overflow、coursera、github、知乎等。

多关注一些你的领域的一些大牛在干嘛,多关注一些优质原创博主的博客,比如说你如果觉得我的文章写得还不错,可以关注一下我。

多关注业界前沿技术和动向趋势,了解最新技术解决了什么新问题,是否能够给自己的工作带来帮助。这里推荐几个优秀的前沿信息来源

  • infoq
  • 《美团技术博客》
  • 公众号-阿里技术
  • 公众号-高可用技术
  • 业界有名的会议:archsummit 架构师大会、flink forward

5、使用 Google 搜索而不是百度

图片

Part 4:大学四年应该如何规划?

1、关于专业课学习的规划路径

关于大学四年的专业课学习规划,这是一个需要很长篇幅才能讲清楚的话题,后面我会专门出一篇文章来写。

可以关注一下我的账号,蹲一波更新。

2、多实战!多实战!

Talk is cheap, show me the code;

对于计算机专业来讲,实践是非常非常重要的。

那么有哪些实战的方式呢?

图片

①参加比赛

有含金量的比赛大概有如下几个:

  • 经典算法比赛:ACM-ICPC全球竞赛、topcoder
  • 数据挖掘/AI比赛:Kaggle比赛、天池比赛、KDD-CUP、腾讯广告算法大赛
  • 中间件-阿里巴巴中间件性能挑战赛

实习

实习是非常好的实践方式,一方面可以提前了解和感受互联网公司的环境、氛围,另一方面向各路大牛学习,获取一手的经验,还可以参与实际的项目。

③github开源项目

如果没有实习,也可以通过参与实验室项目或者github上的开源项目。github上开源社区有完善的文档、协作机制,可以和很多人一起交流,开阔视野。

刷题

主要是锻炼数据结构和算法能力、提高思维能力。推荐用LeetCode或牛客。

顶尖公开课的project

通常都非常有深度,有一步一步实现一个麻雀虽小五脏俱全能run起来的系统,如数据库或操作系统,或者一个tcp协议栈。

3、数学和英语一定要学好

作为一个计算机类科班学生,还会学习高等数学、线性代数、概率论与统计、复变函数、离散数学、图论、数据结构等等众多的数学课。这些数学课会比较枯燥无味,且难度较大,但是数学基础对计算机类学生来说是比较重要的,尤其是一些决定走科研道路的同学,数学基础会非常非常重要,有时候数学能力会决定你到底能够走多远

英语就更不用说了,学计算机,英语不行,那基本是废了,毕竟还有很多外文资料等着你去看呢。

比如我上面推荐的哪些国外精品课程,其实都对英语功底有要求。

而且还有一些技术书籍,其实翻译很烂的,看原版才得劲。

图片

程序员要有阅读外文的能力

4、哪些证书可以给简历锦上添花?

什么计算机一级二级之类的,真没用,真正有用的是下面这些:

①计算机专业类

经典算法比赛:ACM-ICPC全球竞赛、topcoder
数据挖掘/AI比赛:Kaggle比赛、天池比赛、KDD-CUP、腾讯广告算法大赛
中间件-阿里巴巴中间件性能挑战赛
ICPC国际大学生程序设计竞赛(ACM)
“挑战杯"全国大学生课外学术科技作品竞赛
“创青春”全国大学生创业计划大赛
“互联网+”中国大学生创新创业大赛
中国大学生计算机设计大赛
“英特尔杯”全国大学生软件创新大赛
全国大学生信息安全竞赛
“蓝桥杯”全国软件和信息技术专业人才大赛
高校微信小程序开发大赛

②数学类

全国大学生数学建模竞赛
国际大学生数学建模竞赛(美赛)
全国大学生数学竞赛

③英语类

“外研社杯”全国大学生英语辩论赛
全国大学生英语演讲比赛 全国大学生英语竞赛

5、养成写博客的习惯

写博客对我们好处很多:

  • 如果能讲出来让别人懂,那说明自己是真的懂了。勤总结可以不断加深我们对知识的理解;
  • 博客也是自己的一个标签,能够让自己在以后的面试中获得加分;

我在校招的时候就因为博客加分不少。我的技术博客原创博文已经很多了,虽然没有太多高深的东西,都是一些基础知识,但是大多是自己加以总结了的。大多数面试官都打开我的博客看了,评价还不错。

上学的时候主要在CSDN分享,那时候我就已经算是个大V啦,多年没维护,粉丝掉到了4000个。

图片

还有粉丝催更的,现在主要在知乎(ID:夏天)做些分享。

图片

Part 5:很重要的校招!!!

我发现依旧有非常多的同学没有意识到校招的重要性!!!大多数人一生只有一次校招机会,必须足够重视。

先给大家科普一下校招:

春招:

时间:大三期间的3-5月
性质:实习生招聘,实习结束有转正答辩,获得正式Offer。
建议大家能实习的优先实习,一般来讲实习转正的概率很大,二是提前熟悉工作内容和环境,相比未实习的是一个优势(涉及后面的晋升等等)。

秋招:

时间:大三期间的9-11月,秋招提前批在7月就开始了
性质:获得正式Offer的重要途径

补招:

时间:大四期间的3-4月
性质:最后一次获得正式Offer的途径,不过一般名额比较少,不要抱太大期望

招聘对象:一般来讲,22届秋招面对的是即将在22年毕业的同学,也就是今年九月份开学就要大四和研三的同学。当然每家公司对于秋招毕业时间的界定略有不同,以阿里为例,今年秋招的毕业时间要求:2021.11.01-2022.10.31

秋招是校园招聘公司最多、岗位最全,也是最重要的校园招聘,特别是【提前批】。

春招相当于是秋招的补录,还有很多考公考研失败的人还有留学生会加入进来,竞争会更加的激烈,所以我们一定要重视秋招。

总结一下:

需求:春季补招 < 春季实习 < 秋招
难度:春季补招 > 秋招 > 春季实习

最后,祝点赞的你都能拿到理想的offer!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>