从我开始关注科技行业的那一刻起,保罗·格雷厄姆就在那里。我大学毕业后的第一份工作是在Justin.tv办公室拐角处的SoMa,他的论文随处可见,无法忽视。他对Lisp的推广只是我尝试Clojure的一小部分,也是Clojure成功的很大一部分。
我认识到,他有一种自我强化的倾向,并会给读者带来尴尬的奉承,但最糟糕的是,他似乎无害。随着他的写作越来越专注于初创企业,并且我越来越确定自己不想成为创始人,他只是视而不见。
然而,最近,他的著作已发生了反动的转折,这一点很难忽视。他写了关于捍卫“适度”免受“最左端”欺凌者的需要的文章,断言“真相在中位数右边”,因为“左派在文化上占主导地位”,并证明了Coinbase禁止讨论任何事物的政策是合理的认为“将淘汰一些人才,是的,但不是非常有才华的人才”,因此被视为“政治”。
我回到十年前读过的论文中,看看我是否错过了一些东西。原来我有。从他关于Lisp和语言设计的第一篇论文开始,他的所有写作就一直有一个一致的思想框架。从许多方面来看,这些早期文章都清晰地表达了他的框架。我花了十年的时间才看到它。
在Java语言发布六年后的2001年4月,Paul Graham权衡了以下几点:
他跟进了许多有关Java的观察,例如Java是由委员会设计的,它婴儿化了它的用户,并将其最初的成功归功于陷入困境的公司赞助商。但是,他写道,这并不是对Java的分析,而是对自己“黑客的雷达”的反省。雷达是专家程序员的美学反应,是从围绕该语言的附加现象和他社交圈中其他专家的观点得出的。
一个月后,在一篇关于为什么语言流行的文章中,他加倍强调了个人直觉的重要性:
语言的质量只能由专家来判断(“诚然,只有极少数人,但是那少数人编写了所有好的软件”),这些专家的采用将推动其他所有人的采用。最终,“一种编程语言可能变得应有的流行。”
这两篇文章的背景都是格雷厄姆正在创造自己的语言,阿克。他希望它流行起来,并且正在研究如何实现这一目标。
在讨论库的重要性时,他回想起了这一点,它可以将任何程序简化为一次调用:
似乎Graham指的是Perl的核心库函数,而不是CPAN当时无法使用的更大的库函数集,因为他将这种责任完全放在了语言设计者的肩上,他说语言设计将越来越专注于“如何设计出色的图书馆。”
格雷厄姆(Graham)在这篇文章中提到了其他受欢迎的驱动因素,但是他在接下来的一年中一次又一次地回到了简洁,最终发表了一篇关于简洁的重要性的文章,现在被称为“简洁”:
他从研究发现“程序员似乎每天都生成几乎相同数量的代码,而不论使用哪种语言”得出的结论中,他宣称“提高软件编写速度的唯一方法是使用更简洁的语言”。
但是,他无处提及图书馆。下个月,他解释说,鉴于语言足够简洁,用户可以简单地编写自己的库:
这与他先前的著作大相径庭。就在一年前,他曾表示“很难设计出好的图书馆。这不仅仅是编写大量代码的问题。”他曾强调图书馆设计是语言设计的关键部分,即使一年后,他也会告诉我们“设计通常要受一个人的控制。”
现在,他认为语言设计人员只需要提供足够简洁的准系统语言,其他所有方法都将随之而来。图书馆设计既不是至关重要的,也不是其他人为期六个月的软件项目的偶然部分。尽管如此,格雷厄姆再也没有提到图书馆。
一年后,他解释说Arc试图成为一种“百年语言”。他写道:“这似乎是自欺欺人,但由于语言不是真正的技术,语言发展缓慢。语言是符号。程序是您希望计算机为您解决的问题的正式描述。”他断言,该语言最重要的部分是“基本运算符”,因为该语言的其余部分“原则上可以用这些基本运算符来编写”。
那么,什么使语言为22世纪做好准备呢?当然,对性能没有任何顾虑,因为“即使[计算机]最终只快了几百万倍,那也将大大改变编程语言的基本规则。”不是数据结构,因为它们只是对卑微列表的过早优化。这不是并行计算的机制(甚至是表示法),因为对该问题的简单描述将“忽略将从并行计算获得的任何好处,就像它们将忽略从特定数据表示获得的好处一样”。
但是,一百年的语言应该简洁。首先,“写下您想编写的程序,而不管是否有可以翻译该程序的编译器或可以运行该程序的硬件。”当然,您真正想编写的程序是最短的一种:
格雷厄姆写道:“如果我们现在有了一百年的语言,那至少会成为一个很棒的伪代码。”令人困惑的是,他断言,由于它需要在其更快的百万倍的未来处理器上运行良好,因此“大概可以生成足够高效的代码,以在我们的硬件上良好地运行。”
他写道:“当您看到这些想法这样摆放时,就很难不去想,为什么不现在尝试写一百年的语言呢?”
四年后的2008年,Arc发布了。与大多数其他Lisps相比,它是一个名称更短,括号更少的Lisp-1,并且它具有一些阅读器宏,这些宏使匿名函数更易于定义。所有原语都是根据MzScheme(一个不同的Lisp)定义的,它提供了编译器和其他工具。它还带有准系统Web框架,该框架使用了延续性,使人联想起自2002年以来基于Smalltalk的Seaside框架。
总的来说,这是令人沮丧的。格雷厄姆有许多方法可以实现他自称的目标,而他却一无所获。
他曾写道,字符串是过早的优化,应该用字符列表代替。如果他这样做了,并且使字符具有完整的Unicode代码点,那么Arc可能是少数没有遭受半个世纪的宿醉之苦的语言之一,一直延伸到EBCDIC。相反,初始版本使用的字节字符串仅支持ASCII字符集。
格雷厄姆问过:“ [很多次,您听说过黑客热衷于说说APL,他们只要用几行代码就能完成令人惊奇的事情?我认为任何真正聪明的人真正喜欢的东西都值得关注。”但是无可否认的是,数组编程语言的简洁基元和组合规则找不到了。
基于服务器的软件部署是Graham论文中的中心主题,而他基于延续的Web框架是一种有趣且相当新颖的方式,可以在单个会话中跨多个请求创建连续性。但是,由于页面上的每个链接都是一个延续,并且每个延续都在单个进程中存储在内存中,因此这会造成单个耗费内存的故障点。多年来,如果您等待太久才能单击“链接”,那么“黑客新闻”将仅显示“未知或过期的链接”。如果Arc拥有自己的运行时,它可能已经支持持久闭包,或任何其他使该方法变得健壮和可扩展的事物。取而代之的是,Arc在另一个Lisp的运行时之上仍然显得微不足道,而Hacker News(现在在具有足够内存以保持运行的计算机上运行)仍然是存在的唯一有意义的Arc部署。
在拒绝并行计算作为“过早的优化”时,Graham似乎也避免了对并发原语的任何考虑,并发原语必定是“基本运算符”,对于编写清晰,简洁的面向网络软件至关重要。
我最喜欢的差点是格拉汉姆(Graham)2001年12月所做的观测,距他开始在Arc上开发仅几个月后:
他注意到不变的地图是有用的数据结构。在此基础上,他可能会发现前一年发表的一篇论文,描述了不变地图的有效实现,并用他的语言将其作为基础数据表示。无论如何,这就是Rich Hickey在创建Clojure时所做的事情,该版本在Arc发行三个月之前发布,成为有史以来使用最广泛的Lisp。相反,assoc-list仍然是由列表支持的数据结构,Arc的文档通知我们,这使它们“对于大量条目而言效率低下”。
令人失望的是,Arc的发布受到了欢迎。格雷厄姆写道,这种接受使他意识到自己的设计过程几乎保证了“轻蔑的最初反应”:
他的批评家看不到的是,他总是从“非常粗糙的版本1”开始,然后“迅速发布”。他是通过创业公司,新的投资基金,甚至他的论文完成的。在任何情况下,他都证明批评者是错误的。
他写道:“ [L]尽快启动,以便您开始向用户学习您应该做的事情。”目前尚不清楚格雷厄姆学到了什么,但是第二年他停止了在Arc的工作。
值得注意的是,格雷厄姆的语言设计论文花了多少时间来缩小他的注意力范围,而花很少的时间去研究剩下的内容。对于所有证明简洁性的词语,他对简洁性本质的唯一分析是,它与解析树的大小相对应,而不是与字符数相对应。任何程序都可以简化为(execute-my-program)的事实并没有解决,这可能是因为库也被认为超出范围。
对简洁性的更认真分析可能将其定义为“递归内联/宏扩展为语言基元的解析树的熵”。这表明我们的重点应该放在两个问题上:我们的原语可压缩性如何,以及如何使用户获得接近最佳压缩的效果?由于第一个问题具有相对的度量标准(扩展的解析树的压缩率是多少?),因此我们可以高效地迭代更好的基元和用于对其进行抽象的更好的工具。
但是格雷厄姆对简洁性的分析,实际上对所有语言设计的分析,从根本上都不是认真的。他对简洁性的严格定义不感兴趣,因为对语言质量的最终衡量标准仍然是黑客的雷达。他的所有论文,以及Arc本身,都只是围绕那个中心枢纽发表的。如果他的论文有时不同意,或者如果Arc没有反映他的论文,这不足为奇。他们之间唯一的联系是,在保罗·格雷厄姆看来,这一切都是正确的。
不可否认,格雷厄姆是一位专家程序员。他还是一位技术娴熟的技术作家,并且是第一个意识到使用网站来构建网站的人。到他开始在Arc上工作时,他的技术直觉已经使他走了很久。但这一次并没有把他带到他期望的程度。
迈克尔·波兰尼(Michael Polanyi)创造了“隐性知识”一词,用以描述我们仅理解为其他事物一部分的事物。例如,当我们说话时,我们不会专注于正在发出的声音,而是专注于我们的言语。我们知道该怎么说,但是很难解释。隐性知识占我们所知的绝大多数;我们不断地依靠它。
但是,当这些知识开始使我们误入歧途时,波兰尼告诉我们,我们必须深入研究它。我们必须使其明确。对有言语障碍的人,或者对专业表演者来说,对言语的明确理解可能是必要的。要成为该领域的佼佼者,几乎总是需要显性知识。
鸡性别检查器是该规则的一个罕见例外,它可以快速而准确地确定一天大的鸡是雄性还是雌性。两者在大多数情况下是无法区分的,但是专家可以每小时对1000只小鸡进行分类,准确度达到98%。从未明确表明支持该专业知识的知识。只需简单地反复培训一名受训专家,直到他们的直觉得到同样的完善。
坚持这一标准,我们都达不到。没有人对软件设计的敏感性如此精致,以至于他们只能通过演示来进行教学。我们必须将直觉提炼为原则,并让这些原则指导我们超越直觉的界限。少做就是食人教。除去任何上下文的格言,在给定情况下其真实含义只能由一个人来判断。
这是现代“思想领导力”的精髓,对格雷厄姆很有帮助。他关于语言设计的文章以及一些关于初创公司的文章,使第一批企业家加入了他刚起步的风险投资基金。人们之所以申请YCombinator,是因为他们希望Graham将他的直觉应用于他们的问题。
格雷厄姆关于创业公司的论文与他关于语言设计的论文大致相同,但它们的目的不同。他们是营销内容,在这个角色上他们表现出色。他们通过将复杂的问题简化为单个模糊的概念来吸引读者。他们暗示了遥不可及的深刻见解。他们使人们希望与Paul Graham呆在同一房间。
自从离开基金以来,格雷厄姆的影响力再次开始超出他的掌控范围。他将自己的直觉应用于20世纪下半叶的社会和经济趋势,并认为现代创业公司是他们的神化。面对“亿万富翁剥削工人”的主张,他只是观察到“一家初创公司必须通过制造真正令其顾客满意的东西来为其晚饭唱歌”,就好像一个人与另一个人有任何关系。
在YCombinator工作之前和之后,他论文中反复出现的主题就是顺从性。格雷厄姆坚定地站在不守规矩的一方,一再追溯他们的血统,直到伽利略坚持地球移动的主张,即使在教会强迫他退缩之后也是如此。
当格雷厄姆(Graham)写道“积极进取的主意是'Eppur si muove'”时,他没有停下来考虑这也是“地球有4个角落同时进行了4天的多维数据集”,而且更令人担忧的是,“犹太人不会取代我们”。他主要介绍了一个象限模型,这样他就可以专注于他认为有趣的一个象限,但是即使这是较小的群体(伽利略的道德和知识继承者)的代名词,他直觉也希望成为同龄人。格雷厄姆无法解决自己模型的后果,因为模型无关紧要;重要的是分享一些感到正确和真实的事情。
这就是说保罗·格雷厄姆(Paul Graham)是一位有效的营销商和从业者,但他是一位彻头彻尾的公众知识分子。他为应对当前的重大问题而进行的尝试,尤其是与他的个人遗产相交的尝试,陷入了直觉和好奇心的沉迷之中,充其量只能是分神,最糟糕的是理解我们前进道路的真正障碍。
不幸的是,这似乎永远不会改变。在2019年,他宣布他正在研究一种新语言Bel。当被问到其目标时,他回答:
当然,“所有其他事物”将永远不平等。我们可以测量长度,但是可以与之比较吗?只有他的雷达知道。