acm-header
登录

ACM通信

BLOG@CACM

什么使程序优雅?


罗宾·k·希尔,怀俄明大学

哲学的一个分支领域是美学,我们试图在美学中理解美。美通用吗?这会让我们成为更好的人吗?为什么我们关注的是美而不是丑?这个问题在计算机科学中的一个现成的应用是解决程序优雅问题的。大多数程序员(至少我是这样认为的)会同意有些程序是优雅的,而优雅的程序比其他程序更好,而有经验的程序员(至少我是这样认为的)通常会同意哪些程序是优雅的。

效率的标准在生产编程中显得很重要,并且出现在Web上关于优雅的评论中,例如Perrin [Perrin 2006]。一个程序应该是简短的,但不应该成为简洁的奴隶。一个优雅的设计工件在它的用途上是圆滑和简洁的。一个优雅的程序最少是不必要的。例如,在熟悉的问题领域,考虑二进制搜索(有序序列)相对于顺序搜索,或快速排序相对于插入排序[Gelernter 1998]。顺序搜索乏味地检查每个(有序的)项目,但它并不一定要这样做;气泡排序单调乏味地交换许多将不得不再次移动的项目。找到第一个n质数,我们可以乏味地测试每个质数的除数,或者我们可以使用埃拉托色尼的筛子。效率有助于使Sieve、二进制搜索和快速排序变得优雅。我们有关于优雅的第一标准,(1)最小化,包含了简短和简单。

让我们避免完全依赖源代码语法、编译器、I/O机制或内存处理的程序特性。最小化临时变量,直接求表达式值的程序是“更好的”,但是我们没有在这个层次上解决美学问题,也没有在自描述标识符、文档、模块化和设计模式的层次上解决美学问题。当一个程序包含更多的错误检查时,它也会变得更好,但这不会加强,甚至可能削弱它的优雅性,即使它提高了它的质量。

简单本身是不够的;泡泡分类是一个简单的程序。(我认为Boyer-Moore String Search是优雅的,尽管它很复杂。)简洁本身是不够的;C回路控制虽然(我+ + < 10)也许是简洁,精于简洁,但它的优雅是值得商榷的。从建筑的角度来说,我把它叫做野兽派。建筑提供了很好的类比,因为它也努力在材料限制下构建满足规格的工件,特别是那些表现出美的工件[De Botton 2006]。

在计算机科学中比在建筑学或其他学科中更为突出的一个因素是正确性。一栋建筑可能被认为是优雅的,即使它的边缘部分让人不舒服,但没有一个不工作的程序被认为是优雅的。这给了我们另一个标准,(2)成就-程序做它应该做的。尽管这也包括在这里的要求清单中,但未能达到这一标准是致命的,而不是有害的。

编程的约束条件强加了一个环境,没有这个环境,就无法欣赏编程的优雅。我们必须了解问题,了解工具和材料,以便欣赏解决方案。专业知识是必要的。多年来,对许多学生项目的研究提炼出一种欣赏,对那些以优雅的自信和经济的方式完成所有这些工作的作品印象更深刻。因此,优雅是双重的——与作品的背景和观察者的背景有关。想想Jon Bentley [Bentley 1983]在经典的“编程珍珠”专栏中提出的位图排序,仍然值得研究。进行排序n固定范围0到的唯一整数,我们可以通过基于比较的排序(例如快速排序)重新排列它们,或者可以初始化一个位数组,以0为索引到,,然后,对于每个整数输入,将其位翻转为真正的.数组的下标进行一次遍历真正的输出的是位,得到的是排序后的列表。这是很好的。这是优雅的,即使相对于快速排序,但请注意,它只工作于一组唯一的值(如前所述);对满足该限制的情况的识别将优雅的程序员区分开来。

我们正在回避无数关于在不同翻译级别上实现的难题,以及它们是否应该支持或反对优雅。我们将继续这样做。事实上,我所描述的不是源代码术语中的程序,而是算法。简洁或极简是代码的显著特征,但却是算法的微妙特征;当然,我们想要的是解决方案,无论该解是如何表示的。然而,另一个更普遍的“稀疏”概念在优雅中发挥作用,有点像克制。这给了我们一个标准(3)谦虚.Kernighan和Plauger的《编程风格的元素》(Elements of Programming Style)一书的第一页就有一个藐视这一点的例子。

Do 14 i =1, n Do 14 j =1, n 14 v (i, j) = (i / j)*(j / i)

它利用FORTRAN编译器对整数除法结果的截断来填充一个矩阵V除了对角线,其他地方都是0,对角线的值都是1;也就是说,它初始化VNxN单位矩阵。这很聪明,非常聪明,而且非常简短。但是…哦,亲爱的…它依赖于实现,因此很脆弱;它晦涩而浮夸。如此精湛的技艺令人遗憾,却又难以抗拒。(Kernighan和Plauger建议明显地从头到尾初始化为0,然后循环给每个值赋值1V (N, N).)

计算什么?一个优美的节目给人一种满足感和启迪感。让我们称这个标准,尤其是程序工件的特征,(4)启示-程序向我们展示了它的任务中的一些新东西,或者把我们忘记的东西突显出来。埃拉托色尼的筛告诉我们,或者提醒我们,倍数是"非质数"位图排序告诉我们,或者提醒我们,整数已经排序了;它们以序列的形式出现,因此排序只能通过存在的指示来完成。Boyer-Moore弦搜索告诉我们,或者提醒我们,弦向后和向前是一样明显的。

这里建议的程序优雅性标准是(1)最小化(2)成就(3)谦虚,(4)启示,这些都源于问题的特殊性。这些标准是必要的吗?足够吗?不足?由于严重依赖于手头的问题,有时在复杂的情况下,很难获得大量的优雅程序示例。在你的世界里有哪些突出的例子?

参考文献

宾利,乔恩。”编程珍珠:敲开牡蛎1983年,ACM通讯26:8。

德波顿,阿兰。”幸福的建筑, 2006年,万神殿书店。

格勒恩特尔,大卫。”机器之美:优雅与技术之心1998年,珀尔修斯出版社。

克尼根,布莱恩,普拉格,p。j。编程风格的要素, 1978,麦格劳-希尔图书公司。

佩兰,乍得,“ITLOG进口:优雅:“2006只。

罗宾·k·希尔他是怀俄明大学哲学系和怀俄明人文研究所的兼职教授。她自1978年以来一直是ACM的成员。


评论


CACM管理员

以下是Mario Beland在2017年2月22日提交的关于“什么使程序优雅?”的评论:

我很喜欢Robin K. Hill女士关于节目之美的文章。我想起了Edsger W. Dijkstra的书《美丽是我们的事业》。作为一名程序员,我经常使用他的程序“更新顺序文件”,该程序出现在他1976年出版的《编程的纪律》一书中。这确实是一个美丽的节目!

——马里奥Beland


罗宾山

谢谢你的想法,贝兰德先生,也谢谢你激励我重新审视Dijkstra。我还记得几年前当我被邀请教授一门关于文件结构的课程时的懊恼,我认为这门课太、太枯燥、太平凡了。然而,在那之后,我对合并和索引的简单算法的优雅有了新的欣赏。


显示所有2评论

登录为完全访问
»忘记密码? »创建ACM Web帐号
Baidu
map