程序设计,就如同绘画一般,是一种艺术创作。实现原型,以人为本,重构再设计。
保罗·格雷厄姆(Paul Graham),是一个“书呆子”(中学时代)、想当画家的黑客(大学时代)、创业者(Viaweb)、风险投资家(Y Combinator)、一种Lisp方言(Arc)的设计者。
作者设计了第一个Web应用,预言了移动互联网时代的到来。在文集中,以其亲身经历为依据,论述了:1、黑客为何多为“书呆子”;2、黑客与画家为何相像;3、如何应对“流行”;4、财富与创业的关系;5、计算机时代,该如何创业;6、百年后,编程语言的模样;7、如何设计一种成功的产品或编程语言。
构想未来的编程语言,就得结合现有语言的发展趋势,考虑摩尔定律会否失效,以及并行计算的应用程度。松本行弘在其文集——《代码的未来》——中,也构想了未来的编程语言,而且有着与保罗·格雷厄姆相反的观点。
梦寐以求的编程语言,我可以理解为是指Ruby(社区友好、简洁、元编程、杀手级应用、RubyGems)或Python么?
语言流行的秘诀,即:快速原型(曳光弹)、聆听用户需求、产品再设计、时间的检验。我个人认为这几条秘诀也适用于创业产品。
Lisp语言有种动人心魄的美——闭合的括号,你可以从阅读《The Little Schemer》来认识它的一种方言Scheme(提供两种实现:Chez Scheme、MIT/GNU Scheme)。
所有的编程语言都是图灵等价的,但它们的抽象程度却各不相同。Web应用服务器有基于线程的,也有基于事件的。在较大型Node.js项目中,很容易出现“回调地狱”式的代码(callback hell)。
回调作为一种抽象,在编写复杂的异步流时,显得过于底层。JavaScript只是没有跟上工具和抽象的步伐,但是像Scala这样的语言在设计时就考虑了这些抽象,它使用了众所周知的函数式编程原则,从而有可能从不同的角度解决这个问题。
Scala编程语言一个主要的设计目标就是帮助开发人员克服多核以及分布式系统编程所带来的复杂性。
—Manuel Bernhardt《反应式:Web应用开发》
文摘
“计算机科学”,这个学科的一端是纯粹的数学家(计算机科学家),中间部分是计算机博物学家,另一端则是黑客。
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
—格林斯潘第十定律(Greenspun's Tenth Rule)
好设计:
是简单的设计
是永不过时的设计
是解决主要问题的设计
是启发性的设计
通常是有点趣味性的设计
是艰苦的设计
是看似容易的设计
是对称的设计
是模仿大自然的设计
是一种再设计
是能够复制的设计
常常是奇特的设计
是成批出现的
优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。