冒号课堂
第一课 开班导言
课前导读
第一课为整个课堂学习的内容和风格定调,并围绕三个问题进行展开:要成为一个优秀的程序员,最需要学习什么知识?领会什么思想?具备什么精神?
本课共分五节——
1.开班发言
2.首轮提问
3.语言选择
4.初识范式
5.软件技术
1.1开班发言——程序员的四层境界
授人以鱼不如授人以渔 ——古语
关键词:程序员,知识,思想,精神
摘要:对程序员的一些忠告和建议
?提问
- 软件开发者的成长需要经历有哪些阶段?
- 要想在IT业中生存与发展,传统的学习方式是否够用?
- 优秀程序员应该具备哪些素质?
:讲解
冒号开了个程序员提高班,今天迎来了首期学员,他们是问号、句号、逗号、引号和叹号,皆为IT业的新兵。望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言——
大家好!先自我介绍一下,本人姓冒名号字解之。诸位不必叫我老师,就叫老冒好了。比在座各位痴长几岁,“老”是担得的,“师”却不敢妄言。在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享。虽系一家之言、一孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自误误人。
客套已毕,言归正传。本班主要采取讨论的形式,只要是软件开发中值得讨论的,但凡本人力之所及,均可共同探讨。
本班的宗旨是:学会不如会学,会学不如会用,会用不如被用。对于一个软件开发者来说,这意味着四个阶段:
学会(知其所然)——掌握一些具体编程知识的初级程序员
会学(知所以然)——能快速而深刻地理解技术并举一反三的程序员
会用(人为我用)——能将所学灵活运用到实际编程设计之中的高级程序员
被用(我为人用)——能设计出广为人用的应用程序(application)、库(library)、工具包(toolkit)、框架(framework)等的系统分析员和架构师
至于被用的更高层次,如发明出主流的设计模式、算法、语言乃至理论等,则可称得上计算机专家了。本班的目的,正是为各位向更高阶段的提升助一臂之力。
大家可能都习惯了在小学、中学和大学里的课堂,那里的知识大多是系统而完备且貌似终极的,那里的学习大多是单向而被动的。但习惯并不意味着享受,更多的是因为别无选择。你们曾被引入一座座知识殿堂,被告知它们如何美轮美奂、巧夺天工,尽管很多时候你们或不以为然、或不解其妙,但还是不得不记下每一处被指点的细微结构。很少有人带你们看看当初为建造这些殿堂而打下的地基、搭设的脚手架,哪怕只是上漆前的模样也好,更遑论一瞻数易其稿的设计图纸了。那些与殿堂相比显得有些原始、甚至丑陋的东西,被有意无意地挡在视线之外。可没有那些,你们将来如何为这些宫殿添砖加瓦,又如何另起楼阁呢?
中国学生恐怕是世界上最擅长考试、最习惯考试、也最厌倦考试的群体了。你们告别了学生生涯,踏上了职业之旅。首先我要恭喜你们,脱离苦海了!同时也要悲告你们,掉进火坑了!危言耸听吗?如果你选择了做程序员,你时时都得学习,没有手把手教你的老师,没有指定的教科书和参考书,有的是层出不穷令人眼花缭乱的新概念、新技术、新问题,好不容易学到一些皮毛,有的已成明日黄花。你时时都得考试,每提交一段代码就是上交一份答卷,你不知道什么时候、什么人会批改,直到——开发组同事发现你的代码难以看懂,系统分析员指出你的程序不符合规范,测试工程师检验到你的软件有缺陷,客户抱怨你的产品太慢太难用,最后老板倒可能告诉你一个好消息:明天起放长假!
其实,又有哪行哪业的人不需要学习和考试呢?IT业只是相对更激烈、更富挑战性而已。在这个瞬息万变、适者生存的时代,如果还沿用封闭、被动的学习方式,恐有淘汰之虞。有鉴于此,本班的风格与你们习惯的课堂有所不同:这里的知识不一定是系统或完备的,但一定是生动鲜活的。如果知识是水,我们要挖掘最先涌动的泉眼,还要探究最终流淌的曲线;如果知识是火,我们要捕捉起初点燃的火花,还要前瞻未来绵延的轨迹。这里的问题不一定是预设的,结论不一定是终极的,甚至不一定是正确的,但一定是有的放矢、发人深思的。由此决定了这里的学习方式将是开放多元、双向互动的。
越是喧嚣的世界,越需要宁静的思考,让躁动的心灵得以平息,让蕴藏的灵性得以释放。学习编程没有速成大法、没有必杀之技、没有锦囊秘笈、没有终南捷径,只有思考、实践、再思考、再实践。中国的IT界乃至整个学术界过于浮躁和急功近利了,既盲从又自大,缺乏务实精神与研究精神、独立精神与合作精神、批判精神与自省精神。如果一个程序员沾染这种风气,哪怕有再好的学习方法和学习能力,他都注定与“优秀”绝缘。这就是本班极力倡导并将贯穿始终的理念——知识之上是思想,思想之上是精神。
我的开场白到此为止,现在把话语权交给你们,大家自由发问吧。
。总结
这是一个从“知其所然”到“知所以然”、从“人为我用”到“我为人用”的历程。
封闭——系统完备的终极式知识
单向——师教生学的单向式传输知识
被动——师命生从的被动式接受知识
静态——注重知识的现状,而不是起源、历程和未来发展
继续沿袭这种学习方式,是很难在竞争日趋激烈、技术日新月异的IT业中求生存、谋发展的。开放多元、双向互动的现代课堂乃大势所趋。
一个优秀的程序员,除了要迅速掌握知识、善于领悟思想外,还必须具备务实与研究精神、独立与合作精神、批判与自省精神。
1.2首轮提问——什么语言好?
敬畏老师莫如敬畏真理 ——题记
关键词:计算机语言,程序语言
摘要:讨论流行的计算机语言
?提问
- 谁是你真正的老师?
- 程序员是吃青春饭的吗?
- 计算机语言这么多,到底学哪个好?
:讲解
众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式——笔记本上还没写两个字呢,老师就把球给踢回来了。
冒号也不说话,只是微笑地望着大家。
还是问号打破僵局,开始发问:“老师——”
冒号扬手打断他:“请不要管我叫老师,真正的老师是你自己。本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长。”
“老冒——”问号顿了顿,全班哄堂大笑,“学软件开发,当然得先学语言,计算机语言这么多,到底哪个好,或者说学哪个好?”
冒号笑道:“这个问题很典型,很实在,也很初级。”
问号被“初级”这个字眼刺得面上一红。
“如果信奉流行的就是好的,那么也许可以给你一个参考答案。”冒号转身在黑板上写下一串清单——
Java(20.72%) C(15.38%) C++(10.72%) VB(10.49%) PHP(9.24%) Python(5.01%)
Perl(4.84%)C#(4.33%) JavaScript(3.13%) Delphi(3.06%) Ruby(2.76%) D(1.27%)
“根据TIOBE[1]截至2008年9月份的统计结果,选出以上流行度超过1%的12种程序语言。从中可以看出,它们的总占有率超过90%,应该算得上是当今主流语言的代表。尽管有人置疑TIOBE排名的权威性和合理性,但这份名单应该还是八九不离十的。”
引号很疑惑:“怎么可能那么流行的ASP和JSP都不在其中呢?”
“对啊,”逗号附和着,“还有HTML和XML怎么不算呢?”
冒号解释道:“ASP、JSP和PHP是动态网页最流行的三种解决方案。动态网页的实现方式很多,但它们采取的几乎是同样的方式——在静态网页中植入一些能在服务器端运行的代码。在ASP和JSP中,这些代码并不涉及新的语言,故称之为模板、框架或脚本环境更合适些。PHP则不同,本身是一种新的程序语言,并且除了应用于服务端外,还能编写命令行脚本和桌面应用程序。至于HTML和XML,还有XHTML、WML等,均为SGML(Standard Generalized Markup Language)的子集,属于标记语言(Markup Language)。与通常意义上的程序语言有所不同,它们是处理的对象而不是处理的主体。可以说它们更接近数据格式标准,正如CSV和JSON一样。当然也不绝对,XSLT是一种特殊的XML,但却包含变量定义和处理逻辑,更学术地说,它是图灵完备的(Turing-complete)[2],应当属于程序语言。”
问号杀了个回马枪:“那CSS、RSS算是程序语言吗?”
冒号从容作答:“与XSLT类似,CSS是一种样式语言(Stylesheet Language),但不是以XML的形式出现。它将传统的HTML中的样式逻辑提炼出来,大大丰富和简化了HTML。不过它没有执行指令或运算,更谈不上图灵完备,因此不属程序语言。至于RSS,只是一种用XML来描述的数据交换规范,甚至连语言都算不上。”
叹号也插了进来:“近来网络开发语言AJAX特别火,难道不算程序语言吗?”
冒号摇头道:“的确有不少人以为AJAX是一门语言,但如果知道AJAX是Asynchronous JavaScript.And XML的简称,便知其谬矣。事实上,它是综合了JavaScript、XML、HTML、CSS等多种语言的一种网络应用技术。”
“就算这些不是程序语言,那也是计算机语言或者与语言密切相关的技术,该学的还是得学。”句号想起问号开始问的是计算机语言,老冒有偷换概念之嫌。
“不错,”冒号点点头,“不仅要学语言,还要熟悉相应的开发环境和开发工具等等,当然最重要的是学习其中的思想。”
“唉,学完这些头发都白了,程序员可是吃青春饭的。”叹号叹息道。
冒号扫视了一下,说道:“现在班上每个人都尊口已开,这是一个很好的开始。开放言论才能解放思想,思想解放了才能产生灵感和激情。缺乏灵感和激情的程序员,学习起来吃力,工作起来辛苦,最后就会感慨这是吃青春饭的职业。”
叹号不好意思地挠了挠头。
逗号接言:“灵感嘛,偶尔也许能闪一下,激情可就难喽!
冒号注视着他,一字一顿地说:“没有激情作氧气,灵感的火花注定转瞬即灭。”
,插语
[1] TIOBE(http://www.tiobe.com)是一家评估编程语言流行度的权威机构,每月公布一次编程语言排行榜。
[2] 一个能计算出每个图灵可计算函数(Turing-computable function)的计算系统被称为图灵完备的。一个语言是图灵完备的,意味着该语言的计算能力与一个通用图灵机(Universal Turing Machine)相当,这也是现代计算机语言所能拥有的最高能力。
。总结
- 本班倡导自主学习、相互启发,真正的老师不是别人,正是自己。
- 当今主流语言的代表:Java,C,C++,VB,PHP,Python,Perl,C#,JavaScript,Delphi, Ruby和D。
- “程序员是吃青春饭的职业”出自那些缺乏灵感和激情的人之口。
1.3语言选择——合适的就是好的
尺有所短,寸有所长 ——《楚辞》
关键词:计算机语言,低级语言,高级语言,中级语言
摘要:简要回顾计算机语言
?提问
- 语言好坏的标准是什么?
- 计算机语言的发展经历了哪几个阶段?
- 第四代语言和第五代语言与前三代语言相比,有什么不同?
- 什么是低级语言和高级语言?各自的特点与应用范围是什么?
- 为什么称C语言为中级语言?
:讲解
问号觉得自己的问题并未解决,追问:“这么多种语言,仅凭流行度就能分出主次优劣吗?”
“流行度当然不是唯一的指标。”冒号答道,“语言的主次优劣因人而异,答案在你们自己身上。还是刚才那句话,真正的老师就是你自己。”
期待的目光如风中之烛般开始黯淡。
冒号又道:“评书里名师授艺时,常常要徒弟自己挑选称手的兵器。威武的刀,灵活的枪,飘逸的剑,浑厚的棍,粗犷的斧,霸道的锤,诡异的鞭,无不谙合武者的个性。评判语言优劣,如同争论兵器高下,倘若撇开使用的主体和对象,皆为空泛之谈。”
句号若有所悟:“所以好的语言就是适合编程者和解决对象的语言。”
“非常正确!”冒号赞许道,“这就是问号同学要的答案。”
引号并不满足:“可我记得评书里经常描述高手的一句话:十八般兵器样样精通。”
冒号一笑:“兵器虽多,其理相通,高手精通多种兵器何足为奇?但如果让赵云使锤,李元霸使枪,武力恐怕还是要大打折扣吧?”
逗号依然困惑:“我们如何判断一种语言是否适合自己,是否适合解决对象呢?”
冒号看出大家共同的疑惑,不紧不慢地说:“要想从中选择,自然先得了解,不然怎知兵器称不称手、合不合用?现在进入正题,我们先对计算机语言作个简要的回顾。”
大伙均想,总算要挠着痒处了。
“计算机语言按其发展历程通常分为五代。”冒号说完,在黑板上写下——
第一代语言(1GL):机器语言
第二代语言(2GL):汇编语言——IA-32 Assembly,SPARC Assembly等
第三代语言(3GL):高级语言——Fortran,Pascal,C,Java,VB等
第四代语言(4GL):面向问题语言——SQL,SAS,SPSS等
第五代语言(5GL):人工智能语言——Prolog,Mercury,OPS5等
“谁能简要地谈谈这段历史?”冒号又开始踢回传球了。
“最新的两代语言我不是特别熟悉,就说一下前几代吧。” 一阵沉默后,引号终于毛遂自荐,“计算机语言是人用来指挥计算机的语言,而计算机只懂一种语言——由0和1组成的机器语言(machine language)。最初人们直接用这种语言下达指令,可它们实在太难记忆和阅读了,开发和维护起来既费时又易错,严重桎梏了程序员的生产力。后来人们发明了汇编语言(assembly language),用接近英语单词的助记码(mnemonic code)来代替0、1串,由助手——汇编器(assembler)将其转化为机器语言。这些助手很称职,但有两个缺点:一是毫无主见,基本上只会一一对应地翻译,程序员必须不厌其烦地交代每一个细节;二是不知变通,换种机器就傻眼了。于是人们陆续引进了各种高级语言(high-level programming language),同时启用更得力的助手——编译器(compiler)和解释器(interpreter)。这些助手除了能理解更简洁更抽象的高级语言外,还能因地制宜地对一些指令进行优化处理。程序员的劳动力得以极大的解放,生产效率得以大幅的提升。直到现在,高级语言还是最主要的开发语言,包括前面提到的十二种最流行的语言。”
引号发言甫毕,冒号立即献上溢美之词:“精彩!精当!一气呵成!看看,你还怀疑自己不够格作老师吗?”
一种晕眩感向引号袭来。
冒号继续引号的讲述:“从机器语言到汇编语言、再到高级语言的演变,堪比从徒步行走到乘自行车、再到乘汽车的变革,越来越省时、省力、省心。循此方向,第四代语言更专注业务逻辑和问题领域。程序员主要负责分析和描述问题,不再花大量时间去考虑具体的算法和逻辑。事实上,最初提出第四代语言的概念,就是希望非专业程序员都能做应用开发。”
逗号心下一惊:“那我等岂不是要失业了?”
冒号宽慰道:“倒不用太担心。正如引号所说的,语言越来越高级,背后靠的是越来越能干的助手。这些助手本身就是软件,还是需要专业程序员开发的。更何况,这种理想的全面实现依然任重而道远。”
问号百思莫解:“第四代语言到第五代语言的发展路线似乎不够清晰,在逻辑上如何解释呢?”
冒号作出解答:“第四代语言虽然足够强大,但过于局限某些特定领域,基本上属于领域特定语言[1](Domain Specific Language,简称DSL),而不是我们所熟悉的通用编程语言(General-Purpose Programming Language,简称GPPL)。专门用于数据库操作的SQL、用于统计分析的SAS和SPSS、用于科学计算的Mathematica都是典型的第四代语言。然而一个系统往往横跨多个领域,如果每个领域使用不同的语言,并且不同领域的语言在概念和方法上也不统一,必然会给集成和整合带来的困难。第五代语言在保持第三代语言的通用性的前提下,继承了第四代语言的优点,即重在目标而非过程、重在描述而非实现。如果把这种优点用在汽车上,那么下一代的交通工具也许是无人驾驶的智能汽车。只要输入目的地,它会自动通过GPS寻找最佳路径,自动根据路况变速转向,一直驶到终点。”
叹号身形微颤:“坐这种车我可不放心。”
冒号一撇嘴:“这当然只是一种假想。同样地,第五代语言号称人工智能语言,虽然雄心勃勃,试图让机器理解人类的自然语言,并且具备人类的思维能力,但目前看来这一目标还显得遥不可及。”
句号很赞同:“是啊,超级计算机虽然可以战胜国际象棋的世界冠军,但在围棋上弱智得很。”
冒号提纲挈领:“也有人简单地将前两代语言统称为低级语言,其他的统称为高级语言。语言从低级到高级,离机器语言更远,离人类语言更近,因而更易读写、调试和维护,安全性、通用性和可移植性更强,开发效率更高,更加抽象和宏观;但同时运行速度和效率下降,用法和功能上局限性更大。如果拿兵器作比,高级语言好比长兵器,威力强大却难免滞重,长于大型应用,可谓‘一寸长,一寸强’;低级语言好比短兵器,轻便灵活却难免风险,长于底层应用,可谓‘一寸短,一寸险’。”
大伙心里话,敢情来这儿不是学编程,是学武术的。
叹号说道:“我看还是高级语言好,现在谁还学低级语言啊?”
冒号纠正道:“低级语言并不低级,只是随着高级语言的出现,计算机硬件性能的提高,渐渐有些边缘化了。虽然几乎没有人再用机器语言编程了,汇编语言仍有其用武之地。常见的有:包括嵌入式系统在内的系统开发,如操作系统、编译器、驱动程序、无线通讯、DSP、PDA、GPS等;其他对资源、性能、速度和效率极为敏感的软件开发;以信息安全、软件维护与破解等为目的的逆向工程等等。即使你不打算从事系统开发,也不想作红客、黑客或骇客,掌握汇编语言对你深入了解计算机内部运行机制、调试软件和改进程序中某些关键代码的算法也是有帮助的。”
引号提出:“好像有些书上把C语言称为中级语言。”
冒号答道:“这是因为C兼具高级语言和低级语言的特征。一方面它提供了高层抽象和可移植性,使程序员更多地专注问题逻辑而不是机器逻辑;另一方面它也提供诸如指针、位字段(bitfield)等工具进行底层操作,甚至可直接内嵌汇编代码。C语言既简洁灵活又高效强大,是迄今为止最具影响力的语言。几乎所有的操作系统和大多数高级语言都用它来实现,C家族的语言C、C++、Java、C#、D、Objective C等占据主流语言的半壁江山。如果再拿兵器作比,C语言就是一把剑,轻灵飘逸、锐利快捷。一名武将无论擅用什么兵器,往往都会腰悬宝剑。不会C的程序员正如不会使剑的武将,无论如何都是一种缺憾。相比之下,汇编语言就像小刀匕首,而机器语言则近乎赤手空拳了。”
句号灵光一闪:“我明白了——西门吹雪的西来一剑,那是C语言;李寻欢的小李飞刀,那是汇编语言;陆小凤的灵犀一指,那是机器语言。”
大家会心地笑了。
逗号冷不防冒出一句:“我会跆拳道哦!”
句号一乐:“哈哈,等你打赢了陆小凤,就封你为机器语言。”
冒号也笑言:“这位是古龙的粉丝吧?武侠小说里的侠客多轻功高绝且喜单打独斗,故使用轻、短兵器居多;而历史小说里的战将多骑马进行大规模作战,故除了佩剑外,使用重、长兵器居多。这就是前面提到的,中低级语言更适合中小型或底层应用,高级语言更适合大型应用。”
众人活跃起来,开始议论纷纷。冒号放耳听去,净是些古龙金庸、三国水浒里的人物情节,暗想:通俗小说到底比计算机编程吸引人啊。
,插语
[1] 领域特定语言,简称DSL。它区别于通用语言,一般用于特定的问题领域,多属于第四代语言。比如SQL是专门针对数据库的语言,LaTeX是专门用于排版的语言,正则表达式(regular expression)是专门处理字符匹配的语言。
。总结
- 评判语言优劣,不能离开使用语言的主体和对象。好的语言就是适合编程者和解决对象的语言。
- 计算机语言按其发展历程分为五代,依次为:机器语言、汇编语言、高级语言、面向问题语言和人工智能语言。通常,前两代统称为低级语言,后面的统称为高级语言。
- 第四代语言和第五代语言与前三代语言最大的不同在于:重目标轻过程、重描述轻实现。
- C兼具高级语言和低级语言的特征,因此也被称为中级语言。
- 计算机语言从低级发展到高级,渐渐远离机器,靠近人类,以牺牲部分性能和效率为代价,换来更高的开发效率和可维护性。中低级语言更适合中小型或底层应用,高级语言更适合大型应用。
1.4初识范式——程序王国中的世界观与方法论
言者所以在意,得意而忘言 ——《庄子·外物》
关键词:编程范式,编程语言,Object-Oriented
摘要:初步引入编程范式
?提问
- 什么是编程范式?
- 编程范式与编程语言的关系是什么?
:讲解
问号第一个从小说里走出来,问道:“刚才谈到了低级语言和中级语言,现在该谈高级语言了吧?”
冒号微叹:“高级语言大概有近千种,流行的也不下几十种,有时候选择过多反而无所适从啊。”
逗号不以为然:“最流行的不就那么几个:Java、C++、C#还有VB吗?”
不意此言遭到冒号连珠炮似的反问:“可你知道它们为什么会流行吗?是不是学会这几样就是一个合格的程序员了?它们会不会变得不那么流行,甚至被其他语言取代?如果不会,为什么?如果会,又怎么办?”
逗号赧然语塞。
冒号口气放缓:“掌握一门语言的语法、工具和技巧固然重要,但那只相当于学会一门兵器的招法,更重要的当然是心法。招法重形,心法重意。得形而忘意,无异舍本逐末;得意而忘形,方能游刃有余。下面要谈的就是一种心法:编程范式。”
问号不解:“编程范式?听上去很学究,那是什么东东?”
冒号续道:“范式译自英文的paradigm,也有译作典范、范型、范例的。所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。”
叹号吸口气:“好抽象哦!”
句号心中一动:“您是说我们都是虚拟世界的创造者,都在创造自己的黑客帝国?”
大家不禁莞尔。
冒号动情地说:“难道不是吗?只不过帝国有大小之分、优劣之别罢了。当你编程之时,便进入到自己创造的世界之中。这是你的世界,只有注入你的想象力、创造力和激情,它才有勃勃生机。你编写的岂止是代码,分明还有乐曲;你敲击的岂止是键盘,分明还有琴键;你运行的岂止是程序,分明还有世界。当优美的旋律奏起,整个世界都随之翩然起舞,一种莫可名状的满足是否会充溢你的全身?”
大家都被冒号诗化的语言感染了,没想到编程也可以如此感性。
良久,引号试探地问:“面向对象编程就是一种编程范式吧?”
冒号点头:“不错,它是时下最流行的一种编程范式。顺便说一句,‘面向对象’ 译自Object-Oriented,但‘面向’二字令人费解。据说有本书叫‘面向对象方法’,比别的计算机书都畅销,知道为什么吗?不少同学把它当成恋爱指南买走了。”
全班笑倒。
冒号认真地说:“将Object-Oriented译成‘对象导向’[1],虽然稍嫌拗口,但更贴切。并非刻意要咬文嚼字,这关系到对编程范式的理解。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。由于着眼点和思维方式的不同,相应的范式自然各有侧重和倾向,因此一些范式常用‘oriented’来描述。换言之,每种范式都引导人们带着某种的倾向去分析问题、解决问题,这不就是‘导向’吗?而‘面向’ 的宾语往往是预先确定的目标,如面向世界、面向未来、面向用户、面向问题等等。此外,‘面向’强调静态结果,而‘导向’强调动态趋势,显然后者更生动,也更符合编程的特质[2]。”
句号一语惊人:“找对象是‘对象导向’的,去约会是‘面向对象’的。”
全班再倒。
句号得意地解释:“按梦中情人的标准去找对象,目标未定但倾向已定,这就是一种导向,而且是对象导向。找到之后再约会,不就面向对象了吗?”
众人称绝。
“我们是来谈编程范式的,不是来谈对象的。” 冒号一脸的道貌岸然,“编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。任何语言在设计时都会倾向某些范式、同时回避某些范式,由此形成了不同的语法特征和语言风格。”
,插语
[1]港澳台地区将其译为“物件导向”。即使单从字面上翻译,oriented是“以...为方向的;以...为目的的;导向的;定向的”的意思,也比译为“面向”更合适。
[2]作为类比,经济学中的“market-oriented”译为“市场导向(或取向)的”的远多于译为“面向市场的”。
。总结
- 编程范式是计算机编程中的基本风格和典范模式,是编程者在其所创造的虚拟世界中自觉不自觉采用的世界观和方法论。每种范式都引导人们带着其特有的倾向和思路去分析和解决问题。OOP就是一种编程范式。
- Object-Oriented多译作“面向对象”,不如“对象导向”贴切。
- 如果把一门编程语言比作兵器,它的语法、工具和技巧等是招法,它采用的编程范式则是心法。
- 抽象的编程范式需要通过具体的编程语言来体现。范式的世界观体现在语言的核心概念之中,范式的方法论体现在语言的表达机制中。一种语言的语法和风格与其所支持的编程范式密切相关。
“”参考
[1] Wikipedia.Programming paradigm.http://en.wikipedia.org/wiki/Programming_paradigm
[2] Stephen H. Kaisler.SOFTWARE PARADIGMS.New Jersey:Wiley,2005.21-22
1.5软件技术——实用还是时髦?
借我借我一双慧眼吧,让我把这纷扰看得清清楚楚明明白白真真切切
——《雾里看花》
关键词:编程范式,框架,设计模式,架构,库,工具包
摘要:关于框架、设计模式、架构和编程范式的讨论
?提问
- 库和工具包与框架有何不同?
- 什么是设计模式和架构?
- 为什么要谈编程范式,而不是框架、设计模式或者架构?
:讲解
“现在我们具体介绍一下编程范式。”冒号忽然顿住,隐觉一抹失望从众人脸上掠过,问号更是欲言又止,便鼓励他开口。
问号略显迟疑:“您说编程范式是一种心法,那框架、设计模式还有架构呢?”
“原来如此!”冒号心下了然,“让我说说你们最想听些什么吧。”
众现不信之色。
冒号说道:“一种是具体而实用的,最好能立马解决学习和工作中的问题;一种是时髦而花哨的,管他有用没用,不学点心里就是不踏实。”
众人虽觉此话有些尖刻,细想起来也有几分道理,但老冒明知而不为,不走群众路线,偏去扯什么劳什子的范式——当然,直接谈OOP倒是不错的。
“自以为懂的未必真的懂,自以为不懂的未必真的不懂。” 冒号玩起了玄学,“有些概念和技术即使背得烂熟,甚至用得烂熟,那也不代表真正掌握;有些概念和技术看起来很新奇,却不过是新瓶装旧酒。”
引号颇不服气:“用得烂熟都不算掌握,难不成只有发明概念和技术才算掌握?”
“哈哈,那倒不必。”冒号笑道,“用得烂熟不等于用得恰到好处,能解决问题不等于没有后顾之忧。”
逗号问道:“那掌握的标准是什么?”
“许多应聘者喜欢在简历中言必称精通某某语言、某某技术云云,大多不必面试即知其大言炎炎——倘若真的精通,他当应聘更高的职位。”冒号有感而发却又似不着边际,“任何概念和技术都不是孤立的,如果不能在纵向的时间和横向的联系中找准坐标,便似那群摸象的盲人,各执一端却又自以为是。”
众人心想,老冒虽言辞旦旦却有凿空之嫌,一节课下来,天马行空的扯了不少,真刀真枪的一个也无,该不是只会纸上谈兵吧?
句号紧扣主题:“您为何选择谈编程范式,而不是框架、设计模式还有架构呢?难道它们真如您所说只是时髦而花哨的东西吗?”
“我可没这么说。”冒号矢口否认,“但在弄清一样东西存在的意义之前就随众跟风,早晚会跟丢的。我先问问你们:什么是框架(framework)?它与一般的库(library)和工具包(toolkit)有何不同?”
引号应答:“框架就是一组协同工作的类,它们为特定类型的软件构筑了一个可重用的设计。与库和工具包不同之处在于前者侧重设计重用而后两者侧重代码重用。”
“嗯,有点标准答案的味道。”冒号夸道,“如果吹毛求疵的话,框架并不限于OOP,可以是协同工作的类,也可以是协同工作的函数。一个足够复杂的应用软件开发,为确保快速有效,通常采取的方式是:在宏观管理上选取一些框架以控制整体的结构和流程;在微观实现上利用库和工具包来解决具体的细节问题。框架的意义在于使设计者在特定领域的整体设计上不必重新发明轮子;库和工具包的意义在于使开发者摆脱底层编码,专注特定问题和业务逻辑。”
问号提出问题:“框架与库和工具包看起来很相似——都是一些代码集合,都提供一些API(应用编程接口),是什么使得它们不同呢?”
“问得好!”冒号赞言,“框架与工具包最大的差别在截然相反的设计理念上:库和工具包是为程序员带来自由的,框架是为程序员带来约束的。具体地说,库和工具包是为程序员提供武器装备的,框架则利用控制反转(IoC)[1]机制实现对各模块的统一调度从而剥夺了程序员对全局的掌控权,使他们成为手执编程武器、随时听候调遣的士兵。”
叹号苦着脸:“程序员原来就是一小卒子啊!”
“哪个将军不是从小卒做起的?”冒号反问道,“不错,框架是在语言的语法规则之外施加于程序员的又一层枷锁,但没有规矩不成方圆。正如行军打仗,讲究排兵布阵,程序员就是那兵,框架就是那阵。”
句号说:“可不可以这么理解,框架就是一些人——也就是框架设计者,把一个软件开发中最甜的部分啃掉了,剩下部分留给下面的人?”
“从某种意义上说,是这样。”冒号点点头。
逗号很不甘心:“我就想啃最甜的部分。”
“当心别把牙给崩掉。”冒号笑道,“不是打击你,首先你还没那本事;其次即使你有本事也未必有机会;最后即使有本事也有机会,重新设计框架也未必是好的选择。就说大名鼎鼎的Struts吧,哪怕你设计出比它更高明的框架也不会被采用,因为前者早已成为Java平台上网络开发的事实(De Facto)标准,公司很容易从市场上招到懂Struts的程序员,不必培训即可上手,成本低见效快。过去许多公司都有自己的网络框架,但最后大多都放弃了,并不是因为Struts更优秀,而是因为它更普及。毕竟大多数软件开发是以金钱而不是技术为中心的。”
问号提议:“您能谈谈设计模式和架构吗?”
冒号侃侃而谈:“与框架与库和工具包不同,设计模式(design Pattern)和架构(architecture)不是软件产品,而是软件思想。设计模式是软件的战术思想,架构是软件的战略决策。设计模式是针对某些经常出现的问题而提出的行之有效的设计解决方案,它侧重思想重用,因此比框架更抽象、更普适,但多限于局部解决方案,没有框架的整体性。与之相似的还有惯用法(idiom),也是针对常发问题的解决方案,但偏重实现而非设计,与实现语言密切相关,是一种更底层更具体的编程技巧。至于架构,一般指一个软件系统的最高层次的整体结构和规划,一个架构可能包含多个框架,而一个框架可能包含多个设计模式。”
引号愈发疑惑:“这些不是都很重要吗?”
“当然都很重要。不过——”冒号话锋一转,“在没有打好基础前,架构只是空中楼阁,因此不可能现在谈它。至于框架,不同的应用领域有不同的框架,如表现层的Struts、业务层的Spring、持久层的Hibernate等等,即使相同领域的框架也有多个选择,更不用说不同的语言框架还不一样,从何谈起?再说框架其实一点也不高深,完全可以无师自通,关键是领会思想,多学习多实践。说到设计模式,一共就那么几十个,一本‘四人帮’(GoF)[2]的书足矣,自己慢慢去啃,又何须多谈?简言之,一个谈之过早,一个无从谈起,一个不必多谈。”
下面开始交头接耳窃窃私语起来。
“知识的学习有几种方式:一种靠记忆,一种靠练习,一种靠培养。就拿英语学习来说吧,学单词,单靠记忆即可;学句型、语法,光记忆是不够的,需要勤加练习方可熟能生巧;而要讲出地道的英语,光记忆和练习是远远不够的。从小学到大学,甚至博士毕业,除了英语类专业的学生外,大多数人英语练了一二十年,水平如何?不客气但很客观地说:一个字,烂;两个字,很烂;三个字,相当烂!口语甚至连一个英语国家的三岁小孩都不如。”冒号越说越激动,“原因只有一个,那就是国内的英语教学方式严重失策。教学总是围绕单词、词组、句型、语法转,缺乏对语感的重视和培养,导致学生只会‘中式英语’。同样道理,一个惯用C语言编程的人也许很快就能写一些C++程序,但如果他只注重C++的语法而不注重培养OOP的语感,那么写出的程序一定是‘C式C++’。与其如此,倒不如直接用C呢。”
句号悟道:“您是想告诉我们,学习编程范式能增强编程语言的语感?”
“一语中的!”冒号庆幸总算没有白费口舌,“语感是一个人对语言的敏锐感知力,反映了他在语言方面的整体上的直觉把握能力。语感强者,能听弦外之音,能说双关之语,能读隽永之作,能写晓畅之文。这是一种综合的素质和修养,其重要性是不言而喻的。那么如何培养语感呢?普通的学习和训练固不可少,但如果忽视语言背后的文化背景和思维方式,终究只是缘木求鱼。编程范式正体现了编程的思维方式,因而是培养编程语言的语感的关键。现在如果我开始介绍范式,你们还有意见吗?”
众人受了鼓动,个个把头摇得跟拨浪鼓似的。
冒号语重心长地说:“既然范式关乎语感,就需要慢慢的培养和渗透,不可能一蹴而就,因此有些地方不太明白也没关系。现在只是撒下一些种子,慢慢的会生根发芽,直至长成大树。到那时,你们个顶个的都是内外兼修的武林高手了。怎么样?大家准备好了吗?”
“准备好了!”众人齐声道,求知的目光再度点燃。
“准备好了就下课吧。”冒号狡笑着,“下节课,下节课我们再谈。”
,插语
[1] 控制反转(Inversion of Control)是一种软件设计原则。与通常的用户代码调用可重用的库(library)代码不同,IoC倒转了控制流方向:由库代码调用用户代码。有人将此比作好莱坞法则:“不要打电话给我们,我们会打给你的”。
[2] 设计模式最经典书籍《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者常被称为GoF或Gang of Four。
。总结
- 库和工具包侧重代码重用,框架侧重设计重用。库和工具包从微观上解决具体问题,是为程序员带来自由的;框架从宏观上控制软件整体的结构和流程,是为程序员带来约束的。框架是通过控制反转(IoC)机制反客为主的。
- 设计模式是软件的战术思想,架构是软件的战略决策。与框架、库和工具包不同,它们不是软件产品,而是软件思想。
- 设计模式与惯用法都是针对常发问题的解决方案,但前者偏重设计,后者偏重实现。
- 架构太高,谈之过早;框架太多,无从谈起;设计模式太少,不必多谈。至于编程范式,对培养编程语言的语感至关重要,需要充分的重视和长期的积累,方能悟其精髓。
“”参考
[1] Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides.Design Patterns: Elements of Reusable Object-Oriented Software.Boston:Addison-Wesley,1994.26-28
课后思考
- 作为一个软件开发者,你现在处于哪个阶段?你未来的目标是什么?
- 传统的学习方式的弊端在哪里?你是否有切肤之痛?
- 你认为一个优秀的程序员需要具备什么素质和精神?
- 你了解哪些计算机语言?你对一门语言的取舍与喜恶的根据是什么?
- 你认为计算机语言未来的发展方向是什么?
- 你能否在编程中感受到自己的激情和灵性?
- 你了解哪些框架?它们的应用范围是什么?实现的机理是什么?
- 你了解哪些设计模式?它们为什么能成其为模式?
- 学习编程范式的意义何在?