读 《论“器”与“气”》后的感慨

来源:互联网 发布:内窥镜品牌知乎 编辑:程序博客网 时间:2024/04/29 09:15
原文 ---〉
  论“器”与“气”
首先让我们来看一看什么是武林高手,或许我们能够从中得到启发。
凡是喜爱武功或武侠小说的人都知道,修炼武功分为外练和内修两种途径。外练拳脚、兵器,拳脚的招式和兵器的好坏是关键;内修真气,练精化气、练气化神、练神还虚是根本。这两种修炼方法的最大差别在于时间和功力的函数关系上,如图3-1所示。通俗地讲,头3 年,练外功的可以轻易打败练内功的;第10 年,双方只能打个平手;15年后,无论你如何练外功都不是练内功的对手。20 年后,内功高手天下无敌。其中的道理正是在于“器”和“气”的辩证关系。
“器”为有形之物,刀枪剑戟皆为有形之器。外练武功,离不开这些有形之器,练功即为练兵器。所以使枪弄剑的武林高手往往依赖于兵器的好坏。
“气”为无形之质,一切智慧、法力、思想皆为无形之质。内修气功,离不开这些无形之质,练功即为练气。所以真正的武林高手往往无需依赖于特定的兵器,对于他们而言,任何有形之物皆可随气所运,拟为兵器。一折扇,一拂尘在其手中威力不亚于名枪好剑,是得气所致也。
3-1 两种修炼方法的时间和功力关系图
在软件开发中,编程工具是“器”,编程思想是“气”。
在编程之器中,易用之器如VB PB ;难用之器如汇编、C + + ;古老之器如Fortran COBOL ;时尚之器如Java C#。
在编程思想中,又有面向对象和面向过程之分,它们既是世界观又是方法论。前者反映的是人对客观对象的思维方式,后者反映的是机器对指令的思维方式。在软件开发的不断实践中,前者的优越性已经得到不断的体现和证实。
掌握面向对象的编程思想如同获得练气的真谛。它的重要性往往胜过了对编程语言的选择!
有人即使选择了面向对象的利器,也无法成为真正的高手,因为他看重的是“器”的好坏,忽略了“气”的修炼。
实际上“一个系统或语言是不是面向对象的并不重要,重要的是怎样才能是面向对象的以及用什么办法实现相关的好处”。练器虽易,但难成高手。练气虽好,但见效缓慢,寂寞难耐,非一般常人可以明心见性,直取大道。所以很多武林高手都是先练器、后练气;内外兼修,终成正果。
对于初入武林的新手,他们需要借助兵器的威力,以补内力之不足,器的好坏往往很重要。但随着武功的增加,内力的勃发,对器的依赖性应该减小。《神雕侠侣》中杨过练剑,起步初学时好使利剑,谙悉剑法后喜用钝剑,内功纯熟后树枝亦当剑。所以对于真正的高手而言,剑器的好坏往往并不重要。
同样,软件高手的成长也有这样的过程。初学编程需要选择好的语言,这样可以取得事半功倍的效果,同时激发学习兴趣,增强信心。一旦熟悉了一种语言之后,应以此为契机进而掌握面向对象编程思想。这时你熟悉的不再是语言本身的语法、函数、类库,而是绑定、多态、模式等思维方法,然后触类旁通,再学其他面向对象语言也不难。苦练内功,勇于实践,最终成功的真正的软件高手,是不受编程语言限制的。他们可能比较熟悉一种开发工具,但那也只是承载他们大道无形之气的器具。他们虚心好学,善于总结。他们的思想、方法、模式甚至哲学,既超越了编程语言,又可以指导编程语言的实践。
Delphi为软件高手的成长提供了内外兼修的捷径。学练Delphi,既可用其RAD之长,控件之利,初学起步,迅速击败对手;学练Delphi,也能以其OOP之能,VCL之强,培根固本,成就不败之功。
威震四海的华山剑派曾分为“剑宗”和“气宗”,前者只练器,讲招式;后者兼练气,重筑基。学习Delphi好比修炼华山剑法,走RAD之路是“剑宗”,从OOP之道是“气宗”。前者喜用控件,看中奇技淫巧;后者好为对象,热衷方法模式。前者追求速成,后者志存高远。我认为,无论是为RAD而选择Delphi还是因OOP而放弃Delphi的朋友都没有真正了解DelphiDelphi是一个不错的RAD开发软件,可是不学OOP,不深人VCL就很难成为真正的高手。同样,Delphi是一个地道的OOP编程工具,结合Delphi强大的RAD和高效的编译器,可以比其他OOP语言有更多的优势和更高的效率。如果能打破门户之见,“器”与“气”同练,内外兼修,我相信Delphi程序员不难从一个RAD快手成长为OOP高手,最终笑傲江湖,纵横四海。
面向对象编程思想和大道无形之气
前面我简单讨论了“器”与“气”的辩证关系。在编程中,修持内功、提高内力的关键之一在于掌握面向对象编程思想。实际上,我更认为面向对象编程思想才最合大道无形之真气的妙处。
为什么这么讲?“古之大化者,乃与无形俱生”(《鬼谷子》反应第二),气的奥妙首先在于它的“大化”。大化者,天地之大造化也,集一切创造和变化之能。面向对象的编程思想具备了这种特质。
老子曰“无名天地之始,有名万物之母”,无名是无以名状,无法定义的意思。所谓面向对象的思维方式,最奥妙之处在于如何从“无名”中识别和定义对象,如何从“有名”中构造和使用对象。
对于软件开发人员来说,认识客观实体的过程、对用户需求进行分析和设计的过程,就是发现和界定对象的过程,是从无名到有名的过程。然而这里的对象又不同于面向过程中的变量或函数,对象是由类创建的,类是概念的抽象,是可以定义的“有名”,是对象之母。于是乎,太极生两仪,两仪生八卦,通过类的继承和派生,万物始生,系统构成。即使作为面向对象编程工具的“器”,也体现和承载了面向对象的编程思想之“气”。
从软件开发的角度来理解,面向对象的编程工具虽然提供了构建无穷种软件系统的可能性,但这种无限性却是建立在自身类库的有限框架之中。无论是DelphiVCL ,还是Java的类库,或是.NET的框架,无一不是建立在这样一个类似于周易八卦的架构之中。“易有太极,太极生两仪,两仪生四象,四象生八卦”,这样的结构完美无瑕,有着无穷的创造力。太极是Delphi中的TObject,它是构建系统的原子,并是所有类的祖先,它具有所有类的基本特征。在Delphi的编程世界中,根类TObject 生持久对象类Tpersistent ,持久对象类Tpersistent生组件对象类Tcomponent,进而为开发应用程序提供了丰富的控件和强大的功能。然而类库的结构框架不仅仅是给我们可以作为“器”用的组件,更重要的是这种结构通过类之间的关系和相关作用,实现了“气”的构造和变化,体现出面向对象编程思想的精髓。为我们创建自己的系统提供了绝好的示范。
气的奥妙其次在于它“生于无形”。无形意味着它的自由性、开放性、适应性。在面向对象编程思想中处处充满着“气”的这种大道无形的智慧。
比如,面向编程对象中的多态性使程序员可以撰写更加通用的、更加开放的程序。程序员可以为Vehicle对象编写一个纯虚抽象方法stop(),这样的通用stop()方法与驾驶什么车无关。程序员可以让派生类去操心如何完成stop()方法,而继续在更高的抽象级别上编写自己的通用过程。即使car对象的stop()方法与Bicycle对象的stop()方法完全不一样,程序员也可以使用Vehicle.stop()。多态性可以让创建的对象自动知道哪一个合适的方法将被调用。这就使程序具备了“气”的开放性和适应性。
练气功中讲究“上德无为,不以察求。下德为之,其用不体”(引自《周易参同契》)。在面向对象编程思想中,“上德”是晚绑定的纯虚抽象方法,是以不变应万变的对象接口,它是对事物的高度抽象,是形而上学。“上德无为”是说在抽象层次,通过无为来体现编程“虚”的一面,因为这时还无法确定实际使用的真正对象(可能是Car对象也可能是Bicycle对象,更可能是以后发明的新交通工具对象),“不以察求”要求我们跳出具体需求的约束,不去考虑具体的实现代码。所以纯虚抽象方法或对象接口中是没有任何代码实现的。在面向对象编程思想中,“下德”是对纯虚抽象方法的覆盖,是对对象接口的实现。“下德为之”,提供了真正的代码实现。“其用不体”,满足了不断变化的需求。
多态性使得程序员在以后不费多大力气就可以派生对象,实现程序。假设程序员在为CarBicycle 构建应用程序,并不知道还存在Truck ,但这并不要紧。程序员可以为继承vehicle类的carBicycle类撰写覆盖stop()的方法。这样,在程序中只要把创建的car Bicycle对象转型为Vehiole 的类型,使用vehicle stop()方法,就可以让carBicycle对象动态绑定符合自己要求的stop()方法。即使后来新增了Truck对象,仍然是调用Vehiolestop()方法,并不需要改动程序。
“物有自然,事有合离。有近而不可见,有远而可知。近而不可见者,不察其辞也;远而可知者,反往以验来也。”(《鬼谷子》抵戏第四)
虽然客观事物复杂,用户需求是变化的,但是其中也有一定的内在规律。
近而不可见者,只看眼前的具体功能实现,不察事物的一般发展规津,心中只有孤立的数据和机械的流程,一旦“事有合离”,则措手不及,难以应对。这样的编程是静态的、机械的、难以维护和扩展的。
远而可知者,善于发现规律,重视代码重用,眼中尽是有机的对象和和谐的关系,即使需求改变,也能从容应对,游刃有余。这样的编程是动态的、灵活的、可维护和可扩展的。
Paul Kimmel在《Delphi6 应用开发指南》中说“以非面向对象的方法去使用面向对象工具是一个错误。使用Delphi编写结构化程序可以很快地到达beta版——你的程序可能永远脱离不了beta 版。迅速得到错误的答案,仍然是错误的。”
同样是使用Delphi,如果没有面向对象的编程思想,好比“不察其辞”,最终仍然是“近而不可见”,难以开发出优秀的系统。惟有潜心苦练,悉心总结,掌握面向对象编程思想的精髓,才能运“气”自如,“反往以验来也”,最终达到“远而可知”的境界。
评论:
看过这片文章本人方知自己之不足。
本人认为现在本人正在用“器”。正要向气转换。本人使用之器为vs2005
借助.net的强大补自己的气力不足。现在要向java拓展取c#java 编程思想之精华。
 
原创粉丝点击