【译文】热闹驱动开发

本文由Yurii原创,转载请注明来源: Life Sailor

本文链接 【译文】热闹驱动开发


按:今天在网上看到阮一峰推荐的《Hype Driven Development》,忍俊不禁,联想到工作中的很多经历又百感交集。趁春节假期翻译出来(练练手),与大家共享。


软件开发团队所做的软件架构或技术栈的决策,很多并没有经过踏实的研究和对目标成果的认真思考,而是不准确的意见、社交媒体的信息,或者就些是“热闹”的玩意。我称这种作派为“热闹驱动开发(Hype Driven Development,HDD)”,眼见它的危害,我赞成更专业的做法,就是“脚踏实地的软件工程”。下面我们一起看看HDD的来龙去脉,想想能如何改进。

新技术带来新希望

开发团队把最新最热的技术应用到项目里,这样的情景你见过吗?有人是因为读到了相关的博客,有人是看到了Twitter上的潮流,还有人是刚刚在技术大会上听到了关于某门技术的精彩演讲。不久,开发团队就开始采用这种时髦的新技术(或者软件架构设计范式),结果他们却没法更快(就像之前说的那样)开发出更优秀的产品,反而身陷囹圄。开发的速度降下来了,信心受挫了,后续版本的交付也出问题了。有些团队甚至干脆专心修bug,停止开发新功能。他们“只需要多花几天”就能把事情搞定。

热闹驱动开发

热闹驱动开发有很多流派,也有很多渠道介入大家的项目:

Reddit驱动开发——在选择技术、架构、设计方案时,团队和个人的决策依据是知名博主的文章,或者reddit, hackernews, blogs, twitter, facebook, Github以及其它社交媒体上的热门信息。

技术会议驱动开发——仔细观察观察,参会回来的家伙们有什么表现。他们听了演讲兴致高涨。然而这是双刃剑。他们没有做足够的研究,就开始使用最新最热的类库、框架、架构范式,于是可能踏上通往地狱的高速公路。

嗓门驱动开发——有人整天谈论新框架/类库/技术,他自己其实没有实际经验,但是反复念经终于让团队决定采纳他的意见。

Gem/类库/插件驱动开发——在RoR社区里特别流行这种情况,有时候我会发现一个gemfile太长,唯一比它更长的只有程序启动时的装载时间。这种流派源自下面的观念:Rails里的每个问题都应当有个gem来解决。有时候分明只要自己动手写几行代码就能解决,但是我们还是一个劲地添加类库/插件/gem/框架。

我还希望提到热闹驱动开发的一个常见流派,StackOverflow 驱动开发——开发人员从StackOverflow(总之就是互联网上)拷贝代码,而没有真正弄懂这些代码。

HDD就是开发团队自掘坟墓

凑热闹的问题是:它很容易导致错误决策。无论是糟糕的架构决策,还是糟糕的技术栈决策,对团队的影响都常常持续数月甚至数年。最坏的结果是造成极其严重的软件工程问题,只能推倒重来。但推倒重来而成功的案例几乎没有。

一切罪恶的根源似乎都是社交媒体——新观点传播得太快,都还没来得及经过检验。大家还来不及细想有哪些利弊,这些观点就已经传播开了。

凑热闹的起承转合

大多数凑热闹的过程是相同的,像下面这样:

第一阶段:真实问题和解决方案

热闹的来源是,某些公司真的遇到了问题。这些公司里的开发团队认为,现成的技术栈、流程、架构并不能解决这个问题,必须自己动手。所以他们研发了新的框架、类库、范式,问题迅速解决了。

第二阶段:宣示、推广、包装关键词

团队热衷于向他人展示自己的成果。很快他们就发布了博客文章,也去技术会议上演讲。这些问题通常是有难度的,所以解决方案是有分量的,结果也是很可观的,开发团队对此很自豪。其它人也开始对这项新技术有了兴致。唯一的问题是,并非所有兴致勃勃的人都能彻底理解问题本身和解决方案的细节。毕竟,问题有难度,解决方案也有分量,所以不是一条推文、一次碎碎念、甚至是一篇博客就能讲清楚的。利用博客文章、技术大会的主题演讲之类的社交工具,原始信息就很容易走样。

第三阶段:狂热现身

HDD阴影下的开发人员都会阅读博客、参加技术会议。然后,世界各地的开发团队都开始使用新技术了。因为信息已经走样了,所以有些人会在框架问题上做草率的决定。哪怕新框架没有解决任何具体问题,开发团队仍然期望新的框架会带来帮助。

第四阶段:心灰意冷

