全栈,是用有限(且更依赖于人偏执性)的片面思维换取所谓通用性,在该通用模式被计算机取代之前的临时折衷做法。
实际问题中,存在了多个“栈”,虽有少量交叉,但它们的存在恰恰是因为有自己独特的问题域(貌似没有存在两种相同“栈”的理由吧),对应每个问题域都沉淀和使用了最高效的方案,比如网络层和数据层的架构和调优,所以,每个“栈”之间大部分理念和思维方式都可能是不兼容甚至是冲突的,这也是语言大战、工具大战、鄙视链等等现象出现的原因——这恰恰是系统分层的本质特性。
再来说说人,“全栈”的出发点,是为了寻找兼容所有问题域的方案,说白了,就是花一份钱买一百份收益(对,我也想到了山寨手机),但卖方真的是啥波一吗?那么,一旦引入“全栈”工程师这种非常容易出现个人偏执(即这个人必有所长有所短)思维的个体,这样的方案势必会抹掉差异,并将问题归结为砍头去尾的某些统一模式,那实际情况很可能是:
在有限精力下,这个人要做的只能是“掩盖个人有限精力和偏执性在专业领域的短板,并强行忽略之”。
试想,为什么node.js这类受很多“全栈”工程师追捧逆袭到后端的技术卖点却是“只需要会js”?岂非矛盾?
所以,这个圈里可以存在“全栈”团队(优势互补分而治之),而几乎不存在所谓的“全栈”工程师——这由人类思维的局限所左右,后者只能是一片涂不匀的草莓酱,或者你只需要来个稀里糊涂的买卖(并非专业需求),或者是一些抠门老板YY出来的称呼。
当然,市场的选择,导致目前主流问题域出现了一些整套的相似方案(比如一个典型的Blog系统,当然还有我们经常遇到一些前辈烟圈里翻腾的那句“软件不就那么回事,不就数据库么”),但人们往往忽略了一个支撑信息产业到现在的最根本理论:只要能复制的,都可以交给算法去执行。这些方案都趋向于由工具或者更高级的模式屏蔽差异,“全栈”的期望愈演愈烈是技术发展走向新高一层的中继,也是认知层次提升所需要经历的阶段。
所以,“全栈”更适合一些初创团队快速demo处理一些“先搞起再说”的场景,而当问题域变得复杂,专业需求不再是可忽略的场景下,一味的“全栈”反而阻碍了技术栈的深度——栈溢出,或者把时间浪费在了上下文切换上,再或者跟鸠摩智一样武功尽废。
可怜的架构师。