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

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

冒号课堂

第一课 开班导言

课前导读

第一课为整个课堂学习的内容和风格定调,并围绕三个问题进行展开:要成为一个优秀的程序员,最需要学习什么知识?领会什么思想?具备什么精神?

本课共分五节——

1.开班发言

2.首轮提问

3.语言选择

4.初识范式

5.软件技术
t&}"Z@4o"?K#Dx0


6J/^alg/wwXY0ITPUB个人空间]R L3CmF(g
1.1
开班发言——程序员的四层境界

授人以鱼不如授人以渔                                                               ——古语

 

关键词:程序员,知识,思想,精神

摘要:对程序员的一些忠告和建议
(I_5Z(l7y8\ hW.T0


"fG|%N r?0  提问

  • 软件开发者的成长需要经历有哪些阶段?
  • 要想在IT业中生存与发展,传统的学习方式是否够用?
  • 优秀程序员应该具备哪些素质?


讲解

 冒号开了个程序员提高班,今天迎来了首期学员,他们是问号、句号、逗号、引号和叹号,皆为IT业的新兵。望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言——

大家好!先自我介绍一下,本人姓冒名号字解之。诸位不必叫我老师,就叫老冒好了。比在座各位痴长几岁,“老”是担得的,“师”却不敢妄言。在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享。虽系一家之言、一孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自误误人。

客套已毕,言归正传。本班主要采取讨论的形式,只要是软件开发中值得讨论的,但凡本人力之所及,均可共同探讨。

本班的宗旨是:学会不如会学,会学不如会用,会用不如被用。对于一个软件开发者来说,这意味着四个阶段:

学会(知其所然)——掌握一些具体编程知识的初级程序员

会学知所以然)——能快速而深刻地理解技术并举一反三的程序员

会用人为我用)——能将所学灵活运用到实际编程设计之中的高级程序员

被用我为人用)——能设计出广为人用的应用程序(application)、库(library)、工具包(toolkit)、框架(framework)等的系统分析员和架构师

至于被用的更高层次,如发明出主流的设计模式、算法、语言乃至理论等,则可称得上计算机专家了。本班的目的,正是为各位向更高阶段的提升助一臂之力。

大家可能都习惯了在小学、中学和大学里的课堂,那里的知识大多是系统而完备且貌似终极的,那里的学习大多是单向而被动的。但习惯并不意味着享受,更多的是因为别无选择。你们曾被引入一座座知识殿堂,被告知它们如何美轮美奂、巧夺天工,尽管很多时候你们或不以为然、或不解其妙,但还是不得不记下每一处被指点的细微结构。很少有人带你们看看当初为建造这些殿堂而打下的地基、搭设的脚手架,哪怕只是上漆前的模样也好,更遑论一瞻数易其稿的设计图纸了。那些与殿堂相比显得有些原始、甚至丑陋的东西,被有意无意地挡在视线之外。可没有那些,你们将来如何为这些宫殿添砖加瓦,又如何另起楼阁呢?

中国学生恐怕是世界上最擅长考试、最习惯考试、也最厌倦考试的群体了。你们告别了学生生涯,踏上了职业之旅。首先我要恭喜你们,脱离苦海了!同时也要悲告你们,掉进火坑了!危言耸听吗?如果你选择了做程序员,你时时都得学习,没有手把手教你的老师,没有指定的教科书和参考书,有的是层出不穷令人眼花缭乱的新概念、新技术、新问题,好不容易学到一些皮毛,有的已成明日黄花。你时时都得考试,每提交一段代码就是上交一份答卷,你不知道什么时候、什么人会批改,直到——开发组同事发现你的代码难以看懂,系统分析员指出你的程序不符合规范,测试工程师检验到你的软件有缺陷,客户抱怨你的产品太慢太难用,最后老板倒可能告诉你一个好消息:明天起放长假!

其实,又有哪行哪业的人不需要学习和考试呢?IT业只是相对更激烈、更富挑战性而已。在这个瞬息万变、适者生存的时代,如果还沿用封闭、被动的学习方式,恐有淘汰之虞。有鉴于此,本班的风格与你们习惯的课堂有所不同:这里的知识不一定是系统或完备的,但一定是生动鲜活的。如果知识是水,我们要挖掘最先涌动的泉眼,还要探究最终流淌的曲线;如果知识是火,我们要捕捉起初点燃的火花,还要前瞻未来绵延的轨迹。这里的问题不一定是预设的,结论不一定是终极的,甚至不一定是正确的,但一定是有的放矢、发人深思的。由此决定了这里的学习方式将是开放多元、双向互动的。