新鲜劲头过去了,新技术并没有给团队带来期望的改进,反而增加了很多额外的工作。大家得重写很多代码,花不少时间专门学习。工作的速度慢下来,管理者也没耐心了。大家都感觉被骗了。

第五阶段:反省领悟

最终团队做了复盘,认清了追逐这项新技术的代价,也认清了新技术适合解决的问题。大家都变聪明了,直到再次凑热闹为止。

HDD举例

来看看几个热闹驱动开发的例子,看看它是怎么发生的。

举例 1:React.js

  1. Facebook遇到了一个问题,Facebook自己的复杂单页面应用里会出现各种状态改变的事件,必须追踪到发生了什么,并且保持状态的连贯一致。
  2. Facebook用几个时髦的词包装新范式:函数式、虚拟DOM,组件。
  3. 追逐热闹的人说:Facebook创造了未来的前端框架。我们现在就把一切用react重写吧。
  4. 等等!要做的工作很多,但这项投资看不到什么短期回报。
  5. React非常适用于包含很多实时通知的复杂单页面应用程序,但是对简单应用来说,它不见得合适。

举例 2:TDD被DHH杀死了

  1. David Heinemeier Hansson(DHH,Ruby on Rails框架的创造者)意识到,Rails的框架里没有对OOP支持很好的架构,所以很难做测试驱动开发。于是他做了个现实的选择:不要提前写测试代码。
  2. DHH的博客和会议演讲引发了热潮。关键词是:TDD is DEAD。
  3. 忘了测试吧!我们的领袖说过。一个测试也不要写。我们可不是在假装,而是在虔诚地执行。
  4. 等等!以前一些能正常运行的代码现在都出问题了。我们新写的代码错误百出。
  5. TDD无所谓生死。TDD是需要权衡的,权衡因素包括API变化的风险、既有设计、参与者的水平——Kent Beck。

举例3:微服务

  1. 庞大的单体系统很难扩展。在某个时候我们可以把它拆成多个服务。如果各个都用QPS之类的指标来衡量,扩展就容易很多,也更容易拆分给多个团队。
  2. 热闹关键词:可伸缩性、松耦合、单体系统。
  3. 让我们重写所有的服务!我们的单体系统已经是一锅粥了。得把所有东西都拆成微服务。
  4. 见鬼!现在系统开发的速度变慢了,部署的难度提高了,我们还花了不少时间在多个系统之间追踪bug。
  5. 微服务需要团队有充分的DevOps能力,还需要权衡增加系统和团队扩展性,保证投入划算。在你遇到严重的规模问题之前,这样的投资是超前的。微服务是提炼出来的,不是重写出来的。按照Martin Folwer的说法,微服务的门槛可不低

举例 4:NoSQL

  1. 在应对高压力和处理非结构化数据时,关系型数据库有不少问题。全世界的团队都在研究新一代数据库。
  2. 热闹关键词:可伸缩性、大数据、高性能
  3. 我们的数据库太慢,而且容量不够。我们需要NoSQL。
  4. 我们还需要联表查询?这可不行。简单的SQL操作现在都越来越有挑战了。开发速度越来越慢,我们的核心问题还没解决。
  5. NoSQL是用来解决特定问题的(要么是海量的非结构化数据,要么是非常高的负载)。如果专业水平足够高,关系数据库也是应对高负载和处理海量数据的好工具。非得使用NoSQL的情况,在2016年仍然不多见。

举例 5:Elixir和Phoenix (或者是你喜欢的语言/框架组合)

  1. RoR之类的Web框架不能很好地应付高性能应用、分布式应用、Websockets。
  2. 热闹关键词:可伸缩性、高性能、分布式、容错性。
  3. 噢,我们的系统太慢,我们的聊天系统不是可伸缩的。
  4. 才发现,学习函数式编程和分布式解决方案没那么容易,我们进展真慢。
  5. Elixir和Phoenix是很优秀的框架,但学习成本太高。如果你确实需要高性能的系统,它的益处要很长时间才会显现。

推而广之

在软件开发的小小天地里,已经有太多领域是热闹非凡的了。在JavaScript里,几乎每天都有新框架诞生。Node.js(关键词:事件编程),React编程,Meteor.js(关键词:共享状态),前端MVC,React.js…… 你可以随便举例。软件工程领域里新概念也层出不穷:领域驱动开发,六边形架构理论,DCI架构(数据-场景-交互)。你最喜欢哪一种呢?

正面的例子

如果我们不能相信网上的言论或是其他人的说法,那如何做出聪明的选择?下面是一些好的建议:

