签到

05月05日
尚未签到

共有回帖数 0

    白衫故友

    等级:
    Wetware - 2012-08-11
    译自:http://www.yosefk.com/blog/what-worse-is-better-vs-the-right-thing-is-really-about.html

      我想这个想了几年,然后写了出来,然后又把写好的玩意扔在那几年没动。
      让我现在把这个贴出来的——至少是第一部分、相对来说写完的——是 Steve Yegge 的这篇(https://plus.google.com/u/0/110981030061712822816/posts/KaSKeg4vQtz),一篇把政治上“激进对保守”的辩论、以及软件开发者的职业世界观中一些意见的对立、这两种现象做出类比的文章。他类比的核心是规避风险:保守主义比自由主义更能规避风险,无论是在政治上还是在软件里。
      我想描画一个相似的类比,但从一个多少有些不同的角度:在政治上,人们之间看法迥异的一件事是“市场”和“竞争”的角色。一些人认为它们是基本正面的,而另一些则看作洪水猛兽。这跟“左”和“右”稍稍有些联系(注意,政治上的左翼和右翼可是重载了很多义项的用语)。
      那这个跟软件又有什么关系呢?我将尝试阐明关于看待市场的观点分歧正在于这篇经典论文《The Rise of Worse is Better》(http://www.dreamsongs.com/RiseOfWorseIsBetter.html)中描述的冲突的核心。那篇论文给出了两种相对立的设计模式:“差劲更好”和“正确的事”。
      我要声明,对经济进化的观点是我这篇文章所依赖的基础——并不是在那篇论文中提到的、在设计简单性和其它考虑之间做出的权衡。
      所以说,那篇论文说了一件事,但我可以负责地告诉你它其实说的是另一件事。
      然后我会告诉你问什么它对我来说很重要,还有为什么——用 Yegge 的话来说——“这个概念性的框架成为了我工具箱里最重要的工具之一”。(当然,即使我们现在都在谈论他自己那篇类比。)
      还有就是我知道你们可能赞同或者反对进化论。我自己是倾向于反对的,不过我有努力着不做过头啦。
      许多技术上的工作都是在市场环境中完成的。我这个“市场”是一个泛指——不只是用来卖钱的开发,也包括竞争的情况。程序在争抢用户,规约(specification)在争抢实现者,诸如此类。
      市场和竞争自有它们的手段来在人群及其思想中选拔佼佼者,技术市场和技术人群也不例外——包括那些最为人所知、最为人景仰的人。Linus Torvalds 这么(http://groups.google.com/group/fa.linux.kernel/msg/52f04d4ab1121c9b)谈论竞争:
        别轻视“适者生存”的力量。也别错误地认为你总可以设计出个比你从无情的、大规模并行的带反馈循环的试错过程中所得到的更好的东西,那是对你的智力自信过头了。
      Alan Kay 则是这么(http://www.doc.ic.ac.uk/~susan/475/AlanKay.html)说的:
        ……如果你同时有一个伟大的想法、截止日期、便利主义和竞争对手,你会做的很可能是把那个想法过一遍低通滤波器、实现一部分而把下一步要做的丢掉。向来如此。
      也就是说,Linus Torvalds 视竞争为“过程之源”、比人的创造力更重要;而 Alan Kay 则相反,视市场约束为横在好点子面前无法克服的阻碍。
      (Linux 比 Smalltalk 在“市场”上成功得多的事实,不论你考虑的是哪个“市场”,都跟创造者的价值观完全对齐。)
      就像事故一样,Linux 由 Unix 派生,而 Smalltalk 从 Lisp 那里受益良多。有段时间 Lisp 和 Unix——文化以及实际的软件之间——打得你死我活,不过这场仗变成了一边倒的“小鹿班比遇见哥斯拉”(http://v.youku.com/v_show/id_XOTY5NDg4OTY=.html)情形:便宜的 Unix 箱子很快替代了基于 Lisp 的复杂工作站,让后者沦为收藏品。
      在《Unix 痛恨者手册》(http://m.simson.net/ugh.pdf)里破天荒地用讽刺性技术写作风格记录了那场战争的流毒。这本书在市场约束下的进化过程中担当了与 Alan Kay 所述相似、与 Linus Torvalds 所述相反的角色:
        文献里断言说 Unix 是因为它在技术上的优势而成功的——纯属扯淡。Unix 只是在进化上较其竞争者为优,而不是技术上。Unix 成为了商业上的胜利,只因为它是个病毒。它唯一的进化上的优势是小尺寸、简单的设计、以及由此带来的可移植性。
      “Unix 痛恨者”们把进化优势看得跟技术优势相去甚远——而且还不大承认进化优势。作者对进化产物的轻蔑态度并不限于为经济因素所驱动的开发,还扩展到自然选择上:
        一旦人类基因组图谱绘制完成,我们就可能发现其中只有百分之几才真正描述了有用的人,而剩下的只编码了猩猩、新变异种、电视传教士、卖旧电脑的。
      比较一下 Linus 对人类基因组计划的信服:
        我们人类从未能复制比我们自身更为复杂的某种存在,然而自然选择连想都不想就做了。
      《Unix 痛恨者手册》在一片附录里刊载了 Richard P. Gabriel 的著名论文《The Rise of Worse is Better》。这篇论文阐释了两种它所称为对立的软件哲学,并把 Lisp 所立足的哲学命名为“正确的事”、Unix 的根基命名为“差劲更好”——我相信这是再合适不过的两个名字。
      这篇论文同样尝试着捕捉那两种哲学的关键特性——但依我看来,比起那些哲学的核心、论文更关注的是那两种哲学的先天化身。论文声称它是关于不同设计者为“简单性”所赋予的重要程度的不同,而我声称说到底它是南辕北辙。
      也就是说,我认为论文讨论了真实的东西、命了正确的名字,却给了错误的定义——一个多多少少难以守卫的论断。以下是我对这一论断的守卫尝试。

    差劲更好——因为它更简单?
      Richard Gabriel 把“差劲更好”定义为一种关注简单性而牺牲完整性、一致性甚至还有正确性的设计风格。“正确的事”则被勾划为完全相反的形式:完整性、一致性和正确性碾压掉简单性。
      首先,“它是真实的吗?”这两种哲学之间的冲突是否真正存在——而且不仅是 Lisp 和 Unix 之间的冲突?我认为它确实存在——这也就是为何那篇论文能唤起不大关心 Lisp 或者 Unix 的人的共鸣。比如,Jeff Atwood(http://www.codinghorror.com/blog/2004/08/worse-is-better.html):
        ……被《The Rise of "Worse is Better"》(http://www.jwz.org/doc/worse-is-better.html)吹飞了,因为它碰触到了我已经在我博客提到过的一项主题:对复杂性的拒绝,即使复杂性是在理论上来说更加正确的解法。
     这则评论承认我们所说的冲突即使在其原本的上下文之外也仍然存在。它同时把这种冲突定义为简单性和复杂性之间的冲突,跟论文的定义很相似——却与我的“它跟简单性无关”主张相反。
      不过下面有个“差劲更好”队伍的人参赢家的例子——x86 强势插入:

      你或许正在其上阅读这篇网页的 x86 架构被广范认定为一大坨翔。它确实是。但它是一坨从春哥菊花塑造出来的翔。
      x86 在九十年代后的乱序执行实现确实是“春哥菊花塑造的”,但它从未因为简单性而受批评——恰恰相反,它就是被批评说一个高效的实现不可能简单。这也就是价值数百万美金的“塑造”为何必要的第一理由。
      x86 是一个简单性的例子吗?不是。
      它是“差劲更好”队伍的人参赢家吗?一个人参赢家——绝对是。“差劲更好”的队伍——是的,我想我可以证明。
      但如果在原教旨主义下、“差劲更好”被理解为“简单压倒一切”的话,那 x86 还是会被踢出这个队伍的。
    差劲更好——因为它更兼容?
      不像 Unix 和 C 这种“差劲更好”的原始例子,x86 不容易被高效地实现——而易于高效实现的是它的竞争者,RISC 和 VLIW。
      但不管怎么样,我们还是感觉 x86“就像 Unix 一样”。不是因为它简单,而是因为它身为较差参赛选手的逆袭夺冠。因为较为干净的 RISC 和 VLIW 在本文里是应当属于“正确的事”那一伙的。
      还有,因为 x86 是因为把宝押到进化压力上而获胜的。
      Bob Colwell,奔腾的首席架构师,曾是 Multiflow——一个正在坏掉的早期 VLIW 公司——的设计工程师。公司的崩坏提示他应当跳槽去 Intel 参与创建 x86 的乱序实现、也就是 P6。在《奔腾编年史》(http://www.amazon.com/The-Pentium-Chronicles-Politics-Practitioners/dp/0471736171)中,他给了简单性两星,也承认复杂性是 x86 的一项缺点——然后这样解释为何他仍然把宝押在 x86 上:
        RISC 和 CISC 的辩论这锅水开了整整一个 1980 年代。RISC 的大前提是计算机指令集……已经变得越来越复杂、大而难解到影响生产力的程度。在工程上,在所有等价的东西中、小的总是更好的——而且有时候是好得多的。
        ……一些我工程上的同伴认为我要么是个抖 M 要么疯了:我刚从渐渐沉没的 Multiflow 这艘船上逃生游上岸,却又立即掺和进一项“注定要完蛋”的 x86 设计项目里。在他们眼中,无论我的设计团队多么聪明,最后总是不可避免地被更高级的技术扫地出门。然而……我们可以——事实上也——把 RISC 差不多所有的技术优势都导入到了一个 CISC 设计当中。至于剩下的,我们可以用额外的工作、略大一点的芯片尺寸、以及更大的产品运输容量来弥补。尽管更大的芯片尺寸……意味着更高的生产开销和功率耗散,在 1990 年代早期……简单的冷却方案还是唾手可得的。还有,虽然生产开销受芯片尺寸的影响,但它要远远更依赖于要运输的尺寸——在这一点上,CISC 比起它的 RISC 竞争者而言有着莫大的优势。
      ……因为有更多的用户已经准备去买 x86 处理器来让他们现存的软件跑得更快了。
      x86 是“差劲”的——就像现在被越来越明显揭示出来的一样,在手机和平板电脑上、简单的冷却方案并非唾手可得,而此时身为 RISC 处理器的 ARM 碾压 x86 无压力。但在 1990 年代,x86 因为兼容性问题而“更好”。
      “差劲更好”,即使并不简单——当“正确的事”是技术上而非经济上正确时。

    差劲更好——因为它更快速?
      有趣的是,Jamie Zawinski,第一个(http://www.dreamsongs.com/WorseIsBetter.html)宣扬“差劲更好”理论的,走上了一条跟 Colwell 多少相似的道路。他从 Richard Gabriel 的 Lucid Inc.“游上岸”(他在那参与本来可能成为 XEmacs 的项目),参与了那时还叫 Mosiac 的 Netscape,并且开发了他们非常成功的浏览器。他是这么(http://www.codersatwork.com/)谈论那时 Mosaic 的境况的:
        我们就像宗教一样全神贯注于截止日期上。我们要么在六个月内交付一个完整的产品、要么死在尝试那么做的半路上……我们环顾剩下的世界,决定如果我们不在六个月内做完,就会被人揍到在六个月内挂掉。
      他们没必要非得跟 Unix 似的在一个小机器上引导这个程序,也没必要跟 x86 似的跟以前极度复杂的版本兼容;他们只要麻溜利索做完。
      然而另一种经济约束意味着必须让出一些别的东西。“我们肯定勾销了一些特性。”结果代码——用 Jamei Zawinski 的话来说——不太简单,但也不太好:
        我得意的不太在于这个代码,而在于它已经完成了。在许多方面这代码都不怎么好,因为它是赶工的产品。但它被完成了,我们交付了——那就是底线。
      “差劲”的代码比没按期交付“更好”——“差劲更好”的最简单形式。跟简单性半毛钱关系都没有。
      James Zawinski 是这样(http://www.jwz.org/doc/)谈论那篇“差劲更好”论文的——还有,像 Jeff Atwood 一样,他也给出了一段不总结实际的文字、而总结“他感觉事情本应当是什么样的”的总结:
        ……你应该读读它。它阐释了为何平凡总是比完美有更高的生存优势。
      这篇论文并不解释那些——文字只是解释了为何“简单却错误”比“正确但复杂”更有生存优势。
      但就像 James Zawinski 和 Jeff Atwood 的评论所证实的一样,人们希望它解释一些别的东西——一些关于“完美(正确的事)”对抗“小于完美(差劲更好)”的东西。
    差劲更好进化论
      于是,看起来强迫你小于完美、选出次于完美的解决方案、“认为”自己更好的那些东西,永远都是经济上的、进化上的约束。
      经济约束是在为简单性(Unix)、复杂性(x86)、开发速度(Netscape)——或者任何可能导致别样差劲产品的其它品质——做出选择时所可能发生的东西。
      就跟 Alan Kay 说的一样——但跟 Linus Torvalds 的信仰相反。后一信仰认为进化的结果最终会在事实上比任何缺乏进化压力而产出的产品都更好。
      从这个观点来看,“差劲更好”事实上比任何现实中的替代品更好——然而从 Alan Kay 的观点出发,“差劲更好”事实上比能做到的更差。
      (有点晕了,是不?事实上,Richard Gabriel 写了一些后续,但也没能确定“差劲更好”事实上是好是差。我不是要帮他的忙——只是要展示什么东西可以使一个人认为它事实上好或者差。)
      以上是第一部分——我希望已经展示出你的进化观对于你的设计风格而言有着巨大影响。
      如果进化是你世界观的核心,如果你认为可持续发展在任何领域都比完美更重要,那么你会倾向于“差劲更好”风格的设计。
      如果你认为进化压力是一个障碍、一个在通往完美的道路上极不重要的歧路,那么你会更喜欢“正确的事”风格的设计。
      但是首先,为何人们的进化观不同呢?在这分歧之下,是否有一些更为基本的假定?我想关于这个我有更多话要说,即使这并不像第一部分那样有个完整的形态,但我以后可能会把它们都写出来。
      同时,我也要用一些关于“为何它对我个人来讲重要”的想法来为这第一部分作结。
      我本质上是一个完美主义者,很难接受妥协。像其他好到足以实现自己的大部分野心的开发人员一样,我把我的职业生涯变成了一场追求完美的挣扎。我没完全丢掉常识,但我以前也干过傻事。
      我写过启发式的 C++ 解析器、用汇编做过 96 位整数算数、在裸机上做过歪门邪道的线程迁移、之类之类许多不想提及的黑历史。
      那些都是无理无益无用的玩意——如果你今天问我的话。那只是在成为“对我来说好过头”的、“完美”之道的垫脚石的意义上来说才是“有用的”。今天,我意识到这种完美毫无存活力(事实上,那些怪异没有一个能挨到现在的)。如果可以重来的话,我会在一开始就选则一条不需要任何如彼复杂的完全不同的道路。
      但是我写的那些都交付了。我成功地让它们工作起来。人都是不见棺材不落泪、不撞南墙不回头的主——至少我是。完美主义者都是顽固派。
      然后某一次我失败了。我只能扔掉几个月码出的代码,因为它们根本不干活。
      然后我偶然读到了《Unix 痛恨者手册》。我就像蓝蓝路广告一样喜欢它,因为我就是书里说的那种完美主义者,或者至少足够接近到跟他们搅基。然后就有了这篇文章。
      然后我在码马上要扔掉的代码时读着这本书,在决定扔掉和已经扔掉之后也是。
      然后我突然开始想:“这种东西不会工作的。一致性我所欲也、完整性亦我所欲、正确性同我所欲也——三者不可得兼。我太愚钝了,而且也没有足够的时间。我必须作出选择。既然那些目标不能都得到,那就最好确定一个去追。”
      如果你读《Unix 痛恨者手册》,你会注意到许多道德上的怒火——完美主义者对不完美东西的那种,尤其是对于故意选择小于完美的目标的人、尤其是当那是出于想要成功的隐秘动机时。
      这时我头一次有了与之针锋相对的怒火。“啥都没有还秀个毛?理想还能当饭吃?死尸当然要发臭。没有进化优势的技术优势?进化劣势意味着‘死亡’,那可能有技术优势么?死人有为我们做过什么吗?”
      对我来说那很大。我的意思是说,需要几年才能真正钻进去,但那还只是个开始。我至今还没做过任何“正确的事”,不过以后我会越来越欢乐的。我猜那也是一种“游上岸”吧。


    楼主 2016-06-23 12:00 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知