全栈修炼之路,很漫长…

虽然目前并没有对全栈工程师有一个具体的定义,不知道自己是否合格。

大势所趋的全栈开发。首先你能够配置全站开发的环境和工作流程,操作数据库,建立后端服务API,独立开发前端,从而开发一个包含前后端的完整应用,再进行测试和部署,直至产品正式上线。

全栈开发是所有Web开发者的终极梦想,无论你现在是前端开发还是后端开发。并且随着大量开发者的涌入,前端和后端岗位都面临者激烈的竞争,全栈已经不是加分项,越来越成为必须项。

全栈修炼之路,很漫长…_第1张图片

终极指南

全栈 Web 开发人员是能够工作在应用程序的前端和后端的开发人员。前端通常是指应用程序中用户将看到或交互的部分,后端是应用程序中处理逻辑、数据库交互、用户认证、服务器配置的部分。全栈开发并不意味着你已经掌握了前端和后端工作所需的一切,而是意味着你可以在双端工作并理解构建应用程序时发生的情况。

在Web与软件开发的世界中有3个基本的关注点:前端、后端与全栈。我们先来看一下他们的含义。

全栈修炼之路,很漫长…_第2张图片

何为全栈工程师?

前端工程师:

在打开一个网站时,屏幕上的一切都属于前端。前端工程师负责创建用户界面背后的代码。这些工程师不仅要熟悉HTML、Java与CSS,还要掌握很多框架。这些框架有Foundation、Angular JS、Ember JS、Backbone及Bootstrap等等。前端工程师要与设计师和其他专家协同工作,从而将网站从模型转换为可使用的模式。

后端工程师:

在你每天所访问的网站背后有服务器网络、数据库以及各种应用,他们相互协作将你所请求的网页与数据传递给你。后端工程师负责构建这些组件。

他们要擅长各种编程语言,如Python、.Net、Ruby、Java及PHP等等,从而通过这些语言来编写程序。他们还需要使用各种数据库程序如MySQL、SQL Server及Oracle等来操纵信息并将其传递给最终用户。后端工程师需要与组织中的各种经理及其他成员通力配合来完成工作。

全栈工程师:

全栈工程师既要了解后端开发,也要了解前端开发。他们是“全方位”的工程师,熟悉服务端的同时又懂客户端用户体验。全栈工程师理解Web开发进程的每一个方面,同时又会就整体策略与最佳实践对相关干系人提出建议与指导。

角色演变

在早期的桌面计算时代,我们常常会看到一个人就完成了整个应用的开发工作。随着程序变得越来越复杂,以及越来越多的技术涌现了出来,一个人很难再完全掌控应用开发的各个方面。

在21世纪初期,一些拥有专业化技能的专家开始出现。由于复杂性的持续攀升,当Web 2.0站点开始出现时,很多程序员又回到了更简单的方式上来。相比于构建复杂的数据库和企业计算网络,开发者开始部署稳定的LAMP栈(Linux、Apache、MySQL与PHP),并创建出了灵活的面向对象语言,如Django与Ruby on Rails。在这种环境下,全栈工程师的价值变得越来越大,因为他们熟悉大多数现代框架与语言。

运维复杂性的回归

不过,由于移动计算与iOS和Android平台的兴起,我们又回到了复杂性的新时代:低成本的云服务器如Amazon Web Services和微软的Azure、MongoDB等数据库、Node.js与Angular.js等前端技术、Docker等容器技术。这些平台、服务与框架都拥有自身的特性。因此,一个人几乎无法成为能够掌握所有技术的全栈工程师。

通才与专才

在当前的环境下,成为全栈工程师的好处在于没多少人拥有足够的知识、经验与沟通能力来整体把控使用了各种平台与框架的项目,如HTML5、机器学习及Scala等。因此,高水准的全栈工程师总是供不应求的。

不过,坏处则在于对于全栈工程师来说,他需要能够熟练掌握这些组件,但这是非常困难的事情,况且未来还会有新的技术涌现出来。你可能很聪明,但这些组件本身却是非常复杂的,每几个月都会出现新的语言和平台。要想时刻保持技术上的领先是一件极其困难的事情。出于这个原因,专才拥有自己独特的优势。组织倾向于雇佣专门的角色,因此相比于其他开发者来说,专才在深层次的知识以及某个狭窄领域的经验上会更胜一筹。