先测试、研究,再决定

快速搭建原型,不要从博客学习,而要从经验学习。针对新技术提供的功能,在决定采用之前花一两天搭个原型,然后组织大家分析利弊。你可能会遇到若干能彼此替代的技术,可以让团队里不同人用不同的技术来搭原型。

黑客马拉松,这也是不错的办法,它让大家真正感受到不同技术的代价。对所有兼具风险和诱惑力的技术,都让整个团队花一两天来把玩。这会让大家自主做出聪明的选择,根据自己的经验来决策。

何时开始?

原则上说,应当选择投资回报巨大的时间点开始。大多数技术是用来解决特定问题的。你遇到了那个问题吗?那个问题重要不重要?会不会节省很多时间?新技术带来的好处能不能抵消学习成本和重新的成本?如果我们的开发速度从一开始就降低到正常水平1/2甚至1/4?想想新技术还值得吗?

优秀的团队有更多自主权——一些团队确实比其他团队更快出成果,他们也更容易厌烦自己手头的工作。这些团队可以更多更快地引入新技术。但这不是省略快速搭建原型或者黑客马拉松的理由。相反,如果这样的团队在交付上遇到了麻烦,一定要加倍小心。

雇佣对的人

有良好技术背景的人——那些人了解不同的范式,理解编程的理论(算法和并发),受过良好工程文化熏陶,这样的人很少去凑热闹。

有经验的人——年轻的开发人员更喜欢凑热闹。如果有多年的开发经验,见过许多技术,踩过许多坑,在技术决策时就更容易做出客观的判断。

Yurii

Recent Posts

德国育儿经验:家长需要和儿童谈论”空气动力学“吗?

家长应当和儿童,尤其是低龄儿童谈论“空气动力学”吗? 我的答案曾经是非常肯定的:不应当。不要说儿童,就是成年人也不见得理解这些抽象的概念,与儿童谈论这些名词,只会让人望而生畏。身为父母,我们应当做的是,以孩子能理解的、感兴趣的方式谈论相关的具体问题,但绝对不要提这些大词。 不过世界的奇妙就在于,父母对教育并没有绝对的权威,总是需要根据实际情况来修正自己的观点。在“空气动力学”的问题上,我就吃到了教训。 那是一个下午,家里小朋友在iPad上看完他最喜欢的Blippi(这个节目我之前介绍过,对80后父母来说,Blippi可以理解为“带你见识各种新鲜玩意的董浩叔叔”),忽然抬起头来问我:“爸爸,你知道什么是aerodynamics吗?” “什么?你问我知不知道什么是aerodynamics?”我的下巴都要掉下来了。“空气动力学”这种词还是上中学时,身为军迷的我们在《航空知识》上知道的。再往后英语好一些,能看原版科普视频了,才知道“空气动力学”的原文就是aerodynamics。可是,我家这个还没上小学的家伙,竟然就能真诚地瞪大眼睛,一本正经地问我“知不知道什么是aerodynamics”。 (more…)

3 months ago

忆孟繁超老师:他从来没有给我上过一堂正式的课,但我永远都是他的学生。

我本来是不应该认识孟老师的。 2001年,我在寝室夜谈里第一次听到孟老师的名字。当时有同学说“公共选修课的《法学概论》讲得真好,那个老师叫孟繁超”,开始我不怎么在意,慢慢才发现这么说的人还不少。那个年月网上的资料正丰富,出版管制也不那么严格,刚进大学不久的我正自由自在地看得过瘾,心想“大学里的法学概论讲再好,能讲些什么,还不是教科书上老一套”,所以这种课,不听也罢。 但生活就在这么奇妙。那年冬天,有天中午我吃过饭正准备午睡,忽然有人敲门问“计算机系有位叫余晟的同学在这里吗?” 大中午的谁会来找我?我正好奇这个问题,门一推开就有同学喊“孟老师,孟老师来了”。 那是我第一次见到孟老师,中年人,国字脸,身材高大,打扮很精神,披在身后的深色大衣让我一下子想起电影里的斗篷。他笑眯眯地说“你是余晟?听同学说你搞电脑很厉害,我家的电脑坏了,想请你去看看。” (more…)

3 months ago

“历史照进现实”,这似乎不太现实

