2.5年, 从0->阿里 向山科人学习

    历来没有想到本身的求职之路会这么顺利, 第一次投阿里就拿到了offer, 之前一直都是作好被刷的准备的...php

    3月31号晚上收到了来自阿里的正式offer, 签下录取意向书, 粗略算了一下, 从2012年9月份正式入学进入计算机系到2015年3月签下阿里offer, 大约两年半的时间, 这期间有不少人值得感谢: 磊哥, 立萍, 宋艺, 兴华老师... 发生了不少事儿: 从最初的懵懵懂懂到后来的立志进入像阿里同样的一线互联网企业, 从对计算机一窍不通到有本身的目标和兴趣爱好, 从不知道技术博客是啥到我的博客的访问量超过40W...  也学习了不少内容: C++, Linux, 数据结构与算法, 计算机网络(TCP/IP), 操做系统(OS)...html


    磊哥一直想让我写下此次面试的通过, 同时也记录一下这一年来准备招聘的过程, 不少有意思的事儿若是如今不写下来之后很快就忘了, 况且看了这么多的面试经验, 如今到了"回馈社会”的时候了, 可是一直拖着不知道怎么开始, 这一拖就到了5月份, 这篇博客陆陆续续写了半个多月, 感受今天应该告一段落了, 否则总有新的东西加进来,这篇博客是永远写不完的...linux

    因为不少朋友和大神学弟对我找工做的准备过程以及面试经历比较感兴趣, 我就分别谈一下本身的这两段经历吧:程序员

 

养兵千日

    我是在2013年11月份中旬遇到磊哥的, 当时磊哥刚刚拿下阿里巴巴的offer, 意气风发, 我越俎代庖请磊哥给咱们这些学弟学妹作交流讲座的详细通过在个人另外一篇博客《个人2013 -岁月划过生命线》(连接)有详细的记录, 在此我就再也不赘述了, 不事后来我又找了磊哥好几回, 聊了不少, 也收获不少, 下定决心必定要进入阿里之类的一线互联网公司, 后来磊哥也一直鼓励并帮助我进入阿里, 所以, 我一直把磊哥当成为命里的贵人.面试

    个人准备工做大体分为五方面内容: C++, Linux, 数据结构与算法, 计算机网络(TCP/IP)和操做系统. 若是一个本科生可以把这五方面的基础打得比较坚实再加上稍稍一点儿运气, 拿下互联网的offer是不在话下的, 另外若是你实力够强的话, 那仅需的一点儿运气也是不须要的, 在此我引用671学长的一句关于面试的经典: ”面试 = 运气*(50-n)/100 + 实力*(50+n)/100, n=f(x),x即实力,n与x成正比关系,这就意味着: 你实力越强,对运气的依赖性越低,因此实力才是很是重要的一个环节.”, 下面分别介绍一下我所准备的五方面内容:算法

 

C++:编程

    C++被我称之为飞机中的战斗机, 我对C++是情有独钟的, 他功能很是强大, 尤为是其与Linux操做系统结合, C++灵活的语法, 再加上Linux强大的平台支持, 让人感受有种手握核武器的感受[不过今天(4月28号)获悉本身在阿里实习被分派到了YunOS手机操做系统部门, 之后要主攻Java了...], 这方面我读过的经典的书有《C++ Primer》,《Effective C++》,《深度探索C++对象模型》与《STL源码剖析》,其实在面试阿里的时候《STL源码剖析》这本书是还暂时未读完,并且个人简历上面也没写我读过STL源码, 可是面试官仍然问了不少这方面的内容,如:关联容器的典型实现原理, vector/list的实现, 迭代器失效的问题, string的三种实现方式等, 面试官对STL实现的看重可见一斑; 另外《深度探索C++对象模型》也是面试官常问的内容之一,像虚函数的实现机制, 重载的实现原理什么的都是常问的, 在网上流传着一段关于本书的书评, 感受比较有意思(连接); 《Effective C++》中的内容在我面试时没怎么问到, 可是我我的感受trains技法是比较难,并且属于比较重要且经常使用的内容, 所以你们也须要悉心准备一下. 这方面的书要多读几遍, 不要异想天开的认为这些书只读一边就可以彻底理解, 经典之因此叫经典, 就是不管你第几回读都能找到新感受!服务器

 

