编程与软件工程dreamsongs.com编辑精选
更糟即更好之兴起(1991)
The Rise of Worse Is Better (1991)
2018 — 2024,它一次次回到首页
黑点是上首页(≥ 50 分)的那次投稿,空心点是没冲上去的投稿,点越大分数越高。
导读
《The Rise of Worse Is Better》是 Richard P. Gabriel 1991 年的一篇经典软件设计随笔,对比了“做对的事”(MIT/正确性优先)与“更糟即更好”(New Jersey/实现简单优先)两种风格,指出后者虽不完整,却因易实现、易移植而更容易传播并最终胜出。文章原本带有批判口吻,后来常被解读为对 Unix/C 成功路径的总结。
为什么经久不衰:它用一个反直觉的命名揭示软件生态中“简单可传播”往往战胜“完整正确”,是理解 Unix、C、JavaScript 乃至开源生态为何胜出的经典框架。
HN 评论精选
作者原意是批评,但“更糟即更好”也能解释 JavaScript 的胜出:先以简单可用占领生态,再靠大量改进变得足够好用。
这篇文章原本是用批判口吻写 C 和 Unix 的,说它们有很多问题,但只具备 50% 功能就被很多人接受为“足够好”,然后像“终极计算机病毒”一样扩散。发表后,许多 Unix 人把它重新解读为对 Unix 成功路径的赞美。我一直很讨厌 JavaScript 的不一致和丑陋语法,也觉得现在什么都带 JS 引擎、不管原生语言是什么都强制用 JS 很糟糕,还梦想过 Scheme 成为 Web 语言。但近年因这篇文章改变了看法:同样的原则适用于 JavaScript——它以 50% 的功能成为 Web 上的终极病毒,之后大量人力投入改进它;结果它仍保留原始设计的不一致,但整体可用性其实高于设计更“干净”的替代系统,就像 FreeBSD/Linux 仍是最可用的系统之一。所以我决定接受 JavaScript 了。
segfaultbuserr查看英文原文
This article was originally written with a critical tone of C & Unix, it said they have a lot of problems, but with a 50% functionality, a lot of people had accepted it as good enough, then spreaded it like "the ultimate computer viruses". After it's publication, many Unix people reinterpreted it as a celebration of Unix's successful apporach since then. I always strongly dislike JavaScript for its inconsistencies and ugly syntax, I found the tendency that everything now comes with a JavaScript engine and force developing in JavaScript regardless of their native programming language is unfortunately, and I always dreamed that the alternative timeline which Scheme became the language of the web. But I've changed my position in recent years, because of this article. Now I think the same principle applies to JavaScript. It was something with a 50% functionality, and so it became the ultimate virus on the Web, and since then, a huge amount of manpower was spent on improving JavaScript. As a result, it still has the same inconsistencies from its original design, but overall, due to all the efforts, the overall usability is actually higher than alternative systems with a "cleaner" / "better" design. Just like a Unix-like OS like FreeBSD or Linux is still one of the most usable systems in existence. So I think I'd just accept JavaScript...
作者后来把“更糟即更好”概括为:功能不全但可靠、快速、小巧,比功能完整更重要。
我最近发现作者本人对“Worse Is Better”最好的总结,却不在以此为题的文章里:“一个功能不足但坚如磐石、快速且小巧的产品,远胜于一个覆盖了专家眼中完整需求的产品。”(出自 Patterns of Software 第219页)
akkartik查看英文原文
I recently discovered my favorite summary of "Worse is Better". It's by the author, but it isn't anywhere in articles by that name. “It is far better to have an under-featured product that is rock solid, fast, and small than one that covers what an expert would consider the complete requirements.” https://www.dreamsongs.com/Files/PatternsOfSoftware.pdf (pg 219)
省略某些“正确”功能反而能避免用户陷入混乱,简化实现和用户体验可以一致。
我认为核心是“只要危及实现简单性,就必须牺牲完整性”。有时删掉一个本应存在的功能,不仅让实现者轻松,也让最终用户更省心,即使她有充分理由想要这个功能。例如 Subversion 允许对空目录做版本控制,而 Git(像 CVS)不允许。表面看这是 Git 的缺陷,但 Subversion“做对的事”带来的后果很广:它把目录当作一等对象,而不只是文件名的一部分,于是仓库可能进入各种奇怪混乱的状态。用 Git,用户永远不会被“我删了目录,然后合并一个往里面加文件的分支”这种结果搞糊涂。
mjw1007查看英文原文
I think the central point here is "completeness must be sacrificed whenever implementation simplicity is jeopardized". Indeed, sometimes omitting a feature which really ought to be there makes life easier for the end user, not just the implementor, even though the user has a good reason to want the feature. For example, Subversion allows versioning empty directories while Git (like CVS) doesn't. On the face of it this is just a deficiency in git, but the fallout from Subversion doing the Right Thing is quite extensive: because Subversion treats directories as first-class objects rather than just part of a file's name, you can get a Subversion repo into all kinds of strange and confusing states. With git the user is never going to be confused by the result of something like "I deleted the directory then tried to merge a branch which added a file inside it".
“先发布再迭代”并非万能,复杂问题可能无法靠增量改进解决。
我对“更糟”开发方式——先赶出一个简单 MVP 再迭代——的主要批评是:它只适用于简单问题。不是所有问题都能靠增量改进解决。
gerbilly查看英文原文
Main main criticism of the 'worse' development approach, rush out a simple MVP then iterate, is that it only works for simple problems. Not all problems can be solved by incremental refinement.
历次讨论
同类还值得读
开源应用架构
The Architecture of Open Source Applications
《开源软件架构》(AOSA)是一本在线免费书,邀请知名开源项目的作者亲自剖析其内部设计,涵盖 SQLAlchemy、LLVM、Audacity、Apache、Bash 等系统。
编程与软件工程上首页 9 次 · 2011–2024aosabook.org编辑精选编程语言简史:简短、不完整且多半错误
A Brief, Incomplete, and Mostly Wrong History of Programming Languages
一篇以戏谑、故意不准确的方式回顾编程语言史的博客文章,用夸张轶事和讽刺定义串起 Lisp、C、C++、Java、JavaScript、PHP 等语言。
编程与软件工程上首页 8 次 · 2009–2021james-iry.blogspot.comSQLite 是如何测试的
How SQLite is tested
SQLite 官方文档页,系统介绍 SQLite 的测试体系:多种测试方法(TCL 测试、模糊测试、回归测试、静态分析等)和海量测试用例,展示了这个小型开源项目如何靠极致测试获得…
编程与软件工程上首页 8 次 · 2009–2025sqlite.org编辑精选高级编程语言(2009)
Advanced programming languages (2009)
Matt Might 的经典文章,按用途推荐“高级编程语言”:如果追求就业就选主流语言,如果追求表达力、学术研究或创业,则推荐 Haskell、OCaml、Scala 等函数式语…
编程与软件工程上首页 8 次 · 2009–2022matt.might.net我的 Forth 与栈机器经历
Yosefk - My history with Forth & stack machines
作者以亲身经历回顾了使用 Forth 语言和栈式机器的历程:既赞叹其简洁优雅、代码量小、可自举的优点,也坦率指出栈操作在实际编程中的痛苦,以及 Forth 社区文化中的问题。
编程与软件工程上首页 8 次 · 2010–2024yosefk.com编辑精选