中国人大概都对历史有一些特别的偏好。对我们普通人来说,历史首先是文化的象征,一个人“懂历史”,基本等于这个人“有文化”;历史也是民族自豪感的来源,哪怕考古上仍然存在争议,但是“五千年文明”的说法是普通人都耳熟能详的。 不过等我长大之后才发现,这种偏好大概还有更深层次的原因,那就是历史看起来有种道德的意味,因为我们从小就熟悉“以史为鉴”的智慧,也熟悉各种“历史的选择”:每当我们对现实感到失望、困惑的时候,我们经常去历史——而不是先贤的智慧中——中寻找解答。找到曾经发生的类似的故事,就可以预言未来的结局。 于是乎,失望也好、困惑也罢,总归会有光明的未来,历史总会给我们支撑的信念。 我曾经很相信,熟谙历史是种智慧,而且是深层次的智慧。但是看得越多、经历得越多,我就越觉得,这很难称之为“智慧”。 为什么? (more…)

3 months ago

无人出租车,是技术进步的一粒灰,还是普通人头上的一座山?

“无人出租车要来了”。以百度“萝卜快跑”为代表的无人出租车,眼看就要在国内多个城市成规模运营。 熟悉IT的人都知道,IT的独特优势就在于“大规模扩展时边际成本极低”。在软件时代,微软开发的Windows,多卖一份的成本只是多刻录一张光盘而已。在无人驾驶时代,从10辆车到10万辆车的成本,也遵循同样的规律。换句话说,一旦模式“跑通”了,就可以迅速大规模铺开。无人出租车的大规模应用,也是“指日可待”了。 只不过,新技术这一次似乎没有那么激动人心,反而引起了很多争议——无人驾驶出租车大规模推广,会不会影响广大出租车、网约车车主的收入甚至生计?如果是,这样的技术进步,真的是我们所需要、所期待的吗?对于这个问题,不同的人有相差迥异的答案。 按照我的观察,许多人对此是相当乐观的。理由在于,“技术的每一次飞跃发展,虽然有阵痛,最终都创造了更多的新岗位”。既如此,无人出租车短期“看似”抢了许多人的饭碗,但也只是短期的“阵痛”而已。看看历史,纺织机的发明,蒸汽机的改良,汽车的诞生,无不证明了“阵痛说”的正确性。 坦白说,这种观点我是怀疑的。 (more…)

3 months ago

回国感受:松弛一点,愉快一点

因为小朋友放暑假,近期带小朋友回国待了几个礼拜。最深的感受就是标题所说的:松弛一点,愉快一点。 我第一次突出意识到这点,是在上海下飞机乘地铁。当时我们乘的直梯就要关门,远远看见有个年轻小伙子跑过来,我连忙按住开门按钮,并招呼他”别着急,慢慢来“,等他进了轿厢才关门。本来我以为大家起码会打个招呼,露个笑脸,因为我已经习惯如此,但完全出乎我意料的是,他进来之后对我们完全视若不见,自顾自掏出手机,盯着看得入迷。 我继而发现,不管是在电梯里,站台上,还是车厢里,虽然四下里都是广播”请扶好站稳,抓好扶手,不要看手机“,但是似乎人人都盯着自己的手机。年轻人在打手机游戏,年纪大一点的在滑各种小视频,还有不少人在聊天软件里打字如飞……对着屏幕的表情都很生动,可是一旦抬起头来,似乎马上又换了个人。 后来又有一次,我乘地铁的时候,因为比较拥挤,一个小伙子倒退时踩了我一脚,他大概意识到了,很快把脚挪开,脸上闪过一丝不安,马上又恢复正常,我也没有计较。不幸的是,过了十来分钟,他又踩了我一脚,同样是先有一点不安,很快又恢复正常。 这次我忍不了了,于是我开口告诉他:“小伙子,你已经踩了我两脚了。” (more…)

3 months ago

First name, last name, middle name,浅谈外国人名

前几天,国内朋友发来一条消息,原来是乌克兰F-16坠落,飞行员丧生的新闻。我本来以为他要讨论此事的真假和原委,他真正的问题却完全出乎我的意料: 新闻里说,飞行员叫阿列克谢·“月鱼”·梅斯,对应原文是Alexei “Moonfish” Mes,为什么会有人把“月鱼”写在自己的名字里,而且还打引号。 之前看新闻,乌克兰还有一个著名的飞行员叫安德烈·“果汁”·皮尔希科夫(Andrii “Juice” Pishchykov),怎么“果汁”也是正式的名字? 未必Moonfish和Juice之类,还有什么特别的含义吗?…… 这堆问题看的我有点想笑,因为自己以前也很苦恼外国人的名字,只有在国外长期生活,才逐渐搞清楚这其中的名堂。所以,除了解答朋友的问题,我也把自己的解释写下来,搞清楚两个最不容易理解的点,就不会对外国人名有那么多问题了。 (more…)

3 months ago