近,每当我谈论起全栈开发时,很多人都深表怀疑,他们说世界上并不存在全栈工程师,而且大多数开发人员只适合后端或前端的工作。
针对全栈开发的大多数批判都可以归结为以下两点:
没有人可以同时成为前端和后端的专家,所以好还是术业有专攻。
大多数人只适合前端或后端的工作。
然而,这些批判都未能切中全栈的要点。
全栈指的不是代码,而是责任
全栈指的不是你所熟悉的编程语言或掌握的技术,而是指你能够利用工具和相应的权限,克服所有困难,负责某项任务的始末。
将一个任务拆分成不同的职责,然后交给不同的人员处理,这中间会造成不必要的断层,此外还需要额外的协调,而且通常很难实现跨层的解决方案。
假设我们有一个非常简单的Web开发任务,需要后端开发人员提供新API,同时还有部分前端的开发工作,比如显示某些指标或活动的图表。
开发这类功能的时间表通常如下所示:
如果范围发生变化,或有关该任务的新技术出现了,那么就需要对原来的架构进行调整,这时两位开发人员会成为彼此的瓶颈——他们会牵制彼此的连续工作,会给彼此施压,而且在切换思路时也很痛苦,终有可能在两位开发人员之间引起怨恨和冲突。
由于大多数工作本质上都是有顺序的(如上图所示,前端开发人员需要API),而且在前一个任务完成之前,后一个开发人员必须等待,或者想变通的方法(如上图所示,使用模拟API)。
重要的是,很多时候某一层中遇到的难题可以在其他层简单地解决。而当开发人员只负责前端或后端时,通常他们不会考虑自己职责范围之外的解决方案。
全栈开发的优点
没有瓶颈:你不需要等待另外一个人即可连续工作。
更快的迭代:你可以随时修改API,并在客户端查看修改后的结果,然后通过修改UI来处理新的API,而且你可以连续推进这种迭代。
与利益相关者拉近距离:你可以利用应用程序的可视化部分,为利益相关者展示你的工作进度,并与他们进行交流,这有助于拉近你与利益相关者之间的距离。
所有权:直接与各方人士(利益相关者、质量保证、产品、管理)联系,更为顺畅地沟通和管理,肩负起一定的责任。
任何人都可以胜任全栈开发
为了回应“并非每个人都可以胜任全栈开发”的批评,我想指出,如今的前端放到几年前就是后端,特别是困难的部分—— 路由、状态管理、缓存、甚至业务逻辑现在常常放到前端完成。
大多数前端问题不需要详细了解语言的设计、UI性能或浏览器兼容性,通常只需添加几个div,然后修改一些CSS值(假设你的客户端是Web的话)。
同理,大多数后端问题也不需要详细了解并发模型、字节码操作或ORM的内部机制,通常只需向数据库或API模型添加新字段。
成为一名全栈工程师并不意味着你需要成为掌握所有技术的专家,也不意味着你需要以一己之力承担起所有的工作。如果你需要在不太熟悉的领域开发某个功能,也并不意味着你不可以求助于他人。你应该向那些专注于该领域且经验丰富的专家寻求指导和帮助。
全栈开发人员也可以专攻某项技术
成为一名全栈开发并不意味着你不可以专攻某项技术,或成为某个方面的专家。
有人说你无法同时掌握前端和后端,那么这是否暗示了如果你潜心研究某一层,就可以深入掌握这方面的技术?这很荒谬,前端和后端也分很多区域,任何人都不可能成为全面掌握了某一层的专家。
你可以成为一名全栈开发,同时还可以成为图形库的专家。
你可以成为一名全栈开发,同时还可以成为ORM的专家。
就像其他开发人员一样,全栈开发终会深入某些领域的专业开发知识,因此将这些领域中较为复杂的任务分配给专门研究这些领域的开发人员是很自然的事情。
不要按照前后端划分开发人员。
全栈不仅仅是后端和前端
全栈不仅仅是后端和前端,全栈代表了一种工作方式,采用这种方式的开发人员全权负责自己的代码,他们能够克服所有的困难,完成自己的任务。
相同的工作方式适用于整个技术栈,例如后端开发人员不必等待DBA批准数据库上的SQL脚本,也不必等待运维将新功能添加到CI。而在进行前端工作时,你也不必等待UI设计师为你修图。
全栈开发普遍适用
在软件开发的世界里,没有任何流程是灵丹妙药。多年来,人们总是按照不同的层次划分开发,这其中有一定的价值。
如果你的开发过程涉及大量规划,而且你的需求规格绝不会更改,那么就可以让不同的人承担不同的开发层。
有些行业有严格的法规或认证流程,所以很难在所有团队中实施全栈开发。
此外,也不一定要在整个组织内实施全栈开发,但是,如果你采用了敏捷流程进行Web开发,那么采用面向全栈开发的流程会更有效。
这篇文章很可能会引发很多争议,因此我在此先声明一些事项:
虽然本文中的很多例子都侧重于前端,但是全栈开发的好处并不仅限于为前端工作减压。后端开发也会遇到同样的问题,而且后端也可以受益于全栈开发。
这篇文章可能会给你一种错觉:我们永远不应该分割任务。然而,这并非我的本意,你应该合理地分割任务,但是应该按照功能分割,而不是按层分割。