校友工作

刘怡涛:国际学院13CST毕业生被华为腾讯相中的前前后后

文章来源:国际学院 发布时间:2018-05-25 点击数:147 字体:

【编者按】他山之石,可以攻玉。每个个体都有特殊性,你不必成为第二个谁谁谁,但你可以从他们身上看到很多。作者刘怡涛被华为和腾讯先后相中,他是13CST全英文计算机科学与技术专业中第二个被去腾讯的,第一个是12CST的张金栋。

 

  这篇文章是我早就想写,同时受赫栋峰老师和何小勇老师多次连环催促,才在临近毕业的时候,在答辩完成后,在与晚期拖延癌的不断抗争下,终于开始动笔的一篇文章。主要讲述的是,我是怎么在这互联网时代中,一边看着互联网大潮发展,一边死命地往互联网方向怼的故事,记述比较流水账,故事一点也不传奇,男主也没有开挂,也应该不鸡汤,最后会带点干货。主要目的还是希望,对于暨大之后的无论在国院或者在计院学编程的师弟师妹,或者其他专业想进入互联网行业的同学,如果能有一点点帮助或者启发,就已经是谢天谢地了。

  我算是从很早就开始接触互联网的,比较早接触新浪微博、豆瓣、知乎,高中的时候家里有了第一台iOS设备,当时对于app store玲琅满目的应用激动万分,每天都要尝试各种app,从此对GEEK文化心生向往。高考志愿我心底是首选计算机的,虽然在之前完全没有接触过编程,但是很希望能够学会它。很幸运,能以第一志愿来到暨大国际学院计算机专业,英语对于编程尤其重要,这件事我其实一开始没有意识到,但后来越来越觉得选择全英教学的计算机专业其实很有优势。进入大学前,当时的我认为我可能并不是那种坐得住做研究的人,很有可能会往应用方向发展了,后来事实证明我果然是往应用方向越走越远。每个人的发展方向都会不同,实际上计算机研究对整个业界的影响也很巨大,但是做应用有做应用的乐趣,所以还是follow your heart,如果你也是喜欢那种开发创造的兴奋感,那么下面的文字会对你更有帮助。

  在大一我加入了一个很重要的组织,在当时还是从属于团委的“学生网络联盟”(下面简称网联),里面都是喜欢技术的人,有已经自学编程多年的高手,也有像我一样什么都不懂的小白,但是大家对于技术的热情和宅男共同的语言,让我们很快就熟了起来。当时我们每周会在华文校区举办一次技术沙龙,每个人都有机会上台讲一些计算机技巧和知识。从最基础的HTML讲起,一直到如何搭建一个基于LNMP的PHP网站。

  虽然我当时其实学得不好,但是这个经历对我来说十分重要。大一专业课顶多也就是教如何用C语言进行简单的计算和文件IO,我们很难从编程中得到实际的反馈,久而久之就会对编程失去兴趣。但是做网站对于当时还很喜欢瞎做设计的我,是很棒的编程实践。所以我建议每个人在开始学编程的时候,不一定要买厚厚的专业书从头看,可以尝试从做网站或者做一个app入手,是一个很容易培养兴趣的途径。寒假期间我用wordpress框架搭建了一个自己的blog,虽然这并没有什么技术含量,但拥有一个属于自己的网站是非常有成就感的事情。

  到了大二,我因为报了双学位所以很果断的辞去了大一时期参加的各种组织的职务(虽然后来证明,我对金融的兴趣远没有对计算机大),与此同时,一位之前负责暨南FM的师姐找到我,希望我能帮暨南FM做当时一个网络歌手大赛的网站,然而当时的我,仅仅是明白一些HTML、CSS的概念,从没有亲手做一个网站,连静态页面都做得费劲,只好重新自学,我这个时候才发现,动手编程真的和“懂得概念”完全是两码事。后来这个网站我也没有亲自做出来,而是基本由另外一个师兄做成的,不过那位师兄也给了我许多指导,手把手教我JQuery,我当时实在太菜啦,不过真的很羡慕师兄的能力。后来这位师兄去了阿里巴巴做Android开发。除了这件事,还有很多时候我都感觉自己很菜,比如大二我后来加入了JNUxTED,这个团队都是非常优秀的同学,而我大概是最菜的那个,本来我是应该负责做一个H5的大会宣传页面的,当时的我仍然做不出来,最后是靠第三方平台搞定的。

  即使我的编程天赋如此差,我仍然能找到一些编程的快感。比如专业课要做Java项目,我负责了整个GUI也就是Swing的编程,搞出了还算是不错的界面,心满意足,还有操作系统的项目,思考电梯的运作思考到每次坐电梯都要想一次运作原理,再比如在形式政策课的微信墙上用简单的XSS搞出了大红字“形策大法好”,每次回想到这些事情我都会会心一笑,我一直认为,我是喜欢编程的。

  大二下学期沉迷谈恋爱和制作鬼畜视频,在自学编程方面什么都没做。不过暑假做了个简单的H5跑酷小游戏送给女朋友。