Linux:网络

    关于Linux部分是值得大书特书的, 我感受此次之因此面试这么顺利, 很大一部分是Linux帮了个人忙. 我我的把Linux的内容分为两部分:一是Linux开发环境,一是Linux编程:数据结构

    1) Linux开发环境: 在这部分我认为最主要的是学习Linux这个操做系统平台的思想(Linux不少方面都与Windows有所不一样, 如一切皆文件等), 以及使本身适应Linux的命令行,其余的都是次要的. 所以这方面的内容是比较好学的. 这方面比较重点的内容是: Linux经常使用命令, Vi/Vim使用, 软件管理, 用户管理, 权限管理, 进程管理, Shell编程以及经常使用开发工具(如gcc/g++, gdb, make)的使用等. 这方面的内容我比较推荐两本比较经典的书《鸟哥的Linux私房菜》,《Linux Shell脚本攻略》, 可是对于这种实践性课程,光看书是不够的,并且有时仅仅看书是很枯燥的,所以我在此给你们推荐一部”李明Linux视频教程”(连接),你们结合着书与视频练习, 不会感到枯燥; 李明老师对于Linux不管是基础知识仍是高级应用的功力都十分精湛,听课时既能学到知识又能拓宽视野, 所以这部视频我看了两遍, 而Linux的笔记就写了两遍, 我把全部的听课时的笔记都整理发布到了博客上(连接); 我原来看的是初版的视频, 系统是基于CentOS 5.5的,后来李明老师又出了第二版, 固然第二版增长了不少内容, 组织也更加清晰合理, 总的说第二版是比初版更好的, 可是珠玉在前, 我仍然是对初版情有独钟, 所以第二版仅挑着初版照顾不到的内容看了看. 

    另-建议各位读者朋友: 在刚刚开始学习Linux时, 最好在电脑中只装一个Linux, Ubuntu也好, CentOS也罢(不过我我的仍是比较推荐使用Ubuntu做为桌面操做系统), 此时最好彻底摒弃Windows的观念, 平常只用Linux, 最多不超过一个月就开始对Linux与命令行有感受了!

    2)Linux编程: 这部分固然仍是首推W.Richard Stevens的三部书了,《Unix 环境高级编程》, 《Unix网络编程-卷I-联网套接字》,《Unix网络编程-卷II-进程间通讯》, 可是这三本书内容深入, 并且卷帙浩繁, 组织庞大. 俗话说"没有三两三, 休想过梁山”, 没有很是熟练的Linux/Unix操做系统基础, 没有必定的Linux编程基础, 这三本书是不容易读懂的, 所以在这三部饕餮盛宴以前, 我首先推荐一碟开胃小菜《Linux程序设计》. 可是这四部书的内容并不必定须要所有读完的, 《Linux程序设计》中有三分之一的内容是不须要读的(像终端控制, gtk/gnome编程什么的), APUE的重点是前18章, UNP卷I重点是TCP与UDP编程的内容, UNP卷II主要讲解System V与Posix两种IPC进程间通讯的方式, 可是这两种IPC方式的内容大体是想通的, 像二者都有共享内存, 信号量, 消息队列等, 所以学会Linux/Unix编程的思想与原理就好, API的具体用法多查一下MAN手册就行了, 有了这些基础以后我建议再读一读游双老师的《高性能Linux服务器编程》, 这本书深刻浅出的讲述了编写Linux服务器程序的理论基础与实践经验, 并且还介绍了如何编写服务器的测试程序以及开发Linux服务器程序的经常使用工具等颇有实际意义的内容, 很是值得一读; 并且这部书还重点介绍了Linux中的重型武器Epool, 并与select/pool进行了应用层与理论层的对比, 这是APUE与UNP所不具有的, 且这也是面试的重点之一! 对于学有余力的朋友我在推荐一部Linux与C++编程领域的神做《Linux多线程服务端编程 -使用Muduo网络库》, 陈硕老师在书中不只介绍了使用C++进行Linux分布式网络服务器编程的经常使用技法, 并且还总结了使用C++进行编程的经验教训, 并且这些问题还都是面试时常考的(像string的几种实现模式等), 无奈本人两方面的基础较浅, 只能挑着一些比较简单的主题研读一番..

    和学习Linux开发环境同样, 我也比较推荐在学习Linux编程时不要仅仅看书, 我在刚刚开始学习Linux编程时, 因为大三课程较紧, 所以只是读书不多实践, 到后来感受这样学习效果不好, 到后来在我准备本身的面试项目MyHttpd的时候居然不敢动手去写, 所以在这儿我着重推荐C++教程网的两部视频"Linux系统编程”与"Linux网络编程”, 后来我结合视频与书籍, 不断的去实践, 并将重要的内容总结成博客并发表出来(连接); 固然C++教程网也出了不少其余内容的视频, 像"跟我一块儿学C++”, "本身动手写FTP”等,内容很充实, 可以学到的知识不少, 可是都是价格不菲, 并且我只看了系统编程与网络编程部分, 所以其余的我不便推荐, 但愿之后有时间可以把C++教程网的视频都可以学完, 到时候本身的编程功力确定可以提高一个层次. 还有就是如今传智播客也开设了C++课程, 我在淘宝上买了他们那边第三期和第四期的视频,并且我也仔细学习了他们的Linux基础编程与Linux高级编程的视频教程,可是说实话真是乏善可陈,并且有不少内容我感受传智播客的老师是在学了C++教程网的视频再现炒现卖给他们学生上课的, 所以在此我并不推荐看这些视频(因为我拿不出法律可依的证据, 只是对比他们两方的授课内容类似, 即便错误之处亦相同, 所以若是不相信的朋友就权当我是在乎淫吧).

 