全栈工程师的前景

无论选择在前端还是后端进行深入学习,抑或是将自己定位成一个全栈的通才,从工作前景上来看都是好的。以北京为例,2017年北京全栈工程师的平均收入为20K,但是仍有75%的用户觉得此数据偏低。

从简单的雏形到完美的成品,全栈工程师通常被认为是万能多面手,那全栈工程师到底做什么呢?

全栈修炼之路,很漫长…_第3张图片

全栈修炼之路,很漫长…_第4张图片

全栈工程师需要哪些技能

为了在激烈的市场竞争中占据一席之地,全栈工程师需要不断学习各方面技能,主要包含以下方面:

服务器管理/DevOps

程序员必须具备基本的服务器管理能力,包括并不限于以下知识:

1.在非GUI环境中,通过终端连接远程服务器2.会写Shell脚本编程3.服务器上的用户和群组管理4.管理Apache和Nginx等服务器程序来提供应用5.管理防火墙和权限6.安装及更新软件

除了这些基本功,程序员还需要懂得如何通过Docker或虚拟机来创建完善的、运行良好的独立开发环境;以及熟练操作版本控制系统,以便可靠地生成备份和可共享的协作代码库,来根据时间追踪代码变化。

云端/Cloud

除了物理服务器与虚拟服务器外,全栈工程师还需要了解云端,例如Google Cloud、Azure、AWS等。

虽然很多工具或平台可能不会立即应用,但长远看来,熟悉每个人都在讨论的服务可能会派上大用途,客户可能随时要求更换服务端,所以需要早做准备。

全栈修炼之路,很漫长…_第5张图片

全栈修炼之路,很漫长…_第6张图片

(未来可能出现Serverless无服务器端,直接租用计算和函数即可实现各种应用)

后端/Back-end

除了需懂得选择哪种语言,还应该熟悉:

1.与运维紧密相关的Web服务器,如Nginx和Apache2.NodeJS会将Java,CSS编译为静态文件,用PHP可以避免NodeJS的问题3.依赖管理工具的使用,比如PHP中的Composer4.良好的API设计,当前大多数网站是基于API的,很少有独立的前端交互5.对性能提高非常重要的搜索引擎使用6.用Gearman类工具,Crunz等库进行Cronjobs及后台作业7.缓存技术非常重要,使用Varnish,Redis或其他工具分片存储数据

后端语言比较

后端语言是前端跨向全栈最大的一个障碍,也是必须拿下的障碍。不像前端Javascript独霸天下,后端语言是百家争鸣:PHP、Python、Ruby on rails、Node.js等脚本型语言,也有Java、C#(.net)等重量级语言,也有的Go、Erlang等。语言无所谓好坏,有各自的风格和适用范围。

没有哪种语言绝对的好或者差,具体要看公司的业务和自己的偏好,最重要的在于你怎么运用它。正所谓弱水三千,只取一瓢饮,后端语言千千万,选择一门先学好,比那个都懂一点要强很多——贪多嚼不烂。

数据库/Database

除了需掌握架构稳定的关系型数据库,如MySQL , PostgreSQL,一个全栈工程师还应该对非关系型数据库熟练应用,如MongoDB, Redis, Cassandra,更不用说Neo4j这样的图形数据库了。

数据库是在服务器上的,需要全栈工程师的控制,同时也存在远程解决方案,比如Mongo类的RestDB或Google的Firebase等。

前端/Front-end

说到前端,技术栈可能比较混乱。作为一个全栈工程师,你需要了解:

1.NodeJS和 NPM2.Yarn3.预处理器和编译器(如Babel),用来编译 Type, ES6, LESS, SCSS, SaSS4.构建和任务执行工具,如 Grunt和 Gulp5.框架,如 VueJS、React、Angular6.模块打包工具,如 Webpack、Browserify、Rollup

设计/Design/UI/Web交互

开发者需要知道产品在转为可用的HTML、CSS代码前应如何画原型,然后用Java进行交互,在后端用虚拟数据做模拟测试,只有当原型图完成,用户体验和交互界面设计完成,产品才可以开始真正的开发。所以设计本身就是非常巨大的挑战,需要使用一套特殊工具:

