Contents
  1. 1. 全栈的起源
  2. 2. 为什么有全栈这种说法
    1. 2.1. 技术层面的分层
    2. 2.2. 产品层面的分层
    3. 2.3. 为什么有分层
    4. 2.4. 什么是全栈
  3. 3. 我的全栈观

全栈的起源

全栈 (Full-Stack) 这个词,我印象中它是出现在 Node.js 开始流行后。当 JavaScript 可以通过 Node.js 运行在服务端的时候,很多人都说 JavaScript 可以统一世界了。甚至还有一句话:「凡是能用 JavaScript 实现的,最终都会用 JavaScript 实现!」。这句话比「PHP 是全世界最好的语言」还要霸气吧?

其实这句话的来源是 Jeff Atwood 的 Atwood’s Law。他的原话是这么说的:

any application that can be written in JavaScript, will eventually be written in JavaScript.

Jeff Atwood 是著名的 Coding Horror 博主,也是 Stack Overflow 的 co-founder。当然我不知道他宣布这个定律时是不是纯属开玩笑。他说这句话的时候,还列了一些其它技术大牛的关于软件开发的定律。他声称他的定律是从 Tim Berners-Lee 的 The Principle of Least Power 推导过来的。Tim Berners-Lee 又是谁呢?Wikipedia 上面是这么描述的:Inventor of World Wide Web。他的 Principle of Least Power 是这么一段话:

Computer Science in the 1960s to 80s spent a lot of effort making languages which were as powerful as possible. Nowadays we have to appreciate the reasons for picking not the most powerful solution but the least powerful. The less powerful the language, the more you can do with the data stored in that language. If you write it in a simple declarative from, anyone can write a program to analyze it.

Notes: 个人觉得最后的 declarative from 应该是 declarative form。

大意就是说,计算机科学领域花了很多年月和精力,一直追求把编程语言设计得尽可能地强大。可现在,我们应该意识到,要选择的应该是最不强大的语言,而不是反过来。原因是,语言越不强大,我们就能在它之上做更多事情。如果你使用一种简单的声明式手法编写了一个语言,任何人都可以写另一个程序来分析它。

JavaScript 确实并不是一种最强大的语言。它其实是 Brendan Eich 在 Netscape 时,为 Web 和 HTML 创造的一种胶水语言,来让 Web 变得更动态。这门语言是他花了 10 天的时间写出来的。JavaScript 其实一直被很多人鄙视,觉得它根本不是一门正式的语言。还有很多人用下面的一幅图来说明它的优劣之差。

The Good Parts vs Definitive Guide

现在的 JavaScript 相比当初,已经变得很强大。同时,围绕着它,伟大的工程师们创造了很多的工具和框架。所以,很多人把它比喻成 Web 的汇编语言,最基础的语言。我们甚至可以把很多用其它一些高级的语言写的程序,转译为 JavaScript 的代码,然后在 Web 运行。听起来很神奇吧?

那是不是真的学会了 JavaScript,你就可以称自己为全栈工程师呢?

为什么有全栈这种说法

要了解全栈,我们首先来了解一下栈是什么东西。在我之前写的,被新生大学引用的文章,「编程是什么?我要学吗?」里面,我作了一个类比:栈就像超市里叠在一起的一箱箱牛奶。栈是一种叠在一起的形态。你远看它是一个整体,但是其实它分很多层。既然有分层,那全栈的最朴素的定义,就是所有的层。

所以,当你说一个人是全栈工程师,就是说他能包干所有的事情。

所有的事情到底包含了什么?上面的定义还是太模糊了。我们不妨从技术和产品两个层面来细分一下。

技术层面的分层

技术层面,有一个专门的名词,叫技术栈。它就是用分层的角度,来看待一个产品背后用到的所有的技术。

拿大家最熟悉的 Web Application,其实也就是网站,来简单说明一下吧。

  1. 第一层统称前端。
    这一层包括网页的视觉,设计,布局和交互。现在我们接触的网页,都不仅仅是信息展示了。大部分都为用户提供一些操作和交互,以达到特定的目的。比如,大家上携程订酒店,可以输入日期,城市,酒店名,然后查找相关信息。如果你填入日期不对,网页上还会给予你提醒。

  2. 第二层统称后端。
    这一层为前端提供数据,负责业务逻辑处理,存储数据,与外部系统集成等。比如,当你选择好酒店,根据页面的引导确认订单,然后利用微信,支付宝或者银行付款。那么,从生成订单的逻辑,保存你的资料数据,和微信集成,到最后给你发确认邮件等,都和后端密切相关。

上面只是很笼统的分了两层。其实无论是在传统的 IT 企业,还是互联网公司,计算机技术类职位有很多分类。