也许看到这里,观众老爷会觉得,男主什么时候要开始逆袭了呢?不,男主这个时候才刚刚进入最艰难的时期。

 大三的时候,我的又另一个师兄找到我,希望能帮助他完成一个他想商业化项目,他希望我能真正学会Javascript,然后用Angular做这个项目,我当时没有多想就决定要做。但后来我才发现,Javascript这个动态语言,坑实在比我想象的多太多,Angular这么复杂的框架,更是我当时几乎无法handle的,即使我每天都在研究Angular的文档,也依然被虐的死(主要原因还是基础不够好)。最后我勉强模仿了微信网页版的聊天页面交给师兄,但师兄比较生气,认为我的进度太慢,编程水平实在太菜,这个项目之后不了了之。这件事其实给了我很大的打击,因为我感觉我的能力不足以承担他人的梦想。

 2015年是互联网疯狂发酵的时期,成熟的微信支付、外卖平台已经显著影响人们的生活,成熟的iPhone6发布和国产安卓品牌使得大量APP被制作,各种互联网概念被炒作,各种大学生创业层出不穷,但是我已经没有那个勇气去尝试校内的创业机会。我一位师兄说过一句话,我现在还记得很清楚,他说“暨大缺少工程师的氛围”,当时的我一方面对自己的实力深感捉急,另一方面又觉得校内“PPT项目”实在太多,真心做东西的太少了,于是我把目光放在校外的实习上,我希望能够通过一次实习彻底锻炼出我的编程实战能力,让我能够真正能做出互联网的产品。

 所以我其实大三上就开始在找实习了,但事实很残酷,我尝试了几家公司或者其他学校的创业团队,一方面是大三的课余时间不足以满足他们的实习时间要求,另一方面是显然我的编程经验还不能够handle他们的项目。但在自学编程方面,我又喜欢上了Python,开始研究Python爬虫和Django等框架,学校专业课的openxava项目硬是被我做个Django的demo给过了,Python是我当时继续学编程的乐趣所在。

 寒假我在家附近找到了我的第一个实习,那是一家做外包网页的小公司,但是他们的CTO人特别nice,我没有任何实习工资,但是我每天都会去那家公司自学并和CTO叔叔交流,我在那学到了一些Linux的操作以及网站的部署知识,成功部署了一个Python的Web项目,更重要的是,我感受到了一家真正的公司是怎样的气氛,说实话,我挺喜欢的,所以我之后没有再考虑考研、出国等事情,每个人喜欢的方向不同,当时的我,迫不及待地想参与到实际开发工作中。

 大三下学期开始了,同学们注意了,每年的2月底到4月份,都是各大互联网公司开始招大三暑期实习生的时期,也就是说,如果准备毕业后工作的,一定要把握好大三下学期刚开始这段实习招聘期,这是进入一家一线互联网公司最容易的一段时期。但很显然,我当时就没把握好,我直到过年后才知道各大公司已经开始招实习生了,才慌忙在网上开始写简历,投简历,这个时候你就需要选择你的互联网职业方向了。有后台开发、前端开发、客户端开发,有人工智能、大数据、运维、测试,然而当时的我已经来不及多想,选了比较有经验的前端开发。

 结果呢,接下来各种公司的笔试面试,不是跪在了笔试就是跪在了面试,就算运气好过了笔试,面试的时候面试官也能通过丰富的经验看出我的项目经验不足。所以下面这段是重点:如果想拿下大三下学期这段实习招聘黄金时期,建议在大三的寒假就做好笔试面试的准备,这方面经验我在文章最后会详述。

 说真的,相比后来正式校招的难度,大三实习招聘如果能稍微出色一点的都能过,而能够参与暑期实习的学生大多都能够留下来,所以务必把握好这次机会。


 好啦,说回这个男主,他在网易、腾讯、阿里巴巴各种笔试面试都连跪之后,选择了...学习UWP,嗯,当时学习UWP开发成了我学编程的唯一乐趣,不然我真的考虑要转行了。然而显然微软都扶不起UWP,与此同时,我也开始尝试找小公司投简历希望能参加暑期实习,其中包括了游戏公司、做智能家居的、做PHP网站的,几乎都跪了。这段时期可以说是我最低沉的时期了。转机发生在学期末,我收到了上海银联的面试邀请,面试地在上海,我在我女友的支持下,还是打算去试一下。其实与其说是去面试,不如说是去散散心,让大都市的浮华,冲刷一下我疲惫的心灵(什么鬼)。


 结果是戏剧性的,我在一帮子的复旦、交大高材生的面试中留了下来,成功拿到了实习资格,面试官与其说是认同我的技术,不如说是更看到了我对一份实习的渴望和对开发应用的热情,于是本来我是面试的职位是运维,后来被分到应用开发部门。暑假我就去了上海,在经历了可以写成短篇小说的租房故事后,在银联开始了三个月的实习。