1.Photoshop ,Illustrator或一些开源工具如 Gimp , Inkscape等。2.好用、快速的编辑器,比如 Atom或 Sublime Text3.背景选择器,如Subtlepatterns和匹配颜色的颜色选择器4.CSS的栅格系统5.用于Java模拟的相关知识6.把原型图放到网上供用户查看和反馈的方式,比如Ngrok

日志

为了有效的监控应用的健康度,开发者需要追踪错误,找到这些日志并找出其中有价值的信息,还需要预测一些趋势,比如需要注意CPU及I/O占用率的上涨,以防服务器突然崩溃。这些和运维有一定联系,也需要掌握更多专门的技能

移动端

最后说到移动端,随着 iOS和安卓的webview变得越来越高效,以及PWA(渐进式web应用)的到来,原本的应用逐渐不再流行,因为他们开发起来过于复杂。所以一个全栈工程师必须了解 PWA或 React Native,或Native、Tabris、Cordova、Phonegap等好技术开发出基于API的客户端。

DevOps 和部署

当你学会了后端语言和数据库,你可以开发一个完整的系统了。但是离正式向公众发布你的产品还差一个非常重要的环节——测试和部署,主要要注意几个方面:

选择后端平台:国内较为知名的服务商有阿里云、腾讯云、百度云、七牛云、网易蜂巢等;

选择部署平台:Nginx、Apache、Linux、SSH、Git,不同的后台服务器系统适应不同的情况,配制方法也不同;

测试和修改Bug :包括单元测试、集成测试、函数式测试、系统测试,必要时进行内测,以便在正式发布前发现系统的问题。

可能要用到的还有可视化配置方面:Docker, Vagrant;

其他设置:CDN加速等。

全栈工程师修炼手册

全栈并不是毫无章法的遍地开花,好的学习计划与方法可以事半功倍,以下是笔者总结的几点经验:

一到多再到一

从编程入门开始,先花一至两年时间熟练掌握一门主流的编程语言。这个阶段的目标就是一个扎实的基本功,包括程序中的基本概念,例如值与引用,变量的作用域,对象与类,常用数据结构与算法等等。一旦基础扎实了,接下去的三年左右时间就要从一到多,迅速扩冲你的技能池。要做到快速学习,第一项要领就是读技术资料时要学会跳读。因为很多的技术有相通之处,学习一项新技术,只需学习它与你已掌握的技术之间的 diff 就行了。当你有了一定的技术储备之后,一到两天内学会一门新的语言与框架其实并不难。这个阶段的另一个要领是 20/80 原则,也就是用 20% 的时间来了解一项技术中 80% 的基础内容,将剩下最难啃的 20% 留在将来需要深挖时再研究。

那为什么最后还要再回到一呢?当你有了足够的技术广度之后,你对技术的洞察力与理解力都会提升一个层次,这使你能更准确地发现适合自己且有前途的技术领域。与初入行时的随大流不同,你此时的选择是经过深思熟虑,为自己量身定制的。在接下去的时间里重点深挖一个或少数几个领域,这样在俱备了技术广度的同时,你也拥有了自己的杀手锏,个人价值会再次大幅提升。

任务导向

所谓任务导向就是一切学习都应该以输出为目的。仅凭兴趣学习,往往是低效的。比如你的公司要做一款移动应用,初期的流程是开发 -> 上线 -> 运营,对应的技术能力就是前后端开发,自动化运维,数据平台与用户分析。当用户数到达一定体量以后,就需要高可用架构,推荐算法等技术。你技术学习的脉络应该顺应业务的发展,这样才有机会学以致用。

那如果你身在大公司,又该怎么做呢?有些大公司提供轮岗的机会,比如我之前在Google,公司每18个月提供一次换岗机会。可以借此扩展你的技能池,要好好利用。在选择下一个岗位时,应保持一种连续性,比如从前端开发转后端开发,从开发部门转运维或是数据部门等。

不过总体来说,全栈工程师与创业公司或是发展期公司才是最佳组合。

移花接木

