全栈新兵成长记,附赠校招三大锦囊

摘要:十余载寒窗,一朝迈入社会,翘首以盼中结束的学生生涯往往也是纠结的开始:目光转向同学斩获的各种offer,两手空空的不甘与无奈谁人能懂;带着欢快的心情走向工作岗位,竞争的激烈却让自己处处碰壁。在云栖社区与云翼计划联合主办的《首届互联网新兵进阶在线峰会》上,阿里云前端开发工程师行剑介绍了自己在校园技术类社团成长和活动的经历,并给校招中的同学提供了三个必备锦囊。

本文内容根据演讲嘉宾分享视频以及PPT整理而成。

全栈这个话题在业界褒贬不一,这个话题在最近两年最火也最受争议。这是因为大家往往觉得全栈工程师什么都懂,但是又什么都不精通,资历比较浅的全栈工程师可能觉得自己什么都会,但是这样就会两头不着好,可能一些后端工程师认为他们会MongoDB、Node.js就可以说自己是全栈了。前端工程师则会认为后端工程师不好好写Java,用一些Angular或者Bootstrap的模板就号称是全栈了;在前端领域呢有时候也会认为自己内部出了叛徒,一个前端工程师页面切好了吗?组件做好了吗?就去搞全栈。所以本次就与大家一起聊一聊全栈这个话题。

首先自我介绍一下,我的花名叫做行剑,毕业于大连海事大学,本科是通信工程专业,研究生是交通运输工程专业,大家可以看到这两个专业其实与互联网没有太大的关系,属于比较传统的行业,尤其是交通运输工程在大连海事大学是与海相关的,主要研究的是船舶的交通运输。我的实习一开始是在阿里巴巴的B2B团队,后来又转到了阿里云做前端工程师。

不知道大家对于大连海事大学有没有了解,世界上有两所学校上课都是黑漆漆的一片,一所是霍格沃兹魔方学校,另一所就是大连海事大学。相比于其他院校,大连海事的上课以及日常要求更加严格一些,那么我是如何在这样一个非985、半军管、非计算机专业下的成长为前端技术工程师的呢?这也是本次想要分享的内容。
全栈新兵成长记,附赠校招三大锦囊
可能很多同学认为自己没有一个很好的学校,不是985、211,甚至只是一个二本院校,而且自己的学校也没有一个很好的互联网氛围,并且自己的专业也不是计算机,但是却想要从事互联网行业,这应该如何实现呢?也希望通过本次的分享能够对大家有所帮助。

首先分享一下我大学期间的整体脉络,在刚进入学校的时候自己还是一个互联网小白,基本上什么都不知道,只会一点Office。真正改变我的是在大一的时候我参与了技术社团的招新,其实在进入技术社团之前自己对于技术一点都不了解,面试的时候问到了电脑和显示器,这个我都知道,但是当问到CPU时就真的不知道了。当时并不知道电脑里有CPU、主板、显卡这些东西,只知道电脑能够上网,能够做Word这样的东西。但是进入到社团里对于我自己而言就是一个巨大的改变,我开始一步步地走向了计算机的环境中。在大二的时候,我开始接触编程,因为之前大一的时候是在硬件部,在硬件部就负责一些与硬件相关的工作,负责社团计算机的维护、网络的布置、帮助同学重装系统、解决系统问题、笔记本电脑清灰等这些问题,但是这些问题与社团正真需要做的东西有点远,社团最主要的工作是帮助学校做一些网站或者小的工具等。当有这样的机会时我也会有很多的想法想要与大家一起交流,但是大一在硬件部我的一些想法往往不被采纳,我有想法但是可能与技术相隔着一段距离,不一定被采纳,所以这时候就在想如何将心里的想法变成现实,于是就转到了社团中与代码相关的部门,当时还叫做美工部。
全栈新兵成长记,附赠校招三大锦囊
当时的互联网状态和现在还不一样,那个时候最火热的是人人网,甚至那个时候大家基本上还都不知道Android,只有一部分同学知道iPhone,在那个时候也没有什么小米、锤子这些手机,大家基本上都是使用的是诺基亚。因为当时并不知道互联网会发展成今天这样,所以当时社团里面还叫做美工部,当时的技术栈使用的是Flex,可能很多同学也不知道,这是与Adobe的Flash一脉相传的技术栈。当时并没有想到网页是怎么做的、淘宝网是什么、如何在淘宝上买东西、电商是什么,刚进入大学并没有考虑这些,甚至只知道有一些人是编程的,但是根本分不清什么是前端和后端,也没想到未来会从事相关的职业。