这是我第一次在大公司实习,也是第一次接触了真正互联网产品,那是一个用通过Cordova开发的Hybird App,在那里我真正熟悉了Javascript,以及React、Node.js、webpack等一系列实战中的工具,我也渐渐明确了自己的方向。那段时间我既在上海实习,又同时在尝试向更具有互联网基因的大公司投简历,比如BAT,通过Leetcode和牛客网,我刷了不少笔试面试题,这个时候我觉得我更有底气面试那些一线互联网公司了,毕竟在银联这个还是比较国企基因的公司,这个互联网产品并不是核心业务,我觉得发展空间不大。最重要的,我追求那种geek一般的工作方式,那是只有都是编程狂人的公司才有的氛围。

 然而事实依旧很残酷,我在接下来的暑期招聘,也就是正式校招中,在百度和腾讯的校招流程中,都跪了。腾讯还好,微信嘛,要求高,百度我已经觉得回答完美的情况下,依然没有得到最后的HR电话,后来我才得知深圳的百度只招那个岗位三个人,想必稍微有个学历、简历比我漂亮的,被刷的就是我,竞争激烈啊。我再次进入了某种低沉期。
事情又出现了戏剧性的转机,当时微信小程序刚刚开发,我得知广州爱范儿和杭州的SegmentFault(以下简称SF)合作举办了一次微信小程序的黑客马拉松,这两家都是我很喜欢的互联网公司,所以我很果断地去参加了,确实玩的很开心,最重要的是我成功勾搭到SF的CEO,获得了面试机会,后来我也成功通过了面试。

 这家公司在杭州,我没有多想,还是决定要去实习,因为我当时确实很喜欢这个充满活力的团队,虽然很小,但是却维护着中国最大的技术问答网站,相当于程序员的知乎也不为过。我对这种Geek型的公司充满了向往。后来事实证明,我在这家公司实习给我带来的成长确实是巨大的,每一个同事都是如此年轻和优秀,效率非常高,三位创始人也非常开明和富有创新精神,从公司各种各样的钢铁侠手办、涂鸦装饰就能感受到这不足20人的公司的活力。在SF我接触到了docker、redmine等更加先进的工作流,同时因为小公司,我真正参与了不少实际开发工作。


 然而有趣的故事并没有这么结束,SF除了运营技术问答网站,还有个很重要的工作,就是举办开发者大会,我们叫做SFDC(SegmentFault Developer Conference)。

 在我实习期间恰好遇上公司举办一年一度的SFDC,我自然也参与了这次大会的准备工作中,那次大会邀请了互联网行业包括前后端和移动端各种技术大牛同聚一堂,是我们非常用心准备的一次大会。


 在请来的讲师中,就包括了腾讯AlloyTeam(下面简称AT)团队的一位讲师。腾讯AT是腾讯的一个前端团队,我之前就有了解过他们,他们也每年都会举办一次腾讯前端大会,叫做TFC,在举办SFDC的前几天,我在TFC微信群中试探性地问是否还有校招名额,竟然得到了肯定的答复并且马上有人找我要了我网页版简历,第二天我就和AT的一位高级工程师进行了一次长达2小时的电话技术面试,那次说得我口干舌燥,终于成功通过初步面试。在SFDC大会上,我又再次见到AT的另一位工程师,和他进行了深入交流,他得知我有进入AT的想法,鼓励我继续去深圳参加面试。

 恰好我需要回学校拍毕业照,拍毕业照的第二天我就去了深圳,和AT的leader进行最关键的一场面试,结果是振奋人心的,leader对我的技术和对技术的热情都进行了肯定,回想那次面试,谈到我喜欢的项目,我的双眼应该确实是在发光的。另一方面,我也确实有多次参与举办大会的经验,这也是AT看重我的一点吧。总之之后进行了交叉面试、HR面试后,我成功获得了腾讯实习机会,并在那一直实习至今。

 至此故事算是讲完了,但是我知道很多人都想问,那你笔试面试怎么过的啊,都做了什么准备啊,面试官都问了什么啊。别着急,下面我讲一些我总结的经验。

