聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
引言
很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做《回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议》,首发于笔者的博客园博客,这里也郑重声明一下,所有内容类似文章均属转载或抄袭。
之前看过的朋友可能会有疑问,为什么要再次捡起这篇文章,还把称谓改成了笔者这么高端的词汇。
简单的解释一下,原因有三个,第一个原因,是说不得的原因,请各位看官自行YY。第二个原因,是两年过去了,笔者在阿里也呆了700+天的时间,所以对这篇文章,又有了一些新的理解和想法,想回过头来,再完善一下。最后一个原因,是因为最近笔者经常刷某音,根据玩某音的经验,发两次会火,哈哈,-_-。
所以,这篇文章,可以说是之前那篇文章的进阶版,为了方便大家观看,本文会引入很多原文章的内容,避免没看过上一篇文章的同学,还需要回过头去翻看。(好吧,我承认是为了偷懒,-_-)
阿里社招面试都问什么?
和之前一样,文章一上来,我们先来谈谈阿里的社招面试都问什么,其实这个话题并不是什么秘密,所有来阿里面试过的同学,都能回答一二。两年前的时候,笔者在文章里是这么回答的。
看到当时自己的回答,笔者有种在review几年前代码的错觉,不过好在,哪怕是现在来看,当时写的虽然多了些废话,但整体思路应该还是没错的。
只不过在这里,笔者想要再补充下,如果把以上两个阶段再概括化一下,其实得到的答案,就基本适用于所有面试,而并非只是阿里的社招面试。
__那就是,第一阶段是主语言,第二阶段是项目__。
这点相信不少人在面试的过程中,已经深有体会,大部分面试就是分这么两个阶段去问的,只不过针对不同的公司和职位,每个阶段面试的难易程度会不同,所问的问题范围,自然也会有所不同。
说到面试的难易程度,不得不八卦一下,据之前笔者在网上某地方看到的评论中说,就面试的技术难度而言,BAT之间的排列顺序是这样的,阿里>百度>腾讯。
对此,笔者实际的感受倒是和上面一致,因为笔者参加过百度和阿里的面试,就个人的感觉而言,阿里的难度是高于百度的。
不过笔者说阿里的难度比百度高,其实也仅限于笔者那一次具体的面试,实际上,两家公司面试的具体难度,是不能这么简单对比的。
面试的难度,根据职位的不同(比如低级工程师还是高级),部门的不同(比如业务部门还是纯研发部门),用人需求的不同(比如是急需还是人才储备),面试官的喜好(比如是装逼型还是温和型)等等因素,就算是在同一家公司,难度也是会有差异的,所以不能简单的对比两家公司的面试难度。
到底难不难,只有来试了才知道!
阿里社招面试如何准备?
这个话题相信是大家比较关心的话题,之前笔者其实已经详细谈论过了,就这一部分内容来说,之前写的还是比较详细的,所以索性偷个懒,把原文搬上来了。
看完以后,关于连环炮的部分,笔者这里还是想简单再补充几句,上面之所以举了那么多连环炮的例子,其实并不是想让大家背下来,而是想让各位看官体会一下社招面试的套路。
说到底,这些连环炮的例子,就是在考验你对某一个知识点理解的有多深。就笔者的亲身经历而言,其实上面所提到的这些连环炮,你并不需要每个都理解的很深,只需要有那么一两个点比较深,甚至超过面试官的理解,就可以达到要求了。
很多时候,面试官并不需要你对每一个知识点都很深入,他只是在考察你的理解能力,以及平时有没有一些技术积累。
如果一个面试官,只因为一两个技术知识点而否决你的话,那么只有两种可能,第一种是这个点,可能确实是你所面试的职位中,非常重要的知识点,比如面试算法类岗位的话,算法不好是不行的,或者是面试偏运维类的技术岗位,Linux玩不好也是不行的。
第二种可能就是——他在装逼,-_-。
“野生”Java程序猿学习的道路
这一部分笔者上篇文章谈了很多,不过这一次,笔者在Java程序猿前面加了个限定词——野生。
笔者一向自称是“野生”程序员,所谓的“野生”,笔者这里先简单下一个定义,就是__在大学之前,从来没想过会走程序猿这条路,而是在进入社会之后,才逐渐走上程序猿这条路的人,笔者称之为“野生”程序猿__。
自学还是培训机构?
“野生”程序猿有不少程序猿“正规军”所不具备的共性,其中__最典型的一个共性,就是“野生”程序猿在进入社会之后,都会经历一个学习入门的阶段__。
也正是因此,社会上出现了大量的培训机构,所以往往“野生”程序猿在入行初期,所面临的第一个问题就是,到底是自学,还是选择培训机构?
笔者就收到过无数这类的问题,其实这个问题没办法一概而论,要具体情况具体分析,但如果简单粗暴一些来说的话,假设你家里不缺那个培训费,就去培训机构,反之就别去。
毕竟花了钱,总会多一些学习上的资源,最起码聊胜于无。
所以,这个问题通俗点说,就是__有钱就去,没钱就自学__。
就像那个经典的笑话一样,说自己买东西有选择恐惧症的同学,不是真的有选择恐惧症,唯一的原因就是——穷,呵呵哒。
算法到底重不重要?
除了上述的共性之外,__“野生”程序员还有一个共性,就是学习曲线和程序员“正规军”会有所不同,前者是从实践到理论,后者是从理论到实践__,这就会导致“野生”程序员的基本功一般不怎么扎实,比如算法、计算机系统原理、计算机网络等。
私底下,无数同学问过笔者同样的一个问题,到底算法重不重要?阿里面试考不考算法?
其实第一个问题,关于算法到底重不重要,笔者这里是有两个答案的,如果来问的同学互相对质一下的话,可能会发现笔者给每个人的答案会略有不同。
如果是一个学生来问的话,笔者会告诉他,算法非常重要,一定要全力学习。
而如果是一个已经踏入职场多年的人来问的话,笔者一般会告诉他,按需学习即可,如果你做的工作和算法关系很大,那自然要好好学,比如你做算法工程师,你告诉我算法重不重要?
当然重要!
而如果你每天写的是增删改查,更注重业务,那还是别花那个精力了,省省吧,有学算法这个精力,多研究研究业务,多思考思考技术与业务结合这种问题,可能比你学习算法收效更高。
至于第二个问题,阿里面试考不考算法,笔者清晰记得,面试官问了这样一个问题的,“你对算法的了解多不?”
而笔者当时的回答是,“不好意思,这个我不会。”
看到这里,可能有的同学会有疑问了,“作者啊,你这样做不太好,你这不等于告诉大家,算法不重要,不学算法一样可以进阿里吗?”
有这种疑问的同学,是没有想明白这么一件事,算法是否重要,和是否一定要花精力学习它,并没有什么直接的卵关系。
更何况,不会算法能进阿里也很正常,难道你觉得阿里万千工程师,都是熟悉算法的吗?我敢说,你敢信吗?
还有不少人有一个误区,那就是,“算法好的人,工资都高了不少。”
关于这个,笔者只想说,如果这个人本身就是搞算法类工作的,那无可厚非,但是如果他是搞增删改查的,笔者可以很确定的说,他学算法这个时间去学点别的,工资可能会更高。
所以,不要被这个表象迷惑了,他高工资本质是因为他业余时间学习了才高,而不是因为学习了算法才高。
__俗话说学以致用,不光花钱要花到刀刃上,学习也是要学到刀刃上的,因为时间比金钱更珍贵__。
当然,以上所说对于算法要按需学习的论调,仅适合于毕业多年,已经进入职场的同学,如果你是一个在校生,那么对于算法这个东西,就只有一个字——学!往死里学!
“野生”Java程序员如何学习
扯完了家常,咱们聊点正事,“野生”程序员,如何度过自己的学习和职场生涯。
关于这个话题,笔者会引用一下上一篇文章中的内容,但是两年过去了,笔者会对其中再做一些补充。接下来,我们首先看一下之前笔者所写的前奏。
其实这段前奏中,笔者第2点中所说的“处于待业状态,准备转行Java的同学”,就是今天一直提到的“野生”程序员。
笔者这里专门提到这点,也是希望看官们可以明白,本文所有内容,都是围绕着“野生”程序员展开的,如果你不属于其中的一员,那么一定要对文中提到的学习道路自行取舍。
哪怕是“野生”程序员,也不一定就非要完全照搬文中的学习,也要有自己的思考。
第一阶段——未参加工作的同学
这个阶段,其实就是上面笔者提到过的,是“野生”程序员学习入门的阶段。大部分人在这个阶段学习的时候,都是非常痛苦的,所谓万事开头难,是有一定道理的。
不过没关系,谁让你运气好,看到了这篇文章呢(吹逼会不会遭雷劈?),你只需要保持学习的信念,然后按照下面的思路去学习就可以了。
强调一下,对于程序员来说,心中那股信念很重要,你要问笔者这股信念是什么,笔者只能说只可意会不可言传,自己在职场生涯中慢慢体会吧。
两年过去了,其实这个学习路线,并没有什么太大的变化,唯一变化的点,就是spring-boot的普及,省去了之前很多框架整合的工作。
回想11年笔者培训那会儿,想要搭建一个SSH框架,还要自己梳理jar包,整合一大堆配置,一不小心就各种报错,而且那异常往往都不是简单的NPE,甭提多苦逼了。
所以,同学们,珍惜你现在的生活吧,呵呵哒。
第二阶段——工作0到1年的同学
这个阶段是所有人都会经历的一个阶段,这个阶段的程序员,心里往往都是非常复杂的,刚找到工作,坐在明亮的办公室里,仿佛自己成为了电视剧中的主角,难免会感到意气风发,但是同时心中又不免会有些恐惧,生怕自己一个不小心,再次被打回原形。
如果你有这样的感觉,不用紧张,这是所有人都要经历的,你要做的,就是让自己彻底沉浸在工作和学习当中即可,原因很简单,因为这个时候——你还是单身狗,-_-。
补充一下,看书的时候,不要只是看书,一定要经常思考,比如思考你所写的代码,和书中的内容是否有联系。
举个实际的例子,当你看到static这一部分内容的时候,你是否会去翻一下你现在开发的项目里,是否有地方使用static,它使用的目的是什么,它使用的方式是否正确。
只有这样看书,你才能真正的把书看进去,一定要注意,看书的最终目的是为了引发自己的思考,只看书不思考的话,那叫背书,不叫看书。
说到这里,有不少同学问过笔者这样的一个问题,“我看书看不进去怎么办呢?有没有什么好的办法?”
笔者这里可以很负责的告诉你,哪有什么岁月静好,只是有人替你负重前行而已。
所以,不要期望有什么开开心心,快快乐乐就把书给看了的办法,你想的倒还挺美,呵呵哒。
这玩意儿没有什么好办法,就是靠着自己内心的一股信念,强迫自己去看,特别是刚开始的时候,是最困难的,熬过那一段时间,后面看起来相对来说会顺畅很多。
万事开头难,用在看书学习上,也同样适用。
第三阶段——工作1到2年的同学
这个阶段的你一般已经做了一年的增删改查,与刚入职时的意气风发不同,这个时候的你,会开始考虑你未来要走的路,但通常在这个时候,你很难看清前方的路,因此你或许会有些焦虑。
如果你存在这样的焦虑,不必忧心,只需记得,在程序员的道路上,学习能使你变得更加充实,继续沉浸在学习的海洋中吧。
这个阶段笔者所建议的三本书,其实都是在教你如何更好的编写和设计你的代码,除此之外,设计模式这个系列,也是在锻炼你对问题的抽象能力。
使用Java这种面向对象的语言,抽象能力是非常重要的一项能力,和上面一样,笔者建议,当你看完设计模式、重构和Effective Java这几本书后,一定要结合自己的项目,做深入的思考。
不思考的人生是不完整的,只干活儿不动脑子的人,看似勤奋,实际就是台机器,既然是机器,那就早晚会被取代的。
只有不断思考,总结过往,指导未来的人,才最终会成为这个社会的主导者。
第四阶段——工作2到3年的同学
这个阶段,对于程序员来说,是非常重要的一个阶段。在笔者的学习道路规划中,这个阶段学习的目的,是为了让你从初中级工程师迈入高级,实现质的提升,因此,这一部分的学习,难度会比之前两年的要高。
但既然你已经踏上了这条路,就没有回旋的余地,只能往前冲。
所以,做好心理准备,迎接挑战吧。
可以看到,这个阶段笔者列的任务非常之多,不仅要了解JVM、并发、JDK类库,还要自己尝试造轮子。
如果你仔细阅读了本文的话,你会发现,阿里社招面试笔者所举的连环炮中,有一大部分都是这个阶段学习的,那些连环炮中,基本上都是JVM、并发和JDK一些类库的内容。
而比较巧的是,阿里大部分招聘要求的年限,都是3年或以上。
这意味着什么?
相信反应快的同学已经明白了,你如果可以在3年内,完成笔者的学习计划的话,那么在你满3年的时候,刚好可以来阿里检验你的学习成果。
第五阶段——工作3到4年的同学
这个阶段的同学,很多已经碰到了天花板,在此之前,只要你按部就班的学习,智商又没啥硬伤,90%以上的同学(有人问,剩下的10%呢?笔者只想说,我怎么知道?/尴尬),在工作3年的时候,都可以达到年薪30W左右这个范围(仅指2015年或以后北上深一线城市)。
而如果你的年薪想要更上一层楼(一般10W为一档,比如40W、50W等),仅靠之前的积累是远远不够的,你需要打造你的核心竞争力,在之前的文章里,笔者把这个所谓的核心竞争力,称之为差异性,其实想表达的意思都是一样的。
具体如何在这个阶段学习,还是先看看之前笔者是怎么建议的吧。
可以看到,在这个阶段,笔者提到了三本基础书籍(操作系统原理、网络协议、算法),这三本书,会让你更加的接近底层。
如果你仔细品味本文所提到的学习路线,你会注意到,笔者一直在让你由浅入深的学习,也就是__一直在让你提高知识的深度,而不是知识的广度__。
这就回答了不少同学问过笔者的那个问题,“到底是先有广度后有深度好,还是先有深度后有广度好?”
首先,很多人在思考这个问题的时候,有一个误区,那就是一直在纠结这个问题本身,有的说学习要先学深了,才好提升自己的广度,而有的却说,学习要先了解更多,开阔眼界,才能更好的提升自己的深度。
其实,这种讨论已经本末倒置了,回答这个问题很简单,看市场上需要哪一类,就是哪个好。
所以,把上面那个问题换一下,你就很容易得到答案了,“如果让你来面试一个5年经验以下的程序员,你喜欢在某个领域研究很深的人,还是每个都懂点的人?”
答案是显而易见的,笔者相信大部分人,都会选择在某个领域有深度钻研的人,特别是一些一二线的互联网公司。
或许有的同学在这个时候,会用“全栈工程师”这个概念来试图反驳,毕竟全栈工程师这个概念,有一段时间被炒得很热,很多公司的招聘上都加了这么一条——全栈工程师优先。
全栈工程师这个概念,其实是小公司(或者是大公司的小部门)为了节省人力成本,想让程序员干杂活,却又不好意思直说,因此所编造出来得美丽的谎言,可笑可悲的是,一些不知全栈真正含义的程序员,还以自己是全栈为荣,觉得自己跟上了潮流,真的是被人卖了还在帮人数钱。
笔者在这里可以很负责的说,初入职场的头几年,一定是以提高深度为主才是正道,像全栈工程师这种潮流,就如同最近一些采用非常规手段出名的网红一般,注定只是昙花一现,只有一技傍身,才是长久之计。
第六阶段——工作4到5年的同学
4到5年其实也是一个比较重要的阶段,咱们先来看看,两年前,笔者是怎么来讨论这个阶段的。
从引文中最后一段可以看出,笔者当初写的时候,才工作不到4年半,所以当时笔者也是处于一个摸索的阶段。
如今两年过去了,其实现在来看,到了这个阶段,笔者已经很难再提出有效的建议了。
如果你仔细阅读了本文,会注意到,在前3年的时候,笔者建议的学习道路都是一样的,因为笔者没有给出任何选择的余地,就按照笔者所罗列的去学就可以了。
但是从第3年开始,也就是第3到4年的时候,笔者所给的建议当中,已经出现了选择,比如操作系统原理、网络协议、算法这三本书,再比如你准备钻研的领域,都是在让你自己选择,而不是笔者直接告诉你,应该看哪本书,钻研哪个领域。
这其实是符合常规的学习道路的,初中级工程师的时候,大家学的都一样,3年过去,进阶为高级工程师以后,自然每个人会走向不同的领域。
就和上学一样,小的时候学的都差不多,高中就开始分文理班了,大学就开始选专业了,到了研究生......
额,忽然想起没上过研究生,不太清楚,但学习的道路肯定更加细分了,对不对?
所以,在4到5年这个阶段,其实同样没有固定的道路可走,之前之所以建议大家提高“影响力”,其实现在笔者自己回想起来,其中深层次的原因,是希望大家去一些知名的公司,比如......咳咳.......你懂的(这次完美的暗示,感觉要个4不过分)。
其实在第3-5年这段期间,最好的选择,就是一边提高自己的核心竞争力,一边着手开始进入一家可以“洗白”的公司,或者说是可以提高“影响力”的公司。
什么叫“洗白”?
作为一个“野生”程序员,你通常没有华丽的学历,你能仰仗的,只有自己的实力,这在你做程序员,包括做一些中低层技术管理者的时候,并不会特别阻碍你的发展。
但是当你想往上爬的时候,也就是做高层技术管理者的时候,你没有一定的背景,就算你实力再牛逼,也是无济于事的,这就是笔者所说的“影响力”,其实也可以叫“信服力”。
你听说过哪个公司的CTO或者是技术总监,是没什么学历,也没进过任何大公司,一穷二白的野书生吗?
可能有的人这个时候会举手发言了,“作者你说的不对啊,我见过这样的人啊!啥学历没有,啥大公司没进过,但人家就是CTO,老厉害了呢。”
这只有两种情况,第一种,你说的这个人太厉害,不在本文讨论范围内,呵呵哒,第二种,这个CTO,是一个披着项目经理的皮,管着十人二十人的假CTO,因为公司一共就这么点人,-_-。
总而言之,言而总之,说了这么多,“洗白”的意思就是,在学历不够亮眼的情况下,就想办法提高一下自己的公司背景吧。
最起码,如果哪一天,你真的坐上了CTO的位置,你的简介里可以加这么一句话,“曾就职于某著名XXXX公司,任XXX职位。”
是不是感觉多了一些信服力呢?
第七阶段——工作5年以上的同学
这一部分之前的文章是没有的,因为那时候笔者自己工作还不到5年。
对于这个阶段的同学来说,与5年前初入职场相比,除了工作上的不同以外,最大的可能是来自于生活上的变化。
所以,这个阶段,咱们不谈工作,不谈学习道路,咱们来谈谈生活。
5年前,你可能还是单身狗,你自由,你拼搏,你各种跳槽,你四处流浪,但是5年过去了,你恐怕已经结婚,甚至孩子都有了,这个时候的你,不得不考虑一些现实问题。
买车?买房?落户?
这每一项,都像一座大山一样,压在奋斗在一线城市的上班族身上。
特别是买房这件事,哪怕你此时已经年薪50W,在一线城市,买房依旧是非常困难。
因为50W扣掉各种乱七八糟,估计得缩水15W,等于是到手只有35W左右了,再加上你的花销,一年能存20W算是非常不错了,而一线的一套房子,首付基本上最少的都要上百万(也就是总价300W,这已经是一线的白菜价了),这都要存5年才够,更何况有多少人在这个时候,年薪还不到50W。
再者说,你敢保证这5年房价不涨?你敢保证这5年你一次都没有大的花销?
有的同学可能要举手说话了,“我爸妈已经给我在北京2环买好房子了呀。”
那笔者只能说,“这位同学,请你出去!呵呵哒......”
咱们这里讨论的,主要是非二代同学,关于二代同学们,笔者给你的建议只有一个,吃好玩好就行,就别出来抢饭碗了,-_-。
好了,言归正传,买房其实只是第一大难关,其它城市笔者不知道,但是在北京,落户比买房还要困难,基本可以说是无路可走,虽说最近出了个积分落户,但怎么看都是中看不中用。
当然,因为笔者早就逃离北京,所以对这个政策没有细研究,有兴趣的同学可以自行去这个地址研究下,看你有没有落户的希望,呵呵哒。
说到这里,笔者不得不提到之前写的一篇文章,题目叫做《程序员们,再不行动就来不及了!》,其实讲的就是程序员的安家之道。
具体的这里就不再具体详述了,有兴趣的同学可以自行去看,这里只是引用一下文中的一句话——__一线城市奋斗攒钱,二线城市安居乐业__。
一句话已经道出了程序员的最终归宿,而在二线城市中,目前最合适的,杭州就是其中之一。
杭州的互联网行业相当发达,工资不比一线的低多少,甚至还可能会更高,但是房子均价却是一线的一半都不到,再加上杭州风景怡人,这样的城市,绝对是最适合在外拼搏的“野生”程序员,安居乐业的好地方。
而从一线转往杭州,总需要一个公司来过渡,那这个最合适的公司也自不用说,咳咳.......你懂的.......(毫无违和感的植入,-_-)
而其他知名互联网公司,大部分都在北上深,就算工资高些,但是从生活压力,和幸福感上来说,相信和杭州这样的宜居城市,是没办法相提并论的。
5年了,5年的奋斗是为了什么?或许在你初入职场的时候,你意气风发,你要改变世界,但是当你结婚生子以后,你会发现,在你改变世界之前,你要先安居乐业,-_-。
“野生”Java程序员学习道路小结
其实纵观笔者今天所讲的,就是“野生”Java程序员,如何通过学习和努力,进入阿里,并且在杭州买房落户的道路。
是的,这个学习道路的终点,不是帮助你成为技术大牛,而是教你安居乐业。
毕竟咱们在外奋斗,不就是想在大城市扎根安家吗?
至于当初改变世界的梦想,等你把生活安顿好了以后,再去谈改变世界也不晚。
当然了,有一点要强调一下,关于学习的那一部分(也就是前4年),是相对来说比较通用的,基本上所有的Java学习者,都可以适当参考一下笔者当时的学习路线,甚至在极端情况下,照搬也不无不可。(免责声明:学成啥样,作者概不负责,-_-)
但是,对于安家落户的这一部分(也就是4年后),可能并不适用于所有人,比如有的人老家就是深圳这种一线城市的,那自然没有必要来杭州了,毕竟深圳也有阿里中心嘛,-_-。
因此,在工作的前面几年,你可以按照笔者的学习道路去走,但是当你工作到3-4年这个阶段的时候(又或者是你讨到老婆的时候,-_-),一边工作学习,一边你也要规划一下,你未来要去哪个城市安家,进哪家公司。
认准目标以后,你就要好好研究一下这个城市的房价、购房政策、落户政策等,也要研究一下这个公司面试,都倾向于哪方面(比如本文第一部分的内容,-_-),然后等钱存的差不多以后......
好了,之所以后面用省略号,是怕你们现在的老板看到以后,来杭州找我拼命,但是我相信你们看懂了,-_-。
作者:中间件小哥
本文为云栖社区原创内容,未经允许不得转载。