本文内容根据演讲嘉宾分享视频以及PPT整理而成。
全栈这个话题在业界褒贬不一,这个话题在最近两年最火也最受争议。这是因为大家往往觉得全栈工程师什么都懂,但是又什么都不精通,资历比较浅的全栈工程师可能觉得自己什么都会,但是这样就会两头不着好,可能一些后端工程师认为他们会MongoDB、Node.js就可以说自己是全栈了。前端工程师则会认为后端工程师不好好写Java,用一些Angular或者Bootstrap的模板就号称是全栈了;在前端领域呢有时候也会认为自己内部出了叛徒,一个前端工程师页面切好了吗?组件做好了吗?就去搞全栈。所以本次就与大家一起聊一聊全栈这个话题。
首先自我介绍一下,我的花名叫做行剑,毕业于大连海事大学,本科是通信工程专业,研究生是交通运输工程专业,大家可以看到这两个专业其实与互联网没有太大的关系,属于比较传统的行业,尤其是交通运输工程在大连海事大学是与海相关的,主要研究的是船舶的交通运输。我的实习一开始是在阿里巴巴的B2B团队,后来又转到了阿里云做前端工程师。
不知道大家对于大连海事大学有没有了解,世界上有两所学校上课都是黑漆漆的一片,一所是霍格沃兹魔方学校,另一所就是大连海事大学。相比于其他院校,大连海事的上课以及日常要求更加严格一些,那么我是如何在这样一个非985、半军管、非计算机专业下的成长为前端技术工程师的呢?这也是本次想要分享的内容。
首先分享一下我大学期间的整体脉络,在刚进入学校的时候自己还是一个互联网小白,基本上什么都不知道,只会一点Office。真正改变我的是在大一的时候我参与了技术社团的招新,其实在进入技术社团之前自己对于技术一点都不了解,面试的时候问到了电脑和显示器,这个我都知道,但是当问到CPU时就真的不知道了。当时并不知道电脑里有CPU、主板、显卡这些东西,只知道电脑能够上网,能够做Word这样的东西。但是进入到社团里对于我自己而言就是一个巨大的改变,我开始一步步地走向了计算机的环境中。在大二的时候,我开始接触编程,因为之前大一的时候是在硬件部,在硬件部就负责一些与硬件相关的工作,负责社团计算机的维护、网络的布置、帮助同学重装系统、解决系统问题、笔记本电脑清灰等这些问题,但是这些问题与社团正真需要做的东西有点远,社团最主要的工作是帮助学校做一些网站或者小的工具等。当有这样的机会时我也会有很多的想法想要与大家一起交流,但是大一在硬件部我的一些想法往往不被采纳,我有想法但是可能与技术相隔着一段距离,不一定被采纳,所以这时候就在想如何将心里的想法变成现实,于是就转到了社团中与代码相关的部门,当时还叫做美工部。
一步步走来之后再回想起来,其实不一定必须在开始时将所有问题都想清楚,大学里同一个人每一年的想法都是有很大变化的,所以只要有想法就是好的,即使中途会有所转变,只要沿着自己的想法走下去就是好的。在大三的时候,我在一个*美院的朋友的带领下接触了智能硬件、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的时候就在知乎、*甚至是微博上一点点去搜集相关资料的,所以将一整套设备做出来其实是对于我的历练,这个项目也是到目前为止我参与的比较复杂的项目之一。
如果未来想成为一名工程师,其实最本质上我们是人,第二个层次是工程师,第三个层次才是细分领域的工程师,我们不应该因为细分领域就变得缩手缩脚,而是在工程师这个领域内去思考如何通过技术手段解决生活中遇到的问题。
在我心目中好的全栈工程师应有如下的素质:
- 快速的项目介入和上手能力。
- 精准的技术选型能力。可能需要在能够看到很多的技术里最快地发现和分析出什么技术更适合并且能够给团队以强大的支撑。
- 强大的问题划分能力和解决能力。
- 优秀的代码质量。无论是前端还是后端都需要有优秀的基本功,代码是最基本的能力。
- 良好的补位意识和团队意识。全栈也不是一个人孤军奋战,也是需要与团队成员一起合作的,互相帮助,互相补位。
对于全栈工程师而言,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。
以上这些就是通过我自己大学阶段的积累对于全栈工程师能够在未来占据一席之地的理解。可能通过这些,大家认为全栈工程师比较有意思,所以也会比较向往成为全栈工程师,但是我认为并不是所有人都要成为全栈工程师,这应该是未来的发展方向之一。与全栈工程师对立的发展方向就是专家,专家能够解决内在问题,而全栈工程师则是从外在地去解决问题。比如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,而应该体现出自己完整的技术思考过程和相互之间组织的能力。
最后送给大家三个校招锦囊。
锦囊1: 了解阿里云产品
锦囊2: 在阿里云上进行实践
锦囊3: 关注云栖社区
第三个锦囊就是关注云栖社区这样的开发者社区,通过云栖社区可以与大咖直接近距离互动,了解技术最新前沿的方向。