架构设计随想-Unix哲学和Node.js

前几天,我在TxJS上发表了一篇演讲,其中提到Unix哲学是Node.js模式,观点和文化的重要组成部分。像往常一样,我可以在提供谈话视频之前在线提供我的幻灯片

出于某种原因,这篇简短的提及“Unix哲学”引发了一些人的愤怒。由于我只有25分钟,并且每张幻灯片都可能完全是它自己的谈话,所以我对阐述很轻松。有可能,视频不会添加太多的背景。但目标是激起对话,所以如果它引起批评,也许这是成功的。毕竟,不知情的拖钓只是教育的邀请,所以我想我会解释。

Eric S. Raymond在他的书“Unix的编程艺术”中收集了一些关于Unix哲学的最佳解释。他详细阐述了17个具体的原则,但我最喜欢的Unix哲学的解释是Doug McIlroy在“四分之一世纪的Unix”中引用的简洁解释:

这是Unix哲学:

编写完成一件事并做得好的程序。

编写程序以协同工作。

编写程序来处理文本流,因为这是一个通用接口。

McIlroy的原始4点配方略长一点:

(i)让每个项目做好一件事。要做一份新工作,重新构建而不是通过添加新功能使旧程序复杂化。

(ii)期望每个节目的输出成为另一个尚未知的节目的输入。不要使用无关信息使输出混乱。避免严格的柱状或二进制输入格式。不要坚持互动输入。

(iii)设计和构建软件,甚至是操作系统,以便在几周内尽早尝试。不要犹豫扔掉笨拙的部分并重建它们。

(iv)使用工具优先于不熟练的帮助来减轻编程任务,即使你不得不绕道去构建工具并期望在你完成它们之后把它们中的一些扔掉。

从事X Window系统工作的Mike Gancarz总结了以下9点的Unix哲学:

  1. 小是美丽的。
  2. 让每个程序做好一件事。
  3. 尽快建立原型。
  4. 选择便携性超过效率。
  5. 将数据存储在平面文本文件中。
  6. 使用软件杠杆对您有利。
  7. 使用shell脚本来提高杠杆率和可移植性。
  8. 避免强制用户界面。
  9. 使每个程序成为过滤器。

最后一点确实引起了瑞恩达尔经常说的话,“每个节目都是代理人。”前三个基本上是詹姆斯·哈利迪的生活规则。

很多时候,人们会对Unix哲学的错误方面感到困惑,并错过森林中的树木。Unix哲学不是关于特定的实现,也不是任何Unix操作系统或程序必需的。它不是关于文件描述符,管道,套接字或信号。这些抱怨就像是说除非他们说Pali,否则某人不是佛教徒。

Unix哲学是软件开发的前景,而不是软件中的任何特定技术开发。这是一种理想的接触,也许具有讽刺意味的是,它是一种理想,它指示我们偶尔避开理想主义以支持实用性。

在Node中,人们共享和交互的基本构建块不是命令行上的二进制文件,而是加载的模块require()。通用接口一个文本流,但它是一个JavaScript Stream对象,而不是一个stdio管道。(标准输入输出管道是由JavaScript流代表,当然,因为那是我们的通用接口,所以还有什么我们使用?)

那么,就Node.js而言,这就是我如何表达Unix哲学。唉,我不是麦克罗伊,我没有时间或技巧来写这个更短。

编写能很好地完成一件事的模块。编写一个新模块而不是使旧模块复杂化。

编写鼓励构图而不是扩展的模块。

编写处理数据流的模块,因为这是通用接口。

编写与输入源或输出目标无关的模块。

编写解决您知道的问题的模块,这样您就可以了解那些您不知道的问题。

写小的模块。快速迭代。无情地重构。勇敢地改写。

只需进行一些合规性测试,即可快速编写模块以满足您的需求。避免广泛的规格。为您修复的每个错误添加测试。

编写模块以供发布,即使您只是私下使用它们。您将来会欣赏文档。


工作胜于完美。

专注比功能更好。

兼容性优于纯度。

简单优于任何事物。

Unix哲学是一种实用主义的意识形态。它是关于平衡编写优秀软件和编写任何软件的双重需求。这是一套实用的建议,用于交易适度增加的开发成本,从而大幅降低维护成本。

在现实世界中,我们面临着在编写程序和调试程序时成为人类的完全不公平的约束,并且这些成本都不能减少到零。这种意识形态是上下文的,可以应用于堆栈的所有级别。这是一个公开承认我们实际上不够聪明,不知道如何编写我们第一次需要的软件,因为我们通常只有在完成解决后才能完全理解我们的问题。

这些规则都不是神圣不可侵犯的! 事实上,在许多情况下,他们可能存在分歧,甚至完全矛盾。但是,如果我们通过简单的通用接口保持我们的编程单元很小,我们可以发现将零碎结构作为质量棘轮,在我们进行时更换笨拙的部件。

关于Unix哲学的任何内容都没有明确涉及软件共享的文化。然而,它来自软件社区并不是一个谜,我们会详细讨论使我们的程序正常免费的最佳方法。根据这些原则开发的软件更易于共享,重用,重新利用和维护。


翻译自 :node.js 维护者

http://blog.izs.me/post/48281998870/unix-philosophy-and-nodejs