根据面试官的思考方向而学习
一个多月前,作为技术面试官参加了2016百度 校招 深圳站面试,主要目标学生是清华/北大/哈工大/中科院在本地的研究生院(实际上并没有设限,有不少江西广西福建的同学过来面试了),这里和大家分享一点自己的思考。
我们一般有3轮技术面试,一面二面通常是由资深的工程师面试,三面一般是技术经理面试。我负责的是一面和二面,面试过程中除了给全公司层面的统一招聘人才,我们还随时要准备物色合适的人加入自己的团队。面试官会根据面试过程对每个候选人的编程能力/逻辑和思考能力进行评价,只有每一轮的面试官都给予通过,才有可能被录用。
面试是一个双向考察和选择的过程,所以面试时我一直尝试把这当成和候选人的一次沟通。面试的过程有大量的问题也是根据候选人自身的特点提出的,而不是遵循了某个题库固定的题目。
整体感受是,大多数人真的很弱,你并不需要「非常努力」,就可以比大多数的人「优秀」。下面就大家关心的一些问题分开讨论下。
教育背景
很多同学咨询我时,有意无意地给自己贴上了「渣二本」「普通一本」「非211」这样的标签,这都表面其内心还是非常介意自己的教育背景不好。我想你应该庆幸自己生在互联网时代,这个时代的人和资源都暴露在互联网中,你完全有机会用互联网来证明自己的能力和曾经的努力。
我在面试时能明显感觉到,一些好学校(比如中山大学/哈工大/清华北大/厦门大学/华科武大等)的学生,在基础知识/表达/逻辑能力等都要更强一些。我想之所以有这样的表现,是因为好学校的学生受过更好思维训练,他们面对一个难题时往往知道怎么去简化和抽象问题,把问题拨出来分类或者分层讨论,同时他们还会试图把问题分解成不同的子问题逐个来讨论。我就碰到过一个大学纯玩票的中山大学的大四学生,对计算机基础知识基本上一问三不知,但是分析问题时的思路和逻辑还是清晰的,而这种能力,是很多教育背景较差的学生缺乏的。因此我也建议属于这种情况的同学,多进行一些思维训练,学会如何系统地区分解和分析一个问题。
当然,非名校中,也不乏优秀的候选人。有个江西理工的大四学生,在他的博客中我读到了大量分析技术细节的文章,还有参加mooc上机器学习课程,github中有他自己些的key-value数据库和webserver。通过讨论,我确定他是真正学习过这些知识的人。还有一个深圳大学的学生,大学时代做过很多app和校园实用小工具,他总是试图用技术去提高自己的工作和生活效率,是一个真正的极客而不是脑残果粉。
实习和项目经验
不少同学担心他们大学没有实习过,也没有做过很多的项目,所以在找工作时会是很大的劣势。 首先我不否认好的实习经验和项目经历,会是很大的加分项,但是如果你是一个学习优秀/热爱独立思考/科研达人,也可以收到同样的效益。在我看来,最重要的问题在于你要「曾经努力做好过一件事情」,否则「Why you?」
既不擅长于学习和科研也没有折腾过具体的技术,这样的人才是大多数。所以,当你能做好一件事情,就是优势。(当然,我更建议大学时代读好书,搞好科研,而不是放弃学习去折腾具体的技术)
另外很多「烂校」的学生,总认为自己学校差所以没有机会去大公司实习。实际上,你在微博/github/v2ex之类的地方,可以勾搭到大量大公司的人,只要你能吸引到他们,完全可以找到一份不错的实习。问题是你拿什么来证明自己优秀?
热爱,有激情
面试时,有不少人总是急于表达自己对技术对编程的热情和喜欢,而我却很难在这些人的人生经历中,找到一件事可以支持他们的这个说法。你既然这么喜欢计算机和编程,大学四年你干吗去了? 你确定不是因为找不到其他工作或者考不上公务员才来面试程序员的吗?互联网如此发达的今天,大学你有四年的时间去折腾,去证明你喜欢计算机,然而你没做过任何这样的事情,却说自己热爱,这反而会让人对你的看法大打折扣。
大学时代不知道如何正确地学习很正常,但是如果你真喜欢一样东西,你会做过一百种尝试。哪怕是反复地折腾安装linux系统,尝试各种不同的发行版本,也是一种证明。你可以去计算机系蹭课,可以去mooc上学习计算机的公开课,甚至你可以去考并没有什么卵用的计算机二三四级考试,也可以去交一个计算机系的男朋友女朋友。然而你「什么都没做过,凭什么说爱」
有一个候选人本科是武汉大学某个偏门工科专业的,大学时代因为喜欢编程买了树莓派写代码,还去华科修了计算机科学的第二学位,为了进一步学习他考研去了中科研研究计算机视觉,读研期间又自己用C++实现了视觉领域的大量算法来提高自己的编程能力。这样的经历是非常吸引人的!这个同学的算法和数据结构底子比较一般(或者只是没有刷过题),但是学习能力,分析问题的能力很强,我能明确感受到他面对一个自己不熟悉的算法题时,逐步分析归纳试着去解决问题的过程。这样的同学太讨人喜欢了!(他的二面面试官给出了比我更高的评价!)
说了这么多,其实我想说的就一点,每个人都要有自己的优势和核心竞争力。这个核心竞争力可以是牛校(清北复交浙南大科大等),当然,如果你只有牛校光环,并没有什么卵用,因为你竞争的对象是自己的同学,而不是大专毕业生;也可以是很强的算法设计能力,但是参加ICPC拿过大奖的同学那么多,你刷题刷的过来吗?;还可以是学习成绩好,因为成绩好的同学往往在工作中表现出很高的执行力和快速交付能力(这也是为什么很多投行和咨询公司对候选人的学校和成绩有很高的要求);爱造轮子折腾开源;实习经历(BAT,google,MS等实习过),学术强人(顶会paper); 数学好(奥赛金牌)等等。
如果你啥都没有,只能跟大多数人一样,人云亦云,刷算法题看面筋,临时抱佛脚,指望着互联网泡沫更大一点,这样bar就能更低一点,这样就谁都能进入BAT分一杯羹。
可是,在这个阿猫阿狗都能拿到年薪20万offer的泡沫时代,这样的你就没有一点焦虑?
最近这段时间,每天从知乎和QQ上会收到大量的offer求比较咨询,其中BAT 20万的offer司空见惯,30万的special也见怪不怪,40万(今日头条等给的special offer)的也常有出现,作为老人只能感叹这个互联网时代的疯狂。
我不是一个可以讲大道理的「人生赢家」或者「长者」,只是你们经历着的事情,3年前我也经历过,offer越多越烦恼,尤其是没有杀手级offer时天天都只能纠结困扰。然而回头一想,有时候真的是自己想得太多了而已。所以,今天也谈谈我对校招offer选择的一些不成熟的微小的看法,也欢迎大家把我批判一番。
选择你当前最需要的东西
我当然更欣赏勇于去追求自己的梦想的你。当有一个好的offer时,哪怕是要去帝都这样的城市,你也毅然前往。不过我也从来不认为现在的一个offer选择会成为你未来走向人生巅峰的障碍。阿里巴巴上市的时候,许多技术圈朋友感叹自己当年没有选择去淘宝,否则现在也走向财务自由了。而我觉得,即便你当初选择了淘宝,中间也有一万个理由离开。我们决定不了自己的运气。
生活和工作平衡,同时加上较高的收入,这是最理想的工作状态。平衡生活往往需要在一个你喜欢的城市里,如果你介意去北京,那么还是留在上海/广州/杭州/深圳吧,留在一个有你亲人基友同学的地方,在一个你更愿意长期发展的地方。当地域成为你当前诉求中一个重要因素时,就可以缩小你的选择空间。有个同学说他想找个浙大的女朋友,我说那肯定去网易/阿里/蘑菇街这些公司啊,可是他又纠结说他想学技术,我只能问他难道阿里的技术不够学么?
薪水当然是最重要的,没有人不喜欢钱。许多连C轮都没走到,愉快地烧着VC钱的公司,大方地给应届生开出了远高于BAT的薪水,让人很难不动心。可是当下你真的有那么需要钱吗?如果答案是肯定的,那很简单,选钱最多的一个!如果你并没有什么经济负担,一个月多5K少5K本质上没有影响到你的生活,那么,一定要跟那种花几百万请王宝强孙红雷田亮过来说一句广告词的创业公司说不!
这里顺道分享个案例:某同学收到某不靠谱创业公司开出的18K的offer,百度开出的14K的offer。表面上看来百度的钱少好多,但是实际上该创业公司的社保公积金都按最低标准缴纳,比如公积金每个月总共才两三百块,但是百度每月给你缴纳的公积金公司那份就有差不多2000,同时你的医保和养老金也会多出几千块,另外公司还给你买了商业医保,这么一算,你觉得如何呢?
做自己最擅长和有兴趣做的事情
许多游戏公司给应届生开出了远高于预期的薪水,似乎让人很难拒绝。然而游戏是一个特殊工种,游戏的天性就是要短平快赚钱,所以你永远都是在冲爆款,你永远都在做下一个游戏!同时,这种经验没法让你体验到持续的增长和积累,而这种应对高速增长的流量和业务规模,不断改进架构和基础设施的能力在大型互联网项目中又是必备的。
所以,除非你真的热爱游戏和游戏开发,否则一般不建议去游戏公司。(当然,如果你优先级更高的诉求是去广州,但是又没有其他选择比如微信,那么另当别论)
许多同学有「后台开发工程师」的offer,又有「Data Scientist」这么高大上title的offer。还有些有「前端开发」或「运维」offer的同学话语间却透露出一点对相应领域鄙视的神情,和那些认为「汇编」和「底层」就是更牛逼的人是一样一样的。
「算法」「机器学习」这些听上去更高大上,我也有不少这类offer,但是我依然选择做「基础架构」这个方向,而不是「算法」,因为我的热情和兴趣都在这上面,我相信这样可以做得更好。等我做得足够好的时候,我才可能会去做一些新鲜的尝试。
我一直觉得只要保持开放和持续学习的心态,做哪个领域都不会有问题,塔尖的人永远是稀缺的。实践中,想要招一个优秀的「前端」和「运维」,是非常难得事情,因为真的很缺。所以如果你擅长前端或运维相关的技术,又有足够的兴趣,请不要头脑发热去搞「大数据」和「机器学习」。
哪个技术/编程语言有前途?
还有些同学说我对后台编程有兴趣的,只是我不知道学哪个好,接下来他又会问现在C++还有市场吗?PHP和Python到底哪一个好? 是不是以后的趋势是Go?Java的薪水是不是没有C++高? 就这么一纠结,半年就过去了,再那么一纠结,转眼就要毕业找工作了他们还是没想明白这个问题。对于这个问题,举个例子说明我的观点:微软的工程师一直是国内外互联网公司抢夺的重要人才资源池,但是实际工作中大多数微软FTE工作都使用C#在windows平台编程,而且很多都是在从事传统的软件开发,那么,为什么会这么抢手?
我身边优秀的工程师们,都是有自己擅长且无法被轻易替代的技术,同时又保持着对新技术探索的热情。我自己主要编程语言是C++,但是对Python和Go的熟悉程度也可以轻易地开始独立做一个项目,对openstack和docker等等也都有研究过。我也尝试过用PHP和Python写过网页小游戏的后台,我试着用这些开发一些工具来便捷自己的生活。当然,我并不是说我优秀,我只是说我真的喜欢技术,愿意去探索,并有信心未来不轻易地被淘汰。
当然,软件工程师的核心价值应该是实现想法和解决问题,而不是编码员。
一定要去BAT吗?
很多人形容大牛都是「BAT X年工作经验」这样的论调,给人一种似乎只要去BAT熬上多少年就可以变成大牛一样。
我的看法一直是「BAT有很多大牛,但是大牛并不是因为去了BAT而成为的大牛」,这跟好的教育背景是一样的,我们不应该把「锦上添花」当成了「点石成金」。
我不止一次探究过身边高T的大牛或其它公司资深工程师的经历,发现这些人有个共同的特点,就是都是伴随着优秀的项目/团队一起成长起来的。有一个高速增长的业务挑战,不断地出现难题,不断地从坑里面走过来,这样的经验,才是最有价值的!如果你有一个机会去一个业务快速增长并尊重工程师的创业公司,绝对是比去BAT做螺丝钉更好的机会!(比如近年的美团、小米、滴滴打车、宜信大数据中心、今日头条等)
大公司很多部门通常有一个毛病,就是业务过于成熟,所以一切都追求稳定,即便是急需要改进的东西,也没有人敢去碰坑。你极有可能就是在这样的环境中,你是一颗勤劳的螺丝钉,随时可以拔掉或者替换。而你根本不用幻想,基于现有的资源,给你机会去创造并擦出新的火花。
当然,一切归根结底最重要的因素还是看人。
通常,心态开放并积极学习的人,运气都不会太坏。
当我说到上述观点时,经常有人问我为什么不去创业公司。其实主要原因是深圳还没有一个打动我的创业公司,北京确实有很多,但是这还不是我当前的核心诉求,我在现在的岗位上还可以得到很大的历练,更何况我的家人都在这里,不过未来会怎么样,谁知道呢。
看来,仅仅会IOS是不够来,前台后台各种知识都要了解。