数据结构与算法

    这方面我准备的时间最长, 花费的心血较多, 从2012年入学直到如今(2015年5月份)我都一直在持续不断的补充本身数据结构与算法方面的知识. 这方面我感受比较经典的书是《数据结构与算法-维斯(C++版)》和《算法导论》, 维斯的书很是的棒, 不管是理论仍是实践都有很是多的亮点, 并且这部书还有C语言版与Java版,总有一款适合你(*^_^*); 《算法导论》大名鼎鼎,其内容就不用我赘述了, 并且我也只读了部分的内容, 像链表,树,图,红黑树等,在此也是没有资格推荐的.

    面试时链表,树, 排序与Hash的内容考察较多, 尤为是与STL的内部实现相结合来考察(既考察了C++经常使用技法, 又考察了数据结构与算法的内容,一箭双雕). 关于数据结构与算法部分的面试,有三部书不得不推荐一下《剑指offer》,《编程之美》和《编程珠玑》, 还有一个网站LeetCode(连接). 这些内容都是都是我从不少面经中总结出来的, 尤为是LeetCode, 里面一些很赞的面试真题, 没事的时候建议刷一下.

    最后关于”数据结构与算法”的学习, 我建议最好在网上找些这方面的视频结合着书看, 由于这部分比较费脑子, 书看累了的时候就能够看些视频, 敲敲代码, 帮助消化.并且在我看来, 一个准备在IT领域有所做为的程序员/工程师, 数据结构与算法的是不管什么时候都是不能放下的, 在这儿我推荐一篇Google工程师的博客, 我记得当时我看完以后颇受感染, 不知道你们有什么感觉(连接).

 

