作者 | 江枫渔火
责编 | 胡巍巍 
还记得去年那个被谷歌招走的年薪千万的印度小哥吗?作为普通人的我们,除了仰望,我们从他的履历中总是可以看到些什么。
2018年4月:在2018 ACM国际大学生程序设计竞赛杀入总决赛;
2017年5月:在2017 ACM国际大学生程序设计竞赛杀入总决赛。
没错,这位来自印度孟买的名叫Aditya Paliwal的印度小哥在去谷歌正式工作之前是个算法竞赛选手。反观国内,华为、腾讯、阿里巴巴、字节跳动、百度是如何组织校招以及发掘优秀软件工程师的呢?
放在全国范围内看,字节跳动会举办ACM-ICPC冬令营;百度每年都有百度之星程序设计大赛;阿里巴巴赞助了2010年的ACM-ICPC亚洲区域赛,获得金牌的选手可以享受绿色通道,进入阿里巴巴实习或参加工作;
华为赞助了2012年的ACM-ICPC亚洲区域赛。放在地方上看,有些省份是有ACM省赛的,而金主就是地方上的互联网产业巨头,比如山东省,从第二届省赛开始,就由浪潮集团充当金主,每年的金牌选手都会获得浪潮集团的实习offer。
这些公司倾向于通过这些竞赛来选拔人才,虽然在竞赛中拔得头筹的选手都不屑于进入这些公司。
大厂为什么特别看重算法和算法竞赛选手呢?
用我们ACM集训队的老师的话说,因为打算法竞赛的人都普遍具备3个优秀的品质,一是智商高,二是坐得住,三是学习能力强。
第一点对于普通人来说是遥不可及的,但不是决定因素;
第二点,刷题时真的要静下心来,做好听取WA声一片的准备(WA为Wrong Answer的简写,即没有通过全部的测试样例),WA了就要静下心来一行一行地看代码,找出Bug出在什么地方,学习的过程中也必须静下心来,因为很多算法不是扫一眼就能掌握的,既要了解原理又要熟练运用。
第三点,我不了解别的学校的情况,就说一说再普通不过的我们学校,ACM集训队,根本没有老师教,有的只是自己啃书刷题和问周围的小伙伴,也就是纯自学,课上学的算法与数据结构根本就不叫算法,只是照顾大多数同学不让他们挂科而已。学习能力强了,各种算法都能融会贯通了,还会愁学不会编程语言、框架和操作系统那些东西吗?
今年我们学校(非985非211非双一流)4名应届毕业的学长拿到了腾讯的offer,他们大都是我们学校ACM校集训队的,也就是说,他们也都是前算法竞赛选手。隔壁学校,也是非211非985非双一流,前几天传来喜报,有位学长拿到了阿里的offer,据他透露,在阿里巴巴ACM选手会被优先面试。
如果你现在还在学校,而自己的学校又不是太好,备战、参加算法竞赛不失为拿到大厂offer的一条捷径。
虽然说备战、参加算法竞赛应该从大一就开始,才有机会能够进入校队、代表学校参赛等,但是对于程序猿来说,学习算法,什么时候都不晚。
身边的有些同学给我一种东一榔头西一棒槌的感觉,今天入门机器学习,明天入门深度学习,后天又开始了SpringBoot框架,编程语言“学”了一大堆,到头来却什么都不精,这些时间还不如用来刷一刷算法题动一动脑筋,为以后的工作开拓思路呢。
还有一些同学,在我看来,他的成长虽然比样样都学样样都不精的同学要好很多,但我认为他的顺序搞反了。这些同学精通一门语言熟悉一种框架就开始做项目,既锻炼了自己的项目能力,又给自己带来收益从而缓解了生活费用上的紧张。
我认为,在学校里不宜做过多的项目而忽视算法的修习,因为在以后的工作中有的是时间做项目,把自己早晚都要做的事提前做可能会让你真正工作的时候没有了那一腔热血,保持一份对于做项目的激情也是十分必要的。
在学校里就应该先把基础打好,把算法修习好。特别是在当今互联网寒冬的背景下,会点Java就有工作时代已经过去了,互联网行业已经不再野蛮生长了,不要等一出校门才发现大厂招人不会管你会多少种语言、会用多少种框架、熟悉多少操作系统,他们考察你的能力和水平的标杆就是算法,大厂的一面基本就是算法面,一面都过不了后面就别想了。将算法比喻为敲门砖一点也不为过。
如果你现在已经工作了,熟悉了自己的业务流程,修习算法也是很有必要的,因为社招与校招的区别仅仅是要求上加了项目经验。
有人说今天的互联网寒冬跟跨世纪的那个时候很像,前期井喷式发展的时候,是个会点C语言的人就会有公司抢着要,而寒冬来临的时候首当其冲被淘汰的也是这部分人。
李开复老师曾在文章《算法的力量》中这样谈到算法的重要性:计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。这些基础课程类似武功中的“内功”,而新的语言、技术、标准则为“外功”。
整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。所以,要想保证不被行业淘汰,就修习算法吧,至少可以让你在当前行业寒冬背景下具备跳槽的能力。除了ACM对于参赛选手的要求是本科生之外,其他的竞赛都是对社会开放的。所以工作和修习算法之余,还可以参加比赛玩一玩。
算法不是玄学,也不是遥不可及的。本人比较反感有些算法书记故作高深,写了一大堆数学符号,最后却在描述一个简单的问题。
还有一些算法书籍已经超越了普通程序猿的能力范围,比如介绍P到底等不等于NP这种世界性难题、神谕图灵机这种玄学问题的书。
本文所说的修习算法,也不是修习机器学习、深度学习等涉及大量理论数学问题的算法,因为一般的程序猿也接触不到这些算法,本文所说的算法无非包括几大模块,比如动态规划、贪心、最短路、二分搜索、网络流、图论等,还有一些体现思维的“自创算法”,学习这些算法高中毕业就足够了,很少会用到大学里学的数学。
算法不是闭门造车,对于某个问题,不是自己写了一套代码,自己随便输入一个样例得到自己想要的结果就算成功了,而是要解答该问题的全部实例,有些时候还需要考虑特殊情况。算法的提升不能全靠自己想,而要借助前人的经验,多看书、看大牛的博客。
修习算法,并不仅仅是为了参加竞赛拿到奖牌、奖金和offer,其对于项目开发的影响也是潜移默化的。
以我个人的经历讲,我在技术上的成长是走了很多弯路的,我原本的专业不是计算机,是通过转专业考试转到计算机的,刚转过来的时候我们就进行了一次实训,那次实训是用C语言做一个具有图形用户界面的商品交易系统,因为刚转过来技术水平有限,最后这个项目没有完成。我很苦恼,于是后来自学C的图形界面编程,也完成了自己比较满意的一个小项目。后来我就又开始探索新的项目。
我想给新的项目实现某某功能,却发现不是一般的吃力,自己用脑子想半天写出来的也全是Bug,于是先将这个项目搁置。再后来,我又加入了ACM集训队,练了一段时间的算法,再回来看自己原先的项目的时候,想实现什么实现起来得心应手,丝毫没有大脑被掏空那种感觉。
再后来也是,各种东西学起来很快,各种功能实现起来也很快。觉得某样东西简单,无非被更难的东西虐的多了罢了。
最后给大家推荐几个刷题网站:
牛客网:有题库,会定期举办竞赛,适用于程序员、本科ACM选手和高中信息学奥林匹克竞赛选手;
https://ac.nowcoder.com/acm/contest/vip-index?&headNav=www
LeetCode:有题库,每周都会举办周赛,被称为offer收割机,里面收录的题目大都在真实的面试中出现过;
https://leetcode-cn.com/
VirtualJudge:集成了各大高校的OJ和各种在线评测系统,一个网站就可以刷到各种网站的题目,主要是本科ACM选手在用。
https://vjudge.net/
PTA:浙江大学的评测系统,很多高校用它给学生布置作业,里面也有PAT(浙江大学计算机程序设计能力考试)的题库,可以刷题。如果参加PAT甲级考到了一定的分数,会有企业向你抛出橄榄枝,PAT甲级的分数也可以用作浙江大学计算机类专业考研机试的成绩。
https://pintia.cn
坚持LeetCode每天1-3道题,3个月后定会有显著收获,加油!
作者:江枫渔火,大学计算机专业在校生,本科在读,学生开发者。
为码一代,想教码二代却无从下手:
听说少儿编程很火,可它有哪些好处呢?
孩子多大开始学习比较好呢?又该如何学习呢?
最新的编程教育政策又有哪些呢?
下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)
戳他了解更多↓↓↓
 热 文 推 荐 
点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。
你点的每个“在看”,我都认真当成了喜欢
继续阅读
阅读原文