一步步走来之后再回想起来,其实不一定必须在开始时将所有问题都想清楚,大学里同一个人每一年的想法都是有很大变化的,所以只要有想法就是好的,即使中途会有所转变,只要沿着自己的想法走下去就是好的。在大三的时候,我在一个*美院的朋友的带领下接触了智能硬件、Arduino以及Processing。其实大二期间相当于在社团里做了一些产品,在大三的时候就觉得未来可能是物联网的时代,所以就接触了一些智能硬件,物联网可以说就是将现实中的感觉、触觉搬到互联网上去做分析和研究,所以当时就接触了Arduino这种智能硬件的东西。可能大学期间的每一步与每一步之间都没有太多的联系和目的性,就是单纯地认为这个事情比较好玩,所以需要尝试一下。到了大三很多同学就开始找工作了,我当时并没有太多的想法,只是想将自己心目中想做的事情做好了,构想未来产品是什么的样子就去尝试一下。真正让我踏入前端大门的时机就是大三暑假的机会,学校的一个老师想找社团进行合作去做一个航海通信模拟器用做教学设备,这时候因为之前使用Flex做过一个版本,但是Flash以及渐渐日薄西山了,所以希望将之前的Flex模式搬到普通的浏览器上,而不再需要Flash沙盒了。也正是因为这个契机,我开始真正地接触到前端和互联网这些东西。