计算机网络(TCP/IP)

    关于TCP/IP,面试的时候问得颇多, 相似TCP的11种状态, TIME_WAIT状态的缘由, TCP三次握手的缘由等. 能够看出网络层与传输层(重点是TCP)的内容是重点, 若是按照优先级对TCP/IP进行排序的话, 应该是传输层>网络层>链路层, 关于计算机网络, 我看的书有《计算机网络(谢希仁著)》与《计算机网络联考复习指导(王道)》,《TCP/IP详解-卷I》只挑了重点的几章内容(原本是打算把这整本书仔细研读一遍的, 但因为时间不足, 这个愿望一直未能实现, 打算等到在阿里实习结束,本科毕业以前必定好好的把这部经典读完). 在面试结束后的一个月内, 我本身根据此次面试的通过以及结合本身读到的面经的内容, 本身总结了四篇TCP/IP的博客, 我的感受有志于进入互联网公司的读者朋友能够读一下(连接).

 

操做系统(OS)

    关于操做系统, 重点在于进程管理与内存管理这两章, 再加上SPOOLing等一些零零碎碎的内容. 操做系统我感受比较不错的书籍有《现代操做系统》,《操做系统联考复习指导(王道)》与《计算机操做系统(汤子瀛)》;《现代操做系统》我只看了有限的几章,《操做系统联考复习指导(王道)》我读了两遍, 估计你们也看出来了, 这本书与前面提到的《计算机网络联考复习指导(王道)》都是考研书, 可是可是考研类的书每每对课本内容的重点总结的比较精确. 像这本操做系统, 我就感受对OS重点总结是比较精确, 固然通过压缩以后有些问题也是有些阐述不明(像内存管理中的页式管理和段页式管理等), 但其余的内容感受总结的确实是挺到位的(所以个人几篇操做系统的博客就是以王道的书为蓝本,再结合面试中常考的知识点写成的, 不过如今还未发表, 由于排版整理的工做还未完成, 不过他们会最终发到这个目录下面:连接). 最后一本书是咱们的上课时的课本,我的感受这本书仍是挺靠谱的, 可是有些内容有些啰嗦, 学院派气味很浓, 有些问题原本举个例子就能够阐明的却用了一大段晦涩难懂的描述性文字, 让人似懂非懂. 

    我学习操做系统与计算机网络的有一点心得是: 感受二者很相似, 都是内容很零碎, 但又都不很难; 所以, 他们的学习最好与系统编程/网络编程结合起来学习, 这样就会有一番更深深的体会.

    另-若是你们对Linux内核比较感兴趣并且实力足够的话,建议读一下《Linux内核的设计与实现》或《Linux内核源代码情景剖析》,前者内容较难, 我只读了有限的几章, 然后者的总页数超过1000页, 这两部书有很大的毅力来读的...

 

用兵一时

    3月7号(2015年)磊哥把个人简历推到YunOS, 3月12(周二)晚七点参加一面, 3月13(周三)下午三点参加二面, 隔了一周3月20号(周三)晚八点参加三面, 3月24号(周日)参加四面, 3月30号收到offer.

    前面说过, 我历来没有想到此次面试会这么顺利, 很早之前我就作好了前几家面试会被打击的准备, 并且此次面试又是这么仓促, 从简历推上去到真正面试只有三四天的准备时间, 还要一直提心吊胆不知道啥时候一个电话打来就要面试,终于在磊哥的一顿催促之下, 阿里那边的人在我返校以后的第五天晚上,开始了面试:

