原创文章,转载请注明:转载自Keegan小钢
并标明原文链接:http://keeganlee.me/post/full-stack/20170826
全栈正在变得越来越流行,很多人都有意愿或正在往全栈的方向去发展。我自己也一直在往这个方向不断提升自己,到目前为止,算是略有小成,勉强称得上是一个合格的全栈架构师。为了给更多走在全栈路上的小伙伴们提供一些思路,我将基于我自己这些年来的经验总结和思考,以及从其他更优秀的人(比如吴军)学习得来的感悟,与大伙分享我对全栈的一些观点。我主要将从三方面来聊聊全栈的问题:
- What?什么是全栈?
- Why?为什么要发展全栈?
- How?如何发展全栈?
什么是全栈
对全栈的定义,据我所了解的,最早来源于Facebook的工程师Calos Bueno在2010年底时写的一篇文章:The Full Stack。作者认为全栈是一个通才,能够自己创建不平凡的应用程序。他也指出,没人能够熟悉所有方方面面,但作为一个全栈,能够看清每个栈的上下之间是如何运作的。他还提出视觉化一个系统的方案:One way to visualize a system is how its data is shaped and how it flows.
百度百科收录的定义则是:掌握多种技能,并能利用多种技能独立完成产品的人。收录的原文其实是这篇:全栈工程师到底有什么用。本质上来说,和Calos Bueno的观点大同小异。另外,也有越来越多人认为,全栈工程师 = 前端开发 + 后端开发。
对全栈工程师,每个人都有不一样的定义,不一样的衡量标准。要求高的,认为全栈=全能,需求分析、产品设计、UI设计、移动开发、前端开发、后端开发、运维等,全部都熟悉。要求低的,认为只要既懂前端开发也会后端开发即可,比如,熟悉H5前端开发和Node.js后端开发,就可以称得上全栈工程师了。在我看来,其实都没有错,工程师也有分初级、高级、资深、专家,全栈工程师也一样有等级划分。
那么,我们就从分级的角度来聊聊什么是全栈。但我不想从传统的初级、高级、资深、专家的角度来划分,我想从另一个更高的视角来划分全栈工程师。
吴军在得到专栏《硅谷来信》的第054封信中,将工程师划分为五级,如下:
第五级:能独立解决问题,完成工程工作;
第四级:能指导和带领其他人一同完成更有影响力的工作;
第三级:能独立设计和实现产品,并且在市场上获得成功;
第二级:能设计和实现别人不能做出的产品,也就是说他的作用很难取代;
第一级:开创一个产业。
从本质上来说,不同层级的工程师需要有能力独立解决不同高度的问题。第五级只要有能力独立解决技术任务即可,第四级则需要解决团队问题,第三级需要解决产品问题,第二级需要解决行业问题,第一级则是最高级的产业问题了。需要注意的是,有能力独立解决问题,不代表就不需要和别人协作。
全栈工程师属于工程师的子集,同样的,也适用这个五层级别的划分。那么,对于第五级的全栈工程师来说,就是有能力独立解决跨栈的技术问题。第四级的全栈工程师,需要具备管理和领导能力,应该是一个全栈架构师。第三级则还需要掌握产品设计能力,有能力做出成功的产品。但这个产品会比以往复杂得多,如果不具备全栈技能,那就很难形成全局性思维,更难以做出成功的产品。再往上还要深入了解行业和产业痛点,需要更高远的前瞻性能力。
如果这样划分的话,那能够独立完成产品的全栈工程师应该属于第三级和第四级之间,而只懂前端开发 + 后端开发的全栈工程师还不一定能达到第五级,因为懂了前端开发和后端开发并不意味着就有能力独立解决问题。我面试过几个既懂前端开发,也懂点后端开发的程序猿,但每个端其实都还达不到我要求的及格线,更谈不上有能力独立解决工作中的跨栈问题。
在我看来,一个合格的全栈工程师应该具备硬技能和软技能。硬技能主要就是熟练掌握工作领域中的各种技术栈了,比如做移动应用的,那可能就要熟悉Android/iOS开发、Java开发、数据库、运维等。更重要其实是软技能,我觉得至少应该具备有以下能力:
- 解决问题能力 —— 如果不能解决问题,要全栈工程师何用
- 超强学习能力 —— 全栈需要快速掌握很多技能,所以必须具有超强的学习能力
- 良好沟通能力 —— 全栈虽然有能力独立解决问题,但在实际工作中还是需要和各种人员合作沟通,在团队不同成员之间起到桥梁作用
- 技能迁移能力 —— 全栈不会被某一领域绑死,技能可以快速迁移到其他领域,比如可以从移动互联网迁移到物联网、人工智能或区块链等新领域
- 全局思维能力 —— 全栈最大的价值就是拥有全局思维能力
为什么要发展全栈
发展全栈,不管是对公司还是个人,都大有益处。
对公司的益处,就举个栗子吧。假如在App端有时候会出现调用接口超时的问题。在没有全栈工程师的团队里,一般的处理流程就是:Android或iOS开发人员在App端检查确定不是前端的问题后,就把锅丢给API网关,API网关开发人员检查日志后发现有部分服务的查询接口没能在超时时间内返回数据,各服务开发人员和前端、网关联调后发现是数据库查询结果慢,就将锅甩给了DBA,DBA经过一番排查之后发现数据库存在很多慢查询,最终定位到是因为很多SQL查询语句没有加索引。等这个问题解决,可能半天就过去了。而为了解决这个问题,至少投入了前端开发、API网关开发、后端服务开发、DBA等四个角色的人力。至少四个人加起来那就是两人日的成本,期间还有不少沟通成本。这不是个杜撰的栗子,而是在我们团队中真实发生过的事情。那么,如果有全栈工程师的话呢,一个人从前端到网关、服务接口端、数据库,一路自己调试跟踪数据,估计一个小时左右就能定位到问题,这就非常高效地解决了问题,也极大地减低了沟通成本。
当然,最重要的还是对个人的发展如何。毕竟,公司并没有要求你一定要成为全栈,而你也不会是为了公司的利益而努力成为全栈,除非这家公司是你自己开的。而我觉得,个人发展全栈,最重要的就是为了应对未来,主要有以下几方面:
- 避免被淘汰 —— 技术更新迭代太快,只熟悉单一技能栈在未来几年有可能会面临被淘汰的风险。比如,虽然现在Android和iOS开发依然是主流,但又有谁能保证五年十年后不会像塞班一样。比如,虽然现在Java依然是后端开发的主流,但代表着未来趋势的人工智能、区块链等,大多却不是用Java开发的。
- 提升个人价值 —— 如今,系统级产品已经越来越复杂,那么,对于具有全局思维的全栈工程师和全栈架构师的人才需求就会越来越大,所以,全栈工程师,尤其是全栈架构师的个人价值也就会越来越高。
- 走向高管职位 —— 管理岗位对全局观的要求必不可少,越高的管理岗要求越高。所以,就算是在特定领域做到了技术专家,如果缺乏全局思维,就会成为职业瓶颈。
- 实现创业梦 —— 我想,不少人可能和我一样,将自己慢慢发展成全栈,主要还是为了做出优秀的产品,为了实现创业梦。
如何发展全栈
要发展全栈,就需要全面发展硬技能和软技能,硬技能相对比较容易掌握,但最重要的还是软技能,这是全栈的根基,当然,软技能就不是那么容易提高的了。
需要发展哪些硬技能要看从事的行业和技术方向而定,做移动应用和做VR/AR/MR应用所需掌握的技能栈是不同的,做人工智能、区块链应用又是另一套技能栈。就以目前做企业级应用的主流技术为例,主要会有以下技术栈:
- 移动端 —— Android、iOS、React Native
- 前端 —— H5、CSS3、SASS、LASS、React、Vue、AngularJS
- 后端语言 —— Java、Go、Python、Node.js
- 后端框架 —— SpringBoot、SpringCloud、MyBatis、FastJson、Dubbox
- 数据库 —— MySQL、Oracle、DB2、MongoDB、Redis
- 运维 —— Nginx、ZooKeeper、Docker、Kubernetes
一个合格的全栈工程师并不需要掌握以上所有技术栈,但在工作中遇到问题时,如果卡在了某个你还不懂的技术栈,那你应该能快速学会该技术栈中能解决问题的那部分知识,然后解决问题。
如果想发展成全栈架构师,那还需要掌握架构方面的技能,包括前端架构、API设计、负载均衡、微服务架构、分布式事务、服务器集群设计、容灾设计等等。优秀的架构师还需要深入理解业务,应该也是个业务专家。
然后,如何发展软技能呢?就如我上面说的,软技能主要包括: 解决问题能力、 超强学习能力、 良好沟通能力、 技能迁移能力、 全局思维能力。这些软技能都需要通过长时间的实践积累才能掌握,以下我只提供一些实践方法的指引。
解决问题能力
要提高解决问题的能力,首先要懂得如何分析问题。分析问题要尽量保持开拓性思维,多角度、多方面地思考可能导致的原因。多思考,多分析,而不是直接就开干,才能不断提高你的思维能力。如果该问题不是急着马上就要解决的,可以尽量将所有想到的可能原因全部列出来,通过长时间的这种刻意练习,你会慢慢变成分析问题的高手,同时,你的思维能力会得到质的提升,经常能看到别人看不到的地方。
然后,对推测得出的原因,一定要进行检查验证。有些人,一旦遇到问题,总是武断地下结论,认为是某某地方导致的,而不是先进行检查验证,这是一种错误的解决问题的思维方式。就算有90%的可能的确是某某地方导致的,也要先进行验证之后才下结论。之前,我带领的团队里就有这种固化思维习惯的人,出现了某个BUG,他立马就下结论说一定是因为XXX导致的,我也知道,可能是XXX导致的几率挺高,但我还是让他先检查验证一下再作结论,结果检查完发现是另外的原因导致的,啪啪啪,直接打脸。
还有,更重要的一点就是,要去解决当前值得解决的问题。注意两个词:当前、 值得。有些问题,可能也是值得解决的,但是否需要当前就去解决呢?比如说,项目初期阶段,需要解决高性能问题吗?
超强学习能力
刘润在《5分钟商学院》提到一个20小时快速学习的方法,怎么做?
- 第一,花5小时,大量泛读,主要就是为了了解一些基本概念;
- 第二,花3小时,建立模型,这是为了形成基本的全局观;
- 第三,花2小时,请教专家,专家能帮你解答你无法理解的问题;
- 第四,花10小时,理解复述,可以使用著名的“费曼技巧”。
另外,古典在《超级个体》也提到了一些学习管理的东西,包括:功利学习法、找到知识源头、学习金字塔。
还有一本书叫《关键20小时,快速学会任何技能!》,书中提到快速学习也是分为四步:
- 分解步骤 —— 把技能做最大程度的细分,分成若干小步骤。
- 充分学习 —— 对每个小步骤进行充分学习,以便进行灵活的练习,并在练习中自我纠正。
- 克服困难 —— 克服在练习中出现的生理、心理或者情绪上的障碍。
- 集中练习 —— 至少用20小时集中学习最重要的小步骤。
学习方法很多,但我觉得最有效的还是 输出倒逼输入。我目前在团队中也正在采用此方法帮助团队成员提升自己的能力。
良好沟通能力
良好的沟通主要分为两方面:一是理解对方的想法,二是让对方理解我的想法。任何一方理解出现偏差,都是无效沟通。
首先,你要先理解对方的想法,这是有效沟通的第一步。当然,这里面的学问也很大。有时候,对方表达出来的只是表面的需求,而不是真正的需求,这时候,你要懂得如何去挖掘出他的真实需求。一般情况下,多问几个为什么就能挖掘出来。另外,多站在对方的立场看问题。
其次,要让对方理解我的想法,这就需要你能清晰明确地表达出你自己的想法了。当然,前提是你自己脑子里已经有了清晰的逻辑。另外,作为技术人员,最容易犯的错误就是:与不懂技术的人员沟通时,依然使用技术语言。比如,你和不懂技术的产品经理谈UML、谈架构细节,这都不是合适的沟通方式。沟通时,一定要使用对方能听得懂的语言或其他方式。
技能迁移能力
硬技能一般是比较难迁移的,软技能则容易迁移。所以,应该多发展自己的软技能。就算是硬技能,其底层大多也是软技能的东西,比如,Android和iOS开发属于硬技能,但底层的设计模式、架构模式、编程思想等则属于软技能,是可以迁移到后端开发的。所以,学习一门技术,除了要知其然,还要知其所以然,了解一门技术背后为什么这么设计,这才能将硬技能转化为软技能。
不过,有一点需要注意,技能迁移不等同于把所有东西都从旧领域照搬到新领域,因为两个不同领域肯定存在一些差异性,在旧领域适用的东西,在新领域不一定也适用,甚至有可能适得其反。比如说,很多大公司的高管出来创业的人,会将他们在大公司的管理经验迁移过来,对创业公司进行同样的管理,但最终很多都失败了。这样的故事相信你也听到过不少了。所以,进行技能迁移时,也要清楚不同领域的差异性在哪里,要懂得判断哪些可以迁移过来,哪些不能直接迁移。
全局思维能力
全局思维能力是最难提高的,需要不断扩展自己的技能栈,要不断扩大自己的视野,要站在更高的视角看问题。我自己在这方面的培养主要就是多学习和思考如何才能做出优秀的产品。这就涉及到需求分析、产品设计、UI设计、技术实现等,每一部分都会影响产品的质量。因此,我每做一个产品,虽然主要还是负责技术部分,但都会习惯站在更广更高的视野去看待整个产品,也会经常性地给产品经理、UI设计师提建议。
总结
最后,做一个总结回顾。本文主要围绕三个问题简单聊了聊我对全栈的一些观点:
- What?什么是全栈? —— 全栈也有分等级,合格的全栈工程师至少应该有能力独立解决跨栈的技术问题。合格的全栈工程师应该具备硬技能和软技能,硬技能就是熟练掌握工作领域中的各种技术栈了,软技能主要包括: 解决问题能力、 超强学习能力、 良好沟通能力、 技能迁移能力、 全局思维能力。
- Why?为什么要发展全栈? —— 发展全栈对公司和个人都大有益处,但最重要的还是对个人的发展如何。个人发展全栈主要还是为了应对未来,主要有几方面: 避免被淘汰、 提升个人价值、 走向高管职位、 实现创业梦。
- How?如何发展全栈? —— 发展全栈就需要全面发展硬技能和软技能,需要发展哪些硬技能要看从事的行业和技术方向而定,更重要的是发展软技能。