作者 | 梁唐
大家好,我是梁唐。
这两天在知乎里看到了一个热门问题,叫做:“程序员需要达到什么水平才能顺利拿到 20k 无压力?”
这个问题足足有六千多人关注,可见谈及薪水,大家都比较重视。但很遗憾的是,我大概翻了一下,排在前面的高赞回答不是关注公众号送书的广告,就是推销课程的,要么就是罗列了一堆一辈子也看不完的资料的。
看着大家都没说到点上,倒还好,真正让我比较遗憾的还是看到知乎变成这样。感觉有了一点吃枣药丸的征兆……
好了,闲话不多说了,下面进入正题,和大家聊聊到底如何才能拿到20K的offer呢?
怎么样做一定不行
在阐述我们究竟应该怎么做之前,我想先来说说怎么做一定不行,帮助大家排排坑。
无脑刷题不可取
首先,指望疯狂刷题拿到20K的offer,几乎不可行。
我自己就是刷题出身,甚至还刷到了ACM-ICPC的亚洲区银牌,即使如此,当年毕业的时候也差点翻车,腾讯的实习生招聘更是连简历关都没有过。虽然我个人对此很不爽,但也不是不能理解。有些公司看重思维和编码能力,自然也会有些公司更看重项目经验和能力。
最后虽然找到了还算不错的工作,但离20K还是差得不少。一直到两年之后,也就是进入了阿里的第二年,才勉强达到。
所以指望刷几道LeetCode,看几个堆栈这样数据结构就可以找到好工作的少年们不妨洗洗睡吧。专业的acmer的做题量至少在2000题以上,全国每年能拿区域赛银牌的不超过300人。几乎99%的都是名校,不是学术圈里的名校,就是acm圈里名校(如东软、杭电)。而且这些选手几乎清一色大一开始刷题苦练寒暑不辍的那种,甚至很大一部分高中就是信息竞赛选手。
普通程序员说得上来的刷题网站可能就只有LeetCode,然而LeetCode的Hard放在acm赛场上往往连签到题都比不上。指望参加两门公开课,再刷几道LeetCode就能比肩专业选手数年的苦练,这可能吗?
想通过刷题提升一下能力,应付一下面试问题不大,但如果别无所长,就指望凭这个拿到20K的offer,几乎是痴人说梦。
无脑看书不可取
除了刷题之外,第二大流行的就是看书。
很多大V为了宣传自己的网站或公号,贴出一大把书单,吸引人关注。并不是说这些书不好,而是说想要通过看书就拿到很好的offer,也几乎不可行。
这里面比较浅显的道理是看书的学习曲线比较陡峭,本来看书就是一个比较枯燥无趣的过程。而且技术书籍的篇幅往往很大,像是著名的Java书籍Thinking in Java,动辄大几百页。想想看就知道,想要把这样的鸿篇巨制看完得需要多久,至少我是没有读完的。
蛋疼的是,不论是哪个技术领域,这样的大部头的书都必然不止一本。看一本都很费劲,要是看十本八本呢?不用我多说,大家自己应该都能想象得到。
俗话说买书如山倒,看书如抽丝,可以说是非常形象了。
第二个问题是书本上的知识不成体系,很多同学估计会很诧异,书本上不都是成体系地介绍么,怎么还会不成体系呢?
其实这里的道理说穿了很简单,成也体系,败也体系,就是太有体系了,所以不成体系。举个简单的例子,以深度学习举例。随便拿一本深度学习的书,翻开一看必然是各种模型都有,DNN、CNN、RNN。但是在实际工作当中呢?你会发现做NLP的根本用不到CNN,做CV的也用不到RNN,像我们做推荐的,搞不好RNN和CNN都用不到。
对于作者而言,这样写作当然没有问题,把深度学习的模型方方面面都介绍到了。但对于读者而言就有点问题了,我可能就只想了解某一个领域或者是某一个方面的技术,但我不知道究竟要看哪一部分,只能把整本书全部看完。这样的代价就是学习的成本非常高,但是收益很小,因为大量的投入浪费了,学到的东西很多是用不到或者是不关心的。不但事倍功半,而且容易打击学习积极性。
所以说这些大部头的书不是不好,而是不太适合当做入门读物,最好是有一定了解之后,再来读,这样可以有所选择地补充知识,系统性地提升。
20K意味着什么
第二个问题聊聊20K究竟意味着什么。
说起来现在互联网行业的薪水,一年比一年高,好像20K的offer满大街都是。但实际上20K并不算低了,在BAT中得是高级工程师,也就是阿里P6,百度T5的级别才能拿到这个价。
如果是一(钱)般(少)的小厂,职称还得升一级,得是管三四个人的小lead才能拿到这么多。
那这些职位对应需要哪些技能呢?
这个问题就很简单了,随便找个招聘网站一搜就是。这是我从拉勾网上找到的阿里算法工程师的招聘介绍。对应的薪水是25K-35K,其实就是P6到P6 、P7-的职称。
这样的介绍不能只看表面的文字,得做深入的解读。下面我就以上面的介绍为例,给大家示范一下应该如何解读。
首先前两条是一个招聘对象的画像,可以理解成理想的候选人的背景。这里也不是很苛刻,无非是专业相关,有过相关经验。从第三条开始进入正题,我们一条一条来分析。
第三条写的是语言要求,Java/Python/Go,看起来没啥问题。但是仔细分析里面的意思很深,首先Python基本上是算法必备的语言。早年还有R流派,但现在都2021年了,基本上不会Python的算法工程师已经绝种了。所以重点就是除了Python之外的内容,那么言下之意也很明显了,也就是说你最好要会Java或者Go。
Java和Go是什么?是后端开发语言,那么也就是说这个岗位可能会涉及一些简单的后端开发。那么如果你有后端经验,特别是Java或者Go的后端经验,一定是潜在的加分项。其次,Go语言比较冷门,一般不会写在算法工程师的介绍里,这里能写上,基本可以说明这个岗位的实际工作中很有可能会用到Go。
第四条的关键词有三个,机器学习、数据挖掘和推荐系统。同理,机器学习和数据挖掘都是常规内容,算法岗位必会的。但推荐系统不是,所以基本上可以判定这个岗位和推荐算法相关,那么很明显,如果你有推荐系统的相关背景一定是加分项,即使没有,那么面试的时候也一定得往这个方向准备,因为面试官很有可能是推荐算法出身。
第五条涉及的方向太多了,其实没啥指向性,倒更像是说只要你有过算法经验就OK。变相体现出来这个岗位应该很缺人。
最后一条是常规内容,可以忽略。
你看这么解读下来,这个岗位对于候选人有哪些具体的要求,我们在面试之前该如何准备是不是就很清楚了?照着一条一条往上靠是不是就可以?
高级工程师的标准
看完了鲜活的例子,我们再来说说高级工程师的标准。
其实在大厂内部对于高级工程师(P6)的要求很简单,只有一句话:基础扎实、干活给力。
干活给不给力只能入职之后才能发现,所以面试的时候基本上都是围绕前面四个字,也就是基础扎实。
很多人看到基础两个字就嗨了,去啃计算机网络、操作系统或者刷题去了。这些东西的确算是基础,但未必是你需要的基础,你的岗位需要什么样的基础能力,是由岗位的工作内容以及工作性质决定的。
比如说后端,需要学计算机网络吗?需要,需要整本书全部啃下来吗?完全没必要。
后端当然会涉及到网络通信,但重点并不在这里,还是围绕后端的开发。比如后端大部分用Java,那么关于Java的基础知识就是必考的,尤其是经常用到的一些。比如抽象类和接口的区别、泛型的使用、hashmap的原理等等。再深入一点还会问JVM内存模型,问Java常用框架(SSH、SSM),问中间件(kafka、zoo-keeper、redis等)。
为什么会问这些?因为这个岗位用得到,需要这些知识。
假如说我要去面试后端的岗位,我就光看Java、计算机网络、操作系统能行么?显然卵用没有,面试100%被问成筛子,能问一个线程和进程的区别顶天了。
说完了基础,再来说说扎实。
书本上的内容学会了,记住了,这不叫扎实。扎实一定是有自己深入的思考。
拿后端最常问的hashmap举个例子,很多人问到hashmap,只能回答上来数组 链表的结构。像是这样的答案就是书本上的,一看就没真正了解过,自然也就很不扎实。
但实际上仅仅是hashmap就可以问得非常非常深,比如hashmap里的数组长度是固定的吗?如果不是固定的如何变化?
如果能回答上来,还能继续问,为什么这样设计,这样设计的好处是什么?
如果还能回答上来,还可以结合其他领域的知识再追问,hashmap是线程安全的吗,为什么?
如果还能回答上来,再继续追问,如果我们想要在并发场景下使用hashmap该怎么办?
如果这还能回答上来,还可以再问concurrentHashMap的原理是什么,为什么可以解决并发问题?
这样一系列问题都能答上来才说明这块知识是真的吃透了、嚼烂了,掌握地扎实了。想做到这点只靠面试准备是不够的,需要在学习的时候就有探索、求知的精神,能够打破砂锅问到底,而不是想当然、浮于表面、浅尝辄止。
我之前面阿里搜索事业部的高级搜索工程师就被这样连环问过,正是凭借着这一系列问题的对答如流才征服了面试官让他破格给了我offer。像是阿里这些大公司非常看重这一点,对待知识一定要有自己的思考,要钻研,不能只停留在知识表面。
大厂当中程序员最要命的评价就是浅尝辄止,如果一旦给面试官留下这个印象,那基本上肯定就与offer无缘了。
说到面试,很多人就知道聊学历、获奖证书、论文,这些东西不是说不重要,而是很表面。真正核心竞争力和核心的价值不在这些东西上,有些像是冰山理论。
我们能看见的可能只有一个人的学历、论文这些,这些不过是冰山一角,藏在水面下的才是真正核心的东西,也是真正值得大家多多花心思和关注的东西。
以上,希望可以帮助到努力路上的少年们。