安息吧,“全栈工程师”!

一阵子,国内不少人提倡“全栈工程师”,有人将“全栈工程师”误解为“需求分析和定义、设计、编程、测试”所需技能融于一身,成为全能工程师。百度百科对它的解释也是“掌握多种技能,并能利用多种技能独立完成产品的人”,侧面印证了这点。大家想想,成为这样的“全栈工程师”很不现实,对大多数人(非天才)来说,单项工作(需求、设计、编程、测试等中的一项)都不一定做得优秀,何况这么多的工作?所以这里存在一个误区。

国外并没有人提倡“全栈工程师”,而是“全栈开发人员”或“全栈程序员”,其来源于英文“full stack developer”,简单地解释就是:在软件开发中某一类开发技术 栈(Web开发、移动应用开发)是贯通的开发人员(程序员),这里的“栈”是指“技术栈(Technology stack)”,而不是贯通前面所说的各项工作,因为之前也没有人提到“工作栈”这样的概念。之前,往往会分前端程序员(如HTML5、CSS3 、JavaScript的编程)、后端程序员(如Java、PHP的开发)和接口开发人员(如Web Socket、Restful API、JSON等),而对于“全栈程序员”,应该是能前后贯通的,就不分前后端了,而成为web全栈程序员(软件开发工程师)。栈体现了技术深度,而不是工作的广度,这样理解“全栈程序员(要么称为“全栈开发工程师”也无妨)”就正确了。

全栈不仅局限于技术全栈,而且还适合层次不太深的技术,例如采用PHP、Python、jQuery编程,结合HTML、CSS的展示,成为“全栈程序猿”是没问题,特别是Node.js平台出现,让JavaScript前后端贯通更容易了。Web前端也远远不是从前那样上一个jQuery框架就可以了,今天的Web前端需要用到模块化开发、多屏兼容、各种复杂的交互与优化,多达7~8层技术栈,要成为这样的全栈程序员是有挑战的。例如万维网联盟 (World Wide WebConsortium),W3C给出Web技术架构的层次,虽然包含四层,但涉及到的技术分为六类:

  1. 交互类:XHTML、SVG、CDF,SMIL、XForms、CSS和WCID;
  2. 移动类: Mobile SVG、SMIL Mobile、XForms Basic、CSS Mobile、MWI BP;
  3. 语音类:VoiceXML、SRGS、SSML、CCXML和EMMA;
  4. Web服务类: SOAP、XOP、WSDL、WS-CDL和WS-A。
  5. 语义Web类:OWL、SKOS和RIF。
  6. 隐私类:P3P、APPEL、XML加密、XML签名和XKMS等。

假定我们正在架构一个模块化Backbone / AngularJS前端,同时优化内容交付和调整CSS中的硬件加速层,然后实现一个异步非阻塞服务器(配有预先渲染的模板),并推送到AWS集群,还要考虑其安全性和可扩展性。响应式地设计UI和移动优先(mobile-first)是必不可少的,利用CSS预处理器来节省时间、设置Nagios进行监控,还要考虑外部各种移动设备(包括智能穿戴)的兼容性。理想情况下,当持续集成服务器由于端到端测试失败而检测到错误构建时,要发送包含构建错误消息的SMS。这么多技术,一个工程师可以吃透吗?

今天的系统越来越复杂,设备、CDN、Cloud、前端、NoSQL、应用程序等,有人就数据库开发技术栈就整理出30多个技术点,今天成为一个全栈开发人员反而很难,每一层或每一类技术都需要专家。如果几十年前,反而容易,因为设备和业务都简单,一个人通常会用C语言、FORTRAN语言或汇编语言从头到尾编写完整的软件程序。

(数据库技术栈,来源:https://github.com/unruledboy/DatabaseStack)

人们曾做过调查,绘制一个技能雷达图,涉及UX、HTML、CSS、JavaScript、后端脚本语言和SQL等层次,让Web开发者为每个层次的技能领域按10分制给自己打分,大多数人都认为自己掌握较广的技能,得分不高也不低,在各层次技能上得分介于5~8之间。我们可以忽略他们自己评分的尺度,但他们认为自己是什么样的开发者——全能的网络开发者,虽然没有用“全栈工程师”。但是,如果每个开发者给自己打分,总分限制在30分。这时他们经过一番皱眉和讨论之后进行自我评分,这次结果就很不一样,从原来分布比较均匀转变为分布极不均匀(如下图所示),即在有限制的情况下,他们承认自己擅长什么和不擅长什么,擅长的技能会打8分、不擅长的打2分,也就自然而然地暴露了哪些开发人员是前端的开发人员、哪些开发人员是后端开发人员。

今天学习的语言/框架的基础知识通常几个小时内可以从互联网上找到,也不是所有层次或组件的代码都需要自己一行一行地去写,许多层次的代码或现成的组件、平台或框架等都可以从网络上下载的,根本用不到这些方面的技能,就能构建出一个系统,似乎感觉自己就是一个全栈开发工程师。所以,了解web开发中的一些技能和真正掌握这些技能之间的区别,现在正在变得越来越模糊。虽然你有集成或整合的能力,这种能力也很有价值,但依旧不能代表你是真正的全栈开发人员一个初出茅庐的开发工程师,感觉自己都懂,似乎是一个“全栈工程师”,但是,当它深入到某项技能之后,才知道自己之前只了解皮毛,此时才会真正意识到专业化的限制有多大,成为一个领域的专家已经不容易了。

但是不了解和自己工作相关的知识,他连整合能力也没有了,和其他研发人员的沟通和协作也变得的困难。如果有全面的知识,容易形成全局性思维,做前端的开发人员会想到后端服务器的要求,开发人员了解测试,有利于和测试人员的协作,而且有时在项目后期,整个团队都要上去做测试。这就是人们经常说的T字型技能要有一定的知识、技能广度,具备全局性思维,还要有一项精通的技能。如果你更优秀些、能力更强些,可以有双T字型人才,有两项特长。

技术的确有两个发展方向:横向水平发展、纵向深度发展。横向发展的最好结果是瑞士军刀,也有可能什么都会,但又什么都不会;纵向发展的最好结果是削铁如泥的龙泉宝剑,也有可能是坐井观天,丧失职业的发展空间。这两个方向都没有对与错,只要保持开放的精神和学习的态度,发展到一定程度会相互溶合,形成T字型人才,有广度也有深度

计算机技术变化比较快,技能经常要更新或切换,最有价值的技能是自我学习能力。理想的开发人员应该愿意去学习任何有价值的新技术,但也要承认在某些新领域需要专家(团队中的资深人员)的帮助。

最后,我们要说:

在某些开发技术领域欢迎全栈开发工程师”。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我
  • 上海市嘉定区曹安公路4800号同济大学软件学院
  • kerryzhu@vip.163.com