越是喧嚣的世界,越需要宁静的思考,让躁动的心灵得以平息,让蕴藏的灵性得以释放。学习编程没有速成之法、没有必杀之技、没有锦囊秘笈、没有终南捷径,只有思考、实践、再思考、再实践。中国的IT界乃至整个学术界过于浮躁和急功近利了,既盲从又自大,缺乏务实精神、研究精神、合作精神、批判精神和自省精神。如果一个程序员沾染这种风气,哪怕有再好的学习方法和学习能力,他都注定与“优秀”绝缘。这就是本班极力倡导并将贯穿始终的理念——知识之上是思想,思想之上是精神

我的开场白到此为止,现在把话语权交给你们,大家自由发问吧。


总结

  • 软件开发者的成长阶段:学会?会学?会用?被用。

这是一个从“知其所然”到“知所以然”、从“人为我用”到“我为人用”的历程。

  • 传统的学习方式大多有如下特征:

封闭——系统完备的终极式知识

单向——师教生学的单向式传输知识

被动——师命生从的被动式接受知识

静态——注重知识的现状,而不是起源、历程和未来发展

继续沿袭这种学习方式,是很难在竞争日趋激烈、技术日新月异的IT业中求生存、谋发展的。开放多元、双向互动的现代课堂乃大势所趋。

  • “知识之上是思想,思想之上是精神。”

一个优秀的程序员,除了要迅速掌握知识、善于领悟思想外,还必须具备务实精神、研究精神、合作精神、批判精神和自省精神。

 

1.2首轮提问——什么语言好?

敬畏老师莫如敬畏真理                                                               ——题记

 

关键词:计算机语言,程序语言

摘要:讨论流行的计算机语言ITPUB个人空间,MR9Z r~|o(i4k


ok/UoYo0  提问

  • 谁是你真正的老师?
  • 程序员是吃青春饭的吗?
  • 计算机语言这么多,到底学哪个好?

 

讲解

众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式——笔记本上还没写两个字呢,老师就把球给踢回来了。

冒号也不说话,只是微笑地望着大家。

还是问号打破僵局,开始发问:“老师——”

冒号扬手打断他:“请不要管我叫老师,真正的老师是你自己。本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长。”

“老冒——”问号顿了顿,全班哄堂大笑,“学软件开发,当然得先学语言,计算机语言这么多,到底哪个好,或者说学哪个好?”

冒号笑道:“这个问题很典型,很实在,也很初级。”

问号被“初级”这个字眼刺得面上一红。

“如果信奉流行的就是好的,那么也许可以给你一个参考答案。”冒号转身在黑板上写下一串清单­——

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]截至20089月份的统计结果,选出以上流行度超过1%的12种程序语言。从中可以看出,它们的总占有率超过90%,应该算得上是当今主流语言的代表。尽管有人置疑TIOBE排名的权威性和合理性,但这份名单应该还是八九不离十的。”

引号很疑惑:“怎么可能那么流行的ASPJSP都不在其中呢?”

“对啊,”逗号附和着,“还有HTMLXML怎么不算呢?”

冒号解释道:“ASPJSPPHP是动态网页最流行的三种解决方案。动态网页的实现方式很多,但它们采取的几乎是同样的方式——在静态网页中植入一些能在服务器端运行的代码。在ASPJSP中,这些代码并不涉及新的语言,故称之为模板、框架或脚本环境更合适些。PHP则不同,本身是一种新的程序语言,并且除了应用于服务端外,还能编写命令行脚本和桌面应用程序。至于HTMLXML,还有XHTMLWML等,均为SGMLStandard Generalized Markup Language)的子集,属于标记语言Markup Language)。与通常意义上的程序语言有所不同,它们是处理的对象而不是处理的主体。可以说它们更接近数据格式标准,正如CSVJSON一样。当然也不绝对,XSLT是一种特殊的XML,但却包含变量定义和处理逻辑,更学术地说,它是图灵完备的(Turing-complete[2],应当属于程序语言。”

问号杀了个回马枪:“那CSSRSS算是程序语言吗?”

冒号从容作答:“与XSLT类似,CSS是一种样式语言Stylesheet Language),但不是以XML的形式出现。它将传统的HTML中的样式逻辑提炼出来,大大丰富和简化了HTML。不过它没有执行指令或运算,更谈不上图灵完备,因此不属程序语言。至于RSS,只是一种用XML来描述的数据交换规范,甚至连语言都算不上。”

