| “……我给大家讲个笑话吧。”看着沉闷的气氛无可避免地笼罩着课堂,教师决定拿出力挽狂澜的架势,用一己之力和人类在课堂上睡觉的天性作斗争。这说明了什么问题?处于极度无聊之中的朵朵揣测道,而且迅速得出了结论:这是个没什么经验,良心未泯,换言之便是善良但不免有些愚蠢的家伙。原因很简单,在这种认证培训机构,从教师到学生,根本就不会寄希望于交流什么真正有价值的东西;从而又可以立即知道,这个天真地想活跃气氛的教师一定无法达到他的目的,因为这种家伙虽然热心,本质却一定是技术狂。让他们讲出有水平的笑话恐怕比理解俳句的妙处还要难得多。
“一位生物学家、一位建筑师和一个程序员在一起讨论上帝的职业。生物学家说:‘上帝毫无疑问十一位生物学家,因为众所周知,上帝创造了人类。’” 听了他的话,那些本来期待着带着点“禁断意味”的笑话的家伙认识到自己打错了主意,失望地把思绪拉回自己的小天地中。全场鸦雀无声。 “建筑师反驳道:‘不对!上帝肯定是个建筑师!因为众所周知,在创造人类前,上帝先从混沌中创造了世界。’” 全场继续鸦雀无声。 沉浸在自己思路里的教师费了很大力气才没有偷笑出来,他强忍着抖出了自己那个绝妙的包袱: “这时,程序员冷笑道:混沌是哪儿来的?” 全场毅然决然地鸦雀无声着,同时还有等待下文的家伙们奇怪地看着教师脸上那蒙娜丽莎一般地笑容。 “果然如此,”朵朵暗想,同时打了个呵欠。她之所以无动于衷并不是因为觉得这个笑话没意思,而是由于已经听过好几遍(不同版本)的缘故。况且教师在讲笑话的技巧方面也实在缺乏可陈;尤其重要的,是因为这个笑话出于英语,主要的包袱在于Chaos这个词在宗教和计算机——准确地说是分形,不过对于外行来说,咳——两个专门的领域中各有自己的意味。虽然教师的这个版本算是翻译得最好的,但还是难免有些格格不入的感觉。 等朵朵回过神来的时候,教师正在费力地向大家解释“混沌”在圣经和计算机分形学中的意义。看得出来,尤其让教师感到伤心的乃是大家对圣经的了解远胜于计算机;要知道这可是个计算机的培训课程。最后,可敬的教师终于明白了,真正的理解乃是理解有些事对有些人来说是不可理解的;他不无沮丧地收拾起心情——能做的也只有如此——继续着自己未竞的事业。 “好了,请大家返回课本61页。”受到打击的家伙严肃地说。吾友坡先生说得好,如果一个人在陷入尴尬的时候竟然不横眉立目地指责一番,他看起来一定会像个大傻瓜。教师理论上无疑是明白这一点的,从这方面来看他还不至于无可救药。 “看得出,虽然不免有些痛苦,这个家伙总算是成长了。”朵朵想。其实每个人自己都有一套对世界的认识;而所谓成长,不过是抛弃自己的想法臣服于社会,换言之便是服从于大多数罢了。当然,坚持自我的人也不是没有,这种人不是让世界因为他而改变的天才,便是天真的笨蛋,或者自大的傻瓜;当然,后面两种永远要比前者多得多。“这并没有什么‘冷酷’、‘悲哀’的,”朵朵继续想着,“要是每个人都能照着自己的想法晃来晃去,这世界不就乱了套了吗?一味提倡‘个性’的蠢货是要不得的。归根结底,‘规则’是重要的;每个世界一定有自己的‘规则’——其中有的固然可以通过人力或是时间改变,但大多数规则却是千古不变的。” 想着想着,朵朵开始走神了。她在家里的时候喜欢自言自语,在公共场合也总是改不了这个习惯。 “规则。”她喃喃道,“是的,规则……” “什么?”坐在她身边的一个男人突然转过身来,“难道你也是几几的书迷?” 此人本来一直…… …… …… 这时,教师正在按照教科书的要求,竭力向大家描述所谓“面向对象编程”的好处。他首先对以前讲的东西进行了总结性的说明: “通过条件和循环,我们掌握了解决简单问题的方法;正如我以前讲的,在理论上一切问题都可以用顺序、条件和循环来解决。但是,在处理复杂问题的时候,我们通常会习惯于将复杂问题简单化,也就是分解成若干简单问题之后再分别加以解决。这种解决问题的方法成为‘结构化’,一般又根据具体思维方法分成‘自顶而下’和‘自底而上’两种,分别对应着优先考虑大局和优先追求细节两种风格。” “可是事实上很少有场合会用到自底而上的工作方法,”达康插了一句,“很难想象有人,或者工作小组会先编出一大堆函数再研究怎么把它们组合起来。即使是编写工具包也应该事先有个计划啊。” 朵朵想了一下,没有找到反例。于是她向达康点了点头以示同意。 教师当然不知道两人在暗诽自己。“但是随着人们对软件工程研究的深入,一种新的思维方式诞生了。这就是当今编程的主流:面向对象程序设计(OOP,Object Oriented Program)。”他摆出一副新时代布道者的神气,“相对结构化程序设计方法,面向对象编程显然更加符合人类的思维方式:它把程序的各个部分作为‘对象’来看待。和结构化程序中的‘过程(函数)’不同,对象是一种复杂的数据类型。它不单用来实现某些功能,和现实社会一样,每个对象都有属于自己的属性,我们称之为‘属性’(Attribute);而它们也可以拥有自己的过程或函数,我们称之为‘方法(Method)’。举个形象的例子,我们可以定义一个桌子对象类型:显然,它将具有长宽高、材质、重量、上面摆放的东西等属性;而且根据需要,我们也可以定义一些诸如改变桌子高度、往桌子上放东西之类的方法。顺便说一句,就像桌子总要被制造和抛弃一样,一般对象都要有创建和毁灭——Create and Destroy,它们在RAD进一步封装的时候常常会被用到——这两个方法,通常被称为‘构造’和‘析构’。 “这样,”他喘了口气,接着说,“我们就可以定义属于桌子类型的对象了,比如圆桌,方桌,不方不圆的桌,等等等等。一般构造和析构是自动进行的,这也不难理解;毕竟在定义‘桌子类型’的‘桌子一号’时,要进行分配空间、制定缺省高度等属性的工作。(按,顺便说一句,在不同的计算机语言实现里某些术语是不同的,比如‘桌子类的某某对象’,或者‘桌子对象的某某实例’。)” “经典的例子,不过没什么意义。”达康嘟囔道,“从上个世纪至今也没听说过谁弄过什么桌子对象。不过我倒是挺想知道初学者怎么看待这个例子,也许真的会因此认识到面向对对象的优越性?” “桌子对象这个名字本身听起来挺可爱,”朵朵承认,“但是还是感觉和结构很相似,不过是多了方法罢了。这也称不上多么具有革命性啊。” “如果我猜得不错的话,他大概马上就要提到面向对象的三大特性了。”虽然是“大概”,达康说这话的神气就像是诺查丹玛斯的魂附在他的身上一样。 “当然,面向对象编程绝没有那么简单。”教师很给面子地说,“下面我来给大家讲一下OOP的三大特性,正是它们改写了‘编程’这两个字的意义,那就是所谓的封装性、继承性和多态性……” “祝你听完后能有个大致的了解,——不过我的祝愿可不见得管用。”达康对朵朵说,然后又趴在桌子上小酣起来。 “……”朵朵刚想表示感谢,听了他的后一句话又咽了下去。教师看起来很激动,显然他对这部分理论研究颇深: “……所谓封装性,和大家所了解的‘黑盒子’颇有相似之处,那就是说用户不必关心问题得以实现的细节,直接对属性和方法进行调用。当然,这是不难理解的;但这里的黑盒和我们在结构化程序设计中提到的又颇为不同。过程(函数)就像是一个黑盒子,我们只需要输入参数,就能得到需要的结果(以及返回值,如果是函数的话);但是,我们已经知道,对象不仅具有方法,同时还具有属性。那么属性是否应该全部为用户所见呢?答案当然是否定的。比如既然桌子对象类型已经拥有了‘改变高度’这个方法,那么我们当然不希望用户自行改变桌子的高度属性,因为这可能导致错误的结果,比如高达两米五五的桌子。(我没说三米,注意没?)相反,我们自行编写的‘改变高度’方法可以随意根据我们的意愿实现或者避免一些情况。比如在这个例子里,我们完全可以给该方法定义一个返回值,如果一切正常返回零,如果高度太高则桌子高度不会被实际改变,而且返回一。(相应地,我们可以定义一系列常量之类的东西,让DESK_ChangeHeight_NoError=0,DESK_ChangeHeight_HeightTooHi=1,诸如此类。附带说明一下,这里我们没有太注意常量定义的格式。)为此,我们无疑应该把桌子的高度‘封装’起来。当然,这只是最简单的理论;在面向对象编程的实现里,属性和方法通常可以被定义成四种类型:公共,保护,私有和……” 以下部分朵朵由于走神而没有听到,当然记忆里也没有留下任何相关的东西。针对中学中盛行的“背诵”教育——通常是文科,特别是政治——从前有一种所谓HR背诵法(其发明者称之为HR科学记忆法),主张要在一种“半睡半醒”的状态下进行记忆,据说能收到非常HR的效果(不过据作者说HR不是HighRate,而是HotRubbish的缩写)。不过不管怎么说吧,朵朵对此还是非常不信任。原因很简单,这种理论和日常经验截然相反:根据人们的体验,最容易被记住的通常是感兴趣的东西。一幅表示记忆机制的图画得很好,也颇有意思:一幅西洋春宫图的视觉信息被眼睛接收,大脑表示“感兴趣”,于是该信息便被储存起来,并被建立索引;而一张英语单词表的视觉信息被眼睛接收后,大脑表示“不感兴趣”,于是该信息便被大脑拒绝——这无疑和我们的日常经验是吻合的。听过一遍笑话便能复述的人肯定比看过一遍定理证明就能将其重述的人要多的多。所谓“乱七八糟的东西更容易被记住”,其实不过是因为通常“正经的东西大多没什么意思”;这也说明了记忆应该和显意识有很大关系,由此必然可以推论出清醒的状态显然有助于记忆。我们不能不怀疑,HR记忆法是否需要一名催眠师来唤醒储存在潜意识中的记忆。所以说,充耳不闻并不是朵朵的错;谁让当下人类对大脑的认识还处在很初级的阶段呢?至于走神,更是谁都免不了的。对不同个体来说,把注意力集中在不同对象上,所能持续的最大时间显然不同。对一个数学教授来说,数学大师的讲座可以具有极大的吸引力;可是谁能指望一个浪荡子会如痴如狂地听上几个小时?既然非常喜欢计算机的达康都不免颓然而倒,朵朵稍微走一下神自然也没什么奇怪的地方。而且根据一般的经验,走神通常是因为对当前话题不感兴趣;因此在转换话题的时候,即使处于神游太虚的状态,也能及时注意到这种情况。 ——至于朵朵走神时在想些什么?就是上面的那些东西。 果然,朵朵回过神来的时候,教师正在开始讲解可敬的“继承性”: “……综上所述,封装性使得在发布对象的时候,用户只需得到对象的公共属性和方法以及对它们的描述,就等于得到了全部。这无疑大大增强了代码重用的效率,这就是面向对象的伟大之处。不过,有必要认识到,仅仅如此还是不够的。为了达到预期的进步,面向对象程序设计还需要别的特性。所以,下面来讲解一下OOP的另一个重要特性:继承性。 “我们已经知道,通过‘对象’来描述现实世界具有无可比拟的优势;但是如果每对应一种事物,都要编写有关的对象,这无疑是不科学的。比如电视机和显示器,它们是如此的相似,以至于如果为电视机编写了‘打开开关’的方法,显示器完全有理由使用这段现成的代码;但按照我们现在知道的情况,这是不被允许的。事实上,如果能按照层次关系构造对象,显然会更加符合自然界的实际。比如生物是按照门纲目科属种来分层定义的,这就避免了每定义一种生物的时候都要说明它的所有属性。猫属于脊椎动物门,本身就说明了它是脊椎动物;没有必要在‘猫种’里特别说明它是脊椎动物。为了让程序设计也具有相似的特征,OOP里‘继承性’显然是必须的。 “所谓继承性,指的是……………………………… 需要说明一下,在这种培训课程中,一般是没有休息时间的;其理论是,虽然课间休息可以帮助学生放松,但是人和人之间差别极大,制定统一的休息时间只适用于一般的教学,在认证培训这种高强度的学习过程中,最好还是个人根据自己的具体情况自主规划。不过话说回来,以上曾在某认证机构的内部学报上发表过的理论其实当且仅当在理论上是有效的;这样做似乎显得很专业,其实不过是为了掩盖内部混乱的管理罢了。诸位只要好好想想,就连培训教师很大一部分也坦承自己也无法通过自己教授的认证,又怎么能指望什么科学、高效的计划?——不过我们得公正的说,这主要是倒不是因为这些人专业知识差,俗话说久病成医,这种应用层面的东西天天折腾没理由搞不懂;真正原因大部分是因为他们英语底子不好的缘故。语言这种东西不是靠突击就能掌握的,对付考试你可以选择速成的方法,但要真正掌握的话,需要的东西只有两样:毅力和时间。——当然,一般每个认证培训中心倒都会有一些十分厉害的人押阵,这些人不是年少成名的天才,就是著作等身的可怕人士,不必细表。不过无论如何,再优秀的教师也是生物学意义上的人,他们也是要休息的。虽然在面对一群充满激情的听众的时候,优秀的演讲家往往会有非常出色的发挥,也许会连续几个小时始终精神饱满,但鉴于朵朵班上的具体情况,实在不应对那位可敬的教师提出任何过分的要求。从信息学上来讲如果信号得不到反馈就会发生异常,看着讲台下一张张麻木不仁的脸,为了保证自己精神和心智的完整性,教师简直恨不能说出都德的那句名言——不过他当然不能那么说。“随心所欲”这四个字,终究不过是幻想罢了。 “大家自行总结一下把,我们稍微休息一会儿。”他擦了一把汗,然后打开保温杯,发现没水了,只好出门向小卖部走去。 “完了?”达康抬起头,打了个哈欠。从他的眼神看来,他刚刚享受了完美的休息。 “You are so accurate! ”虽然和上下文颇不适合,朵朵还是用这句歌词称赞道。“你是怎么做到的?”由于她本人精力充沛,不具有任何和睡眠有关的特技,朵朵好奇地问。 “这没什么,习惯了便能做到;”达康明白她的意思,“因为睡眠并不是完全与外界隔绝的状态。众所周知睡眠分为快波睡眠和慢波睡眠,通俗地说便是前者深而后者浅。人类不可能由清醒状态迅速进入快波睡眠,而在慢波睡眠中,外界的刺激还是会发生一定效果的。” “但是那时已经应该没有理智了,又怎么能分辨出‘休息一会’这种话呢?”朵朵想了一下;“我明白了,”她恍然大悟道,“正如看守鼓风机的人员会因为停电而惊醒一样,持续的声音突然停止同样是一种刺激。何况休息时间多少会有人交谈、行动,这些足以让一个训练有素的课上睡觉惊醒了。” “正是!我也是这么认为的,正所谓英雄所见略同。”达康笑道,“不过你关于鼓风机的那个比喻可不太恰当,因为鼓风机在停止的时候会发出非常可怕的声音。” “苏东坡说得好,‘想当然耳’嘛!”朵朵笑着回答道。 “那么他刚才关于面向对象的三大特性的阐述,你认为如何呢?”达康问。 “这个,”朵朵仔细想了一下,认真地说,“的确如教师所说,OOP非常接近我们对现实的体验;但是,我还是想不出在具体编程方面这些有什么作用。除了处理大量数据以外(那些无疑有现成的数据库工具可以使用,这里也提供有关认证的培训),在编写诸如CD播放器之类的实用工具的时候,会需要什么对象呢?连这些我都想不出,何况这对象在什么时候需要继承和重载了。总而言之,理论是好的,可惜看不出有什么用处。当然我只是一时的想法,可能后面的例子就会有阐述了吧。” “这就是培训中心的教学方法,”达康叹道,“真正需要这些的不是程序员,而是写论文的大学生。理论老掉牙暂且不提,即使你看了后面的例子,也不会明白OOP任何有实际意义的用法。谁会 但是,我觉得你这样终究是不能 |