前端很大,可以拆分出视觉设计,交互,和 Web 页面开发。有些大公司甚至还把 Web 页面开发分拆出专门写 CSS 和专门写 JavaScript 交互逻辑的团队。另一些公司的前端可能还包括 iOS, Android 开发。

后端其实也还能分出好几层。有写业务逻辑的开发团队,有数据库管理人员也就是 DBA,运维,和安全等。即便是写业务逻辑的开发团队,也可能根据使用的语言再细分,比如 JAVA, Go, Ruby, Node.js 等。

产品层面的分层

从打造一个完整的产品的角度,栈的分层就有另外一种方式。

  1. 栈的最顶层,是产品经理,业务分析人员等。他们负责对整个产品的方向和功能,做详细的规划和定位。
  2. 接下来的一层负责开发,成员可以包括架构师,开发团队,设计团队等负责实际打造整个产品的人。测试团队有可能同属于开发,也有可能是分拆出来的另一个团队。
  3. 产品上线后,市场和运营的部门需要负责推广和运作。当然,这一层并不一定在最底层。有些工作甚至早于开发。

为什么有分层

虽然上面的分层方式非常简单粗暴,但我相信大家无论是从技术层面,还是整个产品层面,现在对它们各自的技能栈都有了大概的了解。

那为什么会这样分层,这是由什么决定的呢?我相信大家其实都能猜到。这和开发这个产品的团队,企业组织架构有密切关系。其实在软件开发和系统设计领域就有一条著名的康威定律,Conway’s_law

organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations

它的意思是说,企业设计的系统,其实做出来的设计是受限于它本身的内部沟通架构的。虽然这个定律说的是系统设计,但是我觉得道理是相通的。所以,一般情况下,企业越大,组织架构层级或者部门越复杂,分层可能越多越细。而小的团队,里面每个人承担的责任更广泛,更杂。

什么是全栈

我相信到这里,大家可能对「怎么样才算得上是全栈」有一定的想法了。

从技术的角度来说,大部分人的想法就是,全栈就是所有的技术都懂。能够从视觉设计,页面交互,后台业务逻辑,做到服务器管理运维等。也就是说,全栈就要求这个人是技术大拿,会很多编程语言,精通各种领域。

如果从这种观点出发,其实没几个人敢声称自己是全栈,因为很容易被其它技术人员拎起其它技术就抡过去,说:“XXX 你懂吗?不懂?那还好意思说全栈。” 所以,你们可以理解,为什么之前因为 JavaScript 能写后端了,就能刮起一股全栈风,声称学会 JavaScript 就能包打天下,就是一名全栈开发者。但同时,也有不少技术人员,鄙视或者调侃这种观点和这些人。大家现在也能够体会,为什么笑来老师在微博上说,一个人如果不笨,通过一年的学习时间,也是可以成长为全栈工程师,并且搞全栈班培训,被黑的多么厉害了吧?

从产品的角度来说,一些技术人员胆敢声称是自己是全栈的时候,另外又会有一波人拿其它方面的能力来质问他:“你会 YYY 吗?只懂技术算个毛。那些单枪匹马的成功创业者才有资格说自己是全栈。”

所以说,关于全栈,每个人都有不同的定义。

我的全栈观

我认为,全栈是一种态度和学习能力。它代表一种思考和对待问题的方式,而不是一种最终的状态。

首先,态度的意思就是不给自己设限。通常情况下,一个团队里面分不同的角色,我们各自都在某一个领域努力。但是,如果其它领域的负责人离职或请假,系统的瓶颈已经不在你负责的领域,团队需要你学习跨领域的知识来解决问题的时候,你不能说我不懂,这个问题不是我负责的,是前端或者后端的,然后就不管。

有了端正的态度,还需要一定的学习能力。如果说,要你去解决一个问题,还要等你去培训学习那么一年半载回来再说,那肯定不行了。通常情况都要求我们自己马上寻找资料,现学现用来解决问题。

具备了前面两种条件,要做的就是为实现自己的目标和产品,持续不断地学习任何需要的技能。计算机领域变化的那么快,现在需要的技术栈,可能几年后就被淘汰了。

全栈虽然确实需要有一定的技术广度,但并不是一定要精通所有的技术。而是当工作或者项目需要的时候,你能很乐意并迅速学习和使用新的技术,而不是一直待在原来的舒适区。甚至,有时候要求你学习的不是一门新的语言,一项技术,而是要求你学美术设计,学习产品,运营或者项目管理等其它技能。

所以说,全栈不是一种最终的状态,而是一条永无止境的道路,一种追求。我也才刚刚启程。

Contents
  1. 1. 全栈的起源
  2. 2. 为什么有全栈这种说法
    1. 2.1. 技术层面的分层
    2. 2.2. 产品层面的分层
    3. 2.3. 为什么有分层
    4. 2.4. 什么是全栈
  3. 3. 我的全栈观