1、我向潇湘君向秦
子在川上曰,逝者如斯夫。
时间就如白驴过隙,高中三年弹指一挥间,高考结束了。不过还不能完全放松,高考之后就是填志愿,有人说填志愿是第二次高考,此话不假,多少骄子考场似乎得意,填写志愿时洋洋自得,潇洒的大笔一挥,结果高手撞衫,即使600多分也只能名落孙山。又有多少骄子考场似乎失意,填写志愿时畏手畏脚,结果虎落平原,即使600多分也只能安家二类本科。
人们在填报志愿时常常在选学校上发费大气力,往往忽略了另一个重点,就是选专业。进入一个好的学校固然不错,但挤入好学校的好专业的竞争压力必然极大,倘若在“服从专业分配”上打勾,一不留神,极有可能落入相当冷门的专业当中。相反,如果退而求其次,填报一个稍微差一点的学校,却也能保证选择如意的专业。好学校还是好专业,无论当时还是现在都让考生和家长们难以选择。
那一届,木鸿飞及其同学们大部分选择了好专业,名校虽好,也要能找到工作,工作好,才是真的好。
对于木鸿飞来说,理想中的专业其实早就确定了,自从3年前那惊鸿一瞥,计算机的倩影就一直挥之不去,一见钟情也好,日久生情也好,总之木鸿飞是非计算机专业不报,用他的话说,就是“你是报考计算机专业呢?报考计算机专业呢?还是报考计算机专业呢?”
木鸿飞的第一志愿填报ZJ大学计算机科学系。之所以填报ZJ大学,原因有二:其一,ZJ大学排名比较靠前,虽然不如清华北大,但是紧随其后。其二,ZJ大学似乎并不受广大考生重视,在湖南地区的历年录取线一直只在分数线上40分之内。用现在流行的话来说,就是在底部横盘多年价值严重被低估的股票。
木鸿飞的第二志愿填报XT大学计算机科学系。XT大学虽然是一类本科,但在全国排名中靠后,而且处于地级市而并非省会,在崇洋媚外的时代,很容易给人一种土鳖的感觉,所以很多人对DX一中尖子生木鸿飞同学在第二志愿就填报XT大学的做法甚是不解。其实这是木鸿飞与其哥哥木鹏飞在深思熟虑之后作的一个决定,原因有三:其一,虽然木鸿飞的成绩远远超过了一类本科里中等层次院校的录取线,但是经过一轮的筛选,到达第二志愿,估计早就只剩下一些冷门专业的残羹冷炙了,填了也白填,浪费一个机会,反不如直接填报排名靠后的一类本科保险。其二,木鹏飞就在XT大学任教,多少有个照应。其三,师傅领进门,修行靠自己,外国有句俗语曰:天助自助者,学习最终还是自己的事情,无论在什么学校,自己努力总能有收获,如果不努力,进入清华也白搭。
命运之神与木鸿飞开了一个玩笑,那一年ZJ大学、NJ大学等等以前分数线不高的优秀学校的报考人数暴增,分数线如嫦娥二号般直冲云霄,竟然超过了清华北大。本来木鸿飞的高考成绩比ZJ大学的录取线高了一点点,但是计算机科学系当时是热门中的热门,于是ZJ大学计算机科学系的实际录取分数线又比木鸿飞的高考成绩又高了一点点,再加上没有在“服从分配”栏打勾,木鸿飞只能无奈的与第一志愿拜拜,正式进入XT大学计算机科学系。
录取结果公布,几家欢乐几家愁,同学们有的万般无奈心灰意冷准备南下打工,有的摩拳擦掌暗下决心力争明年再战,有的未入理想大学却也只能接受现实,有的梦想实现正扳着手指头过日子只盼望快点开学进入传说中的大学学府,更有甚者,一位报考NJ大学落榜生拒绝了服从分配、放弃了第二、三志愿,以可入清华大学的高分选择复读,只为进入梦想的学校和专业。
相比之下,木鸿飞的心情要平静的多,既没有考入大学的自喜,也没有志愿失利的心酸,此时的他还是象牙塔中的一页白纸,洁白无瑕,学习计算机就是他最大的心愿,其他的一切都不那么重要。当同学们正在人生的转折点上演绎七情六欲的时候,他已经整理好行李,准备北上XT大学,到哥哥家提前学习一个月。
时间:1997年8月的一天,木鸿飞北上XT大学的头一个晚上。
地点:D县某歌厅
人物:木鸿飞及其高中同学
事件:高中毕业生之间的话别。
本来话别不是这个时候,一般要等到8月底同学们才陆续开学,但有好事者以木鸿飞等一批金榜题名学子已经陆续开始离开D县远赴他乡求学了为理由,提出了必须提前进行一次同学聚会的倡议,会议的主题是“友情、欢送和祝福”:即牢记高中三年乃至中学六年的同学之情,欢送金榜题名者远赴高等学府,并预祝他们一路顺风万事如意。倡议得到了全体同学的赞同,一来大多数同学这段时间闲的无所事事,总想找点事情打发时间,要知道那时还没有网游、没有QQ、没有玄幻小说,打发时间只能是诸如聚会之类的实体活动;二来人类都是情感动物,三年的友谊早已深深的埋藏在同学们的心间,现在就要各奔前程了,依依惜别是在所难免的。
聚会并不总是在愉快中进行,除了隐隐的兴奋外,还有淡淡的伤感。同性好友抱头痛哭;异性朋友则先是规规矩矩的言语惜别,最后终究发展为友谊性的拥抱;还有少数早恋男女依偎在角落里妮妮细语,不知是在对棒打鸳鸯的控诉还是在述说山盟海誓的誓言。
“人不早恋枉少年。”可惜木鸿飞枉少年了,所以他没有资格呆在角落里,只能聚在一群男女同学中,当然他们都是纯洁的男女关系。
“木木,这一次你没有考入理想的大学,伤心吗?”导弹问道,当然这也是木鸿飞好友们共同关心的话题。
“谈不上伤不伤心的,我没有感觉。”木鸿飞平淡的说,“没有进入ZJ大学,是有点失望,但是也没有特别的伤心,也没有复读的想法。在哪里读大学不是读,反正能读计算机就行。”
“哥们,你这份淡定使人佩服,我就做不到,我要去一流大学读书!”导弹报考NJ大学落榜后被重新分配到西安的一所地方本科,学通讯专业,在这之前我们都没有这所大学的名字,导弹对此耿耿于怀,下决心一定要圆他的一流大学梦。在大学四年中,他憋了一口气,努力学习,毕业时顺利考入了北邮研究生,这是后话,暂且不提。
“哥们,我们俩是D县一中的第一、第二名,结果都没有考入理想的学校,唉,流年不利啊。”导弹叹了一口气,“明天你就去你的XT大学了,平时我们是很要好的朋友,现在一个在湖南读书,一个在陕西求学,我引用古人的一首诗,送给我们俩。”
导弹停顿了一下,清清嗓音,然后慢慢的念到:
“扬子江头杨柳春,杨花愁杀渡江人。数声风笛离亭晚,君向潇湘我向秦。”
导弹陷入失意当中,一时间引起了大家的共鸣,叹气声此起彼伏,气氛顿时沉闷起来。眼看情绪即将失衡,丫丫大美女如同美羊羊般挺身而出,拿起了麦克风,唱出了一首欢快的曲子,带动大家暂时忘记忧伤。一曲歌罢,丫丫意犹未尽,继续说道:“明天我们的木木就要去他的XT大学了,在这里我们祝他一路顺风。木木,你也来说唱个歌啥,我们今天肯定会听下去的!”
木鸿飞接过麦克风:“我唱歌真的很难听,大家都知道了,就念一首自己写的诗吧,送给所有同学,尤其是像我和导弹一样没有进入理想大学的同学。”
“今年入学我十八,翩翩潇洒好才华。无缘未名湖中雪,但识情人坡上花。
侯门总有平庸客,将相亦出百姓家。待到功成名就日,回首笑观浪淘沙!”
……
那一夜,歌声不断。那一夜,情深泪长。那一夜,憧憬灿烂。那一夜,豪言气壮。这是高中同学毕业后最齐全的一次聚会,明天,同学们将各奔前程,明天,同学们将远赴他乡。明天,Tomorrow is another day!
同学年少,风华正茂,前方正向他们展开双臂,未来终究将移交给他们,70末80初将从这里离开家乡,登上属于自己的舞台。家乡的山水养育了他们,也注定会送别他们。D县的宝塔啊,你默默的注视着他们离开家乡的怀抱。D县的潇水啊,你带着家乡的气息,随着他们流淌到远方。正是那:
又是一年月份九,同学少年把学求。谁知一去数十载,从此难见潇水流。
2、天马行空
木鸿飞提前一个月来到了XT大学。
三年前,他是校园里可有可无的过客,三年后,他已经是学校的一员。三年前,他还来不及仔细欣赏校园的美景,三年后,他有足够的时间细细品味这优美的画卷。三年前,他对计算机只有惊鸿一瞥,三年后,他终于可以与计算机恋爱般亲密接触。
再次来到大学校园,木鸿飞不再来去匆匆,却是缓缓而行,贪婪的欣赏着周围的美景。穿过三道拱门组成的校门,景色依旧,庭院深深深几许,一条大路从校门向内延伸,直至眼光的尽头。道路两旁绿树成荫,从校门前行200米,是一个田径场,场内青草依依,微风吹过,绿色的草浪此起彼伏,仿佛在诉说校园里多么热闹,多么生机勃勃。
从最南边,到最北边,穿越校园就是穿越一个巨大而美丽的公园,在这里,上课将是一次次穿越花园的旅行!
旅行结束,到达北青楼,木鸿飞又见到了几年前熟悉的面孔,结实的高老师一个劲的感叹,“时间过得真快,小小木居然就读大学了!”。一如木鸿飞工作后感叹白云苍狗一般,记得刚刚参加工作时,看着同事的小孩在膝下嬉闹,十年弹指一挥间,如今却常常听同事诉说自己的小孩在大学中如何如何,唉,年轻真好!
得知弟弟提前到来,哥哥早有准备,他专门从系里借了一台486机器。三年过去了,486早已是昨日黄花,如今是586(奔腾)的时代,甚至传说中686也已经问世,所以暑假期间借一台淘汰的486到家里使用还是可以的,这样也省去了来回奔波上机的麻烦。
了解到木鸿飞高中开设了计算机课,还编写了俄罗斯方块,哥哥兴趣大增,要求木鸿飞演示一把。只是演示什么呢?俄罗斯方块程序在5寸磁盘中,但5寸磁盘早已全面被淘汰,数据取不出来。
“那就演示动画吧。”木鸿飞想了想,设计动画程序似乎是最方便的。
“哦,你还会动画!”哥哥吃惊的说道,然后马上出题:“设计一个从左边移动到右边的矩形。”
与俄罗斯方块相比,这个需求实在是太简单了,木鸿飞思索了一阵子,打开Qbasic,在发一点时间习惯后,写出了这段代码。
“我再编个天马飞翔的动画。”前面的热身显然达到了效果,木鸿飞主动请缨再战,编程瘾已经吊起,还可以show一次,何乐而不为。
但木鸿飞并不马上编程,而是拿出纸笔,用简笔画的方式勾勒出一匹大马,再在背上加上双翅,然后为每一根线条标上坐标,整个过程大约发费了两个小时。然后才进入Qbasic,开始输入代码,又过了一个多小时,一匹背生翅膀的天马从右到左飞过屏幕,屏幕黑黑的,时不时反射几丝亮光,就如同从宇宙深处掠过一般。
哥哥点点头,对这个作品赞不绝口:“很好,很好。先准备,再编程,比很多大学生强多了。现在有的学生连干什么都不知道就直接上机去了,真不明白他们要编什么。”
“无准备,不编程!”木鸿飞想起了设计俄罗斯方块时写满代码的笔记本,看来当初的做法是正确了。“我设计的马并不是简单的飞过屏幕怎么简单,你看,”木鸿飞再次运行程序,“在移动的过程中,翅膀上下翻动,马腿前后移动,而且整匹马也没有保持在同一个水平线上,而是忽上忽下,用来表示跑动中颠簸的效果。”
“你是如何实现上下颠簸的?”哥哥问道:“有没有为每个位置的马单独设计代码?”
“没有,我使用了一个函数来画马,马的左上角坐标是函数的参数,比如x是左上角的横坐标,y是左上角的纵坐标。函数中所有的画线过程均采用相对坐标,比如这条线从(x+1,y+10)开始画起,到(x+10, y+20)结束。无论在任何位置,都可以很方便的实现。”木鸿飞回答道。
“会使用函数,很好,很好!”哥哥继续点头:“你是如何实现动画的?”
“动画很简单,它由两个步骤组成:显示和擦除。显示就是直接画出马就可以了,而擦除吗,”木鸿飞洋洋得意起来,“其实就是在原地方用黑色再画一次,马就消失了,然后把左上角坐标移动到新的位置继续显示,马就前移了!不断的擦除和显示,就形成了动画的效果。我在俄罗斯方块中就是这么做的。”
“在原处用黑色画马实现动画。”哥哥若有所思,“你有没有考虑,还有什么方法可以实现动画呢?这些方法都有什么优缺点?比如目前你使用的方法实现动画有什不足?”
“多种方法?不足之处?”木鸿飞摇摇头,“我没有考虑过。”
“应该考虑,至少还有四种方法可以实现动画。”哥哥说道。
“还有四种,加上这一种不就是五种。我不知道。”顿了顿,木鸿飞补充道:“为什么要考虑这么多方法,反正可以实现了,不浪费吧。”
“在计算机中常常有多种方法可以实现同一件事情,也就是条条大路通罗马。真正的程序员需要综合各种情况,思索各种实现方法,并从中选择最适合的一种。”哥哥一本正经的说道,但木鸿飞显然不理解,一脸的不可置信。
“不信?”哥哥略一沉思,计从心来,“让我们演示一下。我在这个程序开头部分增加一个语句,设置屏幕背景为蓝色,咱们再看看效果。”
程序再次运行,蓝色的屏幕上,天马消失的无影无踪,取而代之的是,红线、黑线依次划过,留下一片漆黑的区域。
程序运行“异常”,木鸿飞大吃一惊,疑惑之情暴露无遗。不过这一切都在哥哥的预料之内。“实现动画的第一种方法,就是在原位置处以底色重画一次。记住是以底色重画一次,不是以黑色重画。”哥哥讲述“底色”和“黑色”时明显加重了语气。
“我明白了!”木鸿飞也是八面玲珑,一点就通,“我应该用蓝色重画天马!”说干就干,更改代码后,久违的天马终于再次行空,所不同的是上次是掠过宇宙星空,而本次则是划过蓝天。
“很好。”哥哥毫不吝啬对木鸿飞的赞誉,同时开始谆谆教导,“但是这种方法有个缺点,你发现了吗?”
“没有!”木鸿飞很直接。
“以底色重画天马来实现动画,这种方法的优点是简单,但缺点是,如果背景不是纯底色时,会破坏原来的背景。”见木鸿飞紧锁眉头,哥哥继续解释:“假设你的背景是由太阳、星星和地球的图案,当你用背景色——比如黑色——重画时,屏幕上留下的将是黑色的线条,原来的背影将被黑色取代。而随着动画的继续,最终天马飞过的地方将全成为黑色……”
“就像刚刚以蓝色为背景时一样。”木鸿飞明白了,开始抢答。
“对!所以第二种动画方法就是以异或方式画图。”重音在“异或”上。
“疑惑?”木鸿飞只知疑惑,不识异或。
“异或是位运行,你还没有学习二进制,不过没关系,二进制很简单,你的数学也很好,应该马上能够理解。”哥哥开始现场教学。
不一会儿,木鸿飞理解了“异或”的特性:对同一背景,同一图形,使用“异或”方式显示两次,则背景复原,就如同从来没有显示一样。程序的更改也很简单:在开始处将输出方式设置为“异或”;“擦除”时也不再使用背景色而使用前景色——此处是红色——即可。为了使演示结果更具备说服力,木鸿飞还在移动前画了若干个几何图形充当背景。
程序开始运行,天马飞过星空后,星空背景一切依旧,成功!木鸿飞欢喜的手舞足蹈,不住的说:“这个方法好,这个方法好!简单!”
“使用异或方式是实现动画的一种方法,其优点是可以保护背景,但是缺点也显而易见。”哥哥继续爆料。
“它还有缺点?还显而易见?我怎么没有看到。”木鸿飞已经完全陷入惊奇当中。
“你别只顾高兴,平静的观察的话肯定可以发现。”哥哥叫停木鸿飞的兴奋。
“好。”木鸿飞深吸一口气,平静一下心情,然后看了看代码,好像还是没有什么特别,再运行程序,终于有了发现:“天马的颜色变了,程序使用了红色,但显示出来是紫红色!还有通过背景几何图形时,那些交叉的点颜色都变了!”
“对,异或方式显示容易更改颜色。”说着,哥哥拿起笔,在纸上演示:“你看,本来输出红色,红色代码是0100,而背景是蓝色,蓝色代码是0001,这两种颜色异或后是0101,正好是紫红色。”
“哦,我明白了。”木鸿飞恍然大悟,“有没有什么方法既可以保留背景,又不更改显示的颜色呢。”
“你能这么想就对了!程序就是在一次次改进中前行。不过其他的方法设计起来就比较麻烦了。比如背景保存法:在显示前,先把图形所涉及区域的背景保存下来。擦除时,就把保存的背景再显示出来。”考虑到木鸿飞还没有学习相关函数,哥哥亲自操刀,对程序进行了一些修改,于是天马终于以自己本来的颜色飞跃星空了。
“哥哥,这个方式设计起来好像比较麻烦,加了好多代码。”木鸿飞已经初步具备了分析设计方法的思维了。
“的确比较麻烦,而且保存背景也是需要内存的。当然,可以采用背景刷新的方法解决这个问题,。”哥哥又提出一种方法。
“背景刷新法,难道每次都重新刷新,也就是全面画一次背景图像。”木鸿飞自动忽略不懂的“内存”,主动思考新方法。
“没错,每次擦除时,都把重新画一次背景,这样做即能擦除原图形,又能复原背景,一举两得,而且实现起来相当简单。不过每次重画背景时都特别费时,每动一步,就看到屏幕闪烁一次,给人一种卡机的感觉。”哥哥详细的分析。
“有解决方案吗?”木鸿飞知道哥哥必有下文。
“有,可以采用多页面显示法。一个屏幕就是一个页面,我们调用各种画图函数,一般都是直接画在屏幕页面上,比如你调用line函数,屏幕上马上就会显示一条线。但是也可以不马上显示,比如准备一张白纸,所有的画图函数都画在白纸上,当然白纸藏起来不显示到屏幕上的,上面画的图形你都看不到,直到画图完毕,再把白纸的内容显示到屏幕上。这种白纸就是页面,我们可以在显示一个页面的同时,画另一个页面,画好后显示另一个页面而同时画前一个页面,如此循环。”哥哥说道。
“原理我懂,就像放电影一样,一秒钟24张图片,一页一页的显示出来,在显示第一页的同时设计下一页。但是为什么要这么做,直接在屏幕上显示不是很好吗?”木鸿飞不解的问。
“你还没有正式学习计算机,有些情况可能还不太了解。”哥哥解释道:“有时候直接在屏幕上画图速度会比较慢。今天的例子简单,所以看不出来。但是有一些复杂的图形程序,生成全部的图形需要比较长的时间,如果直接在屏幕上显示的话,就会像慢动作一样很明显的看到这个过程,比如先画一个三角形,再画一个矩形等等。而实际上,用户只在乎最后的结果,所以就需要把这些缓慢的实现步骤掩藏起来。”
“我明白了。实现动画有背景色重画法、异或法、背景保存法、背景刷新法和多页面显示法。”木鸿飞对今天的学习做了一个总结。
“当然,你也可以找到其他的方法。其实今天告诉你动画的这么多种实现方法,并不是教会你做动画,那还太早了点。目的只是告诉你,计算机程序的设计方法多种多样,每种方法都有自己的优缺点,都有自己适用范围。所以在设计程序时,一定要考虑各种方法,并从中选出最适合的来。不要以为这样很多余,也不要以为浪费了其他的设计方法,这个程序不适合,也许下一个程序刚好适合也不一定。有一句可能现在你还不能理解:算法没有好坏之分,只有适合和不适合的区别。”
木鸿飞度过了非常有意义的一天,他在展示自身计算机才能的同时也隐隐触及了计算机的博大精深,仅仅一个动画就牵涉若干的方法,而这还只是冰山一角。虽然不能立刻学会这些的知识,虽然不能马上消化这些的思想,但木鸿飞越发喜欢上计算机,今天他对计算机还只是懵懵懂懂,但是明天他一定能掌握计算机,因为木鸿飞就是为计算机而生。
3、论道(一)数学是基础
木鸿飞连续编写动画程序三天了,各种方式、各种图形都试过一遍,简单的动画已经不能提起他的兴趣,当然复杂的也设计不出来,暂时处于编无可编的状态,只好去咨询哥哥。
“我想设计游戏,或者开发一部动画片,做得到不?”木鸿飞脑海中浮现出变形金刚的画面。
“可以!完全可以实现。”哥哥斩钉截铁的回答。
“哦,耶!”自己设计情节,自己开发程序,自己导演一部动画片,木鸿飞想入非非,甚至开始恶意透支成功后的喜悦。
“那么我应该学习哪一本书呢?”幸好,木鸿飞没有完全被幻想冲昏头脑,没有忘记必须先学习才能实现梦想的道理。
“我想想。”哥哥来到书架前,目光不断地扫描上面满满的书本,然后从中间抽取了几本书,“首先要学习《数学分析》,一共三册,然后是《线性代数》,还有《计算机图形学》。当然这些都是基础,还远远不够,还有很多专业书籍要学,哦对了,至少还要学会一门语言,比如C语言等。”哥哥一丝不苟的回答,似乎在故意打击木鸿飞的气焰。
“这么多,要学多久?”木鸿飞大吃一惊。
“一般要大三才开始学习《计算机图形学》,这之后你就可以编写简单的图形。但是要设计一部动画片就不是这么容易了,还需要学习计算机图形的硕士研究生和博士研究生专业,时间不长,大概4~7年左右。当然做动画片,还需要有美术天赋,不然画出的东西丑不垃圾的,没有人会看。而且还要有导演方面的能力,这方面的我就不知道了。”哥哥继续一丝不苟的打击木鸿飞。
“不是吧,要那么久?”木鸿飞一百个不相信,“一本《计算机图形学》而已,现在学习也可以啊!为什么要大三才学习?”
“因为前面有很多基础课程要学,除了《数学分析》、《线性代数》,还有《操作系统》《数据结构》《离散数学》等等很多,还有就是大一大二要学好英语过四级。”哥哥说道。
“我可以先学《图形学》,同时再学看其他的教程啊,或者直接照敲别人的代码啊。”木鸿飞道。
“不行的,学习计算机必须要打好基础。”哥哥坐了下来,满脸郑重其事的神情:“你知道吗?时下计算机是最热门的专业,各大高校计算机专业都在扩招。你们上一届只有2个班,这一届扩大成4个班。很多原本没有计算机专业的学校也纷纷增设这门专业,我们专业开设是很早的,85年就有了,以前湖南只有3个学校有计算机专业,现在几个大的本科学校都开设了!还有,别只看眼前计算机专业毕业生多么好找工作,等4年后就不一定了!你们毕业时,肯定人满为患。而且很多非计算机专业,甚至包括文科的一些专业,也都开设了计算机编程课,甚至国家94年时还开设了计算机等级考试,这个考试主要针对非计算机专业的学生。也就是说,计算机势必成为一种工具,一种人人都会的工具,将来会计算机就如同拿驾照会开汽车一样普遍。那么,从大范围上讲,在如此多的懂计算机的人群中,你这个计算机专业的学生的优势在哪里?从小范围上将,在如此多计算机专业的学生中,你的优势在哪里?等你毕业时,怎么找一个好工作?一言以蔽之,怎样让你在计算机专业学生中最牛,你想过没有?”
“没有,”木鸿飞摇头,“我还没有读大学,当然没有考虑大学以后的事情。”
“那么我现在告诉你。首先我们计算机专业与其他非计算机专业相比,我们的优势就是专业基础课!我们开设了专业基础课,比如数据结构、操作系统等等,但其他专业没有,他们只开设了语言编程课。”哥哥顿了顿,然后问道:“你知道计算机专业的基础课程有哪些吗?”
“不知道。”木鸿飞一如既往的摇头。
“主要可以分为两大类,一类是数学基础课。”哥哥说道。
“数学课?”木鸿飞大为不解。
“对。数学课程。很多人不明白数学系和计算机系的关系,其实计算机系来源与数学,咱们计算机系以前是数学系的一个教研室,后来独立出去的。中国科学院很多计算机院士以前都是学数学的,还有计算机之父——冯·诺依曼,就是一个数学家。”哥哥细心的解释。
“数学在计算机中都有什么应用呢?”木鸿飞根据疑惑,不解的问。
“很多算法都需要数学。比如多媒体压缩,存储一张图片需要几兆空间,很耗费存储资源,怎么办?这时你提出一种算法,利用这种算法,可以把用几百K的空间存储几兆的内容。而要发明这个算法,就需要高深的数学知识,比如需要什么微积分知识啊,线性变换知识啊,等等。”
“再比如说这个问题,”哥哥从书架中抽出一本书,“有一个旅行家,立志要游遍祖国的大好河山,他决定先游览所有的省会城市,于是任意从一个省会出发,不重复的游遍所有的省会。现在问题来了,问他应该选择怎样的旅游线路,才可以使最后旅行的总路程最短?书的附录中给出了所有两个省会之间的直线距离,现在你来回答走哪条线路。”
“让我想想,”木鸿飞摸摸下巴,皱着眉头,“计算所有的可能的路径,从中间选择最短的。”
“很好,你的方法叫做‘列举法’,列举法的优点就是他的缺点,也就是根本不能列举所有的情况。”哥哥拿出一个计算器,“高中学习了排列组合,你算算一共有多少种可能的路径。”
“好的。总共34个省会,第一站有34种情况,第二站有33种情况,第三站有32中情况,这就是一个排列问题!所有的可能有P34种,也就是,”木鸿飞开始在计算器上面输入:“34乘以33,乘以32,乘以31,……,乘以,矣?动不了了,计算器死掉了!”
“哈哈,当然了,数目太大了!”哥哥一幅“早知如此”的神情,“这个数字已经有人算过了,大概是2.9乘以10的38次方!什么概念?假设计算机的运算速度是每秒钟百亿次——这个运算速度很快了——你自己算算需要多久才可以算完。”
“不用算了,肯定很大。”木鸿飞这回学聪明了。
“所以列举法行不通。”哥哥下结论,“即使计算机的运算速度在提高一百遍,也行不通!”
“那——就——”木鸿飞继续思考,转转眼睛,计上心来,“每次选择最近的没有访问的省会。”
“这种方法叫做‘贪心法’,贪心法是得不到好结果的。”哥哥说道。
“那我就不知道了,哥哥,你说最短路径是多少?”木鸿飞寻找放弃。
“我也不知道!旅行家问题就是《离散数学》中的最短路径问题,目前还没有人给出一种有效的方法。如果有人解决了这个问题,就可以立即评为教授!”哥哥说道。
“真的吗?这本书的作者评为教授没有?”木鸿飞狡诈的问道。
“他本来就是教授了!不用评。”哥哥回答道,然后指了指书本,“而且这本书给的距离已经不是最短的了。上次楼上有一位其他系的老师听我讲了这个问题后很感兴趣,把书借过去研究了很久,然后找到了一条更近的路径。他专门写了一篇论文,文后还对我表示了感谢!”
“是吗?他评为教授了!”木鸿飞问。
“没有。”哥哥摇摇头,“第一,他没有给出一种方法,而是乱找找到的。第二,这本书其实比较久了,现在已经有人给出了更加短的路径。”
“哦,给出更短路径的人评为教授了吗?”木鸿飞打破沙锅问到底。
“我不认识他们,不知道!”哥哥没好气的说道,“不要纠结评教授的事情了!跟你讲旅行家问题,就是要告诉你,数学是计算机的基础,要掌握计算机,学好数学必不可少!”
“数学是计算机的基础,”木鸿飞自言自语道,但马上提出了一个疑问:“假如说计算机专业的一类基础课程是数学,但问题是,一般来讲计算机系学生的数学不如数学系的好,既然如此,我们与数学系的相比,不就没有竞争优势了吗。”
“这个问题问的好,所以我们的计算机专业的第二类基础课程就是计算机专业课程。”哥哥说道。
预知后事如何,且听下回分解。
4、论道(二)计算机学习三宗罪之冒进
上文说道木鹏飞声明数学是计算机专业的基础,因此计算机专业学生必须学好数学,但木鸿飞却认为计算机系学生的数学知识一般不如数学系的,如何比数学系学生更学好计算机课程呢?
“这个问题问的好,所以我们的计算机专业的第二类基础课程就是计算机专业课程。”哥哥说道。
“呵呵,计算机专业的基础课程就是计算机专业课程,”木鸿飞重复哥哥的话,“比较啊拗口啊。”
“其他专业可能只开编程课,比如Pascal编、Matlib编程、C语言编程,但不会开设很多专业课程,比如《数据结构》、《操作系统》、《编译原理》、《汇编语言》、《数据库原理》等等。”看着木鸿飞又被一堆名词搞晕了,哥哥连忙解释:“虽然不学这些,也可以编程。但是如果想了解编程的原理,或者编写更快、更好、更稳定的程序,就必须要学习它们了。比如说数据结构,它关系到如何设计更优化的程序。同样一个程序,大家都会设计,但精通数据结构的人编出来的性能就要优化很多。这就是优势,计算机专业学生的优势。”
“其实计算机专业的优势主要体现在上下两头:下头是基础扎实,也就是学习了大量的专业课程;上头就是专业深入,主要用于硕士和博士,他们研究和学习了很多外专业并不涉及的计算机知识。不过专业深入对你们本科生来说不适合,所以计算机专业普通大学生欲比非计算机专业大学生更有优势,或者欲在同专业学生中脱颖而出,就必须精通专业基础!只可惜啊,很多计算机专业大学生没有看到这一点,一味的抨击学校开设的课程过于老土,一味的追赶时髦,用一些所谓时髦的工具,编一些所谓时髦的程序,把专业基础丢在一边置之不理!用一句时髦的话说,计算机专业学习在专业学习时,很容易犯三宗罪。”哥哥说道。
“哦,是哪三宗罪,说来听听。”木鸿飞急切的问道。
“第一宗罪,冒进,具体来讲就是一位追求‘时髦’知识,忽略专业基础知识的学习。大家都知道,现在是知识大爆炸年代,尤其是咱们计算机专业,知识更新速度特别快。昨天还使用5存盘,今天就改为3存盘,明天将流行光盘。知识应用不断的变化,所以很多同学就坐不住了,总以为学校里面开设的课程OUT了,于是拼命的追赶潮流。比如还不知《面向对象程序设计》为何物,就到处看MFC设计;把《数据结构》《计算机组成原理》等课程抛到一边,直接设计某某系统;《汇编语言》和《密码学》不学,就钻营黑客与破解。今天流行VC就去学习VC,明天听说Java有潜力就去看Java,后天打听到Windows编程有趣又改读Windows编程。追来追去,最终学校的课程没有学,基础没打牢,哪些所谓时髦的东西自然也读不懂,结果是什么都没有学到。”
“其实,造成这种现象的原因我们也知道,就是大家误以为学校开始的课程过时了,怕学习那些东西找不到工作,而学习那些流行的东西将来毕业时就可以轻松找到工作了。但是这种想法是严重错误的!”
“首先,空中楼阁的道理大家都懂,没有‘老土’的基础,如何能够学习‘时髦’的知识。其次,‘时髦’是发展变化的,今天时髦的东西,毕业时说不定早就打入冷宫没人用了。最后,即使你学会了某门‘时髦’的知识,但你能保证以后工作的单位就需要这门知识吗?也许你工作的单位根本就不涉及这个方向!”
“其实,整个大学阶段都应该是打基础,至于所谓的时髦专业知识,等毕业后再有的放矢去学习,会好得多。因为那些时髦的东西实在是太多了,大学阶段完全没有必要,也不可能学会和学好。不相信?举个例子,由于软件开发并不仅仅懂得编程就可以做好,还必须要懂得其他的业务知识。比如在专门为银行做软件的公司里干活,就必须要懂银行业务;在专门设计医疗软件的公司打工,就必须要了解医疗流程;如果设计炒股软件,就必须略知股票知识。虽然不需要你特别‘精通’成为‘专家’,但基本概念是要知道的,基本流程是要了解的。那么请问诸位计算机专业的同学,你在大学期间,是选择学习银行业务呢?还是医疗流程呢?或者股票知识呢?三样都学,估计没有这个精力。退一万步,姑且你好不容易呜呼哀哉学会了,也许毕业后你进入了一个专门做超市销售软件的公司,前面辛辛苦苦学的时髦知识都用不上。”
“再比如说,很多单位都有自己的业务范围和操作规范,也许会有专门在单位内部使用的规划库。例如A公司有自己的编程工具和函数库,它们是A公司上岗的必备知识,所有员工必须掌握。但问题是,这些所谓的知识仅仅在一个公司中有效,换一个单位则没有丝毫作用,请问:在大学期间提前学习这些知识有用吗?”
“但是大学课程实在是太拿不出手了,找工作时应该没有竞争力吧?”木鸿飞问道。
“你们以为应届生毕业笔试时,试题是什么?招聘单位会问考察很时髦很专业的问题吗?你们以为应届生毕业面试时,对方的期望值是什么?面试考官会希望毕业生曾经领衔开发某某大型项目吗?你们以为应届生刚刚参加工作时,用人单位就期望你们马上上手做业务,成为单位的骨干吗?”
“其实应届生有些太高估自己了,招聘单位一般都会有两套试题分别针对往届生和应届生,前者涉及很多专业知识和开发技巧,但后者一般都是数据结构试题!而且招聘单位从来就没有期望应届生是某某项目组长,他们看重是否在项目组里干过,是否了解一些项目开发的基本情况,至于项目组长,他们会作为人才引进,而不是从应届生中招聘。还有,单位招聘应届生后都会培养,都需要进行专门的业务培训,没有人指望应届生能立刻成为业务骨干。当然单位都希望能够缩短成长时间,而对于不必备成长指数的应届生也会无情的抛弃,所以与其在大学期间学习所谓的‘时髦’知识,不如扎实掌握专业基础,以便于在参加工作的后能够快速的充电,缩短成长时间,尽快成为业务骨干。”
“所以专业基础是要掌握的,所以学校开的课程是要学的!不要以为老师都是傻瓜,学校开设课程自然有他的道理,你想反驳也请先学懂了再反驳。至于担心毕业时没有竞争力,我有一个好办法。”哥哥说道。
“哦,是什么,快点说罗。”木鸿飞连忙问道。
“呵呵,如果你发三年时间打牢基础,根本不用担心找工作时会OUT!等大四的时候再到书店里去看,什么类型的书多就买什么,那些都是时下最流行的东西,发一年时间看看就可以了……”哥哥说道。
“一年时间会不会来不及学习。”木鸿飞又插嘴。
“时间足够了!事实上,只要你基础知识打扎实了,学习这些新东西很快的,他们就是在基础上的一些应用而已。比如说我们系里有个老师叫郑金野,以前从来没有研究多媒体,但是多媒体一出来,他马上就明白了,就是一些算法加一些特殊的设定和应用,很容易的。哪些叫嚣学校误导他们没有叫流行知识的学生,恰恰专业基础很不扎实。”哥哥说道。
“打牢基础真的能够快速学习新知识吗?新知识中真的都是基础应用吗?”木鸿飞还是将信将疑。
“不相信?你没有经历这一切,还没有切身体会,等以后你就会明白了。”哥哥也不继续说服。
“哦,那不说这个话题,讲讲第二宗罪吧。”木鸿飞说道。
欲知第二宗罪如何,且听下回分解。
5、论道(三)计算机学习三宗罪之浮躁
上文说道木鹏飞声明计算机学习的第一宗罪是不学习基础课程,并提示大一至大三学习学校开设的专业课程,可待大四毕业时再恶补时髦知识的观点。木鸿飞暂时不能理解,就继续咨询余下两宗罪。
“第二宗罪就是浮躁。表现在学习知识就是浮于表面,没有深入理解专业知识。表现在编程上就是只想编写一些所谓漂亮的、能够拿得出手的程序,而对于一些底层的支持程序置之不理。”
“有的同学喜欢编写一些漂亮的程序,比如设计漂亮的网页,使用某某工具开发某某‘大型’系统等等,当然这都是人之常情。正如鲁迅先生所说,文章写出来总是希望拥有更多的读者,除非是写给恋人的。程序编出来,总是希望拥有更多用户,除非是专门为爱人开发的。但问题是,只编写这类程序是不够的,是有缺陷的。”
“其一,这些所谓的程序,往往只需要对知识应用,并不需要刨根究底研究知识的本身,甚至有很多加入了很多相当专业的内容,并不适合于初学者学习。比如VC中的MFC就是一个典型的误导初学者的工具。利用MFC可以很方便的编写出DIAG界面程序或者视图文档程序,从表面上看风光无限,但对初学者却祸害无穷!假如使用VC学习C++,大部分时间将用于消息的处理,控件的处理,还要阅读大量的视图文档结构类库说明,这些操作将耗费了你大量的时间,得不偿失。而且VC++的大部分编程是在某些位置插入代码,至于C++部分系统自动实现了,留给你的是纯C语言操作。同学请注意,你学习的是C++,不是VC类库,也不是VC操作!”
“其二,编写这些程序,往往伴随大量的交互式界面设计。事实上,编程有个二八原则,即编写80%的核心内容将耗费你20%的时间,而另外20%的功能将耗费你80%的时间。不幸的是,那些漂亮的给人风光无限的东东恰好就是耗费80%时间的20%功能,得不偿失!”
“那我们到底该用什么工具,编写什么程序呢?”木鸿飞糊涂了。
“什么工具都可以,只要不涉及太多的花边操作就行。至于练习用的程序,最好是一些基础的、底层的实现,不要有太多花俏的图像和交互式操作。当然也可以设计一些简单的具备图形界面的小游戏,但此时你应该将精力更多注重于游戏本身的设计,而不是游戏的画面风格和动画效果上。”
“比如说数据结构中学习了有关链表、队列和栈等内容,如果你使用VC编程,你会发现VC提供了全部的数据结构,无需自己再去设计。一般的同学会大呼‘数据结构’无用论,认为很多语言工具都提供这些结构,何必自己再去设计一次!其实,这就是浮躁的表现!如果你处于工作中,可以名正言顺的使用这些提供的数据结构。但若还是学习,就不可以,请记住:学生编程序的目的是为了学习,而不是给谁谁谁使用!所以应该自力更生,亲自设计这些数据结构,在以后的程序中可以继续调用自己的设计,以求达到检测的效果。”
“再举个例子,这几天你编程序时应该用到了内存分配函数,就是那个malloc和free。一般人直接调用就行了,但是计算机专业的学生不应该止步于此,而应该思考这两个函数的系统实现方法,并且编程序模拟内存分配和释放。设计这样的程序,不但可以增强动手能力,还可以加深对计算机知识的理解,一举多得,何乐而不为。”
“但是很多同学不愿意这么做,因为设计自己的内存管理程序是一个相当枯燥的过程,不但没有任何趣味性,而且以后也不大可能会直接应用。花费大量的时间和精力去设计这样一个似乎毫无好处的程序,值得吗?青春男女,欢乐校园,载歌载舞,恋爱谈情。也许别的同学设计了漂亮界面正在享受荣誉的光环,也许有的同学编写了音乐程序正在向心仪的女孩表露心声,而你却在黑漆漆的窗口中苦苦修行,甚至连修行的结果也不足为外人道也。此情此景,你还耐得住寂寞吗?”
“耐不住也要耐!编写一些看上去很风光的应用程序实际上意义不大,毕竟你编程所使用的工具和库都是别人提供的的,甚至一些关键的控件也是第三方的,如果只知其然不知其所以然,你将永远被别人抢着鼻子走!别人提供的控件指东,你就不能朝西,别人提供的控件走路,你就不能跳跃,如果别人掐你脖子,不提供控件或库,你就只有干瞪眼了。所以要耐得住寂寞,沉得下心,别人不给控件,咱就原创,自力更生,艰苦创业,自己设计!”
“计算机界有一个35岁问题流程很广,就是说程序员最多只能做到35岁,然后就会被后来的新人淘汰掉。所以很多学生特别着急,担心10年之后会失业。其实这是瞎担心!
“对于浮躁的学生,由于他们没有学习到深层次有内涵的内容,往往流行一过,就只有失业或者转行了,根本不用等到35岁就有可能失业。所以计算机学习不可浮躁,只有用心学习,深挖知识,才能基础扎实,才可以深入理解计算机专业知识,从而达到‘他强由他强,清风拂山岗;他横由他横,明月照大江’的境界,万变不离其宗,管它什么流行,都能很容易的学会,很快的掌握。还有些同学,能够看穿程序的本质,既而由代码编写升级为系统设计,再升为系统分析,甚至完成从程序员到管理者的转变,35岁对于他们来说根本不是终结,而是辉煌的开始!”
“就拿数据库编程工具PowerBuilder举个例子吧,假设有两个学生,都对这个工具非常了解,对它的每一个系统函数都了如指掌,但是其中一个只会使用这个工具,而另一个却吃透了《数据库原理》一书。那么如果有一天,当PowerBuilder退出历史的舞台时(编者注:目前已经退出很久了),前者也只能无奈的退出,因为他不懂数据库原理,再从头学习一个全新的数据库编程工具,必定需要发费大量的时间,困难重重,。而后者则不一样,借助于数据库的相通性,他可以很快在新的数据库编程工具中找到熟悉的内容,减少新内容范围,加快理解,缩短学习时间,从而快速上手。这就是不浮躁、沉下心去学习编程的好处。”
“前不久有一个学生跟我说,他编了一个VCD播放器,请我过去show。我当时想,这是件了不起的事情啊!于是就去了。一看才知道,原来他只是使用Delphi编了一个界面,在上面设置了几个按钮,至于VCD播放的功能,全是一个第三方控件完成的!就这样还自称编了VCD播放器,真是可笑!不思自己弄懂,而到处寻找第三方支持,还到处卖弄,自以为是,就是浮躁的典型表现!”
“其实对我们来说,编程程序具有三重境界。同样以VCD播放器为例,第一重境界就如同上面的同学,核心技术使用别人的,自己只是做了一个外壳!第二重境界则学习VCD编码技术,亲自设计VCD解码程序,独立完成全部解码程序。第三重境界者则不光学习VCD编码技术,还分析其优缺点,并提出自己的视频压缩算法。你想成为第几重境界?”
“我要成为第三重境界。”木鸿飞大声说到。
“呵呵,有志气。第一重显然是不可取的,太丢人了。但是第三重吗,也太难了,只适合少数人,一般是研究生们考虑的内容,所以对于大部分本科学生应该以第二重境界为目标。当然以第三重为目标也没有错,但前提是要考上研究生!”
“我一定要考研究生!不过哥哥,你还是接着讲第三宗罪吧。”木鸿飞继续说道。
预知第三宗罪如何,且听下回分解。
文章的原始出处:http://zhuyunxiang.blog.51cto.com/653596/367051
文章原始出处
http://zhuyunxiang.blog.51cto.com/653596/367999
目录