冒号课堂§1.0:开班导言(下)

上一篇 / 下一篇  2008-10-11 12:11:42 / 精华(3) / 个人分类:冒号课堂

1.4初识范式——程序王国中的世界观与方法论

言者所以在意,得意而忘言                                               ——《庄子·外物》

关键词:编程范式,编程语言,Object-Oriented

摘要:初步引入编程范式
Y)l/??'dxLF0


GW]{J(y-oH0 提问

  • 什么是编程范式?
  • 编程范式与编程语言的关系是什么?

 讲解

问号第一个从小说里走出来,问道:“刚才谈到了低级语言和中级语言,现在该谈高级语言了吧?”

冒号微叹:“高级语言大概有近千种,流行的也不下几十种,有时候选择过多反而无所适从啊。”

逗号不以为然:“最流行的不就那么几个:JavaC++C#还有VB吗?”

不意此言遭到冒号连珠炮似的反问:“可你知道它们为什么会流行吗?是不是学会这几样就是一个合格的程序员了?它们会不会变得不那么流行,甚至被其他语言取代?如果不会,为什么?如果会,又怎么办?”

逗号赧然语塞。

冒号口气放缓:“掌握一门语言的语法、工具和技巧固然重要,但那只相当于学会一门兵器的招法,更重要的当然是心法。招法重形,心法重意。得形而忘意,无异舍本逐末;得意而忘形,方能游刃有余。下面要谈的就是一种心法:编程范式。”

问号不解:“编程范式?听上去很学究,那是什么东东?”

冒号续道:“范式译自英文的paradigm,也有译作典范、范型、范例的。所谓编程范式programming paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。”

叹号吸口气:“好抽象哦!”

句号心中一动:“您是说我们都是虚拟世界的创造者,都在创造自己的黑客帝国?”

大家不禁莞尔。

冒号动情地说:“难道不是吗?只不过帝国有大小之分、优劣之别罢了。当你编程之时,便进入到自己创造的世界之中。这是你的世界,只有注入你的想象力、创造力和激情,它才有勃勃生机。你编写的岂止是代码,分明还有乐曲;你敲击的岂止是键盘,分明还有琴键;你运行的岂止是程序,分明还有世界。当优美的旋律奏起,整个世界都随之翩然起舞,一种莫可名状的满足是否会充溢你的全身?”

大家都被冒号诗化的语言感染了,没想到编程也可以如此感性。

良久,引号试探地问:“面向对象编程就是一种编程范式吧?”

冒号点头:“不错,它是时下最流行的一种编程范式。顺便说一句,‘面向对象’译自Object-Oriented,但‘面向’二字令人费解。据说有本书叫‘面向对象方法’,比别的计算机书都畅销,知道为什么吗?不少同学把它当成恋爱指南买走了。”

全班笑倒。

冒号认真地说:“将Object-Oriented译成‘对象导向’[1],虽然稍嫌拗口,但更贴切。并非刻意要咬文嚼字,这关系到对编程范式的理解。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。由于着眼点和思维方式的不同,相应的范式自然各有侧重和倾向,因此一些范式常用‘oriented’来描述。换言之,每种范式都引导人们带着某种的倾向去分析问题、解决问题,这不就是‘导向’吗?而‘面向’的宾语往往是预先确定的目标,如面向世界、面向未来、面向用户、面向问题等等。”

句号一语惊人:“找对象是‘对象导向’的,去约会是‘面向对象’的。”

全班再倒。

句号得意地解释:“按梦中情人的标准去找对象,目标未定但倾向已定,这就是一种导向,而且是对象导向。找到之后再约会,不就面向对象了吗?”

众人称绝。

 “我们是来谈编程范式的,不是来谈对象的。”冒号一脸的道貌岸然,“编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。任何语言在设计时都会倾向某些范式、同时回避某些范式,由此形成了不同的语法特征和语言风格。”

ITPUB个人空间I"~0B1[&\6j

插语

[1]港澳台地区将其译为“物件导向”。
L3['Fl(`VS!t.\0
3JH2vj N8Sb;S6k0

 总结

  • 编程范式是计算机编程中的基本风格和典范模式,是编程者在其所创造的虚拟世界中自觉不自觉采用的世界观和方法论。每种范式都引导人们带着其特有的倾向和思路去分析和解决问题。OOP就是一种编程范式。
  • Object-Oriented多译作“面向对象”,不如“对象导向”贴切。
  • 如果把一门编程语言比作兵器,它的语法、工具和技巧等是招法,它采用的编程范式则是心法。
  • 抽象的编程范式需要通过具体的编程语言来体现。范式的世界观体现在语言的核心概念之中,范式的方法论体现在语言的表达机制中。一种语言的语法和风格与其所支持的编程范式密切相关。

“”参考

[1] WikipediaProgramming paradigmhttp://en.wikipedia.org/wiki/Programming_paradigm

[2]Stephen H. KaislerSOFTWARE PARADIGMSNew JerseyWiley200521-22

ITPUB个人空间f!B l&y1tTyU"KX%k
1.5
软件技术——实用还是时髦?

借我借我一双慧眼吧,让我把这纷扰看得清清楚楚明明白白真真切切                                    

——《雾里看花》

关键词:编程范式,框架,设计模式,架构,,工具包

摘要:关于框架、设计模式、架构和编程范式的讨论
0d9V@V U%Hl5n0


\i8v:p j r"O6x*C0 提问

  • 库和工具包与框架有何不同?
  • 什么是设计模式和架构?
  • 为什么要谈编程范式,而不是框架、设计模式或者架构? 

 讲解

“现在我们具体介绍一下编程范式。”冒号忽然顿住,隐觉一抹失望从众人脸上掠过,问号更是欲言又止,便鼓励他开口。

问号略显迟疑:“您说编程范式是一种心法,那框架、设计模式还有架构呢?”

“原来如此!”冒号心下了然,“让我说说你们最想听些什么吧。”

众现不信之色。

冒号说道:“一种是具体而实用的,最好能立马解决学习和工作中的问题;一种是时髦而花哨的,管他有用没用,不学点心里就是不踏实。”

众人虽觉此话有些尖刻,细想起来也有几分道理,但老冒明知而不为,不走群众路线,偏去扯什么劳什子的范式——当然,直接谈OOP倒是不错的。

自以为懂的未必真的懂,自以为不懂的未必真的不懂。”冒号玩起了玄学,“有些概念和技术即使背得烂熟,甚至用得烂熟,那也不代表真正掌握;有些概念和技术看起来很新奇,却不过是新瓶装旧酒。”

引号颇不服气:“用得烂熟都不算掌握,难不成只有发明概念和技术才算掌握?”

“哈哈,那倒不必。”冒号笑道,“用得烂熟不等于用得恰到好处,能解决问题不等于没有后顾之忧。”

逗号问道:“那掌握的标准是什么?”

“许多应聘者喜欢在简历中言必称精通某某语言、某某技术云云,大多不必面试即知其大言炎炎——倘若真的精通,他当应聘更高的职位。”冒号有感而发却又似不着边际,“任何概念和技术都不是孤立的,如果不能在纵向的时间和横向的联系中找准坐标,便似那群摸象的盲人,各执一端却又自以为是。”

众人心想,老冒虽言辞旦旦却有凿空之嫌,一节课下来,天马行空的扯了不少,真刀真枪的一个也无,该不是只会纸上谈兵吧?

句号紧扣主题:“您为何选择谈编程范式,而不是框架、设计模式还有架构呢?难道它们真如您所说只是时髦而花哨的东西吗?”

“我可没这么说。”冒号矢口否认,“但在弄清一样东西存在的意义之前就随众跟风,早晚会跟丢的。我先问问你们:什么是框架framework)?它与一般的library)和工具toolkit)有何不同?”

