《黑客与画家》:20年后依然振聋发聩的编程与创新思考

《黑客与画家》探讨编程的艺术性与创新思维,即使在20年后,其观点依然具有启发性。

原文标题:20年前的思维,今天还很前沿,超牛的书!

原文作者:图灵编辑部

冷月清谈:

《黑客与画家》是硅谷创业教父 Paul Graham 的经典之作,出版于2004年。书中对编程和创新思维的见解即使在今天也依然具有启发性。
Paul Graham 将编程视为一种艺术创作,而非单纯的工程实践,并用绘画作类比,强调编程的创造性本质。他认为,编程像绘画一样,需要反复试验和探索,才能最终创作出优秀的作品。
书中还探讨了编程语言的设计理念,认为好的编程语言应该像油画一样灵活,允许程序员轻松修改和完善代码。他主张编程语言应该注重灵活性,以支持程序员的探索性思维。
除了编程之外,书中也探讨了其他话题,例如如何创造财富、设计者的品味等,并对学校教育和社会现象进行了深刻的反思。即使你不是程序员,也能从书中获得启发。作者建议非程序员读者可以优先阅读第三章《不能说的话》、第六章《如何创造财富》和第八章《设计者的品味》。

怜星夜思:

1、Paul Graham 将编程比作绘画,这种类比在当今 AI 编程时代是否依然适用?AI 编程是否会改变我们对编程的理解?
2、书中提到编程语言应该灵活,方便修改和完善。那么,在实际项目开发中,如何平衡灵活性和代码的可维护性?
3、Paul Graham 认为编程是一种探索之旅,你认为这种探索精神在当今快速迭代的软件开发环境中是否还重要?

原文内容

一本好书的魅力在于“常读常新”。它不仅凝结了作者几十年的智慧与经验,更是需要反复品味才能真正理解与掌握。即使是同样的文字,在不同的时光与心境下阅读,常常能激发出全新的思考与感悟。《黑客与画家》正是这样一本值得反复阅读的经典之作。

老彼得·勃鲁盖尔的《巴别塔》

Paul Graham 的《黑客与画家》是一本充满个人洞见的作品。如果你对 Paul Graham 这个名字不熟悉,可以参考维基百科对他的描述:
“他以其在 Lisp 编程语言上的工作、早期创立的初创公司 Viaweb(后更名为 Yahoo! Store)、创立知名创业加速器及种子基金 Y Combinator、他的博客以及 Hacker News 而闻名。”
这本书出版于 2004 年,距今已二十年之久。然而,其中关于计算机编程和创新思维的见解依然发人深省。在这里,我想谈谈书中对编程的一些核心思考,这些观点不仅深刻,还影响了许多技术实践。(当然,如果你不是程序员,你对编程没有任何兴趣,可以直接跳到后半部分阅读。)
编程可以像绘画一样有趣
编程与绘画之间的类比是书中的核心思想之一,正如他在书中同名章节「黑客与画家」中详细探讨的那样。两者的相似之处在于它们的创造性本质,而非科学性:
“黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀的作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术(那样当然更好)。 ”
Paul 在这里将编程描述为一种艺术创作,而不是传统意义上的工程实践。这一观点启发我们重新思考编程教育和技术开发的方式。科学或数学的正式训练固然重要,但并非成为优秀程序员的唯一途径。借鉴艺术创作的经验,比如注重直觉和试验性思维,可以大幅改善编程工具和方法。
此外,Paul 提出了一个具有挑战性的观点:技术的真正价值不在于精确性,而在于其创造性如何改变世界。这种对技术的审视也为后来众多创新者提供了灵感。
编程,其实是一场探索之旅
很多人误以为优秀的程序员应该一开始就知道如何解决问题,并像数学家心算那样直接完成代码。你是否也曾因为需要多次尝试才能解决一个问题而感到挫败?
Paul 反对这种误解。他指出,编程的过程本质上是探索性的,这与他在书中讨论动态语言的章节内容紧密相关:
“你应该在编写程序的过程中逐步解决问题,就像作家、画家和建筑师在创作过程中一样。”
这一点揭示了编程的真正工作方式。程序员并非一开始就拥有所有答案,而是通过反复试验找到解决问题的最佳方法。这种观点对编程工具的设计提出了新的要求:
“编程语言应该是灵活的,是帮助我们思考的工具,而不是仅仅用于表达已经完成的想法。它应该像铅笔,而不是钢笔。”
Paul 特别强调,动态类型的语言特性能够帮助程序员更自由地构思和实验。这一观点在书中「设计与研究」章节得到进一步阐释,他认为灵活性是推动创新的关键。在他看来,编程工具的灵活性和适应性比绝对的规范性更加重要。
尽管动态类型语言近些年来面临静态类型语言的竞争,其核心价值仍然体现在许多领域。例如,Python 的广泛使用表明,在探索性任务中,灵活性依然是开发者的重要需求。
什么样的编程语言最理想?
“一种好的编程语言应该像油画一样,能够让你轻松地改变主意。”
Paul 指出,油画的独特魅力在于它允许艺术家在原型的基础上不断修改和完善,直到完成最终作品。
“油画之所以令人兴奋,是因为你可以用它在原型的基础上完成最终作品。”
他认为,这种特性同样适用于理想的编程语言设计。然而,编程语言需要兼顾快速原型开发和生产级别的可靠性,这使得实现这种特性变得困难。
Paul 强调,评估编程语言不能只看最终代码的简洁性,更重要的是从原型到成品的整个开发过程是否顺畅。他在书中进一步探讨了这一点,提出好的语言设计必须兼顾探索与生产:
“一种语言的评判标准,不仅在于它写出的最终程序是否简洁,还在于通往最终程序的路径是否流畅。”
这一观点具有深远的意义:程序开发是一段旅程,而不是一个静态的终点。语言的设计需要为程序员提供改进和演化的空间,从而推动创新。
最后,Paul 留给我们的思考
《黑客与画家》不仅仅是一本关于编程的书,更是一份对创造力本质的思考。Paul 通过绘画的隐喻,将编程从传统的工程学框架中解放出来,赋予它更多的人文意义和艺术价值。
书中强调的几点启示包括:
  • 编程是一种创造性的艺术:它不应该局限于科学和工程的视角,而应该更多地向艺术和设计借鉴方法。
  • 探索是编程的核心:程序员应该接受试错的过程,并利用灵活的工具支持这种探索。
  • 语言设计需要关注过程:好的编程语言不仅要关注结果,还需要优化开发的路径。