下图就是我们在大三时做的船舶通讯设备模拟器,当时使用的技术栈是MEAN,也就是MongoDB + Express + Arduino + Node.js这样一个典型的全栈环境。这个相当于是船上的通讯设备的模拟器,这样的模拟器在网站中总共实现了7个,因为在真正将现实的东西进行模拟的时候就会涉及到非常复杂的数据环境。下图的模拟器就需要有时间的数据、经纬度数据、入网洋区的数据,在业务领域中有信息的收发、报警、出入网、设置等等。最开始技术栈想使用jQuery,但是因为它是命令式的,并且很多的命令都是相互交叉的,不同设备之间的命令、同一个设备不同页面之间的命令都是相互交叉的,所以就会造成比较混乱的情况,所以我们想要对它进行隔离,使得每个设备之间有自己的环境,但是想的方法是使用iframe实现数据隔离,但是正是因为iframe对于数据隔离的太好了,一些公用的数据之间的交互反而变得复杂了。比如在这里会使用到经纬度的数据,无论船只开到哪里都需要这个经纬度,而且对于经纬度而言,每个设备都是一样的,但是由于iframe的隔离性使得数据的流通性不是很好,所以当时我就在思考如何将iframe这一层去掉,后来发现了Angular,通过Angular的MVC或者MVVM这样的数据模型的组织可以实现路由隔离、数据隔离、视图隔离以及组件隔离。2014年的时候的前端环境和现在也不同,当时还只是一部分了解Angular,我当时了解Angular也是比较吃力的,是一点点看下去的,因为没有太多资料,甚至当时Angular还处于普及的阶段,所以当时学习Angular的时候就在知乎、*甚至是微博上一点点去搜集相关资料的,所以将一整套设备做出来其实是对于我的历练,这个项目也是到目前为止我参与的比较复杂的项目之一。
全栈新兵成长记,附赠校招三大锦囊
下面这张图是我在大三的时候做的一个物联网相关的项目,主要是通过手机来遥控小车,在小车上装上不同的传感器,将传感器上的数据再传输到平板上进行可视化的展现。我相信未来的发展趋势就是将线上和线下进行有机的结合,不光是微博数据、分享的数据以及图像照片等,更多的是真实数据感受的触及搬到互联网上进行线上和线下的融合,也就想大家现在经常说的IOT。当时我也不知道自己未来要做的是什么,但是觉得自己做的事情非常有意思,可能是未来的方向,所以应该进行尝试,之前也不一定有这一方面的技术,但是就是去学习、去思考、去一点点积累,最后完成了这个项目。也没有参加太多的比赛,只是对自己有一个答案,给自己一个自豪感,也没有太多功利的想法,我的大学生活更多的是好玩、有意思,对于一个东西有想法要尝试做出来,不一定是未来我要去哪家公司或者一定要去做什么。
全栈新兵成长记,附赠校招三大锦囊
下面这张图是我整个大学期间接触的技术栈,最核心的当然是前端技术栈,当我真正地做完了航海模拟器的项目之后就学会如何组织前端工程,如何组织前端细节的东西,所以我在前端部分投入了比较多的精力深入技术。当然周围也会涉及到很多的技术栈,比如MySQL、MongoDB、HBase这些不同层面的数据存储技术、大二时开始接触的AI、Flex、项目持续集成和部署的工程化想法CI/CD、Spark、Python以及机器学习。这些大数据、机器学习偏向于学术层面,可能与未来我所从事的职业没有太大关系,但是这些也锻炼了自己的自我学习能力,学会了如何学习,还有就是Docker和Kubernets,这也是当时室友介绍给我的,其实从自己第一次了解Docker到真正地去使用Docker之间是存在一个非常长的时间跨度的,中间可能也是一点头绪都没,但是随着一点点接触和学习最后对于Docker的技术栈也有了深刻的了解。我还了解了Arduino、开源硬件、IOT、Openstack私有云方案以及Spring MVC、Mybatis等Java的方案,当我学完Node.js后发现它在领域层面和模型层面控制的比较弱,但是我认为Java更为严谨,细节也更加丰富,也希望通过对于Java的学习对于Node.js的学习进行反哺,将Java的一些思路引入到Node.js中去,并且我也发现确实有一些人也在做这样的事情,比如Angularjs中使用到的依赖注入,将Java的一些思路引入到了前端。另外,我在部署Openstack的时候也接触到了一些关于网络的技术,比如像交换机以及路由等这些方案。也就是说我的整个技术栈零零散散的非常多,也不是比较有目的性的,只是说这件事情非常有意思可能就回去尝试一下,最后找出一个答案,总体而言自己还是在前端方面投入的精力最多。
全栈新兵成长记,附赠校招三大锦囊
总结一下校园时光,最主要的是遇到了一帮志同道合的伙伴,真实的社团就是非常单纯的和快乐的,这样的技术社团和学校的学生会或者其他社团不同,而是非常单纯,在里面也不分部长之类的,只是一群单纯的人在一起搞技术,而且可能也不会像现在的一些技术社团在开始的出发点就是要创业,当时并没有这样的想法。在社团里大家都是做自己感兴趣的东西,只是觉得这个很有趣,可以在学校里通过技术手段帮助大家。第二点就是兴趣驱动,兴趣是一个人最好的老师,这是没有功利性的。第三点就是大学时光培养了自己分析问题和自主学习的能力,遇到问题的时候需要通过什么方式去参考别人的解决方案,所想的是这个问题究竟应该如何解决,而不是这个问题能够让我到达什么样的高度。最后这一系列的东西,水到渠成,当我真正走进前端、学习前端的时候,因为有了分析问题和解决问题的能力,所以学习起来也会非常快。
全栈新兵成长记,附赠校招三大锦囊
因为经常看到很多同学有如下这样的困惑,所以就在知乎上挑选了几条进行回答。
全栈新兵成长记,附赠校招三大锦囊
通过我自身的经历想要告诉大家,没有必要在大二或者大一的时候就去想如何做一个细分的领域,或者就是前端。只要是跟随自己的兴趣,思考要把什么事情做得更好,这才是最重要的。如果你想要把一件事情做好的话,最后的结果肯定是能够做好的。

