示例编程
2009年6月30日
世界上最常见的编程语言是什么?
我不确定如何衡量这一点,但你需要考虑的是我们对编程的定义。我的候选答案认为,最流行的编程语言是那些不认为自己是程序员的人广泛使用的一种语言。这种语言是 Excel,或者更一般地说,是电子表格。
电子表格很容易用于小型任务,但也用于令人惊讶的复杂和重要的任务。我经常看到专业程序员在意识到某些重要的业务功能正在运行在他们认为过于复杂而无法处理的电子表格上时,会感到不安。
总的来说,我们在为这类非专业程序员设计编程语言方面没有取得太大成功。每当有人谈论一些新的环境将允许人们“无需编程”即可指定复杂的行为时,我都会提到 COBOL,它最初的设计目的是为了摆脱程序员。因此,重要的是要考虑 Excel 可以教会我们关于编程环境的什么。
电子表格的一个我认为很重要的特性是它能够将程序的执行与定义融合在一起。当你查看电子表格时,电子表格的公式并不立即显而易见,相反,你看到的是计算出的数字——程序执行结果的示例。
在其他地方,使用示例作为编程环境的一级元素——UI 设计师也是如此。提供程序输出的具体示例有助于人们理解程序定义的作用,以便他们更容易地推断行为。
那么,为什么我觉得我们需要这个特定的新词呢?本质上是因为我认为它值得更多思考。我们忽略了示例编程,并没有真正思考它们,或者是什么让它们变得特殊——甚至它们在某种程度上是特殊的。我们多年来一直在使用示例编程,但我们没有给予足够的关注。我们没有足够地思考它的本质是什么,以及它的优缺点是什么。
我选择用“示例编程”来描述它,部分原因是“示例”被过度使用(而“示例”则没有),但也因为“示例”一词强化了示例执行的解释性。示例旨在通过提供不同的视角来帮助解释概念——类似地,示例执行是为了帮助你看到程序在改变时是如何执行的。
在尝试明确地表达一个概念时,思考边界情况是有用的。一个边界是使用程序信息在编辑期间的投影,例如,一个 IDE 在你编写代码时向你显示类层次结构。在某种程度上,这很相似,因为层次结构显示会随着你修改程序而不断更新,但关键的区别在于层次结构可以从程序的静态信息中推导出来。示例编程需要来自程序实际运行的信息。
我还认为示例编程是一个超越动态语言的经典 REPL 循环的概念。REPL 循环允许你探索执行,但它们不像电子表格那样将示例放在最前面。示例编程技术将示例放在编辑体验的前台。程序退居后台,只有当我们想要探索示例的一部分时才会出现。
我认为示例编程并非全是优点。我在电子表格和 GUI 设计师中看到的一个问题是,它们在揭示程序执行结果方面做得很好,但淡化了程序结构。因此,复杂的电子表格和 UI 面板通常难以理解和修改。它们经常充斥着不受控制的复制粘贴编程。
我认为这是程序被淡化而示例被强调的结果。因此,程序员不会考虑维护它。即使在常规编程中,我们也因缺乏对程序的关注而遭受了足够的痛苦,因此,非专业程序员编写的示例程序出现这种情况并不奇怪。但这个问题导致我们创建的程序在增长时很快变得难以维护。未来示例编程环境的挑战是帮助在示例背后开发一个结构良好的程序——尽管示例也可能让我们重新思考什么是结构良好的程序。
这方面最困难的部分可能是轻松创建新抽象的能力。我对富客户端 UI 软件的一个观察是,它们变得混乱,因为 UI 构建者只考虑屏幕和控件。我在此方面的实验表明,你需要为你的程序找到合适的抽象,这将采用不同的形式。但这些抽象不会得到屏幕构建器的支持,因为它只能说明它知道的抽象。
我的同事丽贝卡·帕森斯和尼尔·福特一直在花很多时间思考这些问题。以下是尼尔在一次电子邮件交流中的一些想法:
- 我认为这些工具最适合非专业人士(因此,你与非专业程序员的联系)。然而,总的来说,这类工具会减慢经验丰富/高级用户的速度。当你提到 UI 面板时,Mac 上充斥着这类控件。我在 Keynote 中花费了大量时间,摆弄检查器。至少所有这些控件都在一个地方(不像新的功能区)。我更希望使用一种标记语言来直接定义内容,包括宏、代码段以及我作为开发人员习惯的所有其他内容。
- 随着这些工具的增长,它们变得笨拙(也许是因为它们不再足够领域特定?)看看 Word、Excel 和 PowerPoint。他们不得不发明新的 UI 比喻来暴露这些工具的所有功能。编程语言中的 API 扩展性要好得多,在变得难以导航之前,它们的密度要高几个数量级。
- 那里不存在所有最佳实践和工具:重构、测试级别等。此外,你失去了与文本的连接,这意味着宏功能要么不存在,要么是复杂的单次使用。我认为一个很好的比较可以突出示例编程的局限性,那就是将 bash(庞大、神秘、强大、古怪)与 Automator 进行比较。我几乎从不使用 Automator,因为它受迪茨勒定律的困扰:它总是缺少我需要的 10%。我乐于处理 bash 粗糙的表面,因为它的功能更强大。
- 我与你一样看好这类工具,但它们距离用于全面的敏捷开发还有很长一段时间。我希望它们能快速成熟。
-- 尼尔·福特
少数几个认真对待示例编程的人之一是乔纳森·爱德华兹。他提出了许多关于这种环境应该是什么样子的非常有想象力的想法。他对示例编程的愿景也与投影编辑和受控复制粘贴的概念密切相关。
我想要在这里创造一个术语的触发因素是,语言工作台(例如IntentionalSoftware)使用示例编程。这些语言工作台鼓励你构建示例 DSL。在这种情况下,使用示例非常重要,因为它应该有助于吸引非专业程序员,这是使用 DSL 的目标之一。挑战是如何做到这一点,而不陷入程序结构不良的陷阱。