一面:

    一面问得问题有: (1)TCP三次握手过程, 与为啥须要采用三次握手; (2)TCP TIME_WAIT状态的缘由; (3)C++ 虚函数机制(C++对象模型); (4)C++ Static关键字; (5)Select/Poll/Epoll的异同(使用与内部实现方面); (6)C++迭代器失效问题(iterator原理); (7)map/set容器的实现原理(红黑树知识+STL容器内部原理);

    前面的这几个问题比较简单, 回答的都比较流畅, 估计面试官打算在最后一题发难吧, 最后一个系统设计题难度陡然提升, 一会儿就没了感受, 题的内容是 "如今有两块内存, 一块10G设名为A, 一块20G设名为B, 如今A中数据已满, 但还有新的数据到来, 所以只能转向B写入, 可是还须要把A中的内容作数据迁移, 移动到B, 那么如今问题来了: 如何保证在不打断新数据写入的前提下, 将内存A中的数据完整的迁移到B, 即不能出如今A中数据迁移完成以前B内存满了或者打断新数据输入的状况”, 这个问题纠缠了十多分钟, 我尝试了从数据结构和操做系统的角度去解决这个问题, 但都被面试官否决了, 直到如今这道题我仍然不知道该如何解决.

 

二面:

    二面问得问题有: (1)个人博客的访问量的问题(估计是暖场吧); (2)Linux 伙伴堆算法(slab)实现的原理, 以及与普通内存分配相比有什么优点(Linux内核); (3)Linux 高并发的实现, 线程池的实现思想, 怎样处理高并发(根据项目来问); (4) Linux 写一个并发测试程序; (5) 如何实现一个String, 他的内存是长什么样的(STL内部实现);

    记得当时二面面试官打电话过来的时候还在上课, 跟老师匆匆说明状况以后就找了一间空教室开始面试. 与一面面试官的和善不一样, 二面面试官刚开始问得问题就咄咄逼人(相对较难),并且在我回答问题时还曾经不止一次被他打断. 因为题目相对较难(也多是我本身水平不足)感受须要思考一段时间才能回答, 并且有好几个问题是我之前没有接触过的(像题目2, 题目4, 题目5), 我只能凭本身的理解去回答, 面试还未结束, 我就感受此次面试的结果有点儿悬, 可能过不了这一关了... 但当时内心却是很坦然, 因为刚开始就没有打算可以经过, 所以也就没有那种"天生我材必有用”或那种"此处不留爷,自有留爷处,到处不留爷, 爷去投八路”的气概,只是以为过不了就过不了,大不了从头再来.面试到最后, 我问面试官是哪一个部门的, 回答说是"阿里云·云计算”部门,忽然感受今天被虐成渣不怨了, 心想若是此次面试通不过, 下次直接投云计算部门, 不投YunOS了, 后来跟同窗提及这个想法,他说我是被虐疯了.

    二面结束以后给磊哥发了一短信, 跟他说今天面试感受不是太好.估计通不过了, 磊哥却说面试应该不会就此停下, 可是可能会中间再加一轮技术面, 由原来的三面变成四面.  缘由是在我一面快结束时问了一下面试官对个人评价, 面试官除了说我真正的项目经验不足以外又说"大三可以有这样的扎实的基础已经至关不错了”, 褒奖之意溢于言表, 估计面试官给的评价应该不错, 所以若是二面面试官给个中评的话,那我就应该可以顺利的进入HR终面, 但若是是差评的话, 那就估计还要再加一轮技术面, 给出一个最终的技术评价.果不其然, 在等了一周以后, 三面来了...

 

三面:

    在三面正式开始以前, 我先问了一句是技术面仍是HR面, "是技术面”. 心里顿时紧张起来,但面试官告诉我不用紧张,放松就好,只是聊一下我这边的具体状况, 果真三面30多分钟基本上都是处于比较轻松的氛围之中. 问得问题有:我经常使用的数据结构有哪些, 对将来有什么打算, 对杭州有什么印象, 有没有女友, 有没有在杭州长期居住的打算,若是我去杭州的话, 我女友怎么办等等, 因为面试官很健谈, 后来又聊起了逻辑思惟与追求完美的话题, 总的来讲, 这一面并不如前两面那样技术氛围浓厚, 面试官也特别和善(因为面试官在正式面试以前曾经放过我鸽子, 面试开始时面试官居然还不住给我道歉,真是受宠若惊了...), 后来面试官把他的两个联系方式都留给了我, 让我有什么就能够直接联系他, 后来在收到offer后联系团队时还跟面试官经过几回电话, 求面试官老师帮忙, 面试官老师在百忙之中还帮我联系HR , 告诉我该如何更快的融入团队.. 说实话, 真的很是感谢这位面试官.

 