关于简历

 很多人在求职的第一步,写简历上就感到十分困难。首先互联网行业的简历千万不要讲太多废话,比如什么优 秀学生会成员、XX晚会创意奖之类,这些都和你要面试的岗位毫无关系,互联网是残酷而且实在的,花哨的头衔只会招来反感。其他岗位我不太清楚,下面针对技术岗位来说。

 2.实习经历
 介绍你的实习经历,在什么公司做了哪些技术开发的工作,有什么成果。

3.比赛获奖
 如果你是ACM选手拿了什么奖,一定要写上去啦,现在互联网还是很偏爱ACM选手的,因为算法题刷的快代表基础好,基础好代表进了公司学东西快,潜力高。另外,现在经常有一些编程比赛、黑客马拉松、大数据比赛,都可以去参加,没取得成绩也有项目经验嘛,尤其是对于想面试大数据岗位的,BAT尤其是阿里的大数据比赛是非常权威的,也是最接近工业界的大数据实践,一定要把握机会参加。

 4.知识领域
 其实对于岗位要求的基本技术已经不需要做过多的介绍,而应该突出自己最擅长的方向,比如自己特别会Android甚至阅读过Android的源码,或者自己特别喜欢Vue.js框架并且知道原理,可以写上去等面试官来试探你的深浅。

 总之一定要有个人特色的项目或者实习经验,因为如果进了面试,这些就是面试官围绕的话题之一。如果你觉得你在简历上没什么好写的,那么现在就去做项目,就去做实习,做到觉得自己有那个自信的时候,就可以挑战互联网了。

