与其他互联网热词一样,”全栈“程序员也是英译过来的,英文全文是:Full-Stack Developer,你想啊,中国人民怎么会用客栈的栈、堆栈的栈来形容工程师呢?
谈论一个概念,首先得给伊个定义,一般来说,全栈工程师就是指技术多面手,掌握多种技能,能够独立完成 non-trivial application 的人。non-trivial 怎么解呢?就是有一定复杂度的,具备一定规模的意思。基于此,我和我的程序员朋友们,对全栈工程师的认识是:在技术栈的各个领域都能够做到出色的工程师。有了这个标准,我和程序员们面面相觑,发现没有一个是全栈工程师。技术领域浩如烟海,更新换代之迅猛如炸雷不及掩耳,别说盗铃了。互联网短短 20 年的发展,累积的技术信息已经不是我们终其一生能够消化的了,知道尚不可为,何以做到出色?
但是,这个标准稍稍降低一点,早期的程序员差不多就都能叫全栈了。2001 年左右我们开发 B/S 产品,用来展现 UI 和数据的程序代码中混杂了 Java、HTML、CSS 和 JavaScript,根本不可能把前端和后端拆开编写,而后端业务逻辑本身就是 Java 实现的,你不写谁写?懂了业务逻辑和算法还不行,你得把数据存数据库和文件系统吧,什么?你不懂 SQL?我靠那你还是程序员吗?你不能每次和数据库交互都让一个进程去敲门吧,数据库招你惹你了?这时候就得有个连接线程池。异常得统一处理吧,得支持集群吧,给用户部署了得能自动扩展吧,没测试怎么办?你自己写的代码写的业务逻辑写的界面,你不保证正确性谁保证?……
总之在那个年代,每个程序员差不多什么都得会点,但有的人在这个领域强一些,有的人在那个领域出色一些,不一而足。
现在看来,那时候我们应该叫全沾工程师,什么都会点,能解决问题,但是单个人,除了自己擅长的技术,在其他领域,都没能做到出色。
如果这个标准再降低一点,比如说把「non-trivial」去掉,随便做个 Application,那就容易多了,一个零基础智力正常的成年人去培训班培训几个月,差不多就能做出一个网站、一个移动 App 还包括后端,或者一个数据挖掘的展示页面。但这个范围仅仅局限在会上,和做好、出色,差距明显。可以看做是入门级的工程师,只不过和前端工程师、移动开发工程师、Java 工程师相比,什么技术都懂一点点而已。
这种工程师,我们可以把他们叫做全站工程师,基本上,进入企业之后,都得有老师傅带着,手把手教,练习和实战,才能做「non-trivial」的项目。为啥叫全站呢,意思就是老师傅讲东西的时候,都在旁边站着。
有没有真正的全栈工程师?有,比如菲尔普斯在游泳层面勉强算全栈,奥运会咔咔拿 7 枚金牌,你服不服?你说我也会四种泳姿……您那叫会,会和做好,差着几十个二把刀。当然了,二把刀也没什么不好,至少比拿根儿木头杵着强多了。鼓励大家在立足本职成为专家的基础上,成为一个认真的二把刀。
什么是程序领域的全栈工程师呢?我觉得云风算是游戏领域的全栈工程师,他自幼编程,在语言层面对汇编、C、C++、Lisp、Java、Python、Lua 都有深入的理解,使用起来如臂指使,对游戏领域的策划、引擎、协议和服务端架构也是驾经就熟,最新开源出来的 skynet —— 基于 Lua 实现的网络游戏服务器框架,极具参考和实用意义( https://github.com/cloudwu )……但是云风不做 Web 游戏啊,他对 JavaScript 的评价是:javascript 真是门恶心的语言!
领我编程入门的师兄 baby,也是一个编程奇才,他对操作系统、编程语言、数据库均有透彻的了解,学习新技术只能用迅猛来形容,每次技术选型之后,他就会趴在办公室里敲敲打打几天,然后丢给我们一个用新语言实现的框架,告诉我们,用!一用之下,几乎没有 bug。这样的人,可称全栈。他们并不是在编程领域样样精通,而是在需要的时候能够在极短的时间内达到常人需要长时间练习才能达到的水准。
正如我在书中写到,高手并不是懂得多,他们只是学得快而已。
现在 baby 早有了自己的公司,估计技术也做的少了,现在想起他那训疾如风的键盘指法和闪电般的学习速度,还是让人一声叹息。
整体来说,我觉得程序员们没必要去追逐什么「全栈工程师」,在工作和生活中,花 200% 的时间让自己在擅长的领域成为超越 80% 的人,然后,需要学什么就去学什么,一味追求大而全,反而会适得其反。
之前推荐的公众号「刘炯」曾经写过一篇「想当全才的自我反省」,其中一段大意如下:
就像有人给自己设定目标要学英语、学乐器、学编程、学设计、学会计、学书法、学厨艺最终一事无成一样,我骨子里也希望自己做个「样样精通」的「全才」,然而事实上自己把时间更多的花在收集信息和焦虑上,反而没有将时间用在真正的技能学习上,最终获得了「样样稀松」的结果。
这就如同很多游戏中的稀缺技能点一样,玩家永远加不满所有的技能树,如何有策略的使用有限的技能点来解决对应的问题,成了每个玩家必修的课程。
现实生活中,亦是如此!