四面:

    四面是HR面, 万万没想到的是HR老师居然在周天下午打电话过来, 当时刚刚打完羽毛球, 上气不接下气的接了HR的电话, 而后直接开始面试. 此次面试基本没问技术方面的问题, 因为我说了个人博客, 所以HR老师也看了一下个人博客, 见访问量还比较高, 我谦虚的说"多是因为写的东西都比较基础, 所以看的人比较多吧O(∩_∩)O~~”; 而后又问到为何不打算读研了; 在大学期间遇到的最大的困难是什么, 是怎么解决的; 除了上课,在大学里其余的时间都在干吗等等. 总的来讲, 此次面试虽然不涉及技术, 但大部分问题都是不太好答的, 所以, 在此建议你们在平常生活中对生活对一些思考, 不只仅是为了应付HR, 更要活的明白一些.

    四面结束以后, 自我感受不错, 果不其然在第二周的周一, 收到offer通知, 知道本身的阿里面试算是能够告一段落了.

    最后再说一下: 在每次面试快要结束时, 面试官都会让你问他/她一个或几个问题, 或者你本身主动问个问题, 在这儿我比较推荐的一个问题是"在您看来, 在阿里(固然是目标公司)若是要胜任一份工程师的工做, 他/她须要怎么样的能力或素质, 或者说若是我还想继续应聘这个工做, 我还须要作那些努力”, 这个问题暗含了三层意思:一是对我此次面试结果的询问, 二是我该如何努力弥补本身的不足,三是表达了你对这份工做的渴望,但愿可以胜任或者得到这份工做. 我在四次面试中都主动或被动的问到了这个问题, 四面的面试官各自给出了本身的答案, 虽然答案各异, 可是综合起来可以得出一个对本身综合评价,同时,也可以知道为接下来迎接下一轮面试或者参加工做该作哪方面的努力, 所以我感受这个问题仍是比较好的.

 

放飞梦想

    不出意外7月份就要去杭州了, 因为得知本身进入的是YunOS手机操做系统团队, 师兄给出的建议是学习一下Java以及Android的内容, 所以须要把接下来这两个月的学习规划一下了, 这两个月的学习我将其划分为三个方面: Java, 数据结构与算法(Java), Android编程.

    Java: 因为之前个人Java几乎接近0, 所以此次搞了本《Java核心技术(卷I)》, 又下了了马士兵等人的视频, 打算必定好好学习一下.

    Android: 在网上下了Mars视频, 感受深刻浅出, 挺不错的(Mars是千锋的老师,算是给他们作广告了,呵呵), 又跟同窗借了《第一行Android代码》打算好好学习一下, 可是若是时间不够, 就只能尽可能多学了.

    数据结构与算法: 搞了一部《算法(第四版)》(该书与《算法导论》齐名), 同前所述, 我认为”数据结构与算法不管什么时候都不能放下”, 这部书讲述了数据结构与算法经典内容, 并且书中的代码所有都由Java实现, 数据结构与Java一箭双雕, 值得一读!

    最后, 还有幸到今年山东ACM省赛上当了一把裁判, 开了眼界, 也圆了本身在三年以前”到ACM赛场打一场酱油”的心愿...

    之后的路还很长, 人生之路才刚刚开头, 走出大学, 才算真正的开始...

相关文章
相关标签/搜索