引号应答:“框架就是一组协同工作的类,它们为特定类型的软件构筑了一个可重用的设计。与库和工具包不同之处在于前者侧重设计重用而后两者侧重代码重用。”

“嗯,有点标准答案的味道。”冒号夸道,“如果吹毛求疵的话,框架并不限于OOP,可以是协同工作的,也可以是协同工作的函数。一个足够复杂的应用软件开发,为确保快速有效,通常采取的方式是:在宏观管理上选取一些框架以控制整体的结构和流程;在微观实现上利用库和工具包来解决具体的细节问题。框架的意义在于使设计者在特定领域的整体设计上不必重新发明轮子;库和工具包的意义在于使开发者摆脱底层编码,专注特定问题和业务逻辑。”

问号提出问题:“框架与库和工具包看起来很相似——都是一些代码集合,都提供一些API(应用编程接口),是什么使得它们不同呢?”

“问得好!”冒号赞言,“框架与工具包最大的差别在截然相反的设计理念上:库和工具包是为程序员带来自由的,框架是为程序员带来约束的。具体地说,库和工具包是为程序员提供武器装备的,框架则利用控制反转IoC[1]机制实现对各模块的统一调度从而剥夺了程序员对全局的掌控权,使他们成为手执编程武器、随时听候调遣的士兵。”

