码农轰轰烈烈的重复造框架热潮

在程序员圈子里,一直的狂热就是,拼尽全力去造框架/类库/平台/生态系统,而不是老老实实写业务代码。

从造的框架质量来看这里面又分几类人,一类是明知道自己写的没有现成的好,但是出于学习练手的目的;还一类是写了就比市面上的好,比如 Linus Torvalds;最后一类是,自己觉得自己写的比现成的好,写完了还得强行推广给别人用,这类人占大多数。

首先看看为什么程序员们都有必须一定以及肯定造框架的理由,明白了各种合理的虚伪的以及牵强附会的理由,才能做正确的选择。

首先,造框架的理由无外乎这些:

  • 别人写的太烂。对于码农这个圈子,充斥着“文人相轻”的文化。文人互相觉得别人的文章写得烂,码农觉得别人写的代码都是一坨屎,必须自己拉一坨更好看的屎,就算不小心能力不足拉了一坨更难看的屎,那也是自己拉的亲屎,怎么看怎么舒服。
  • 别人的太贵或者有版权原因,又没有免费的可用,著名例子就是 Linux 操作系统。
  • 别人写的太慢,白花花的金钱等着用我的新框架去赚,时不我待,我要千里江陵一日还的速度。
  • 别人不待见你,你提交 pull request 不鸟你,只能另起炉灶。
  • 眼界有限,不知道有什么框架可用,也没有时间去研究。
  • 现有的框架不满足我前无古人的需求。
  • 卖的就是框架,总不能把别人的框架刷个油漆就当自己的。一个经典笑话就是 Azure 是搭在 AWS 上的。
  • 需要掌握核心科技,不放心交给别人做。这也是为什么**主义国家都要做国产操作系统,还用国产纸去磨芯片。
  • 大神们的理由只有一个,别人跟我对着干,我要干它,于是随便写写 Git 就诞生了,把收费的企业级版本控制软件的市场份额干得只剩一个零头。
  • 小白们的理由也只有一个,想学习技术,不期待重造的框架更好用,而是从学习技术的角度出发。

理由是要给的,毕竟程序员向来讲道理不胡来,从来不出师(屎)无名。但是结果就没那么理想了:

  • 重新造的就是牛,拳打工业界,脚踢学术界,再让两界舔几十年。
  • 重新造的没那么牛,但是比现成的牛,能解决业务需求。这样公司已经赚回发的工资了有没有。
  • 重新造的比现成的烂,不管多烂,我练手了,学习到了,这个也算值回自己的时间了。
  • 重新造的比现成的烂,但是为了名利,还是要吹牛,还是要强奸别人用,哦不对,强推别人用,出去开会也要到处吹牛。不客气地说,大部分的造框架运动结局就是这个。

理想的结局就不多说了,不是本文重点。毕竟做对了,还扯个毛线啊。下面主要讨论不那么理想的结局,也就是造了一堆烂框架,污染了生态环境: 

不合理的出发点,导致了烂框架遍地。而合理的出发点,最核心的根本就是要基于“反思当前的最佳实践“而造新框架。如果都不知道当前的最佳实践,而是为了造框架而造框架,这就跟小孩看见别人家有好玩的玩具,自己哭着喊着也要一个一样没什么区别了。

很多人没有正确的出发点,强行造框架,大多是因为名利。天下熙熙,皆为利来,天下攘攘,皆为利往。天下所有事情都可以从一个利字出发来找最真实的解释。写业务代码太 low 了,写框架比较高端,能装逼,说出去好听,又没人看你的代码,何乐而不为呢?

还有一类需求,就是现成的框架太不通用了,我要造一个银河系都通用的框架,不用管程序员能力是什么样的,去造就对了。这个就没法评价了,只能贴俩图来应景:

好框架诞生靠技术与机遇,但是烂框架能够成功地一批批地被制造,也是天时地利人和的结果。首先,技术负责人大部分情况下不懂技术,觉得自己开发的才上得了台面,对外也好吹牛,允许浪费资源造没用的框架让程序员练手。另外,还得闲,业务不着急,先写写框架练手。练手的时候,还想万一一个不小心造一个世人膜拜的框架怎么办?就好像,我是去练习跑步,万一一个不小心练到了能参加奥运会的水平怎么办?

原来在一个创业公司,见过非常奇怪的现象。所有人都喜欢用 Golang 重写任何企业组件,而不是用成熟的 JVM 栈的语言和框架。理由大概是自己写的有成就感,可以锻炼能力。而公司招的又是大量的应届生,毫无现成框架使用经验,更别提写个不错的框架。最后 bug 遍地开花,吃屎都吃不过来。最后产品被这个原因一拖再拖,不是开发进度慢就是 bug 修不完。有段时间公司需要人脸训练数据,我业余花了俩小时写了个抓取婚恋网站相册的爬虫,离职后交给一个小兄弟了。对话如下:

我:说这个爬虫的精华都给你了。

他:(看了半天)你这个不是用分布式代理么?

我:是啊,用了几十个不同公网 IP 地址的机器上呢,不然抓图片那么猛早被封禁了。

他:说怎么没看见用几十个 IP 的代码呢?

我:这个是用 HAProxy 作为 load balancer,把 HAProxy 的 master 节点设置为代理 IP,爬虫连这一个 IP 就可以了,HAProxy 会动态 forward 流量,不用自己写代码。

他:不是自己写的代码算什么精华!

我:首先,什么都自己写也不可能比 HAProxy 写得更好。HAProxy 用 C 写的,开源社区维护多少年了,质量刚刚的。自己写,花多少时间?而且抓取世纪*缘和百*网相册这个想法,就是精华之一。婚恋网站的相册大多是单人出镜,一个相册大多是同一个人,数据质量很高,用来训练模型的话,半自动清洗数据的成本极低。而且这个爬虫利用了世纪*缘网站的漏洞,无需登陆就能抓到高清大图,并且模拟成了搜索引擎的爬虫,大大降低了爬虫被查封的机率。这些都叫精华。如果不是这么做,原来的人怎么收集人脸数据的呢?他们做了一个把人变成大猩猩的 H5 小程序,上传一张自拍照,就返回这个人是那种大猩猩进化来的。这是哪个天才想出来的?谁天天拍照片看大猩猩?用这个哪辈子才能收集够数据?如果收集够数据了,说明做 App 也能做火,为什么不转行?

轮胎厂造轮胎,汽车厂用轮胎,司机还是老老实实开车比较好

程序员的工作,大体分两种,一种适合做业务逻辑开发,另一种有能力做基础架构研发。一个是 D,一个是 R&D,工作性质天差地别,招的人水平也不是一个层次。如果分不清这两种工作内容和这两种能力的程序员,那就是在自娱自乐中造框架了。这世界上任何行业,工具没多少,需要干的活千千万万,如果任何一个活,都需要一个定制的工具,那开模具就要多少钱?造软件框架看起来试错成本低,大概是忽略了时间成本和人力成本。脑补一下,你开车去加油站加油,没油,你得开车去油田自己采。就算你油箱里剩的油能开到油田,你还得搭个钻井,搭完了发现不专业,搭错了,忘了先勘探哪里有油再搭了。本来就想吃个鸡蛋饼,结果养了一农场的病鸡,还卖不出去。

事实很清楚,人类历史上各行各业,只有极少数的人,造框架造出了未来,大多数人只是陪衬。而且堵这极少数的概率是没用的,有的人造框架成功的概率就是90%,有的人一辈子也是0%。就像金庸小说里面,大侠如杨过才能自创黯然销魂掌,一般人练现成的功都练不会,强练的话,连欧阳锋这种高手也得走火入魔。就不存在什么低段位的自创一个蹩脚武功,还得逼着别人都学他的。这就好比朋友圈显摆的,都觉得别人没钱自己有钱,写框架让别人用的,都觉得别人不会写代码,就他自己写得牛。

从开发者的角度说,如果把开发业务逻辑和造框架并行来做,得有坚定的精神信念才能不致精神分裂。工作进度不容易管理把控,连开发者自己也不知道自己的能力属于哪个层次,写着写着就容易产生“老子就是上帝,能高质量地造一切”的幻觉,在水平低的阶段盲目造框架。从公司管理层面的角度看,难能可贵的就是从一开始就知道自己花了什么层次的钱,招了什么层次的人,实际需要干什么层次的活,做到心中有明镜。

另外,只有重视长期产出的公司,才会允许员工有时间造框架。拼命赶进度的公司,是出不来的框架的。来个例子,看看 Google 给开源界的贡献,不仅贡献了几篇引领工业界10多年的论文,更是开源了大量内部基础设施框架,比如 Kubernetes, TensorFlow,  在 Google 的 Github 主页上可以看到数不胜数。 另一个角度看,不压榨员工的公司,更能招到顶级大牛来造划时代的框架。

再从最基础的层面看这件事。都知道做任何领域的工程开发,时间,质量和成本只能三选二。一般来说做业务开发的公司,时间要求都非常紧,必须照顾时间,所以剩下的质量和成本只能二选一。如果招的人成本又很低,人头又不够,又想开发出高质量的框架,那就很无语了。

有个例子就是,某团队用 Java 简化封装了一个云平台的某服务的 DSL,并且把这个 Java 库在内部大力推广。封装的理由就是原来的 DSL 写起来太冗余,简化封装了之后用起来更方便。这里就有问题了。你封装后之所以简化,是因为把原来的参数数目减少了,被减少的参数被这个 Java 库赋予了默认值,这里就把原来的 DSL 的灵活性降低了。原来的 DSL 也不是非要写得那么冗余,正确的做法是用内部成熟的 Jinja 模版流程生成冗长的 DSL,然后用这个云平台的另一个部署服务模版来批量部署,而不是手里只有一把锤子(Java),就把什么都变成钉子。

要市场经济而不是计划经济

大部分情况是,因为一个框架弱爆了,然后自己亲自开发了一个更烂的而不自知。这时候就得靠市场的力量。

市面上的工具,不管是锤子还是扳手,是要花钱买,花了钱代表认同和投票,市场经济决定工具的成败。这对于程序员来说,就是有种 merge 到 Github 上,让大家投票。别人认可,自然花时间去使用去贡献,花了时间就是最大的投票。不认可,连 pull request 都不会搭理。这就是市场经济。如果你的框架非常垃圾,就算你吹得再牛,也不会有人理你,这就是 Hello World 里的 World。

认识一个小兄弟,把开源的某框架改吧改吧,然后开会就跟人说我们修改了XX框架,很牛的,然而,我一直跟他说,不能 merge 回 Github 的,都是拿不上台面的修改。伟大的党一直说,实践是检验真理的唯一标准,受党教育这么多年,应该能明白啊。

公司内部,就不是市场经济,是计划经济,注定不合理。有的公司内部的框架,不管多烂,都能强推,说你行你就行,不行也得上。这类案例不仅在技术积累水平不高的小公司里盛行,在 BAT 这类巨头里也遍地都是。

学习老司机,而非老中医

前些日子有个新闻,说中国一科学家,觉得自己挺牛逼,用一个多少年前就有的技术,把一段基因改了,就免疫艾滋病了。好像别的国家的人不会改,就他会改一样。这听着在软件界是不是很熟悉?人类这个框架不管是进化来的还是外星人上帝创造出来的,都是经过地球上各种外部环境的大数据验证的,用大数据抛光出来一个模具,你说改就改了,这个劲头,多么熟悉。

当然,另一个极端就是拿着“不重复造框架”当借口,糊弄堆代码。盲目造框架不可取,不了解框架瞎用更不对。对于业务开发为主的公司,学习业界最佳实践,远比造框架高效实惠。能了解现有的框架需要很多能力,这些能力比盲目造低水平的框架更重要,不管对个人还是对公司。不了解最佳实践,随便用框架乱搭,就像把8个拖拉机发动机组一块,就以为是一个八缸法拉利。

了解现有的框架,能飙得飞起,就是老司机。用现有框架当黑盒,拿项目当小白鼠试药,就是老中医,试了一辈子药,可能都找不到规律。

最后

当然了,如果为了名和利,最简单了。对于初级玩家,想显得自己技术牛逼,去 Github 上贡献代码发 pull request 让别人 merge,想显得自己业务牛逼,开发个 app 去推广。这些都是没有门槛,只要花时间就可以做的事情。至于高级玩家,早就不屑造烂框架了吧。当然,造了烂框架好处也大大的有,公司离开你就框架就散架了,不但不能罚酒三杯,还得连升三级。