从这些思想中,我感受到 Paul 对技术的思考始终以人性为核心。他所描绘的编程不仅是一种技能,更是一种让世界变得更好的方式。

硅谷创业教父Paul Graham畅销20年的思想经典


如果你不是程序员,你对编程没有任何兴趣。
中有给到大家建议:
“《黑客与画家》这本书的大受欢迎,不单纯是因为其中思考的深度和特别,更在于一种心理上的安抚作用:虽然我和其他人格格不入,虽然我在生活中并不受欢迎,但是,这个世界上依然存在自全之道,我无需太多改变自己,却也能够活出自己的精彩一生来。
基于以上两点,对于一般性读者,我建议你直接阅读第三章《不能说的话》、第六章《如何创造财富》和第八章《设计者的品味》。其实,这本书并非有大的架构和连贯的体系,每一个章节都独立成篇。所以,类似这样的拆分阅读并不会让你损失什么。等你看完这三章之后,如果有余力,或者是喜欢上了作者,再继续翻看其他章节也没有任何关系。
如果时间依然紧张,精力依然不济,只能读一章的话,那么我建议是第三章。 这一章我在过去的时日里曾经多次向读者进行推荐,在我看来,这一章是作者,也是这本书的核心。它回答了作者何以成为这样一个人,其中谈到的是作者对这个世界,对社会,对人群的观察和结论。许多人因此大受冲击,觉得相见恨晚。无论作者的观点是否正确,找寻不能说的话对于许多处在人生迷茫期,创业泥淖区的人来说,毫无疑问是一种新的思路。和《人类简史》的作者一样,他承诺了揭示人类社会某种深深隐藏的真相。一旦接受了这一点,就会对作者产生强烈的信任,并且有继续研读的欲望。
第六章起了一个诱人的标题《如何创造财富》,但这一章里最为核心的部分是如何理解工作,如何理解金钱。这也是作者所独有的想法,事实是难于撼动的,任何时候,但是我们看待事实的角度不同,可以采取的策略和可能达成的结果也就不会相同。第三章如果说还比较形而上,那么第六章就形而下得很具体。你可以看到一个反传统,反建制,反权威的人如何看待工作和金钱。当然,在2020年的最后,整个世界趋向紧缩和分裂的时候,他的这些观点是否还能和地球村时代一样发挥效用,这需要你自己的思考。
如果你为人父母,又或者是你内向不合群,还可以考虑加上第一章《为什么书呆子不受欢迎》。许多人成长起来之后,就彻底遗忘了年少求学时的经历。但是作者没有,他花了相当长的篇幅分析学校的功能、同学间的阶级关系,以及一个幼童在集体生活中多面临的问题和痛苦。因此,作为家长阅读这一章,可以帮助你理解孩子。作为内向不合群的人,这一章也会让你对自己觉得释然,多少会有些宽慰,不再责备自己。”
点击即可购买,赶快读起来!

代码注释和文档也很重要。清晰的注释和文档可以帮助其他程序员理解代码,从而提高代码的可维护性。另外,代码审查也是一个很好的方法,可以帮助发现代码中的潜在问题。

我觉得 AI 编程和绘画的类比可以这样理解:AI 就像一个高级的画笔,它可以帮助画家更快地完成一些基础工作,但最终的艺术表达还是取决于画家本身。AI 编程也是一样,它可以帮助程序员更快地编写代码,但最终的程序设计和功能实现还是取决于程序员的创造力。

我觉得可以用一些设计模式和最佳实践来提高代码的可维护性,比如模块化设计、单一职责原则等。这样,即使代码需要修改,也只需要修改一部分,而不会影响整个系统。

AI 编程确实会对编程的理解产生影响。以前,编程需要程序员手动编写每一行代码,而现在,AI 可以自动生成代码。这可能会导致一部分程序员的工作被取代,但也可能会催生新的工作岗位,例如 AI 训练师、AI 算法工程师等。

这个问题确实很棘手。我觉得关键在于制定良好的代码规范和开发流程,并使用版本控制工具。这样,即使代码需要频繁修改,也能保证代码的可维护性。

我觉得探索精神在任何时候都很重要。它代表着一种不断学习、不断进步的态度。在快速迭代的环境中,探索精神可以帮助我们更快地适应变化,并找到新的发展方向。

当然重要!快速迭代不代表不需要探索。探索精神可以帮助我们找到更好的解决方案,从而提高软件的质量和效率。

我觉得 Paul Graham 的类比还是适用的。AI 编程更多的是一种辅助工具,最终的创造性工作还是需要人来完成。就像画家可以用新的工具作画,但绘画的核心仍然是艺术家的创意和技巧。AI 编程只是改变了创作的方式,并没有改变创作的本质。

探索精神可以帮助我们突破思维定式,找到更具创新性的解决方案。在当今竞争激烈的软件开发行业,创新是至关重要的。