|
计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三<br>年了,自己也做了一些思考,原先不管是国内还是国外都喜欢把这个系分为计算机软件理<br>论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术<br>。我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算<br>机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算<br>机专业),掌握简单的计算机技术都很容易(包括原先Major们自以为得意的程序设计),<br>但计算机专业的优势是:我们掌握许多其他专业并不"深究"的东西,例如,算法,体系结<br>构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算<br>机专业能够做出来的大型系统。今天我想专门谈一谈计算机科学,并将重点放在计算理论<br>上。 <br><br>1、计算机理论的一个核心问题-------------从数学谈起: <br><br> [1]高等数学Vs数学分析 <br><br> 记得当年大一入学,每周四课时高等数学,天天作业不断(那时是七天工作制)。颇<br>有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科学<br>与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不<br>见得有多大的问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如<br>网络安全学,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许<br>是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是从<br>实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出<br>来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干<br>条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活<br>中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论<br>联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学与技术的应当<br>本着这个方向)。 <br><br> 其实我们计算机系学数学仅学习高等数学是不够的(典型的工科院校一般都开的是高<br>等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数学分析<br>,我们学校计算机学院开的也是,不过老师讲起来好像还是按照高等数学讲),数学分析<br>这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程,<br>这对我们培养良好的分析能力和推理能力极有帮助。我的软件工程学导师北工大数理学院<br>的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作<br>,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推理能力,从所受训<br>练的角度上要远远在我们平均水平之上。当年出现的怪现象是:计算机系学生的高中数学<br>基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数学系,但学<br>完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错了也说不一定<br>,其中原因何在,发人深思。 <br><br> 我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别<br>则更大。通常非数学专业的所?quot;高等数学",无非是把数学分析中较困难的理论部分<br>删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去<br>的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓"工程数学"已经<br>彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现用现查<br>,何必费事记呢?再不然直接用Mathematica或是Matlab好了。 退一万步讲,即使是学高<br>等数学我想大家看看华罗庚先生的《高等数学导论》也是比一般的教材好得多。华罗庚在<br>数学上的造诣不用我去多说,但是他这光辉的一生做得我认为对我们来说,最重要的几件<br>事情: 首先是它筹建了中国科学院计算技术研究所,这是我们国家计算机科学的摇篮。在<br>有就是他把很多的高等数学理论都交给了做工业生产的技术人员,推动了中国工业的进步<br>。第三件就是他一生写过很多书,但是对高校师生价值更大的就是他在病期间在病床上和<br>他的爱徒王元写了《高等数学引论》(王元与其说是他的爱徒不如说是他的同事,是中科<br>院数学所的老一辈研究员,对歌德巴赫猜想的贡献全世界仅次于陈景润)这书在我们的图<br>书馆里居然找得到,说实话,当时那个书上已经长了虫子,别人走到那里都会闪开,但我却格外感兴趣,上下两册看了个遍,我的最大收获并不在于理论的阐述,而是在于他的理论完全的<br>实例化,在生活中去找模型。这也是我为什么比较喜欢具体数学的原因,正如我在上文中<br>提到的,理论脱离了实践就失去了它存在的意义。正因为理论是从实践当中抽象出来的,<br>所以理论的研究才能够更好的指导实践,不用于指导实践的理论可以说是毫无价值的。 <br><br> 我在系里最爱做的事情就是给学弟学妹们推荐参考书。没有别的想法,只是希望他们<br>少走弯路。中文的数学分析书,一般都认为以北大张筑生老师的"数学分析新讲"为最好。<br>张筑生先生一生写的书并不太多,但是只要是写出来的每一本都是本领域内的杰作,这本<br>当然更显突出些。这种老书看起来不仅是在传授你知识,而是在让你体会科学的方法与对<br>事物的认识方法。万一你的数学实在太好,那就去看菲赫金哥尔茨?quot;微积分学教程"<br>好了-------------但我认为没什么必要,毕竟你不想转到数学系去。吉米多维奇的"数学<br>分析习题集"也基本上是计算型的书籍。书的名气很大,倒不见得适合我们,还是那句话,<br>重要的是数学思想的建立,生活在信息社会里我们求的是高效,计算这玩意还是留给计算<br>机吧。不过现在多用的似乎是复旦大学的《数学分析》,高等教育出版社的,也是很好的<br>教材。 <br><br> 中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,<br>因为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京<br>大学林成森,盛松柏两位老师编的"高等代数",感觉相当舒服。此书相当全面地包含了关<br>于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内容,如St<br>urm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能吃透此书,<br>就可以算是高手。国内较好的高等代数教材还有清华计算机系用的那本,清华出版社出版<br>,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不过是代数系统<br>性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨论。然而莫先生<br>的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了一些再读。 <br><br> 正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习<br>的目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题<br>思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练自<br>己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系的同<br>学之间思维上的差距。 <br><br> [2]计算数学基础 <br><br> 概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的<br>东西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻辱<br>。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说清华<br>计算机系开有"随机数学",早就是必修课。另外,离散概率论对计算机系学生来说有特殊<br>的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校开设了单纯<br>的"离散概率论"课程,干脆把连续概率删去,把离散概率讲深些。我们不一定要这么做,<br>但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为好。 <br><br> 计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一<br>般学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像<br>可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数值<br>的为主。这门课有两个极端的讲法:一个是古典的"数值分析",完全讲数学原理和算法;<br>另一个是现在日趋流行的"科学与工程计算",干脆教学生用软件包编程。我个人认为,计<br>算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是很偏向于学好<br>理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力的书籍还是挺多<br>的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《<br>计算方法(Computational Methods)》,华中理工大学数学系写的(现华中科技大学),<br>这方面华科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方<br>面涉及了:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场<br>微分方程数值求解。李庆扬先生的那本则理论性过强,与实际应用结合得不太紧,可能比<br>较适合纯搞理论的。 <br><br> [3]也谈离散数学 <br><br> 每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。<br>不过,这么多内容挤在离散数学一门课里,是否时间太紧了点?另外,计算机系学生不懂<br>组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想的<br>状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现实,<br>因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数论。(<br>这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别谈谈上面<br>的三组内容。 <br><br> 古典集合论,北师大出过一本《基础集合论》不错。 <br><br> 数理逻辑,中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》就不错。现在<br>可以找到陆钟万教授的讲课录像http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自<br>己去看看吧。总的来说,学集合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深<br>不可测。 <br><br> 学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的《<br>Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。这<br>两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方面真正入了门<br>,也就不用再浪费时间听我瞎侃了。 <br><br> 据说全中国最多只有三十个人懂图论。此言不虚。图论这门科学,技巧性太强,几乎<br>每个问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,<br>它就能给你成就感。我的导师说,图论里面随便找一块东西就可以写篇论文。大家可以体<br>会里面内容之深广了吧!国内的图论书中,王树禾老师的"图论及其算法"非常成功(顺便<br>推荐大家王先生的"数学思想史",个人认为了解科学史会对我们的学习和研究起到很大的<br>推动作用)。一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非<br>常适合计算机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,<br>如Bondy & Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,<br>就马马虎虎,对本科生绝对足够了。再进一步,世界图书引进有GTM系列的"Modern Graph<br> Theory"。此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还<br>是读原版好(说实话,主要是亲身体验翻译版的弊端,这个大家自己体会)。搞定这本书<br>,也标志着图论入了门。 <br><br> 离散数学方面我们北京工业大学实验学院有个世界级的专家,叫邵学才,复旦大学概<br>率论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论<br>文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我专<br>门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中我又<br>深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我实在觉<br>得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书还要依据<br>个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的都一样了。<br>外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少?quot;紧跟时<br>代的理论知识"。 <br><br> 原先离散数学和数据结构归在一起成为离散数学结构,后来由于数据结构的内容比较<br>多,分出来了,不过最近国外好像有些大学又把它们合并到了一起,道理当然不用说,可<br>能还是考虑到交叉的部分比较多。比较经典的书我看过得应算是《Discrete Mathematica<br>l Structures》了,清华大学出版社有个影印版的。 <br><br> [4]续谈其他的一些计算数学<br><br> 组合数学我看的第一本好像是北大捐给我们学院的,一本外版书。感觉没有太适合的<br>国产书。还是读Graham和Knuth等人合著的经典"具体数学"吧,西安电子科技大学出版社有<br>翻译版。 <br><br> 《组合数学》,《空间解析几何》还有那本《拓扑学》,看这三本书的时候是极其费<br>事的,原因有几点,首先是这三本书无一例外,都是用繁体字写的,第二就是书真得实在<br>是太脏了,我在图书馆的座位上看,同学们都离我做得很远。我十分不自然,不愿意影响<br>同学,但是学校不让向外借这种书(呵呵,说起这是也挺有意思,别人都不看这种书,只<br>有我在看,老师就特别的关注我,后来我和他讲了这些书的价值,他居然把他们当作是震<br>馆之宝,老师都不许借,不过后来他们看我真得很喜欢看,就把书借给了我,当然用的是<br>馆长的名义借出去的。)不过收获是非常大的,再后来学习计算机理论时里面的很多东西<br>都是常会用到的。当然如果你没看过这些书绝对理解不到那个层次。拿拓扑学来说,我们<br>学校似乎是美开设这门课程,但是这门课程的重要性是显而易见的,没有想到的是在那本<br>书的很多页中都夹着一些读书笔记,而那个笔记的作者及有些造诣,有些想法可以用到现<br>代网络设计当中。 <br><br> 抽象代数,国内经典为莫宗坚先生的《代数学》。此书听说是北大数学系教材,深得<br>好评。然而对本科生来说,此书未免太深。可以先学习一些其它的教材,然后再回头来看<br>"代数学"。国际上的经典可就多了,GTM系列里就有一大堆。推荐一本谈不上经典,但却最<br>简单的,最容易学的http://www.math.miami.edu/~ec/book/这本"Introduction to Line<br>ar and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学<br>者来说非常理想,我校比较牛的同学都有收藏。 <br><br> 数论方面,国内有经典而且以困难著称摹冻醯仁?邸?(潘氏兄弟著,北大版)。再追<br>溯一点,还有更加经典(可以算世界级)并且更加困难的"数论导引"(华罗庚先生的名著<br>,科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,<br>对本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的书<br>,如Bach的"Introduction to Algorithmic Number Theory"。 <br><br> 计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确<br>实非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。算法<br>教材目前公认以Corman等著的《Introduction to Algorithms》为最优。对入门而言,这<br>一本已经足够,不需要再参考其它书。 深一点的就是大家作为常识都知道的TAOCP了。即<br>是《The Art of Computer Programming》3册内容全世界都能看下来的本身就不多,Gate<br>s曾经说过"若是你能把这书上面的东西都看懂,请把你的简历发给我一份"我的学长司徒彦<br>南兄就曾千里迢迢从美国托人买这书回来,别的先不说,可见这书的在我们计算机科学与<br>技术系中的分量。 <br><br> 再说说形式语言与自动机。我看过北邮的教材,应该说写的还清楚。有一本通俗易懂<br>的好书,MIT的sipser的 《introduction to theory of computation》。但是,有一点要<br>强调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译<br>前端已经是死领域,没有任何open problems,北科大的班晓娟博士也曾经说过,编译的技<br>术已相当成熟。如果为了这个,我们完全没必要去学形式语言-------------用用yacc什么<br>的就完了。北邮的那本在国内还算比较好,但是在深度上,在跟可计算性的联系上都有较<br>大的局限,现代感也不足。所以建议有兴趣的同学去读英文书,不过国内似乎没引进这方<br>面的教材。可以去互动出版网上看一看。入门以后,把形式语言与自动机中定义的模型,<br>和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫"宫<br>室之美,百官之富"! <br><br> 计算机科学和数学的关系有点奇怪。二三十年以前,计算机科学基本上还是数学的一<br>个分支。而现在,计算机科学拥有广泛的研究领域和众多的研究人员,在很多方面反过来<br>推动数学发展,从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样,这个孩子<br>身上始终流着母亲的血液。这血液是the mathematical underpinning of computer scie<br>nce(计算机科学的数学基础),也就是理论计算机科学。原来在东方大学城图书馆中曾经<br>看过一本七十年代的译本(书皮都没了,可我就爱关注这种书),大概就叫《计算机数学<br>》。那本书若是放在当时来讲决是一本好书,但现在看来,涵盖的范围还算广,深度则差<br>了许多,不过推荐大一的学生倒可以看一看,至少可以使你的计算数学入入门,也就是说<br>至少可以搞清数学到底在计算机科学什么地方使用。 <br><br> 最常和理论计算机科学放在一起的一个词是什么?答:离散数学。这两者的关系是如<br>此密切,以至于它们在不少场合下成为同义词。(这一点在前面的那本书中也有体现)传<br>统上,数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析,然后是复变<br>函数,实变函数,泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物理,化<br>学,工程上应用的,也以分析为主。 <br><br> 随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现<br>,这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续<br>的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机会<br>进行此类的计算。人们从而称这些分支为"离散数学"。"离散数学"的名字越来越响亮,最<br>后导致以分析为中心的传统数学分支被相对称为"连续数学"。 <br><br> 离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科: <br><br>1) 集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。 <br><br>2) 图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心<br>是算法,而大量的算法建立在图和组合的基础上。 <br><br>3) 抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊<br>讶地发现代数竟然有如此之多的应用。 <br><br>? 但是,理论计算机科学仅仅就是在数学的上面加上"离散"的帽子这么简单吗?一直到大<br>约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我再说<br>了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在这里有<br>两层含义: <br><br> 首先:对abstract而言。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问<br>题关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一<br>些数学。为了直接面向应用的需要,他要提倡"具体"的数学。在这里我做一点简单的解释<br>。例如在集合论中,数学家关心的都是最根本的问题-------------公理系统的各种性质之<br>类。而一些具体集合的性质,各种常见集合,关系,映射都是什么样的,数学家觉得并不<br>重要。然而,在计算机科学中应用的,恰恰就是这些具体的东西。Knuth能够首先看到这一<br>点,不愧为当世计算机第一人。其次,Concrete是Continuous(连续)加上discrete(离<br>散)。不管连续数学还是离散数学,只要是能与我们研究的内容挂上钩的都是有用的数学<br>! <br><br>2、理论与实际的结合-------------计算机科学技术研究的范畴与学习方法 前<br>面主要是从数学角度来看的。从计算机角度来看,理论计算机科学目前主要的研究领域包<br>括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算理论,并行<br>计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这些领域互相交<br>叉,而且新的课题在不断提出,所以很难理出一个头绪来。想搞搞这方面的工作,推荐看<br>中国计算机学会的一系列书籍,至少代表了我国的权威。下面随便举一些例子。 <br><br> 由于应用需求的推动,密码学现在成为研究的热点。密码学建立在数论(尤其是计算<br>数论),代数,信息论,概率论和随机过程的基础上,有时也用到图论和组合学等。很多<br>人以为密码学就是加密解密,而加密就是用一个函数把数据打乱。这样的理解太浅显了。<br> <br>现代密码学至少包含以下层次的内容: <br><br>第一,密码学的基础。例如,分解一个大数真的很困难吗?能否有一般的工具证明协议正<br>确? <br><br>第二,密码学的基本课题。例如,比以前更好的单向函数,签名协议等。 <br><br>第三,密码学的高级问题。例如,零知识证明的长度,秘密分享的方法。 <br><br>第四,密码学的新应用。例如,数字现金,叛徒追踪等。 <br><br> 密码学方面值得推荐的有一本《应用密码学》还有就是平时多看看年会的论文集,感<br>觉这种材料实用性比较强,会提高很快。 <br><br> 在分布式系统中,也有很多重要的理论问题。例如,进程之间的同步,互斥协议。一<br>个经典的结果是:在通信信道不可靠时,没有确定型算法能实现进程间协同。所以,改进<br>TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序,但因果序直到不久前<br>才有一个理论上的结果....例如,死锁没有实用的方法能完美地对付。例如,......*作系<br>统研究过就自己去举吧! <br><br> 如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。事<br>实上,在理论之外,计算机科学还有更广阔的天空。 |
|