关于笔试

 求职第二关是笔试,目前大部分互联网公司的笔试都是网上笔试,一般是托付给赛码网或者牛客网,因为它们有完善的算法题测验系统。客观题是不允许切换网页的,算法题允许使用自己的IDE,会要求有摄像头设备进行全程监控,否则笔试成绩作废。笔试一般就是测试你的计算机基础知识,下面我大概讲讲如何为笔试做好计算机基础知识的准备。

 虽然我在大学一直都偏爱注重项目实践的专业课,到后期甚至是一直在玩自己的项目或者参加实习,但这并不意味着计算机基础知识不重要,类库、框架是不断更新的,但背后的编程思想永远不会变,所以一定不要忽略了自己校内专业课的学习。公认的对互联网行业十分重要的计算机基础知识有三:计算机系统、计算机网络和算法。


 计算机系统是考验你对计算机从硬件到软件的知识广度,其中重点主要有虚拟内存、进程与线程、进程间通信等等,这方面知识我比较推荐一本书叫做《深入理解计算机系统》,讲的非常全面,个人不太推荐《现代操作系统》,太学术派了我没看下去。另外,一定要了解基本的Linux使用,因为互联网行业几乎所有服务器都在运行Linux,Linux相比Windows运行机制更透明,更优雅,非常适合用来理解计算机系统的设计,使用Linux一定会让你对编程产生更大的兴趣的。


 计算机网络也是互联网相比其他IT行业比较注重的知识领域,毕竟所有互联网企业都是建立在通信基础上的。这一块的重点是TCP/IP协议,也就是OSI七层模型中的网络层和传输层,TCP三次握手简直就是每次面试必问而且问不腻的问题,因为如果要深究下去就能看出一个人对网络协议的掌握基础如何。当然,HTTP协议也是重点,尤其是对于新的HTTPS安全原理和HTTP 2.0的优势必须要有所了解。网络这块还有一道很经典的面试题,即“在浏览器输入google.com回车后都发生了什么?”,网上都有非常详细的解释,这道题充分体现了计算机网络也是涉及到非常多技术又和人们生活息息相关的领域。


 算法并不是让你要有参加ACM比赛的能力,也不是要求你能够研究出创新的算法,而是基本的编程能力的体现,举个简单的例子,DFS和BFS二叉树很多人都知道怎么回事,但能否快速地编写出程序,并且能考虑到各种边界情况,便是考验编程基础的时候了。算法题是笔试题得分占比最大的部分,面试也经常有白板手写算法题的情况。要练算法题可以选择牛客网、赛码网等整理好的分好类的算法题,也可以选择LeetCode去刷(难度在Medium及以下就够了,除非是面试算法工程师职位),这块我觉得真的只有刷题一条途径,如果能在面试中遇到做过的算法类型,很多时候都可以秒掉的,如果碰上没做过的,有时候就算预留一小时你都很难debug成功一道算法题。另外这里有个小技巧就是可以通过数学的举证法蹭分数,因为一般笔试题算法时是通过计算通过率,如果有某些“为0”、“null”的边界情况考虑到直接返回结果,也能拿到几分。

以上三个领域只是对于一般互联网技术岗位的要求,如果是特定的岗位如“大数据工程师”、“算法工程师”、“编程语言研究”等肯定还有对特定领域的更高要求。

关于面试

 一般公司笔试成绩会在一周内出来,然后就会给通过的同学发面试邀请。如果能过了简历关和笔试,说明你已经做的很不错了。

 面试是个大话题,我很难在这里讲清楚,建议可以在网上去找各种大公司的面试经验。一般公司面试会有三轮,第一轮是技术面试,主要考察的是基础技术知识。第二轮一般是你要面试的部门主管了,这一轮会压力比较大,也叫压力面试,因为一般这个主管会是一个经验丰富、在某个领域有所成就的技术大牛,他永远可以把你问倒,但这阶段也可以甄选出真正的人才,如果第二轮过了,一般就不会有被刷的情况。第三轮面试一般就是HR面,会问一些关于个人发展、薪酬要求的问题。不过不同公司的面试都会有所不同,比如我在腾讯的面试经历了五轮(因为暨大不属于目标院校多了个跨部门交叉面试==),并且据说微信的面试有整整十轮...够强可以直接面对张小龙...

第一轮面试
 准备第一轮面试的话,就要分岗位来了,一般会开始问该领域的基础了,比如基于前端领域,就是js的闭包特性、原型链、ES6语法、模块化原理等等,当然对于一线公司,不会这么简单的...总会有各种神奇的问题,有些会基于场景问你解决方案,有些会问你MVVM框架的原理等等。除了领域的基础知识,我前面说的计算机基础知识也是会问的,比如TCP三次握手、进程通信的机制,面向对象语言的特性,另外还可能有手写算法,我面试百度的时候一面是全程手写算法题,可见百度对算法题的重视程度,前端的话可能要求实现一个指定的功能。这一块建议去网上看其他人的面试经验记录,当然也不要太沉迷看面经,面经终究是别人的面经,自己的面试很可能会不一样,但是只要基础够好,一轮面试不会有问题。