学技术要了解其思想,而不要留于表面形式。优秀的技术思想会从它的发源地流向其他领域。例如,

  • 前端的MVC结构在后端一样适用。
  • 当你理解了 Java 的 Annotation 以后,再看 Python 的 Decorator 就会觉得非常熟悉(尽管两者的实现方式完全不同)
  • 当编译语言用类型推断(Type Inference)去除类型声明的同时,脚本语言却在用类型提示(Type Hint)添加类型声明。
  • 不可变(Immutable)的思想始于函数式编程,但可以用于运维(Immutable Infrastructure),也可以用于大数据管理(Functional Data Engineering)。
  • 运维的核心是对各类服务器数据的监控与报警,同样的理念也可以用于产品与运营数据。

技术之间的联系,有些是显而易见的,有些需要你沉淀思考。真正的全栈工程师可以用一个技术领域的思想,去解决另一个技术领域的问题。再举一个我公司的例子,在学习用 Ansible 做运维时,发现它的 playbook 不是用脚本语言而是用 YAML 来写的,这让我意识到原来 YAML 不仅可以用来描述数据,也可以用来描述逻辑关系。这个思想后来被用在我们很多的项目中,比如在设计数据产品的报表时,各种指标的计算,包括指标之间的依赖与派生关系都是直接在 YAML 中定义的,主体程序不涉及任何业务逻辑,仅仅是解析与执行这些 YAML 文件。

所以我建议在学习技术时,多做一些交叉领域的思考,这会使你在提升技术广度的同时,加强你的技术思维。

层次切换

记得以前刚进 Google 时,听的第一个内部讲座就是 Life of a Search Request,讲从用户输入一个搜索关键词到得到结果的整个过程,这个过程涉及浏览器,TCP/IP的网络传输,后台的 Web 服务集群,索引数据库群等等。对于你公司的业务,你是否能清楚地描述从用户输入到产生结果的整个周期?对于每一个环节,你又能深入细节到什么程度?

有次和公司的CEO聊天,他说他衡量一个产品经理的能力时,会看这个人能否从产品细节到长期战略之间的各个层次来回切换。我觉得衡量一个全栈工程师能力也是类似的,看他是否在了解系统的全貌的同时,又能深入到单个模块的细节。当系统遇到真正棘手的难题时,就非常考验技术人员在各层次之间切换的能力。就如同玩竞技类游戏,只有同时拥有良好大局观与精湛微操作的选手,才能成为顶尖高手。

在学习全栈的路上,不但要试着横向地切换层次(前台,后台,运维),也要尝纵向地切换层次,除了写业务代码之外,向下了解一些框架的底层运行机制,读一读它们的源码。向上学习一下系统设计与分布式架构。你可能会觉得什么都学会不会精力太分散?我觉得并不会,只要你顺着一条合理的脉络去学(任务导向),花三到五年的时间迅速延展你的技术广度是非常值得的。这会使你比同龄人更具竞争优势。目标要定得高,实践时量力而为。

全栈修炼入门级套餐

全栈修炼之路,很漫长…_第7张图片

每个人的技术学习路线可能都不太一样,这也是为什么这篇文章着重讲的是方法而不是具体的学习内容。不过对于刚进入移动互职网开发的新人,我可以推荐一个全栈学习的新手包。编程语言方面,可以优先去学习以下语言

  • Java
  • JavaScript
  • Python
  • SQL
  • Swift (如果不做 iOS 开发,可以不学,不过现在都是多端一体)

Java 不但可以写 Android 应用,也是目前大部分国内公司的后端主力语言,在分布式系统与大数据平台方面的生态圈非常完整,所以即使你公司不用 Java 也应该学。

写前端,JavaScript 是必备技能,要掌握一个主流前端框架,建议学 React。这是一个非常出色的框架,生态圈成熟,适用性广,在有了 ReactNative 加持之后还可以做移动应用开发。另外,在熟悉了 JS 之后,也可以用 NodeJS 来写后端。

Python 也是个全能型语言,如果之后要做自动化运维,大数据分析与机器学习,Python 在这些方面优势明显。国外有很多公司用 Python 写后端,国内相对少些,但对创业公司而言,用 Python 做大后端的主力语言(业务后端 + 运维 + 数据分析)其实是个不错的选择。