如果未来想成为一名工程师,其实最本质上我们是人,第二个层次是工程师,第三个层次才是细分领域的工程师,我们不应该因为细分领域就变得缩手缩脚,而是在工程师这个领域内去思考如何通过技术手段解决生活中遇到的问题。
全栈新兵成长记,附赠校招三大锦囊
谈完了我自身的一些经历,我们再将问题转回到全栈上来。到底什么是全栈?全栈的意义真的是将设计、后台开发、前端开发、移动开发、运营维护、PS、文案等都交给一个人去做么?我觉得并不是这样的,全栈的目的是在遇到问题时尝试着使用学习的方式解决它,这才是全栈最本质上的意义。
全栈新兵成长记,附赠校招三大锦囊
在这里希望用其他的东西做对比来帮助大家加深对于全栈的理解,下图展现的是汽车领域的例子。早期的汽车是通过手工作坊生产的,可能一个小家庭就是汽车的小生产车间,一个人就可以完成汽车整体设计以及生产;而到了工业化时代,我们就将人进行了细分,就好像卓别林的《大时代》里面那样,每个工人就拧一下螺丝,每个人负责自己细分的领域;而真正到了现代,由于技术的发展所以有回归到人本质的东西,比如现代化的汽车生产车间里,通过外骨骼的技术、机器人技术可能仅仅需要一个人就可以组装车里的大部分零件,又回到了一个人的生产,但是通过技术的手段丰富了生产能力。
全栈新兵成长记,附赠校招三大锦囊
那我们回到互联网和工程的领域再思考这个问题。在早期的时候,程序员基本上都是“全栈”的,每一个站长都是全栈工程师,每一个站群的站长都是超级全栈工程师。随着互联网的发展,为了应对不同的挑战,不同的方向都需要花费大量的时间精力解决问题,岗位细分是必然的。相信在未来,随着多种支撑技术发展,如云计算等,将程序员从一部分繁重重复的体力活中解放出来,更关注编程最本质的目的就是如何使世界更美好,这就是全栈工程师的最终宿命与终极追求就是如何解决生活中的问题,而生活中的问题不是一个个Scope限定死的,可能这里问题中有前端的,可能由后端的,可能有数据分析的,而最终的目的是解决问题,所以可能需要跨领域地进行学习和解决问题。

在我心目中好的全栈工程师应有如下的素质:
  1. 快速的项目介入和上手能力。
  2. 精准的技术选型能力。可能需要在能够看到很多的技术里最快地发现和分析出什么技术更适合并且能够给团队以强大的支撑。
  3. 强大的问题划分能力和解决能力。
  4. 优秀的代码质量。无论是前端还是后端都需要有优秀的基本功,代码是最基本的能力。
  5. 良好的补位意识和团队意识。全栈也不是一个人孤军奋战,也是需要与团队成员一起合作的,互相帮助,互相补位。
以上这五条就是全栈工程师需要的素质,也是未来工程师需要的素质,需要能够Hold住整个团队,带领整个团队前进。

对于全栈工程师而言,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。

以上这些就是通过我自己大学阶段的积累对于全栈工程师能够在未来占据一席之地的理解。可能通过这些,大家认为全栈工程师比较有意思,所以也会比较向往成为全栈工程师,但是我认为并不是所有人都要成为全栈工程师,这应该是未来的发展方向之一。与全栈工程师对立的发展方向就是专家,专家能够解决内在问题,而全栈工程师则是从外在地去解决问题。比如AngularJS明显就是从外面,从Java的思考方式去解决前端的问题。人最本质的天性往往是不同的,有的人天生就适合成为专家,有的人天生就适合向外思考扩展方式。所以我们并不一定就是要成为专家或者全栈工程师,而是应该跟着自己的想法走,跟着自己的天性去走。
全栈新兵成长记,附赠校招三大锦囊

关于校招
现在也是校招的季节,所以也在这里和大家分享一下关于校招的话题,希望能够对于大家的校招有所帮助。首先总结了几个校招小贴士:
全栈新兵成长记,附赠校招三大锦囊
第一点在校招面试的时候最重要的就是积累,如果你没有积累一些其他的技巧或者方法,成长都是无从谈起的,这些积累都是来自于你日日夜夜对于代码或者源码的分析,去做工程或者项目以及上课的学习、考试以及与同学的交流中一点点积累的。第二点比较重要的就是要有一个干净而又清晰的简历。还有一点就是我们在面试的时候也要尝试去引导面试官。除此之外,心态也非常重要,这三点在后面也会进行详细分享。

