`
MauerSu
  • 浏览: 514446 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

王垠:谈程序的“通用性”

 
阅读更多

源:http://www.oschina.net/news/39968/programe-generality

评:

在现实的软件工程中,我经常发现这样的一种现象。本来用很简单的代码就可以解决的问题,却因为设计者对“通用性”,“可维护性”和“可扩展性”的盲目推崇,被搞得绕了几道弯,让人琢磨不透。

这些人的思维方式是这样的:“将来这段代码可能会被用到更多的场合,所以我现在就考虑到扩展问题。”于是乎,他们在代码中加入了各种各样的“框架结构”,目的是为了在将来有新的需要的时候,代码能够“不加修改”就被用到新的地方。

我并不否认“通用性”的价值,实际上我的某些程序通用性非常之强。可是很多人所谓的“通用性”,其实达到的是适得其反的效果。这种现象通常被成为“过度工程” (over-engineer)。关于过度工程,有一个有趣的故事:

http://www.snopes.com/business/genius/spacepen.asp

传说 1960 年代美俄“太空竞赛”的时候,NASA 遇到一个严重的技术问题:宇航员需要一支可以在外太空的真空中写字的钢笔。最后 NASA 耗资150万美元研制出了这样的钢笔。可惜这种钢笔在市场上并不行销。

俄国人也遇到同样的问题。他们使用了铅笔。

这个故事虽然是假的,但是却具有伊索寓言的威力。现在再来看我们的软件行业,你也许会发现:

  1. 代码需要被“重用”的场合,实际上比你想象的要少

    我发现很多人写程序的时候连“眼前特例”都没做好,就在开始“展望将来”。他们总是设想别人会“重用”这段代码。而实际上,由于他们的设计过于复 杂,理解这设计所需的脑力开销,已经高于从头开始的代价。所以大部分人其实根本不会去用他们的代码,自己重新写一个就是了。也有人到后来发现,之前写的那 段代码,连自己都看不下去了,恨不得删了重来,就不要谈什么重用了。

  2. 修改代码所需要的工作,实际上比你想象的要少

    还有一种情况是,这些被设计来“共享”的代码,其实根本没有被用在很多的地方,所以即使你完全手动的修改它们也花不了很多时间。现在再加上 IDE 技术的发展和各种先进的 refactor 工具,批量的修改代码已经不是特别麻烦的事情。曾经需要在“逻辑层面”上进行的“可维护性”设计,现在有可能只需要在 IDE 里面点几下鼠标就轻松完成。所以在考虑设计一个框架之前,你应该同时考虑到这些因素。

  3. “考虑”到了通用性,并不等于你就准确地“把握”住了通用性

    很多人考虑到了通用性,却没有准确的看到,到底是哪一个部分将来可能需要修改,所以他们的设计经常抓不住关键。当有新的需要出现的时候,才发现原来设想的可能变化的部分,其实根本没有变,而原来以为不会变的地方却变了。

    能够准确的预测将来的需要,能够从代码中“抽象”出真正通用的框架,是一件非常困难的事情。它不止需要有编程的能力,而且需要对真实世界里的事物有 强大的观察能力。很多人设计出来的框架,其实只是照搬别人的经验,却不能适应实际的需要。在 Java 世界里的很多 design pattern,就是这些一知半解的人设计出来的。

  4. 初期设计的复杂性

    如果在第一次的设计中就过早的考虑到“将来”,由此带来的多余的复杂性,有可能让初期的设计就出现问题。所以这种对于将来的变化的考虑,实际上帮了 倒忙。本来如果专注于解决现在的问题,能够得到非常好的结果。但是由于“通用性”带来的复杂度,设计者的头脑每次都要多转几道弯,所以它无法设计出优雅的 程序。

  5. 理解和维护框架性代码的开销

    如果你设计了框架性的代码,每个程序员为了在这个框架下编写代码,都需要理解这种框架的构造,这带来了学习的开销。一旦发现这框架有设计问题,依赖 于它的代码很有可能需要修改,这又带来了修改的开销。所以加入“通用性”之后,其实带来了更多的工作。这种开销能不能得到回报,依赖于以上的多种因素。

所以在设计程序的时候,我们最好是先把手上的问题解决好。如果发现这段代码还可以被用在很多别的地方,到时候再把“框架”从中抽象出来也不迟。

分享到:
评论

相关推荐

    王垠:《完全使用Linux工作》

    王垠:《完全使用Linux工作》.对比微软的操作系统以及MS office.提出linux等自由软件存在的重大意义。

    王垠:《如何制作TeXmacs 样式文件》

    TeXmacs是一种基于Scheme语言的文档准备系统,它具有强大...其可视化编辑方式的潜力和价值是不可小觑的,尤其是在人们越来越追求高效率和易用性的今天。对于TeXmacs的进一步探索,很可能引领文档编辑软件的下一场革命。

    王垠_完全用Linux工作_谈LinuxWindowsMac

    王垠是一位知名的技术专家,他在"完全用Linux工作"及"谈Linux,Windows,Mac"这两篇文章中,分享了他对不同操作系统的见解和实践经验。这里我们将深入探讨他提到的知识点,并结合Linux、Windows和Mac的特性进行分析。 ...

    王垠文章合集

    2. 自由软件和开源文化:作为自由软件的坚定支持者,王垠的文章可能会阐述自由软件的重要性,以及开源项目对技术社区的贡献。他可能会讨论GPL等开源许可证,鼓励读者参与开源项目。 3. 软件工程实践:王垠对软件...

    王垠的TeXmacs使用说明(脑图)

    王垠在自己的博客上推荐过很好用的文档撰写编辑器,完美结合Word与Latex的优点:http://www.yinwang.org/blog-cn/2012/09/18/texmacs 这个教程作者为王垠,原地址在这里:...

    王垠 王纯叶的emacs配置

    Emacs是一款强大的文本编辑器,由GNU项目开发并维护,具有高度可定制性和扩展性,被誉为“操作系统中的操作系统”。在IT行业中,特别是程序员和开发者群体中,Emacs因其丰富的功能和高效的工作流而备受推崇。王垠和...

    程序员的心里-王垠

    王垠在其文章《程序员的心里》中探讨了一个深刻且普遍存在的问题——程序员行业内存在的心理疾病现象。这些问题不仅限于个体层面,更是反映了整个行业文化的某些弊病。本文将深入分析文章中提到的几个核心病症,并...

    王垠老师的经典文章《编程的智慧》

    最后,王垠老师讨论了代码模块化的重要性,并批评了业界一些错误的做法。他指出,许多人误解了模块化的本质,错误地将代码物理分散到多个文件或目录中,却未达到真正的模块化效果。王垠老师认为,真正的模块化是逻辑...

    cps.zip_40_CPS_site:www.pudn.com_王垠40行代码

    这种方式使得程序的控制流显式化,便于处理异步操作和嵌套调用。在处理回调函数时,CPS可以使代码更易于理解和管理,因为它消除了嵌套回调的“回调地狱”问题。 在Lisp这样的函数式语言中,CPS转换可以自然地进行,...

    易语言程序飞舞的蝴蝶.rar

    《易语言程序飞舞的蝴蝶》是一款基于易语言开发的程序,主要展示了动态图形和动画效果,仿佛蝴蝶在屏幕上翩翩起舞。易语言作为中国本土的编程语言,旨在降低编程难度,使得非专业程序员也能进行软件开发。下面将详细...

    易语言源码斗转星移 v1.0.7z

    易语言是王垠博士于1998年创立的编程语言,其设计目标是让编程变得简单,让所有中国人都能轻松掌握编程技能。易语言采用了直观的中文语句,语法结构清晰,使初学者能够快速理解并上手。此外,易语言提供了丰富的内置...

    易语言本地硬盘上运行的程序

    标签"SanYe"可能是指易语言的创始人王垠,他在易语言的开发和推广中扮演了重要角色。他的理念和工作为易语言的发展奠定了基础,也影响了众多初学者的学习路径。 综上所述,易语言本地硬盘上运行的程序涵盖了程序...

    易语言加密记事本简单例程

    易语言是由王垠教授开发的一种面向对象的、简体中文编程语言,旨在降低编程难度,让更多的人能够接触编程。它的语法简洁明了,易于理解,特别适合初学者入门。 在这个"加密记事本简单例程"中,开发者设计了一个程序...

    利用易语言打造无图标桌面

    1. **易语言简介**:易语言是由王垠教授发明的一种编程语言,它的特点在于使用中文编程,语法简单明了,使得初学者能够快速上手。易语言支持面向对象编程,拥有丰富的内置函数和库,可以方便地进行系统级操作。 2. ...

    易语言源码Dos程序.rar

    易语言是一种基于中文编程的计算机编程语言,由王垠教授于1998年创立,旨在降低编程的难度,让更多的非专业人员也能参与到软件开发中。它的设计思想是“易学、易用、易读、易写”,通过简单的中文词汇来实现复杂的...

    易语言源码易语言新手学习的参考程序.rar

    易语言是由王垠博士创建的一种简体中文编程语言,它的核心理念是“易学易用”。易语言的语法结构直观,采用自然语言表达方式,使得编程过程更为简单明了。它支持多种操作系统,如Windows、Linux等,并且拥有丰富的...

    王垠导师R. Kent Dybvig的编译器课程(P423)作业文档

    王垠导师R. Kent Dybvig的编译器课程作业文档。跟其他编译原理的课程不同,这门课程是从汇编生成开始,自底向上小步迭代地实现了一个Scheme编译器。这样每一小步完成后都能直接编译运行,检验成果。 文档缺少第12课...

    惯有类型推导的幻灯片

    7. 文档的发布信息显示该文档由王垠撰写,王垠是知名的计算机科学家,长期活跃在编程语言和类型系统的研究领域。文档的发布地点是LH101,时间是2012年10月19日下午4:15,这些信息说明了文档的学术背景和可能的听众。...

    易语言源码人品计算器.rar

    《易语言源码人品计算器》是一款基于易语言编程环境开发的应用程序,主要功能是进行趣味性的“人品计算”。这个压缩包包含了该程序的源代码,为学习易语言编程和理解程序设计提供了实例参考。 易语言是一种面向对象...

Global site tag (gtag.js) - Google Analytics