学 SQL 前期是为了研发与上线时的数据库查询与管理,后期是为了数据分析与商业智能。即使目前各数 NoSQL 百花齐放,但传统的关系型数据库,如 MySQL 或是 PostgreSQL,势头依然强劲 。而在大数据端,各类的数据仓库与数据计算框架都会提供类 SQL 的接口。在较小的公司里,开发人员还经常兼做数据分析师。所以我认为熟练掌握 SQL 是对全栈工程师一项基本要求。

除了这些编程语言外,另一部分就是了解运维的基础知识,包括 Linux 命令行,Docker,以及各类常用的基础服务与数据库,如 Nginx,MySQL,Redis,MongoDB 等。

有了这些技术基础之后,你对于一个移动应用的系统全貌,就有了大致的了解。可以再根据公司实际的业务情况,选择进一步学习的内容。

全栈修炼之路,很漫长…_第8张图片

看完上述技能要求,全栈工程师是否仍然吸引着你?

需要注意的是其实大多数全栈工程师并不是精通所有技术,也会在某些方面有所偏重,毕竟每个人的时间与精力都是有限的。全栈开发工作可能无法使人成为某一领域的专家,但却能让人很好的了解整个产品流程、项目需要的全部技术、以及对项目有更高层面的理解。

如果想要向着全栈工程师的方向迈进,你应该掌握很多知识与技能,并且熟悉上面提到的各种组件。此外,还要提升自己的个人沟通技能,这样才能管理并与前端与后端开发者实现较好的协作。

好消息是未来对于每一类Web开发者来说都是光明的,无论是前端、后端,还是全栈。要坚持学习一切有价值的东西;掌握新的框架、语言与平台;并且与开发者同事及最终用户保持高效的沟通。在这种情况下,无论世界发生什么变化,你都会始终立于不败之地。

全栈适合你吗?

在开始之前,这是你该问自己的第一个问题。因为全栈只是一种选择,你也可以选择朝垂直领域专家的方向努力。如果你已经有自己的答案,那就跟随你的意愿去做。如果你在犹豫,那么让我来问你几个问题

第一个问题,你现在在大公司还是创业公司?将来又想去哪儿呢?虽然没有绝对,但在创业公司,你可以迅速锻炼全栈的能力。而大公司有更多的机会深入研究某个领域的问题。特别是对于运维和大数据方面,大公司有得天独厚的优势,许多挑战与经验是创业公司无法提供的。

第二个问题,你将来是否想成为一个管理者?现在很多公司提供了 dual-stack,就是说管理线与技术线是并行的,要走哪条路你自己选。我的建议是,如果你希望将来转管理,在做技术的时候,广度比深度更重要,也就是说你更应该往全栈方向发展。管理者到一定层次都需要对项目负责,而任何一个典型的互联网项目,前后端开发、线上部署、数据分析,这些部分都缺一不可。拥有全栈的知识,你就可以对项目与团队有更好的把控力。

第三个问题,首席科学家与首席架构师,哪个更吸引你?如果你不走管理线,继续走技术线,那前面两个选择基本就是你发展的目标。如果你选架构师,那你就更适合往全栈发展。其实架构师也是一个管理者,只是他管的不是人,而是一个个技术模块。架构师的功力体现在如何选取最适合的模块,并让它们之间无缝连接。所以你的技术知识面越宽广,你可设计的版图就越大。

最后一个问题,你在学生时代是否偏科?开半个玩笑,我想说的是人要学会从自己的过去总结经验。偏科可能预示着你更适合钻研一项技术而不适合全面发展,或许有一天你就能成为某个领域的大牛,不也是好事一桩?

除去个人的偏好外,你也要关注时代的趋势。这是个开了变速齿轮的时代,短短几年间,技术的热点一直在变化,从移动开发,到大数据、云计算、人工智能、VR,再到深度学习,区块链。身上不多背几项技能,可能没几天就被淘汰了。但到最后“能否快速掌握一项新技术”或许才是唯一不会被淘汰的技能。而在成为全栈工程师的道路上,你可以很好地锻炼这项终极技能。

全栈修炼之路,很漫长…_第9张图片

小结

全栈的路很慢长,也很有趣,祝大家成功!今天的分享就到这里,欢迎留言。

你可能感兴趣的:(软件工程)