首先对于简历而言,简历尽可能简单干净,要有节奏感,主次分明,就是什么东西是你最希望给面试官或者未来的老大去看的,就要将这些重点去写,对于那些你觉得可能并不重要的,可能就可以分层次去写。而且简历尽可能在一页的范围之内,有的同学写简历将自己想写的内容都写了,一共三四页的内容,其实应该在简历中挑选出自己最想表达的东西。在简历中要有明确的可靠的联系方式,方便面试官和HR在第一时间联系到你。对于第二部分学历情况可以使用两句话概括,本科毕业哪里,研究生毕业于哪里,如果想要告诉面试官自己的学校情况,也可以简单地去写,不需要过于啰嗦,在这里也建议大家不要和面试官耍一些小心眼,比如学校不是特别好就一笔带过,其实完全可以将最本质的自己展示出来,每个人总归会找到属于自己的归宿和方向。第三部分一般是项目经验,这部分可以突出分几个项目进行描述,但是在突出的同时也应该划分主次,最主要的项目放在最前面,后面是稍微次要的项目,在每个项目中也应该介绍技术背景、人员情况以及如何进行技术选型的、技术选型的思考以及在技术选型之上当项目完结之后对于项目的思考和改进等,也就是说每个项目不应该是简单地介绍使用了哪些技术,而是立体性地解释自己思考的过程。第四部分应该是对于自己技术栈的总结,很多人都会在这里使用大量的篇幅,但是我认为对于这部分只需要简单地进行罗列,面试官真正想要了解的时候会在面试或者笔试中了解。最后一部分是对于自己的评价,其实自我评价也很重要,在这部分表现自己能力的时候可以使用实例辅助来证明,比如在哪些方面体现了自己的团队合作能力。
全栈新兵成长记,附赠校招三大锦囊
我在自己的简历里大致是这么写的:
  • 对技术有执着的追求。熟悉前端基本技术,对angular,react,vue等流行框架有深入完整的实践。有较强的前端工程架构和组织能力。
  • 有一定的技术视野。并不把自己局限在某个细小的领域,了解后端业务,
  • 了解基本的Linux命令及运维技巧。
  • 有很强的业务逻辑抽象的能力,在项目中追求系统化,模块化,工程化。
  • 善于发现系统的弱点,并有能动性去改变缺陷。以追求系统的健壮性为终极目标。
  • 在开发中一贯遵从代码格式规范,能够通过Git进行版本控制。
  • 有很强的表达能力,在技术社团中经常进行新生培训。经常参加各种线下技术交流活动。并有机会在200人的学校技术交流上进行主题演讲。有很强的团队精神,有良好的组织和协调能力。

在面试中也要尝试去引导面试官,我在自己的阿里的二面的时候,技术面试官问了我关于Cookie的问题,在我讲Cookie的时候,肯定是去讲Cookie在每一次请求的时候都会把信息带给后端,而且现在的互联网架构后端一般都是无状态的东西。想要让面试官记住你就需要将面试官往自己已知的方向上带,与Cookie相像的还有Session的概念,这时候面试官可能就会说那你去讲讲Session吧,哪里会使用到Session,可能在登录的时候,将用户的信息存储到Session上,在使用Session的时候应该注意哪些问题,如何存储、如何更新以及多长时间失效等问题,以及进程与进程之间的Session如何共享,我们知道可以通过外部的存储机制比如Redis或者MongoDB去共享Session,就是在技术面试官问你1的时候,你能不能提出一串来去展现出技术的完整性。当将技术面试官的思路引向了登录之后,面试官就可能会问关于登录你知道什么,我说我知道最基本的登录方式,比如使用POST,即使使用了POST也会是以明码的方式,可能可以进行一些编码,但是这些编码可能在前端也是透明的,更好的方式应该是使用HTTPS来避免一些中间人的攻击,讲到这里也可以往HTTP2这个协议上去带,以及HTTP、HTTP2和HTTPS这些协议之间有什么区别,以及HTTP2未来的发展方向是什么。我们与面试官之间应该是一种交流而不应该是面试官问你1就回答1,问2就回答2,而应该体现出自己完整的技术思考过程和相互之间组织的能力。
全栈新兵成长记,附赠校招三大锦囊
除此之外,心态也很重要,很多同学在面试的时候就会整日惶惶不可终日。所以在这里送给大家三句话:第一句话是“但行好事,莫问前程”,只要做好了自己,最后的结果怎样不一定要太关心,只要做好了自己要做的东西,最后就会有一个令自己满意的结果,所以在面试里也应该有这样的心态。第二句话就是“行至水穷处,坐看云起时”,有的同学从三月份开始参与实习校招的面试到九月份可能一直都没有得到自己想要的公司的垂青,这时就可能认为自己不行了,找不到工作了,这时候越到自己压力最大的时候就越应该云淡风轻地去看,从自己身边的例子来看就是很多同学真正觉得自己不行的时候就会出现一个惊喜。最后一句话就是引用了《哈利波特》里面的一句话“不是你选择了魔杖,而是魔杖选择了你”,有时候我们觉得我们一定要去哪家公司,其实这是一个双向选择的过程,不仅仅是公司选择了你也是你选择了公司,校招这件事就是一个很有缘分的事情,因为缘分可能并不是你一定要去什么BAT或者什么所谓的大公司,其实可能找到一个更适合自己成长发展的。在我自己面试的时候根本没有想到会去阿里这样的公司,但是自己之前从来没有考虑过,所以校招是一个双向选择的过程,所以需要去找到最适合自己的。
全栈新兵成长记,附赠校招三大锦囊