第二轮面试
 第二轮面试就会比较难了,也会根据面试官个人风格和每个人擅长领域不同而不同,但总的来说,面试官首先会从你简历上写的项目入手,问你的项目技术选型,为什么这么选择,遇到了哪些困难,获得了怎样的效果,当详细了解了你的项目后,面试官就会基于这个技术点出发问你对这个技术的理解,这个时候如果研究过源码会很有帮助,如果面试官恰好也对这个技术很熟悉,那最好,你们就有得聊了。如果不熟悉,面试官会尝试问其他领域的难题,有时候也会问一些智力题(Google爱问的那些)。我觉得二面虽然难,但也不要过于紧张,要能和面试官聊起来,并且尽量展现出你最擅长的领域和对编程巨大的热情,如果话题自己不太熟悉,就转向自己熟悉的领域。还是可以看看网上其他人的面经,你会发现世界之大,面试官风格也很多,所以有时候运气也很重要。

HR面
 HR面试的话,一般就不会问技术问题了,而是问你为什么喜欢编程,为什么选择毕业工作,为什么想做技术,为什么选择我们公司之类的问题,当然,有时候即使二面通过,之后二面阶段可能出现一个比你更优秀的学生把你刷下去了...就会在HR面告诉你没有通过...

 总的来说,面试阶段其实是比较累的,视频面试还好,但是大多数时候都是要去指定地点面对面交流的,面试密集的几天每天都要在地铁、公交上奔波,并且还要经常总结面试问题,查漏补缺,耗费的不仅是体力还是脑力。很多人技术很厉害,但是面试阶段很难展现自己的实力,这是沟通能力的问题,还是那句话,尽量能和面试官聊起来,即使有时候你觉得面试官的技术点讲错了,也不要过于争辩,面试官挑出来的学生要成为同事的,他希望是一个技术基础扎实同时善于合作的同事,而不是纠结技术细节喜欢争辩的人。另外,多去尝试,面试有时候有运气成分,有时候公司在做的技术方向和你的技术不符,有时候公司不缺人,这并不意味你实力不够,还可以尝试更多公司,面试经验也需要积累,所以大胆地投简历吧。

 最后给这篇文章做一个总结吧,为什么我花了很多笔墨主要写了自己的经历,而后面的所谓面试笔试干货比较少呢,因为我觉得首先网上关于如何过笔试面试的资料其实真的很多,除了我前面所说的“牛客网”、“SegmentFault”,还有很多技术博客都会详细写自己的面试经历和面试别人的经历,我只是给个大概指引。最重要的是,我觉得我之所以从真小白出发,成长到现在这个还算是个开发者的样子,经历了非常多次失败、沮丧,但最终还是拿到了想要的offer,都是因为我是真的喜欢编程才能坚持下来。
前文我也提到当我面对各种失败时,还是没有放弃去找编程的兴趣点,我想强调的是只要是真心对编程充满热爱,就算是现在实力差的非常多,也能通过各种途径进入这个充满活力的行业。比如在保证学校专业课的学习不受影响下,去把眼光放到校外去找机会。我也看过许多并不是计算机专业的人,也通过自己的天分和努力,成功成为了编程行业的一员,我的努力比起他们仍是远远不及的。
编程是一个非常注重持续学习和动手创造的工作,流行的技术每年都在换,但是只要真心热爱编程,就会自然而然地关注最新的技术,就会动手去写自己想要的程序。我很幸运能够参与到这个互联网时代的创造中,IT界在互联网时代已经焕发了新的活力,有越来越多的人才,秉承自由开源的态度,参与到数据世界的创造中,贡献自己的代码和思想。希望你看到这篇文章能有所收回,也能成为其中的一员,享受编程的快乐。