叹号也插了进来:“近来网络开发语言AJAX特别火,难道不算程序语言吗?”

冒号摇头道:“的确有不少人以为AJAX是一门语言,但如果知道AJAXAsynchronousJavaScript.AndXML的简称,便知其谬矣。事实上,它是综合了JavaScriptXMLHTMLCSS等多种语言的一种网络应用技术。”

“就算这些不是程序语言,那也是计算机语言或者与语言密切相关的技术,该学的还是得学。”句号想起问号开始问的是计算机语言,老冒有偷换概念之嫌。

“不错,”冒号点点头,“不仅要学语言,还要熟悉相应的开发环境和开发工具等等,当然最重要的是学习其中的思想。”

“唉,学完这些头发都白了,程序员可是吃青春饭的。”叹号叹息道。

冒号扫视了一下,说道:“现在班上每个人都尊口已开,这是一个很好的开始。开放言论才能解放思想,思想解放了才能产生灵感和激情。缺乏灵感和激情的程序员,学习起来吃力,工作起来辛苦,最后就会感慨这是吃青春饭的职业。”

叹号不好意思地挠了挠头。

逗号接言:“灵感嘛,偶尔也许能闪一下,激情可就难喽!

冒号注视着他,一字一顿地说:“没有激情作氧气,灵感的火花注定转瞬即灭。”ITPUB个人空间 a8s_:bNc(e

ITPUB个人空间/lP D:[9N`Bb
插语

[1] TIOBEhttp://www.tiobe.com)是一家评估编程语言流行度的权威机构,每月公布一次编程语言排行榜。

[2]一个能计算出每个图灵可计算函数Turing-computable function)的计算系统被称为图灵完备的。一个语言是图灵完备的,意味着该语言的计算能力与一个通用图灵机Universal Turing Machine)相当,这也是现代计算机语言所能拥有的最高能力。


P_1i!f2|0 总结

  • 本班倡导自主学习、相互启发,真正的老师不是别人,正是自己。
  • 当今主流语言的代表:JavaCC++VBPHPPythonPerlC#JavaScriptDelphiRubyD
  • “程序员是吃青春饭的职业”出自那些缺乏灵感和激情的人之口。

 

1.3语言选择——合适的就是好的

尺有所短,寸有所长                                                               ——《楚辞》

关键词:计算机语言,低级语言,高级语言,中级语言

摘要:简要回顾计算机语言

 

  提问

  • 语言好坏的标准是什么?
  • 计算机语言的发展经历了哪几个阶段?
  • 第四代语言和第五代语言与前三代语言相比,有什么不同?
  • 什么是低级语言和高级语言?各自的特点与应用范围是什么?
  • 为什么称C语言为中级语言?

 

 讲解

问号觉得自己的问题并未解决,追问:“这么多种语言,仅凭流行度就能分出主次优劣吗?”

“流行度当然不是唯一的指标。”冒号答道,“语言的主次优劣因人而异,答案在你们自己身上。还是刚才那句话,真正的老师就是你自己。”

期待的目光如风中之烛般开始黯淡。

冒号又道:“评书里名师授艺时,常常要徒弟自己挑选称手的兵器。威武的刀,灵活的枪,飘逸的剑,浑厚的棍,粗犷的斧,霸道的锤,诡异的鞭,无不谙合武者的个性。评判语言优劣,如同争论兵器高下,倘若撇开使用的主体和对象,皆为空泛之谈。”

句号若有所悟:“所以好的语言就是适合编程者和解决对象的语言。”

“非常正确!”冒号赞许道,“这就是问号同学要的答案。”

引号并不满足:“可我记得评书里经常描述高手的一句话­:十八般兵器样样精通。”

冒号一笑:“兵器虽多,其理相通,高手精通多种兵器何足为奇?但如果让赵云使锤,李元霸使枪,武力恐怕还是要大打折扣吧?”

逗号依然困惑:“我们如何判断一种语言是否适合自己,是否适合解决对象呢?”

冒号看出大家共同的疑惑,不紧不慢地说:“要想从中选择,自然先得了解,不然怎知兵器称不称手、合不合用?现在进入正题,我们先对计算机语言作个简要的回顾。”

大伙均想,总算要挠着痒处了。

“计算机语言按其发展历程通常分为五代。”冒号说完,在黑板上写下——

第一代语言(1GL):机器语言

第二代语言(2GL):汇编语言——IA-32 AssemblySPARC Assembly

第三代语言(3GL):高级语言——FortranPascalCJavaVB

第四代语言(4GL):面向问题语言­——SQLSASSPSS

第五代语言(5GL):人工智能语言——PrologMercuryOPS5

“谁能简要地谈谈这段历史?”冒号又开始踢回传球了。

 “最新的两代语言我不是特别熟悉,就说一下前几代吧。”一阵沉默后,引号终于毛遂自荐,“计算机语言是人用来指挥计算机的语言,而计算机只懂一种语言——由01组成的机器语言machine language)。最初人们直接用这种语言下达指令,可它们实在太难记忆和阅读了,开发和维护起来既费时又易错,严重桎梏了程序员的生产力。后来人们发明了汇编语言assembly language),用接近英语单词的助记码mnemonic code)来代替01串,由助手——汇编器assembler)将其转化为机器语言。这些助手很称职,但有两个缺点:一是毫无主见,基本上只会一一对应地翻译,程序员必须不厌其烦地交代每一个细节;二是不知变通,换种机器就傻眼了。于是人们陆续引进了各种高级语言high-level programming language),同时启用更得力的助手——编译器(compiler)和解释器(interpreter)。这些助手除了能理解更简洁更抽象的高级语言外,还能因地制宜地对一些指令进行优化处理。程序员的劳动力得以极大的解放,生产效率得以大幅的提升。直到现在,高级语言还是最主要的开发语言,包括前面提到的十二种最流行的语言。”

引号发言甫毕,冒号立即献上溢美之词:“精彩!精当!一气呵成!看看,你还怀疑自己不够格作老师吗?”

一种晕眩感向引号袭来。

冒号继续引号的讲述:“从机器语言到汇编语言、再到高级语言的演变,堪比从徒步行走到乘自行车、再到乘汽车的变革,越来越省时、省力、省心。循此方向,第四代语言更专注业务逻辑和问题领域。程序员主要负责分析和描述问题,不再花大量时间去考虑具体的算法和逻辑。事实上,最初提出第四代语言的概念,就是希望非专业程序员都能做应用开发。”

逗号心下一惊:“那我等岂不是要失业了?”

冒号宽慰道:“倒不用太担心。正如引号所说的,语言越来越高级,背后靠的是越来越能干的助手。这些助手本身就是软件,还是需要专业程序员开发的。更何况,这种理想的全面实现依然任重而道远。”

问号百思莫解:“第四代语言到第五代语言的发展路线似乎不够清晰,在逻辑上如何解释呢?”

冒号作出解答:“第四代语言虽然足够强大,但过于局限某些特定领域,基本上属于领域特定语言[1]Domain Specific Language,简称DSL),而不是我们所熟悉的通用编程语言General-Purpose Programming Language,简称GPPL)。专门用于数据库操作的SQL、用于统计分析的SASSPSS、用于科学计算的Mathematica都是典型的第四代语言。然而一个系统往往横跨多个领域,如果每个领域使用不同的语言,并且不同领域的语言在概念和方法上也不统一,必然会给集成和整合带来的困难。第五代语言在保持第三代语言的通用性的前提下,继承了第四代语言的优点,即重在目标而非过程、重在描述而非实现。如果把这种优点用在汽车上,那么下一代的交通工具也许是无人驾驶的智能汽车。只要输入目的地,它会自动通过GPS寻找最佳路径,自动根据路况变速转向,一直驶到终点。”

叹号身形微颤:“坐这种车我可不放心。”

冒号一撇嘴:“这当然只是一种假想。同样地,第五代语言号称人工智能语言,虽然雄心勃勃,试图让机器理解人类的自然语言,并且具备人类的思维能力,但目前看来这一目标还显得遥不可及。”

句号很赞同:“是啊,超级计算机虽然可以战胜国际象棋的世界冠军,但在围棋上弱智得很。”

冒号提纲挈领:“也有人简单地将前两代语言统称为低级语言,其他的统称为高级语言。语言从低级到高级,离机器语言更远,离人类语言更近,因而更易读写、调试和维护,安全性、通用性和可移植性更强,开发效率更高,更加抽象和宏观;但同时运行速度和效率下降,用法和功能上局限性更大。如果拿兵器作比,高级语言好比长兵器,威力强大却难免滞重,长于大型应用,可谓‘一寸长,一寸强’;低级语言好比短兵器,轻便灵活却难免风险,长于底层应用,可谓‘一寸短,一寸险’。”

大伙心里话,敢情来这儿不是学编程,是学武术的。

叹号说道:“我看还是高级语言好,现在谁还学低级语言啊?”

冒号纠正道:“低级语言并不低级,只是随着高级语言的出现,计算机硬件性能的提高,渐渐有些边缘化了。虽然几乎没有人再用机器语言编程了,汇编语言仍有其用武之地。常见的有:包括嵌入式系统在内的系统开发,如操作系统、编译器、驱动程序、无线通讯、DSPPDAGPS等;其他对资源、性能、速度和效率极为敏感的软件开发;以信息安全、软件维护与破解等为目的的逆向工程等等。即使你不打算从事系统开发,也不想作红客、黑客或骇客,掌握汇编语言对你深入了解计算机内部运行机制、调试软件和改进程序中某些关键代码的算法也是有帮助的。”

引号提出:“好像有些书上把C语言称为中级语言。”

冒号答道:“这是因为C兼具高级语言和低级语言的特征。一方面它提供了高层抽象和可移植性,使程序员更多地专注问题逻辑而不是机器逻辑;另一方面它也提供诸如指针、位字段(bitfield)等工具进行底层操作,甚至可直接内嵌汇编代码。C语言既简洁灵活又高效强大,是迄今为止最具影响力的语言。几乎所有的操作系统和大多数高级语言都用它来实现,C家族的语言CC++JavaC#DObjective C等占据主流语言的半壁江山。如果再拿兵器作比,C语言就是一把剑,轻灵飘逸、锐利快捷。一名武将无论擅用什么兵器,往往都会腰悬宝剑。不会C的程序员正如不会使剑的武将,无论如何都是一种缺憾。相比之下,汇编语言就像小刀匕首,而机器语言则近乎赤手空拳了。”

句号灵光一闪:“我明白了——西门吹雪的西来一剑,那是C语言;李寻欢的小李飞刀,那是汇编语言;陆小凤的灵犀一指,那是机器语言。”

大家会心地笑了。

逗号冷不防冒出一句:“我会跆拳道哦!”

句号一乐:“哈哈,等你打赢了陆小凤,就封你为机器语言。”

冒号也笑言:“这位是古龙的粉丝吧?武侠小说里的侠客多轻功高绝且喜单打独斗,故使用轻、短兵器居多;而历史小说里的战将多骑马进行大规模作战,故除了佩剑外,使用重、长兵器居多。这就是前面提到的,中低级语言更适合中小型或底层应用,高级语言更适合大型应用。”

众人活跃起来,开始议论纷纷。冒号放耳听去,净是些古龙金庸、三国水浒里的人物情节,暗想:通俗小说到底比计算机编程吸引人啊。
5f J5m~r!\Cb0


z2J1E6Q.M-xeb0
插语

[1]领域特定语言,简称DSL。它区别于通用语言,一般用于特定的问题领域,多属于第四代语言。比如SQL是专门针对数据库的语言,LaTeX是专门用于排版的语言,正则表达式(regular expression)是专门处理字符匹配的语言。
%{v;G Vs1W0Dg"x1K_ l7Z0ITPUB个人空间cn"Q$_O I W+b3H

 总结

  • 评判语言优劣,不能离开使用语言的主体和对象。好的语言就是适合编程者和解决对象的语言。
  • 计算机语言按其发展历程分为五代,依次为:机器语言、汇编语言、高级语言、面向问题语言和人工智能语言。通常,前两代统称为低级语言,后面的统称为高级语言。
  • 第四代语言和第五代语言与前三代语言最大的不同在于:重目标轻过程、重描述轻实现。
  • C兼具高级语言和低级语言的特征,因此也被称为中级语言。
  • 计算机语言从低级发展到高级,渐渐远离机器,靠近人类,以牺牲部分性能和效率为代价,换来更高的开发效率和可维护性。中低级语言更适合中小型或底层应用,高级语言更适合大型应用。

 


TAG: 编程 编程范式 程序员

引用 删除 Guest   /   2009-08-08 21:37:46
5
引用 删除 sevenkylin   /   2009-06-05 23:13:19
5
Germin的个人空间 引用 删除 Germin   /   2009-02-12 22:07:07
5
引用 删除 Guest   /   2008-12-03 21:11:17
5
引用 删除 heoxsoft   /   2008-11-25 22:00:27
评 5 分
引用 删除 Guest   /   2008-10-22 18:46:13
-5
引用 删除 Guest   /   2008-10-15 13:43:56
5
 

评分:0

我来说两句

显示全部

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

Open Toolbar