黑客与画家
2003年5月
(本文源自哈佛大学的客座讲座,该讲座融合了之前在东北大学的演讲。)
当我完成计算机科学的研究生学业后,我去艺术学校学习绘画。很多人似乎对有人既对计算机感兴趣又对绘画感兴趣感到惊讶。他们似乎认为黑客和画家是两种非常不同的工作——黑客是冷酷、精确和有条理的,而绘画是某种原始冲动的狂热表达。
这两种形象都是错误的。黑客和画家有很多共同点。事实上,在我认识的所有不同类型的人中,黑客和画家是最相似的。
黑客和画家的共同点是他们都是创造者。与作曲家、建筑师和作家一样,黑客和画家试图做的是创造好东西。他们不是在从事研究本身,尽管在试图创造好东西的过程中如果发现一些新技术,那就更好了。
我从来不喜欢"计算机科学"这个术语。我不喜欢它的主要原因是它并不存在。计算机科学是一个由历史偶然性把一些勉强相关的领域扔在一起的大杂烩,就像南斯拉夫一样。在一端,有些人实际上是数学家,但称他们所做的是计算机科学,这样他们就能获得DARPA的资助。在中间,有些人从事类似计算机自然历史的工作——研究算法在网络中路由数据的行为等。然后在另一端有黑客,他们试图编写有趣的软件,对他们来说计算机只是一种表达媒介,就像混凝土之于建筑师或颜料之于画家。这就像数学家、物理学家和建筑师都必须在同一个系里一样。
有时黑客所做的工作被称为"软件工程",但这个术语同样具有误导性。优秀的软件设计师并不比建筑师更像工程师。建筑和工程之间的界限并不清晰,但它是存在的。它落在"做什么"和"怎么做"之间:建筑师决定做什么,工程师想出怎么做。
“做什么"和"怎么做"不应该分得太开。如果你试图在不知道怎么做的情况下决定做什么,你就是在自找麻烦。但黑客的工作当然不仅仅是决定如何实现某个规范。在最好的情况下,它是在创造规范——尽管事实证明最好的方法是实现它。
也许有一天"计算机科学"会像南斯拉夫一样分解成其组成部分。这可能是一件好事。特别是如果这意味着我的本土——黑客——获得独立。
把这些不同类型的工作捆绑在一个系里可能在行政上很方便,但在智力上很混乱。这就是我不喜欢"计算机科学"这个名称的另一个原因。可以说中间的人在做类似实验科学的事情。但两端的人,黑客和数学家,实际上并不是在做科学。
数学家似乎并不为此烦恼。他们愉快地开始证明定理,就像数学系的其他数学家一样,可能很快就停止注意到他们工作的建筑物外面写着"计算机科学”。但对黑客来说这个标签是个问题。如果他们所做的工作被称为科学,这让他们觉得他们应该表现得科学。所以,与其做他们真正想做的事,即设计漂亮的软件,大学和研究实验室的黑客觉得他们应该写研究论文。
在最好的情况下,论文只是一种形式。黑客写很酷的软件,然后写一篇关于它的论文,论文成为软件所代表成就的代理。但这种不匹配常常导致问题。很容易从构建美丽的东西转向构建更适合作为研究论文主题的丑陋东西。
不幸的是,美丽的东西并不总是最适合作为论文主题。第一,研究必须是原创的——正如任何写过博士论文的人都知道的,确保你在探索处女地的方法是划出一块没人想要的地盘。第二,研究必须是实质性的——而笨拙的系统会产生更丰富的论文,因为你可以写关于为了完成事情而必须克服的障碍。没有什么比从错误的假设开始更能产生丰富的问题了。人工智能的大部分就是这个规则的一个例子;如果你假设知识可以表示为谓词逻辑表达式的列表,其参数代表抽象概念,你会有很多论文要写关于如何使这个工作。就像里奇·里卡多常说的:“露西,你有太多要解释的了。”
创造美丽的东西的方法常常是对已经存在的东西进行细微的调整,或者以稍微新的方式组合现有的想法。这种工作在研究论文中很难传达。
那么为什么大学和研究实验室继续通过发表论文来评判黑客?原因与"学术能力"通过简单的标准化测试来衡量,或者程序员的生产力通过代码行数来衡量是一样的。这些测试容易应用,没有什么比一个勉强有效的简单测试更诱人的了。
衡量黑客实际上试图做的事情,即设计漂亮的软件,会困难得多。你需要良好的设计感来评判好的设计。而且,除了可能是负相关外,人们识别好的设计的能力与他们相信自己能够做到这一点的信心之间没有相关性。
唯一的外部测试是时间。随着时间的推移,美丽的东西往往会蓬勃发展,而丑陋的东西往往会被抛弃。不幸的是,涉及的时间可能比人的寿命更长。塞缪尔·约翰逊说,一个作家的声誉需要一百年才能收敛。你必须等待作家的有影响力的朋友死去,然后等待他们的所有追随者死去。
我认为黑客必须接受他们的声誉中有大量随机成分的事实。在这方面他们与其他创造者没有什么不同。事实上,相比之下他们是幸运的。时尚在黑客领域的影响远不如在绘画领域那么大。
比人们误解你的工作更糟糕的是你自己误解你的工作。相关领域是你寻找想法的地方。如果你发现自己身处计算机科学系,自然会有一种诱惑去相信,例如,黑客是理论计算机科学的理论的应用版本。在我读研究生期间,我内心深处一直有一种不舒服的感觉,觉得我应该知道更多理论,觉得我在期末考试后三周内就忘记了所有那些东西是非常疏忽的。
现在我意识到我错了。黑客需要理解计算理论的程度与画家需要理解颜料化学的程度差不多。你需要知道如何计算时间和空间复杂度,以及图灵完备性。你可能还想至少记住状态机的概念,以防你必须编写解析器或正则表达式库。事实上,画家必须记住的颜料化学知识比这多得多。
我发现最好的想法来源不是名称中包含"计算机"的其他领域,而是其他创造者居住的领域。绘画比计算理论提供了更丰富的想法来源。
例如,我在大学时被教导应该在纸上完全想出一个程序,甚至在接近计算机之前。我发现我并不以这种方式编程。我发现我喜欢坐在计算机前而不是一张纸前编程。更糟糕的是,与其耐心地写出一个完整的程序并确保它是正确的,我倾向于只是喷出一些完全坏掉的代码,然后逐渐把它敲打成形。调试,我被教导,是一种最终检查,你在这里捕捉拼写错误和疏忽。按照我的工作方式,似乎编程就是由调试组成的。
很长一段时间我为此感到难过,就像我曾经为没有按照小学教的方式握铅笔而感到难过一样。如果我当时看看其他创造者,画家或建筑师,我就会意识到我所做的事情有一个名字:素描。就我所知,大学里教我的编程方式都是错的。你应该在编写程序时想出来,就像作家、画家和建筑师那样。
意识到这一点对软件设计有真正的影响。这意味着编程语言应该首先具有可塑性。编程语言是用于思考程序的,而不是用于表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。如果人们真的按照大学教我的方式写程序,静态类型会是个好主意。但这不是我认识的任何黑客写程序的方式。我们需要一种让我们能够涂鸦、涂抹和涂抹的语言,而不是一种你必须坐着,膝盖上平衡着一杯类型,与一个严格的编译器老阿姨进行礼貌对话的语言。
说到静态类型,认同创造者会让我们避免困扰科学的另一个问题:数学嫉妒。科学领域的每个人都暗中相信数学家比他们更聪明。我认为数学家也相信这一点。无论如何,结果是科学家倾向于让他们的工作看起来尽可能数学化。在物理学这样的领域这可能不会造成多大伤害,但你离自然科学越远,这就越成为一个问题。
一页公式看起来就是那么令人印象深刻。(提示:为了额外的印象,使用希腊变量。)因此有很大的诱惑去研究你可以正式处理的问题,而不是,比如说,重要的问题。
如果黑客认同其他创造者,如作家和画家,他们就不会感到这种诱惑。作家和画家不会遭受数学嫉妒。他们觉得他们做的是完全不同的事情。黑客也是,我认为。
如果大学和研究实验室阻止黑客做他们想做的这种工作,也许他们的地方是在公司里。不幸的是,大多数公司也不会让黑客做他们想做的事。大学和研究实验室强迫黑客成为科学家,而公司强迫他们成为工程师。
我自己直到最近才发现这一点。当Yahoo收购Viaweb时,他们问我我想做什么。我从来不太喜欢商业方面,说我只想编程。当我到了Yahoo,我发现编程对他们来说意味着实现软件,而不是设计它。程序员被视为技术人员,他们把产品经理的愿景(如果这个词合适的话)翻译成代码。
这似乎是大公司的默认计划。他们这样做是因为它减少了结果的标准差。只有一小部分黑客实际上能够设计软件,对公司管理者来说很难挑选出这些人。所以与其把软件的未来托付给一个杰出的黑客,大多数公司设置事情,使其由委员会设计,黑客只是实现设计。
如果你将来想赚钱,记住这一点,因为这是创业公司获胜的原因之一。大公司想要减少设计结果的标准差,因为他们想要避免灾难。但当你抑制振荡时,你失去了高点也失去了低点。这对大公司来说不是问题,因为他们不是通过制造伟大的产品来获胜。大公司通过比其他大公司更不糟糕来获胜。
所以如果你能想出办法与一个足够大的公司进行设计战,以至于它的软件是由产品经理设计的,他们将永远无法跟上你。这些机会并不容易找到,虽然。很难让大公司参与设计战,就像很难与城堡内的对手进行肉搏战一样。例如,写一个比Microsoft Word更好的文字处理器会很容易,但Microsoft,在其操作系统垄断的城堡内,可能甚至不会注意到如果你这样做了。
进行设计战的地方是在新市场,在那里还没有人设法建立任何防御工事。这就是你可以通过大胆的设计方法,让同样的人既设计又实现产品来大获全胜的地方。Microsoft自己在开始时就是这样做的。Apple也是。惠普也是。我怀疑几乎每个成功的创业公司都是。
所以构建伟大软件的一种方法是创办自己的创业公司。但这有两个问题。一个是在创业公司你必须做很多除了写软件之外的事情。在Viaweb,如果我能在四分之一的时间里编程,我就认为自己很幸运。而我在其他四分之三时间里必须做的事情从乏味到可怕不等。我有一个基准,因为我曾经不得不离开董事会会议去补牙。我记得坐在牙医的椅子上,等待钻头,感觉就像在度假。
创业公司的另一个问题是,能赚钱的软件类型和有趣的软件类型之间没有太多重叠。编程语言很有趣,Microsoft的第一个产品就是一个,但现在已经没有人会为编程语言付钱了。如果你想赚钱,你往往被迫去解决那些太糟糕以至于没有人愿意免费解决的问题。
所有创造者都面临这个问题。价格由供求决定,对有趣的工作的需求远不如解决个人客户日常问题的需求。在非百老汇戏剧中表演的报酬不如在贸易展上穿着大猩猩服装站在某人的展位里。写小说的报酬不如为垃圾处理机写广告文案。而编程语言的报酬不如弄清楚如何将某公司的遗留数据库连接到他们的Web服务器。
我认为在软件领域,这个问题的答案是几乎所有创造者都知道的一个概念:日间工作。这个词始于音乐家,他们在晚上表演。更一般地说,它意味着你有一种工作是为了钱,另一种是为了爱。
几乎所有创造者在职业生涯早期都有日间工作。画家和作家众所周知是这样。如果你幸运的话,你可以得到一个与你的真正工作密切相关的日间工作。音乐家经常似乎在唱片店工作。一个在编程语言或操作系统上工作的黑客可能同样能够得到一个使用它的日间工作。[1]
当我说答案是让黑客有日间工作,并在业余时间从事漂亮的软件时,我不是在提出这是一个新想法。这就是开源编程的全部意义。我说的是开源可能是正确的模型,因为它已经被所有其他创造者独立确认。
对我来说,任何雇主会不愿意让黑客从事开源项目似乎令人惊讶。在Viaweb,我们会不愿意雇用任何不这样做的人。当我们面试程序员时,我们主要关心的是他们在业余时间写什么软件。除非你热爱它,否则你不能真正做好任何事情,如果你热爱编程,你不可避免地会在自己的项目上工作。[2]
因为黑客是创造者而不是科学家,寻找隐喻的正确地方不是在科学中,而是在其他类型的创造者中。绘画还能教给我们关于编程的什么?
我们可以从绘画的例子中学到或至少确认的一件事是如何学习编程。你主要通过做来学习绘画。编程也是如此。大多数黑客不是通过参加大学编程课程来学习编程的。他们通过在十三岁时编写自己的程序来学习编程。即使在大学课堂上,你主要通过编程来学习编程。[3]
因为画家留下了作品轨迹,你可以通过观察他们学习。如果你按时间顺序看一个画家的作品,你会发现每幅画都建立在从之前的画中学到的东西上。当一幅画中有一些效果很好时,你通常能在一些早期的画中找到它的第一个版本,形式较小。
我认为大多数创造者都是这样工作的。作家和建筑师似乎也是。也许黑客应该更像画家,定期从头开始,而不是继续在一个项目上工作多年,试图将所有后来的想法作为修订纳入。
黑客通过做来学习编程的事实是编程与科学如此不同的另一个迹象。科学家不是通过做来学习科学,而是通过做实验和问题集。科学家从做完美的工作开始,在这个意义上他们只是在试图重现别人已经为他们做过的工作。最终,他们达到可以做原创工作的地步。而黑客从一开始就在做原创工作;只是非常糟糕。所以黑客从原创开始,变得更好,而科学家从好开始,变得原创。
创造者学习的另一种方式是从例子中。对画家来说,博物馆是技术的参考图书馆。几百年来,复制伟大大师的作品一直是画家传统教育的一部分,因为复制迫使你仔细观察一幅画是如何制作的。
作家也这样做。本杰明·富兰克林通过总结艾迪生和斯蒂尔的散文要点,然后试图重现它们来学习写作。雷蒙德·钱德勒对侦探小说也这样做。
同样,黑客可以通过看好的程序来学习编程——不仅仅是看它们做什么,还要看源代码。开源运动的一个不太公开的好处是它使学习编程变得更容易。当我学习编程时,我们主要依赖书中的例子。那时唯一的大块代码是Unix,但即使这个也不是开源的。大多数阅读源代码的人是在John Lions的书的非法影印本中读到的,这本书虽然写于1977年,但直到1996年才被允许出版。
我们可以从绘画中学习的另一个例子是绘画通过逐步改进来创造的方式。绘画通常始于素描。细节逐渐填充。但这不仅仅是填充的过程。有时原始计划结果证明是错误的。无数的画,当你在X光下看它们时,结果证明有被移动的肢体或重新调整的面部特征。
这是一个我们可以从绘画中学习的案例。我认为编程也应该这样工作。期望程序的规范会完美是不现实的。如果你提前承认这一点,并以允许规范在飞行中改变的方式编写程序,你会更好。
(大公司的结构使这变得困难,所以这是创业公司有优势的另一个地方。)
现在每个人可能都知道过早优化的危险。我认为我们也应该同样担心过早设计——过早决定程序应该做什么。
正确的工具可以帮助我们避免这种危险。一个好的编程语言应该,像油画一样,让你容易改变主意。动态类型在这里是胜利,因为你不需要提前承诺特定的数据表示。但灵活性的关键,我认为,是使语言非常抽象。最容易改变的程序是非常短的程序。
这听起来像是一个悖论,但一幅伟大的画必须比它必须的要好。例如,当列奥纳多在国家美术馆画吉内夫拉·德·本奇的肖像时,他在她头后放了一丛杜松。在其中他仔细地画了每一片叶子。许多画家可能会想,这只是放在她头后作为背景的东西。没有人会那么仔细地看它。
不是列奥纳多。他对一幅画的一部分工作有多努力完全取决于他期望任何人会多么仔细地看它。他就像迈克尔·乔丹。永不停息。
永不停息会获胜,因为总的来说,看不见的细节变得可见。当人们走过吉内夫拉·德·本奇的肖像时,他们的注意力常常立即被它吸引,甚至在他们看标签并注意到它写着列奥纳多·达·芬奇之前。所有这些看不见的细节结合起来产生一些令人惊叹的东西,就像一千个几乎听不见的声音都在和谐地歌唱。
伟大的软件同样需要狂热地追求美。如果你看好的软件内部,你会发现没有人应该看到的部分也很美。我不是声称我写伟大的软件,但我知道当谈到代码时,我的行为方式如果用在日常生活中会让我有资格获得处方药。看到代码缩进不当或使用丑陋的变量名会让我发疯。
如果黑客只是一个实现者,把规范变成代码,那么他可以像有人挖沟一样从一端到另一端工作。但如果黑客是一个创造者,我们必须考虑灵感。
在编程中,就像在绘画中一样,工作是循环的。有时你对某个新项目感到兴奋,想每天工作十六个小时。其他时候似乎没有什么有趣。
要做好工作你必须考虑这些循环,因为它们受你如何反应的影响。当你在山上开手动挡车时,有时你必须松开离合器以避免熄火。同样,松开可以防止雄心熄火。在绘画和编程中都有一些令人恐惧的雄心勃勃的任务,和一些令人安慰的例行任务。在可能熄火的时刻保存一些简单的任务是个好主意。
在编程中,这可以字面意思是保存bug。我喜欢调试:这是编程像人们认为的那样直接的时候。你有一个完全受限的问题,你所要做的就是解决它。你的程序应该做x。相反它做y。它在哪里出错?你知道你最终会赢。这就像粉刷墙壁一样放松。
绘画的例子不仅可以教我们如何管理自己的工作,还可以教我们如何一起工作。过去的很多伟大艺术是多个人的作品,尽管博物馆墙上可能只有一个名字。列奥纳多是韦罗基奥工作室的学徒,画了他基督受洗中的一个天使。这种事情是规则,而不是例外。米开朗基罗被认为特别专注,因为他坚持自己画西斯廷教堂天花板上的所有人物。
就我所知,当画家一起在一幅画上工作时,他们从不画同一部分。通常大师画主要人物,助手画其他人和背景。但你永远不会让一个人画在另一个人的作品上。
我认为这也是软件协作的正确模型。不要把它推得太远。当一段代码被三四个不同的人编程,没有人真正拥有它时,它会变得像一个公共休息室。它会倾向于感觉荒凉和废弃,并积累垃圾。正确的协作方式,我认为,是将项目分成明确定义的模块,每个模块都有明确的所有者,它们之间的接口要像编程语言一样仔细设计,如果可能的话,要像编程语言一样清晰。
像绘画一样,大多数软件是为人类观众设计的。所以黑客,像画家一样,必须有同理心才能做出真正伟大的工作。你必须能够从用户的角度看事情。
当我还是个孩子时,我总是被告知要从别人的角度看事情。这在实践中总是意味着做别人想要的事,而不是我想要的事。这当然给同理心带来了坏名声,我特意不去培养它。
天啊,我错了。事实证明,从别人的角度看事情实际上是成功的秘诀。这不一定意味着自我牺牲。远非如此。理解别人如何看待事情并不意味着你会按照他的利益行事;在某些情况下——例如在战争中——你想做完全相反的事。[4]
大多数创造者为人类观众创造东西。而要吸引观众你必须理解他们需要什么。几乎所有最伟大的画都是人物的画,例如,因为人是人们感兴趣的东西。
同理心可能是好黑客和伟大黑客之间最重要的区别。一些黑客相当聪明,但在同理心方面实际上是唯我论者。这样的人很难设计伟大的软件[5],因为他们无法从用户的角度看事情。
判断人们有多擅长同理心的一种方法是看他们向没有技术背景的人解释技术问题。我们可能都认识一些人,虽然在其他方面很聪明,但在这方面简直可笑地糟糕。如果有人在晚宴上问他们什么是编程语言,他们会说类似"哦,高级语言是编译器用来生成目标代码的输入"这样的话。高级语言?编译器?目标代码?不知道什么是编程语言的人显然也不知道这些是什么。
软件必须做的一部分事情是解释自己。所以要写好的软件你必须理解用户理解得多么少。他们会毫无准备地走近软件,它最好做他们猜测它会做的事,因为他们不会读手册。在这方面我见过的最好的系统是1985年的原始Macintosh。它做了软件几乎从未做过的事:它只是工作。[6]
源代码也应该解释自己。如果我能让人们记住关于编程的一句话,那就是《计算机程序的结构与解释》开头的那句。程序应该为人们阅读而写,只是顺便为机器执行。你不仅需要对用户有同理心,还需要对读者有同理心。这符合你的利益,因为你会成为其中之一。许多黑客写了一个程序,六个月后回来发现他完全不知道它是如何工作的。我认识几个在经历过这样的经历后发誓不再使用Perl的人。[7]
缺乏同理心与智力有关,以至于在某些地方甚至有点时尚。但我不认为有任何相关性。你可以在数学和自然科学方面做得很好而不必学习同理心,这些领域的人往往很聪明,所以这两种品质已经变得相关。但也有大量愚蠢的人也缺乏同理心。只要听听那些打电话到脱口秀节目问问题的人。他们问他们想问的任何事情都如此迂回,以至于主持人经常不得不重新表述问题。
所以,如果编程像绘画和写作一样工作,它是否同样酷?毕竟,你只有一次生命。你不妨把它花在伟大的事情上。
不幸的是,这个问题很难回答。声望总是有很大的时间滞后。它就像来自遥远恒星的光。绘画现在有声望是因为人们五百年前做的伟大工作。在当时,没有人认为这些画像我们今天认为的那样重要。对当时的人来说,费德里科·达·蒙特费尔特罗,乌尔比诺公爵,有一天会主要因为皮耶罗·德拉·弗朗切斯卡的一幅画中那个奇怪的鼻子而闻名,这似乎很奇怪。
所以虽然我承认编程现在看起来不如绘画酷,我们应该记住绘画在其辉煌时期也不像现在看起来那么酷。
我们可以相当自信地说的是,现在是编程的辉煌时期。在大多数领域,伟大的工作都是在早期完成的。1430年到1500年之间制作的画仍然无人能及。莎士比亚出现在专业戏剧刚刚诞生时,戏剧从在客栈院子里上演的粗糙闹剧中出现,他把这个媒介推得如此之远,以至于从那以后的每个剧作家都不得不生活在他的阴影下。阿尔布雷特·丢勒对版画也这样做,简·奥斯汀对小说也这样做。
我们一次又一次地看到同样的模式。一个新的媒介出现,人们如此兴奋以至于在最初几代人中探索了它的大部分可能性。编程现在似乎处于这个阶段。
绘画在列奥纳多的时代并不像他的工作帮助使它变得的那样酷。编程最终会变得多酷将取决于我们能对这个新媒介做什么。在某些方面,酷的时间滞后是一个优势。当你现在遇到一个正在写编译器或编程Unix内核的人时,至少你知道他们不只是为了泡妞而这样做。
注释
[1] 摄影对绘画造成的最大的损害可能是它杀死了最好的日间工作。历史上大多数伟大的画家通过画肖像来养活自己。直到1870年左右,总是有一群画家接受过艺术中最困难的任务的训练,即从生活中画人脸。
[2] 我被告知Microsoft不鼓励员工为开源项目做贡献,即使是在他们的业余时间。但现在这么多最好的黑客在开源项目上工作,这个政策的主要效果可能是确保他们无法雇用任何一流的程序员。
[3] 你在大学学到的关于编程的东西很像你学到的关于书籍或衣服或约会的东西:你在高中时的品味有多差。
[4] 这是应用同理心的一个例子。在Viaweb,如果我们无法在两个替代方案之间做出决定,我们会问,我们的竞争对手最讨厌什么?有一次一个竞争对手在他们的软件中添加了一个基本上无用的功能,但既然这是他们拥有的少数我们没有的功能之一,他们在行业媒体上大肆宣传。我们可以试图解释这个功能是无用的,但我们决定如果我们自己实现它会更让我们的竞争对手烦恼,所以我们那天下午就编程实现了我们自己的版本。
[5] 除了文本编辑器和编译器。黑客不需要同理心来设计这些,因为他们自己是典型用户。
[6] 好吧,几乎。他们稍微超过了可用的RAM,导致很多不便的磁盘交换,但这可以在几个月内通过购买额外的磁盘驱动器来修复。
[7] 使程序易于阅读的方法不是用注释塞满它们。我会把Abelson和Sussman的引用更进一步。编程语言应该设计来表达算法,只是顺便告诉计算机如何执行它们。一个好的编程语言应该比英语更适合解释软件。你应该只在有一些需要警告读者的变通方法时才需要注释,就像在道路上只有在有意外急转弯的部分才有箭头。[8] 列奥纳多画《岩间圣母》得到的报酬与制作画框的工作室相同。
感谢Trevor Blackwell、Robert Morris、Dan Giffin和Lisa Randall阅读了这篇文章的草稿,感谢Henry Leitner和Larry Finkelstein邀请我演讲。
英文版:paulgraham.com/hp.html|中文版:HiJiangChuan.com/paulgraham/024-hackers-and-painters
更新记录:
- 2024-12-04 HiJiangChuan 初稿翻译,术语待验证;