最后送给大家三个校招锦囊。


锦囊1: 了解阿里云产品

全栈新兵成长记,附赠校招三大锦囊
在这里并不是刻意地给自家的产品打广告,而是通过学习这些产品的确能够让我们受益。其实对于很多云产品的设计的学习中就能够发现这些知识往往是书本上延伸不到的东西,是外在的能够辅助我们对于学校里知识的学习,举个例子就是企业版三节点的MySQL是什么样的机制,采用了什么样的BeanLog同步机制,阿里云上的MySQL的读写分离是如何实现的、主从复制是如何实现的等,当你和面试官去聊你了解数据库的时候,只是和面试官讲你会学校教的那些,会建数据库,其实可以和面试官聊一聊建数据库的时候应该考虑什么,怎么实现可靠性和高可用性,如何使用读写分析提升MySQL的性能。很多同学会写Java,那么有没有尝试在阿里云这样的分布式环境下比如EDAS下如何写Java,再比如想了解Docker,那么Docker中涉及的服务编排的概念是什么,高可用的概念是什么,持续集成的概念是什么,这些都是可以在于面试官沟通交流的时候进行旁敲侧击去聊的,这说明你对于这些都有所思考,面试官就会感觉这就说明你的知识不是一个单纯的培训机构出来的速成的体系,而是真的对于技术有深刻的思考和积累,比如现在一些研究生也在学习深度学习,其实在阿里云上也有分布式的机器学习方案PAI,那如何将学校里学习的学术性的东西与工业界的东西相结合,如何将学术界的东西反哺到工业界,这也是可以对面试官进行展示的,也就是可以通过产品来学习。我通过产品进行学习的最主要方式就是读文档,很多文档往往读了很多遍,但是每次阅读也都有很大的提升。

锦囊2: 在阿里云上进行实践

全栈新兵成长记,附赠校招三大锦囊
这里有两个实践的方式,第一个是完成学生认证,参加云翼计划,享受9.9每月的学生优惠,可以以此搭建一下自己的博客,这样给面试官看的时候就不光是自己的描述了,也可以给面试官看自己的动手实践能力。另外,目前阿里云还提供了个人免费套餐,7款热门产品6个月的免费使用,这样能够帮助大家进行完整的实践,这样就可以在面试的时候与面试官分享整个的实践过程。

锦囊3: 关注云栖社区
全栈新兵成长记,附赠校招三大锦囊

第三个锦囊就是关注云栖社区这样的开发者社区,通过云栖社区可以与大咖直接近距离互动,了解技术最新前沿的方向。

全栈新兵成长记,附赠校招三大锦囊

通过这样的技术的学习、实践和交流形成闭环,这样就能使得在知识掌握上更加立体,在面试的时候也会让面试官感觉到自己不是扁平化的而是立体的,这样也更容易得到面试官的青睐。

上一篇:不想当“乖宝”的新人设计师是怎么成为独角兽的


下一篇:分布式存储系统