叹号苦着脸:“程序员原来就是一小卒子啊!”

“哪个将军不是从小卒做起的?”冒号反问道,“不错,框架是在语言的语法规则之外施加于程序员的又一层枷锁,但没有规矩不成方圆。正如行军打仗,讲究排兵布阵,程序员就是那兵,框架就是那阵。”

句号说:“可不可以这么理解,框架就是一些人——也就是框架设计者,把一个软件开发中最甜的部分啃掉了,剩下部分留给下面的人?”

“从某种意义上说,是这样。”冒号点点头。

逗号很不甘心:“我就想啃最甜的部分。”

“当心别把牙给崩掉。”冒号笑道,“不是打击你,首先你还没那本事;其次即使你有本事也未必有机会;最后即使有本事也有机会,重新设计框架也未必是好的选择。就说大名鼎鼎的Struts吧,哪怕你设计出比它更高明的框架也不会被采用,因为前者早已成为Java平台上网络开发的事实(De Facto)标准,公司很容易从市场上招到懂Struts的程序员,不必培训即可上手,成本低见效快。过去许多公司都有自己的网络框架,但最后大多都放弃了,并不是因为Struts更优秀,而是因为它更普及。毕竟大多数软件开发是以金钱而不是技术为中心的。”

问号提议:“您能谈谈设计模式和架构吗?”

冒号侃侃而谈:“与框架与库和工具包不同,设计模式Design Pattern)和架构Architecture)不是软件产品,而是软件思想设计模式是软件的战术思想,架构是软件的战略决策。设计模式是针对某些经常出现的问题而提出的行之有效的设计解决方案,它侧重思想重用,因此比框架更抽象、更普适,但多限于局部解决方案,没有框架的整体性。至于架构,一般指一个软件系统的最高层次的整体结构和规划,一个架构可能包含多个框架,而一个框架可能包含多个设计模式。”

引号愈发疑惑:“这些不是都很重要吗?”

