皇帝的新装和旧装

来源:互联网 发布:mac如何输入罗马数字 编辑:程序博客网 时间:2024/04/17 03:37

 今天看到托尼·霍尔(Tony Hoare,快速排序算法QuickSort的发明者)老大的一个访谈里面提到他当年图灵奖获奖演说《皇帝的旧装》的故事。

 

 问题四:听说你在获得图灵奖的时候做了一个名为《皇帝的旧装》的演讲,能说说当时您都谈到了什么?
 
托尼·霍尔:我在那天的演讲当中主要是谈编程语言的设计,我当时是想对那个时候的一些方法提出一些批评,比如说像Algol 68这样的设计,我认为它们太过复杂了。我就打了一个比方,说这些语言这么复杂,就好像一个人穿了太多件衣服在身上。我就借鉴了安徒生的《皇帝的新衣》的童话故事来说,目前在这样一种情况下,就好像一个人穿了太多件衣服,而皇帝之所以穿了太多件的衣服呢,是因为他害怕出现那种在《皇帝的新衣》里面出现的最后赤身裸体、什么衣服都没有穿的状况。我用这样的一个比喻来描述当时的这些编程语言太过复杂。而当时的编程太过复杂是因为每一个人都想往里面加更多的功能,最后就导致这些新的功能最后超出了程序的必要性。所以,我就觉得我们应该回到一个比较简单的状况,让编程语言不要那么复杂。我同时也说,一个程序的正确性要比在写程序的时候的难易程度更重要。我现在回想起来,我当时说这些话,可能有一点太过傲慢。

 

先赞一下这个演说题目——《皇帝的旧装》,实在是很恰当、很有趣的一个隐喻,堪称典范。
实际上托爷爷谈到的问题在今天仍然很有意义,一个好的设计(当然这里说的肯定是专指程序的设计)到底是应该大而全OR小而精?
Anders Hejlsberg也曾经谈到过他们在C#语言的设计过程中最难的事情并不是如何实现一些看起来很玄的东东,反而是如何砍掉各种新奇的idea提案,保持语言的简洁性。这个也很好理解,一个好的feature只要不是必须&急需,即便你今天不加入明天加入也不是什么大的问题;但是新功能一旦加入想把它拿掉可就没那么容易了。毕竟像Python 3那种抛弃兼容性的做法还是需要很谨慎的。如果语言当中充斥着大量因为历史原因遗留下来的垃圾feature,基本上这个语言就准备着没落吧……
Agile里面同样在谈“过度设计”,这个观点一般我是很赞同的,不过必须清楚的是这可不是“不做设计”的理由。“过度设计”指的是那些真的没有必要,看起来有用实则十分脆弱的设计,因为过度的设计反而会阻碍程序的更新(毕竟简单的东东改起来容易嘛)。

花开两朵,各表一枝。现在再来说说反方观点。我映像最深的是C++老爹Bjarne Stroustrup的观点。因为老是有人批评C++太复杂,Bjarne老大实在忍不住之后终于跳出来反驳,指出那些号称简单的语言只不过是处于婴儿期而已,等它长大之后一样会变得复杂的。现在看来,Bjarne的观点基本属实,各种语言发展到后期都不会很简单,至少跟它最初相比肯定是肥了一大圈。
以前在A公司开发R程序的时候,里面每一个平常耳熟能详的功能都有一套极其复杂的机制来专门处理,最初很是纳闷有必要那么复杂吗,把开发门槛搞得这么高,害得我做一个简单的功能还需要去熟悉你一套怪兽级别的框架,不用你这套东东我自己实现一个好像也用不了多少时间。不过后来在开发过程中才慢慢体会到实际上这些重量级的框架还是很有价值的,很多功能自己当然也是可以实现,但多半都是因为最初的需求很简单。随着不断有新的需求加进来,最初自己那个简单的实现也需要不断加入新的功能去处理这些新的需求。慢慢地,自己的实现就会越来越大,越来越复杂,一不小心自己又重新发明了一个怪兽出来……这时候你就会发现实际上这些功能在那个看起来怪怪的框架/库里面人家早就考虑进去了。

回到开头,到底什么才是好的设计?这估计是一个没有答案的问题,不过我想最重要的一点是好的设计应该经得起时间的考验,在不断的变化过程中坚如磐石,才能熠熠生辉!

原创粉丝点击