“当然都很重要。不过——”冒号话锋一转,“在没有打好基础前,架构只是空中楼阁,因此不可能现在谈它。至于框架,不同的应用领域有不同的框架,如表现层的Struts、业务层的Spring、持久层的Hibernate等等,即使相同领域的框架也有多个选择,更不用说不同的语言框架还不一样,从何谈起?再说框架其实一点也不高深,完全可以无师自通,关键是领会思想,多学习多实践。说到设计模式,一共就那么几十个,一本‘四人帮’(GoF[2]的书足矣,自己慢慢去啃,又何须多谈?简言之,一个谈之过早,一个无从谈起,一个不必多谈。”

下面开始交头接耳窃窃私语起来。

“知识的学习有几种方式:一种靠记忆,一种靠练习,一种靠培养。就拿英语学习来说吧,学单词,单靠记忆即可;学句型、语法,光记忆是不够的,需要勤加练习方可熟能生巧;而要讲出地道的英语,光记忆和练习是远远不够的。从小学到大学,甚至博士毕业,除了英语类专业的学生外,大多数人英语练了一二十年,水平如何?不客气但很客观地说:一个字,烂;两个字,很烂;三个字,相当烂!口语甚至连一个英语国家的三岁小孩都不如。”冒号越说越激动,“原因只有一个,那就是国内的英语教学方式严重失策。教学总是围绕单词、词组、句型、语法转,缺乏对语感的重视和培养,导致学生只会‘中式英语’。同样道理,一个惯用C语言编程的人也许很快就能写一些C++程序,但如果他只注重C++的语法而不注重培养OOP的语感,那么写出的程序一定是‘CC++’。与其如此,倒不如直接用C呢。”

句号悟道:“您是想告诉我们,学习编程范式能增强编程语言的语感?”

“一语中的!”冒号庆幸总算没有白费口舌,“语感是一个人对语言的敏锐感知力,反映了他在语言方面的整体上的直觉把握能力。语感强者,能听弦外之音,能说双关之语,能读隽永之作,能写晓畅之文。这是一种综合的素质和修养,其重要性是不言而喻的。那么如何培养语感呢?普通的学习和训练固不可少,但如果忽视语言背后的文化背景和思维方式,终究只是缘木求鱼。编程范式正体现了编程的思维方式,因而是培养编程语言的语感的关键。现在如果我开始介绍范式,你们还有意见吗?”

众人受了鼓动,个个把头摇得跟拨浪鼓似的。

冒号语重心长地说:“既然范式关乎语感,就需要慢慢的培养和渗透,不可能一蹴而就,因此有些地方不太明白也没关系。现在只是撒下一些种子,慢慢的会生根发芽,直至长成大树。到那时,你们个顶个的都是内外兼修的武林高手了。怎么样?大家准备好了吗?”

“准备好了!”众人齐声道,求知的目光再度点燃。

“准备好了就下课吧。”冒号狡笑着,“下节课,下节课我们再谈。”ITPUB个人空间P,?^I"H:h$hY

ITPUB个人空间1EXEuv(UvWU!\
 插语
 [1]控制反转(Inversion of Control)是一种软件设计原则。与通常的用户代码调用可重用的库(library)代码不同,IoC倒转了控制流方向:由库代码调用用户代码。有人将此比作好莱坞法则:“不要打电话给我们,我们会打给你的”。

[2]设计模式最经典书籍《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者常被称为GoFGang of Four
,H&C p ^1~Xy0


.Qg R$r.nG]fA0
总结

  • 库和工具包侧重代码重用,框架侧重设计重用。库和工具包从微观上解决具体问题,是为程序员带来自由的;框架从宏观上控制软件整体的结构和流程,是为程序员带来约束的。框架是通过控制反转(IoC)机制反客为主的。
  • 设计模式是软件的战术思想,架构是软件的战略决策。与框架、库和工具包不同,它们不是软件产品,而是软件思想。
  • 架构太高,谈之过早;框架太多,无从谈起;设计模式太少,不必多谈。至于编程范式,对培养编程语言的语感至关重要,需要充分的重视和长期的积累,方能悟其精髓。


^2i6H4Y'ard\0“”
参考

[1] Erich GammaRichard HelmRalph JohnsonJohn VlissidesDesign Patterns: Elements of Reusable Object-Oriented SoftwareBostonAddison-Wesley199426-28
,]b t_oC0

ITPUB个人空间 X.gD BI+f(v
ITPUB个人空间 M3w I$d9[] v
课后思考

  • 作为一个软件开发者,你现在处于哪个阶段?你未来的目标是什么?
  • 传统的学习方式的弊端在哪里?你是否有切肤之痛?
  • 你认为一个优秀的程序员需要具备什么素质和精神?
  • 你了解哪些计算机语言?你对一门语言的取舍与喜恶的根据是什么?
  • 你认为计算机语言未来的发展方向是什么?
  • 你能否在编程中感受到自己的激情和灵性?
  • 你了解哪些框架?它们的应用范围是什么?实现的机理是什么?
  • 你了解哪些设计模式?它们为什么能成其为模式?
  • 学习编程范式的意义何在?

TAG: 编程 编程范式 程序员

引用 删除 dingding   /   2009-05-22 17:00:49
挺好的——
1)关于语言、框架的描述
2)行文很优美
引用 删除 scofield_alex   /   2008-11-07 16:56:32
不管是从对语言的认识还是语言的幽默,都相当有意思!!
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar