paradisor 的个人资料paradisor's paradise照片日志列表 工具 帮助

日志


8月5日

猫新作:计算机科学趋势之我谈

OIERS 必读:计算机科学趋势之我谈。。。(0804062021 加量不加价版) (More! 240 Reads)
Posted by: 穿靴子的猫 (IP Logged)
Date: August 03, 2006 05:33PM


常有热血青年问我计算机科学还有啥搞头。

首先我们回顾一下计算机科学的“机械黄金时代”——5/60 年代。这个年代是研究“简单
机械”数学对象的淘金时代。这些数学对象包括:字符串,数列,集合,树,图等等。它
们的特点是:1. 最简单、最机械,就像数学里的"一元一次方程"、物理里的“定滑轮动滑
轮”一样初等。同时这个时代的大背景是应用数学的大发展(冷战时代两个阵营要拼谁的
军事和生产活动达到最优化),因此 2. 这些对象不同于其他纯数学的基本对象在于他们
有强烈的现实应用性。有了什么样的研究对象就决定了会有什么样的研究成果(算法/方法
/原理/应用)。比如,如果研究对象是字符串,就很容易发现我们有实际需求的操作有 压
缩、加密、查找子串 等,于是大浪淘沙,我们有了 ZIP, RSA, KMP 这些堪称经典的结果
;而那些有用但没有有效解法的问题,几乎都被证明是 NPC 的。。。这样,走得通的路都
走通了,走不通的路都被证明是走不通的。。

除了简单机械对象的相关算法设计外,过去几十年同时也是人工智能基本问题的黄金时代
。这些基本成果在它们所在体系中的“根本性”就像牛顿的成果在经典力学体系中的“根
本性”一样,是后人无法再超越的。。。人工智能的一个目的是对“模糊”(非形式化)
信息"形式"的理解,也就是说我们表达的内容可以有各种表现形式:自然语言文本,语音
,图像,影像。对他们的分析(analysis)往往比合成(synthesis)要困难。我举一个非
常典型的例子:语音识别(speech recognition)是对语音数据的分析,语音合成(spee
ch synthesis)是合成,后者的实际成功大得多。要分析我们就不可避免要知道牵涉到的
背景知识(分为“规则 (rules)”和“案例 (cases/samples/examples)”两种,一个案例
就是一个特殊的经验,可以看作一个适用范围最小的规则),还有如何把这些背景知识用
于我们要识别的数据,这又分为两种态度:按逻辑推理 (logic-based reasoning) 和不要
求有严密逻辑推理关系的模糊式、统计式联系(statistical methods 或叫 connectivis
m,就是把“因”和“果”用经验联系起来(知其往往然)而不是用逻辑推理关系联系起来
(知其所以然)),比如初中里的几何证明就是严密的逻辑推理,而 Google 仅仅找到那
些紧密出现你的 keywords 的文章片断就是统计式、模糊式处理,就
像总设计师说的“宜粗不宜细”。根据具体问题的具体条件,两种态度各有所长。人工智
能的另一个目的是对信息“内容”的处理和再创造。前面我们说的是把同一个内容的数据
从一种形式变到另一种形式,比如把一句话从语音形式变到文本形式、把一句话从中文翻
译到英文,其实内容不变。那么对内容本身我们可以做什么有用的操作呢?一方面,我们
可以把内容表示成一种形式化的知识表示,用上面提到的 logic-based reasoning 来推出
新的有用结论。这种操作的局限性在于计算机只能用我们给出的知识反复演绎;尽管我们
可以加入统计性的因素让推理更灵活(同时降低了结果的准确性),但仍然受限于有限的
形式化知识。另一方面,我们可以不拘泥于形式化的知识表示与推理,而是让计算机和人
混和起来思考问题。这时,我们不要求概念和概念之间的可能关系被 完全形式化,但我们
往往还是要求“一个概念只有一个命名”。典型的这种知识表示就是 Wikipedia,它的每
个文章都是一个概念,有唯一的命名(或明确声明多个命名等价),而文章之间的超链接
(不明确表示的关系)使 Wikipedia 成为一个概念的网络。由于概念之间关系的不明确,
我们不说它是一个语义网络(semantic network,知识表示的最重要
方法,与 first-order logic、frames 等价),而是一个概念网络(ontology,即一些概
念的集合,每个概念都有严格的命名)。概念命名形式化而概念关系非形式化的本性决定
了这种东西可以让人和计算机相结合完成某些任务。比如,我心里有一个 idea X,我想知
道它是否已经被别人提出过了,如果被别人提出过了那么它的命名是什么。这是一个很有
实际意义的问题,比如申请专利之前你要查找前人是否已经公布过类似 idea,比如你不知
道一个概念在英语中如何表达(如果这个概念在你的母语中没有一个专门的术语 A 或者虽
然有 A 但是你的双语词典不能为你直接建立 A 到英语对应表达 A' 的映射。。。)。此
时我们就可以基于一个 ontology 如 Wikipedia 来间接寻找 X 的所在。例如我们要找“
热插拔”的英文说法(假设不存在“热插拔”的中文条目),我们可以先想象一下它有什
么特别相关的概念,我们想到“即插即用” (plug and play),因为这两个概念是可比较
的两种硬件安装规格。于是我们先进入英文 Wikipedia 条目“plug and play”: http:/
/en.wikipedia.org/wiki/Plug_and_play  然后我们发现该文章中比较了即插即用和一个所谓“true hot swapping”的相同和不同。通过文章对这个 hot swapping 的描述,我们有很大把握认为它就是我们要找的“热插拔”。我们可以进一步用
这个关键词在其他文献中确定它就是热插拔。这个问题跟查双语字典正好相反,双语字典
是你给出一个已知的母语术语 A,它告诉你 A 对应的未知的外语术语 A' 以及 A' 的未知
的定义 Def_A',而我们刚才说的这个问题是已知一个概念的定义 Def_X,如何知道这个概
念在某个语言中的的命名 Name_X。这又叫 reverse dictionary lookup.

综合以上两段,我们想想我们当代应该研究什么。显然我们不应该再去研究简单机械对象
,那是口枯井(当然如果你不以“有实际用途”为导向去选择研究对象,你完全可以去研
究 100 个方块组成的俄罗斯方块图形有几种(这个美国人 60 年代也研究过了,呵呵)、
人为设计一个类似五子棋的棋类游戏然后研究其制胜策略(这就是所谓趣味数学成果,因
为研究对象可以无穷制造,所以总有研究的空间;这也是为什么某数学家(好像是丘成桐
)教育我们要研究自然界的数学模型而不是那些人工制造出来的数学对象。就算 Knuth 这
种至少有 KMP 这样经典的有用简单机械成果的大牛,也在 70 年代百无聊赖之际研究过游
戏“大智之人”(Mastermind,又叫“猜数字”);而且比尔盖茨在 70 年代哈佛退学以
后还兴致勃勃地研究过翻烧饼的组合数学问题 [1][2];MIT 有个很年轻的加拿大计算机教
授 Erik Demaine,现在华人学者热衷于提起他,他做的最有特色的研究之一是折纸中的计
算机学问。。))。就连在简单机械算法世界里浸淫了几十年的 Knuth 也在 2001 年接受
采访说:“如果。。。人生从头来过,我现在愿意做一个研究机器人学或生化的研究生。
。。理论计算机科学。。。经过五十年的爆炸性发展后,很难想象还有多少发展空间。我
不认为现在对以前的经典结果作小的优化有多大意义。当然我不
能完全否定计算机科学继续发展的可能性,但这种可能性跟生物学是无法相提并论的。。
。计算机科学经过五十年就发展殆尽,而生物学却很容易就提供给我们足够研究 500 年的
问题,两者差距是如此巨大。”[10][12] 有人问,那么计算机科学不是还剩那个圣杯——
“P?=NP”么?让我们看看 Knuth 2002 年在奥斯陆大学的“All Questions Answered”演
讲中是怎么说的:“。。。就算 P==NP,仅仅知道一个问题有多项式时间算法是没有实际
意义的,因为那个指数可能大得超过计算能力。因此也许我们从一开始就不应该提出 P?=
NP 这个糟糕的问题。”[11]在这次演讲中 Knuth 还特别强调要“阅读大师的思想” (Re
ad the masters)。在 2001 年慕尼黑大学另一次同名的演讲[12]中,Knuth 干脆认为“P
?=NP 可能是 Godel 所说的‘不可证明的定理’之一”。

所以我们可以想到,我们当代要研究的对象必然是更复杂的,或者机械的数学世界以外的
活生生的现实问题。比如在劳动人民的生活中,自然语言是全球化背景下一个突出的问题
,同时也是足够复杂的对象;比如股票市场的预测(按道理说这需要计算机知道足够多的
背景知识和内幕消息,因此我对那些统计学者用统计过分简化整个事情是非常鄙视的);
比如宏观经济/社会;比如自然科学如生物、纳米里的复杂结构和功能;比如复杂工程学如
导弹防御系统、机器人、航天;比如经济中的供求双方信息不对称问题(你想找某个很窄
的领域的知识或真人专家,你如何跟这个知识或专家接上头?特别是当这个“很窄的领域
”尚没有特定学名时?这又回归到了我上面说的 reverse dictionary lookup 问题:在对
应的 Wikipedia 页面上留下相关知识和真人专家的联系方式。而作为“卖方”,一个真人
专家如何拓展他的业务范围?他可以观察自己当前领域周边的 wiki 文章是否也可以让自
己去“坐堂”;一个自主学习的学生如何决定自己下一步学什么/研究什么?也是同样道理
。);比如让计算机半自动的穷举、推理、归纳、联想出新的创新机会。

还有一个关键的非技术问题,就是作为学科竞赛中的佼佼者或者感兴趣的小有所成者,如
何展开研究?为什么中国出了那么多大牛前辈却少有知名的研究?第一,OI 中获取的知识
就是上面说的“简单机械世界中的对象及其操作”。OIERS 不管是中级还是顶级选手,主
要擅长的仅限于此,当然我们决不能否定我们向其他空间拓展的潜力。而且我认为大多数
 OIERS 都有作出很好研究的潜力。第二,研究的过程不是工程开发或生产,没有固定日程
安排,而是一种商业投机行为,因此需要极大的自由、自主权。投机能力可以通过考虑做
个商业产品来锻炼。一个对机会主义、个人主义、自由主义没有很好的理论觉悟和运用的
人,或者一个受到现实中给定学习方向、研究方向、研究日程所桎梏的人,作不出好研究
。为此我专门另起一段。第三,要培养很好的哲学思辩能力,特别是归类、归纳、观察能
力,而不仅仅是死板的推理能力。我突然想,如果我们去看看大学的哲学教材,看看它如
何把一套歪理邪说讲得头头是道、自圆其说,也是一种哲学思辩能力。培养哲学能力的方
法可以是常常思考一些自然的、社会的、没有严格公理的现象,比如自然语言的本质表示
,比如民族主义和自由主义本质是什么 [3],比如当代世界的经济格局以及其背后的技术
决定因素。要博学,要有广泛的兴趣,要喜欢百科全书,接受通识、
开放的教育而不是应试教育。推理能力在一个基础已经形式化的封闭体系如纯数学里是很
重要的,而观察、归类、归纳能力则有助于我们研究开放性的事物,比如我现在已经有了
一个点子,但是我发现别人已经提出过了,就这个点子本身其内在关系和本质的研究已经
很成熟,已经自成一个独立的系统,那么我如何去发现这个系统做不到、解释不到的现象
,从而扩展这个系统?电影《美丽心灵》里就有经典的例子:亚当斯密已经建立了零和博
弈的经济学理论,这个理论已经自成系统,甚至已经被形式化,如果你仅仅用逻辑推理想
有所新发现,你必然会在这个封闭的体系里打转转。如果你想有所创新,就必然要到盒子
外面去想(think outside the box),这就需要观察该系统无法解释的现象,并归类、归
纳出新的规律,于是纳什才归纳出“共赢”现象的博弈规律,跳出了亚当斯密设计的盒子
。从盒子外面看,亚当斯密的盒子就成了“incomplete”的了。还有一种研究方法叫“没
事找事”,就是故意(而且是先于经验观察)跟前人唱反调,比如非欧几何。要善于观察
善于表达,比如看看我是怎么写这篇文章并把我要说的内容归类成段的。哲学是凌驾于死
板推理的,是一切思想成果的背后机制,哪怕是数学研究也是要有哲学
领悟能力的。我国的应试教育强调服从既定方针(就像一个体系里的公理和定理)式的推
理能力,打击了我们自由观察、探索、思考体制外的外层空间现象的积极性。而西方由于
崇尚自由主义,勇于探索现有知识体系以外的“非理性世界”,做成败莫测的冒险,甚至
敢于相信有 beyond 我们观察能力的 God 的存在,有了这种对哲学的坚持,才不断从盒子
内的科学走向盒子外的科学。第四,以往的顶级 OIERS,由于一没有投机的经验和物质回
报的滋润(最近听说一句话叫“钱是英雄胆”)、二没有自由探索 自主研究方法 的机会
(IOI 完了往往上国内大学,学的是古人的最终思想产品(end product)如微积分和简单
机械算法而没有学到或者自己悟到思想不断向外发展的哲学和方法论(方法论就是某个哲
学思想的具体可操作化),他们高中被高考或 IOI 所驱使、大学本科被出国读研究生所驱
使、读研究生时被研究生文凭所驱使,内心并没有时间真正去长期观察盒子外的东西,而
到了公司里,又被工作业绩和生存压力所驱使。)因此一直无法改变“大家都不知道怎么
研究”的传统、三是某些人本来就没有兴趣投资时间去观察没有把握的事物——他们喜欢
走保守稳定的职业生涯(如 CS -> Data Mining -> 搜索引擎公司 ->
 Statistics -> Accounting -> 华尔街),很大程度上是因为我们的应试教育鼓励了保守
稳定的态度——针对我给你的价值观(考试大纲)优化你自己,你就能得最高分。所以,
不要指望那些愿意为高分而努力的人会平白无故就突然放弃“稳定压倒一切”去中途追求
他们认为风险很大的“改革开放”。有人问,你说的这两种态度(稳定压倒一切 和 冒进
),难道真的是水火不容、鱼与熊掌不可兼得?非也。关键是:循序渐进,逐步提高投资
和回报的高度。首先建议学生们在寒暑假做个信息技术产品(软件、网站)或服务(服务
不能太花时间,否则扰乱你的长期研究,最好是时间由你选择的 freelance (打零工))
,取得经济独立,然后就能投入自己真正感兴趣的追求。有人还要问“文凭怎么办”。确
实,engineering degree 是大多数人出国、工作的必备,这一点我以后再写文章讨论。如
果你没有魄力,权宜之计是,争取到香港等地的大学学习,因为虽然都是 degree,过程不
同:一个是稳定压倒一切推着你走,一个自由度更大吧。如果你有魄力,且不去说 Bill
Gates,就看看我们熟悉的 BitTorrent 的发明者 Bram Cohen 的故事[4]吧。相似的现代
故事我还能举出一些,比如 Google 的 Glen Murphy,他的 Blogger
 Web Comments 表现了一个很有内涵的应用。如果我大张旗鼓的鼓吹 no degree,很多人
肯定不认同。但是据我了解,至少在计算机科学和应用数学领域,如果你想做纳什,你必
须学着他说“Class will dull your mind, destroy the potential for authentic cre
ativity.”某一次我代一个信息学奥林匹克国际集训队的队员到 comp.theory 上问作业[
5],结果被上面的美国教授们骂得狗血喷头,什么“自己不好好学,到这里来问”云云,
美国的计算机大学教育之严格(=不自由)可见一斑。这也难怪 ACM 近年颁发的图灵奖是
一年比一年烂。我看过四年的 ACM TechNews [6],发现美国主流计算机学术界总是沉湎于
旧的知识体系不能自拔,总是围绕着 security 等陈旧的话题,或者是 voting machines
, RFID 这些所谓新潮的浅薄话题,目的只有一个:好捞联邦政府的研究拨款。所以我最近
几个月都不看了。学术界怀旧无能,反倒是 Bram Cohen 这样的毛头小伙能出新意,引得
 Microsoft(代表计算机工业界)的研究员去“改进” BitTorrent,结果被他批判为“A
ll talk and no work” [7],和 Stanford (代表计算机学术界)请他去演讲 [8][9]。

这一段本来要讲自由主义、掌握自主思想的权利(也就是有权胡思乱想),结果很多内容
都在上一段讲了。思想就像是一棵棵树,重在不同。你的思想往那个方向长,结果如何我
看到了,因此我不想重复你的想法,我要有意无意、有理无理地朝这边长,朝没人长到的
空间去分枝。这种思想方法,就是自由主义。我上 F 大时,本想借着独立研究成果来挑起
 T 大和 F 大在求新求异上的竞争,现在看来,还需要一个个个人的带头作用。三年来,
我越来越认识到自由主义对创新的必要性,这可以在我的研究经历和成果中体现出来。用
一句斩钉截铁的话说就是:“自由不实现,创新不能谈”。


后记:莱布尼兹的四大梦想和我的人类四大信息自由

机械计算机理论之父莱布尼兹有四大梦想[13],其中一些现在已经实现了:
1. Encyclopaedia - 全世界人民集体编写的、用非形式语言(自然语言)表达的一部百科
全书。这就是今天的 Wikipedia。
2. Universal Language - 一个全人类普遍使用的非形式语言。关于这个曾经有过 世界语
、逻辑语(Lojban)等尝试。
3. The lingua characteristica - Universal Language 的形式化版本,同时也是 Ency
clopaedia 的形式化版本。如现在 First Order Logic + Cyc。
4. The calculus ratiocinator - 自动推理一个 lingua characteristica 命题是否成立
的机器,如现在的 Prolog。

我认为信息技术应该提供一个现代人以下四大信息自由:
1. 物理上连通的自由——已知一个人/信息资源的地址就能无阻碍的访问这个资源:就是
现在的互联网;
2. 跨自然语言沟通的自由——能在软件的辅助下与一个讲自己不懂的自然语言的人准确地
沟通,实现方法是消息经过一个形式化语言中转;
3. 跨越说法差异,连接本质相同的思想的自由——不管两个人对一个思想的具体说法(表
达形式)有多不同,只要思想语义本质相同,那么这两人就能够建立联系,也就是上面说
的 reverse dictionary lookup;
4. 连接问题和解决方案的自由——对于给出的任何问题,计算机都能通过人类现有知识和
自动推理给出解答;或者如果计算机无法独立求解,至少告诉我解决此问题牵涉的人类现
有知识有哪些。

[1] http://en.wikipedia.org/wiki/Pancake_sorting
[2] http://scholar.google.com/scholar?sourceid=mozclient&ie=utf-8&oe=utf-8&q=Bounds+for+Sorting+by+Prefix+Reversal
[3] http://www.bytecool.com/ioiforum/read.php?1,3695,3695#msg-3695
[4] http://www.wired.com/wired/archive/13.01/bittorrent.html
[5] http://groups.google.com/group/comp.theory/browse_frm/thread/c37b7f0585f8d823/c7c343e8a07028b3?nk=gst&q=k-ary+tree&rnum=2#c7c343e8a07028b3
[6] http://technews.acm.org/current.cfm
[7] http://bramcohen.livejournal.com/20140.html
[8] http://www.stanford.edu/class/ee380/Abstracts/050216.html
[9] http://stanford-online.stanford.edu/courses/ee380/050216-ee380-100.asx
[10]http://www-helix.stanford.edu/people/altman/bioinformatics.html#12
[11] http://www.tug.org/TUGboat/Articles/tb23-3-4/tb75knuth.pdf
[12] http://www.ams.org/notices/200203/fea-knuth.pdf
[13] http://www.rbjones.com/rbjpub/philos/history/xh003-m.html

-------------------------
Operation Chinese Freedom

Edited 53 time(s). Last edit at 08/04/2006 08:25PM by 穿靴子的猫.

12月4日

网上发现的两篇对计算机学习的漫谈

感觉不错,但是出处几乎不可考了
 
[计算机]胡侃学习(理论)计算机(zz)
reverie 发表于 2004-12-19 12:12:00 
发信人: sir(sir), 信区: Mathematics. 发信站: 南大小百合
    
      记得当年大一,刚上本科的时候,每周六课时数学分析,六课时高等代数,天天作业不断(那时是六日工作制)。颇有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是(当时的)南大计算机系。系里的传统是培养做学术研究,尤其是理论研究的人。而计算机的理论研究,说到底了就是数学,虽然也许是正统数学家眼里非主流的数学。
      数学分析这个东东,咱们学计算机的人对它有很复杂的感情。爱它在于它是第一门,也是学分最多的一门数学课,又长期为考研课程--94以前可以选考数学分析与高等代数,以后则并轨到著名的所谓“工科数学一”。其重要性可见一斑。恨它则在于它好像难得有用到的机会,而且思维跟咱们平常做的这些离散/有限的工作截然不同。当年出现的怪现象是:计算机系学生的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数学系,但学完之后的效果却几乎是倒数第一。其中原因何在,发人深思。
      我个人的浅见是:计算机类的学生,对数学的要求固然跟数学系不同,跟物理类差别则更大。通常非数学专业的所谓“高等数学”,无非是把数学分析中较困难的理论部分删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓“工科数学一”已经彻底地走进了魔道。记上一堆曲面积分的公式,难道就能算懂了数学分析?
      中文的数学分析书,一般都认为以北大张筑生老师的“数学分析新讲”为最好。我个人认为南大数学系的“数学分析教程”也还不错,至少属于典型的南大风格,咱们看着亲切。随便学通哪一本都行。万一你的数学实在太好,这两本书都吃不饱,那就去看菲赫金哥尔茨的“微积分学教程”好了--但我认为没什么必要,毕竟你不想转到数学系去。
      吉米多维奇的“数学分析习题集”也基本上是计算型的东东。如果你打算去考那个什么“工科数学一”,可以做一做。否则,不做也罢。
      中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。当年我们用林成森,盛松柏两位老师编的“高等代数”,感觉相当舒服,我直到现在还保留着教材。此书相当全面地包含了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的比较深的内容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能吃透此书,就可以算高手。后来它得以在南大出版社出版,可惜好像并轨以后就没有再用了。
      国内较好的高等代数教材还有清华计算机系用的那本,清华出版社出版,书店里多多,一看就知道。特点嘛,跟南大那本差不太多。
      但以上两本书也不能说完美无缺。从抽象代数的观点来看,高等代数里的结果不过是代数系统性质的一些例子而已。莫宗坚先生的“代数学”里,对此进行了深刻的讨论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了一些再读。
      概率论与数理统计这门课很重要,可惜少了些东西。少了的东西是随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说清华计算机系开有“随机数学”,早就是必修课。人家可是工科学校,作为自以为“理科计算机系”出身的人,我感到惭愧。
      另外,离散概率对计算机系学生来说有特殊的重要性。现在,美国已经有些学校开设了单纯的“离散概率论”课程,干脆把连续概率删去,把离散概率讲深些。我们不一定要这么做,但应该更加强调离散概率是没有疑问的。
      计算方法是最后一门由数学系给我们开的课。一般学生对这门课的重视程度有限,以为没什么用。其实,做图形图像可离不开它。而且,在很多科学工程中的应用计算,都以数值的为主。这门课有两个极端的讲法:一个是古典的“数值分析”,完全讲数学原理和算法;另一个是现在日趋流行的“科学与工程计算”,干脆教学生用软件包编程。南大数学系的几位老师做了件大好事,把前者的一本极为经典的教材翻译出版了:德国Stoer的“数值分析引论”。如果你能学会此书中最浅显的三分之一,就算没有白上过计算方法这门课!而后一种讲法似乎国内还没有跟上潮流?不过,只要你有机会在自己的电脑上装个Matlab之类,完全可以无师自通。
       本系里,通常开一门离散数学,包括集合论,图论,和抽象代数,另外再单开一门数理逻辑。这样安排,主要由于南大的逻辑传统:系里很多老师都算莫先生的门人,就连孙先生都是逻辑专业出身(见孙先生自述)。
      不过,这么多内容挤在离散数学一门课里,是否时间太紧了点?另外,计算机系学生不懂组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。
      从理想的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数论。
      不管课怎么开,学生总一样要学。下面分别谈谈上面的三组内容。
      古典集合论,北师大出过一本“基础集合论”不错。南大出版朱梧(木贾)老师的“集合论导引”也许观点更高些,但他的书形式化得太厉害,念起来吃力。
      数理逻辑,莫先生的书自然是经典。然而我们也不得不承认,此书年代久远,光读它恐怕不够。尤其是命题/谓词演算本身有好多种不同的讲法,多看几家能大大开阔自己的视野。例如陆钟万老师的“面向计算机科学的数理逻辑”就不错。朱老师也著有“数理逻辑教程”一书,但也同样读起来费力些。
总的来说,学集合/逻辑起手不难,但越往后越感觉深不可测。建议有兴趣的同学读读朱老师的“数学基础引论”--此书有点时间简史的风格,讲到精彩处,所谓“天花乱坠,妙雨缤纷”,令人目不暇接。读完以后,你对这些数学/哲学中最根本的问题有了个大概了解,也知道了山有多高,海有多深。
      学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的"Introduction to Axiomatic Set Theory"和"A Course of Mathematical Logic"。这两本都有世界图书的引进版。你如果能搞定这两本,可以说在逻辑方面真正入了门,也就不用再浪费时间听我瞎侃了。:)
      据说全中国最多只有三十个人懂图论(当年上课时陈道蓄老师转引张克民老师的话)。此言不虚。图论这东东,技巧性太强,几乎每题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它就能给你成就感。所以学图论没什么好说的,做题吧。
      国内的图论书中,王树禾老师的“图论及其算法”非常成功。一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,如Bondy & Murty的“图论及其应用”,邮电出版社翻译的“图论和电路网络”等等,就马马虎虎,对本科生足够了。
      再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。此书确实经典!国内好像还有一家出版了个翻译版。不过,学到这个层次,还是读原版好。搞定这本书,也标志着图论入了门,呵呵。
      组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典“具体数学”吧,有翻译版,西电出的。
      抽象代数,国内经典为莫宗坚先生的“代数学”。此书是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一些其它的教材,然后再回头来看“代数学”。国际上的经典可就多了,GTM系列里就有一大堆。推荐一本谈不上经典,但却最简单的,最容易学的:http://www.math.miami.edu/~ec/book/ 这本“Introduction to Linear and Abstract Algebra”非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想。不过请注意版权问题,不要违反法律噢。
      数论方面,国内有经典而且以困难著称的“初等数论”(潘氏兄弟著,北大版)。再追溯一点,还有更加经典(可以算世界级)并且更加困难的”数论导引“(华罗庚先生的名著,科学版,九章书店重印)。把基础的几章搞定一个大概,对本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的书,如Bach的"Introduction to Algorithmic Number Theory"。
      理论计算机的根本,在于算法。现在系里给本科生开设算法设计与分析,确实非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。
      算法教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言,这一本已经足够,不需要再参考其它书。南大曾翻译出版此书,中文名为“现代计算机常用数据结构与算法”。pie好像提供了网上课程的link,我也就不用废话。
      最后说说形式语言与自动机。我们用过北邮的教材,应该说写的还清楚。但是,有一点要强调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译前端已经是死领域,没有任何open problem。如果为了这个,我们完全没必要去学形式语言--用用yacc什么的就完了。北邮的那本,在深度上,在跟可计算性的联系上都有较大的局限,现代感也不足。所以建议有兴趣的同学去读英文书......不过英文书中好的也不多,而且国内似乎没引进这方面的教材。
      入门以后,把形式语言与自动机中定义的模型,和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫“宫室之美,百官之富”!
 
 
 
[计算机]胡侃学习计算机--理论之外(zz)
reverie 发表于 2004-12-19 12:12:00 
发信人: sir(sir), 信区: Mathematics. 发信站: 南大小百合
 
      如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。事实上,在理论之外,计算机科学还有更广阔的天空。我一直认为,4年根本不够学习计算机的基础知识,因为面太宽了……
       一个一流计算机系的优秀学生决不该仅仅是一个编程高手,但他一定首先是一个编程高手。
我上大学的时候,第一门专业课时程序设计,现在好像改成了计算机科学导论?不管叫什么名字,总之,念计算机的人就是靠程序吃饭。
      去年在计算机系版有过一场争论,关于第一程序设计语言该用哪一种。我个人认为,用哪种语言属于末节,关键在养成良好的编程习惯。当年老师对我们说,打好基础后学一门新语言只要一个星期。现在我觉得根本不用一个星期--前提是先把基础打好。
      数据结构有两种不同的上法:一种把它当成降低要求的初级算法课,另一种把它当成高级的程序设计课。现在国内的课程好像介乎两者之间,而稍偏向前者。我个人认为,假如已经另有必修的算法课,恐怕后一个目的更重要些。
      国内流行的数据结构书也有两种:北大的红皮书(许卓群等著,高教版)和清华的绿皮书(严蔚敏等著,清华版)。两书差距不大。红皮书在理论上稍深一些,当然离严格的算法书还差好远。绿皮书更易接受些,而且佩有一本不错的习题集,但我觉得它让学生用伪代码写作业恐怕不见得太好。最好还是把算法都code以后debug一番,才能锻炼编程能力。
      汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好,也占不到什么便宜。这两门课之间的次序也好比先有鸡还是先有蛋,无论你先学哪门,都会牵扯另一门课里的东西。所以,只能静下来慢慢琢磨。这就是典型的工程课,不需要太多的聪明和顿悟,却需要水滴石穿的渐悟。有关这两门课的书,电脑书店里不难找到。弄几本最新的,对照着看吧。
      模拟电路这东东,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想软硬件通吃,那么建议你先看看邱关源的“电路原理”,也许此后再看模拟电路底气会足些。教材,康华光的“电子技术基础”还是不错的。有兴趣也可以参考童诗白的书。
      数字电路比模拟电路要好懂得多。阎石的书也算一本好教材,遗憾的一点是集成电路讲少了些。真有兴趣,到东南无线电系去旁听他们的课。
      计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings的"Computer Organization and Architecture:Designing for Performance"(清华影印本)。国际上最流行的则是“Computer architecture: a quantitative approach", by Patterson & Hennessy。
      操作系统可以随便选用Tanenbaum的"Operating System Design and Implementation"和"Modern Operating System"两书之一。这两部都可以算经典,唯一缺点就是理论上不够严格。不过这领域属于Hardcore System,所以在理论上马虎一点也情有可原。
      如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k);LR(1)的简化SLR(也许还有另一简化LALR?)。后端完全属于工程性质,自然又是another story。推荐教材:Aho等人的著名的Dragon Book: "Compilers: Principles, Techniques and Tools".或者Appel的"Modern Compiler Implementation in C".
      学数据库的第一意义是告诉你,会用VFP编程不等于懂数据库。(这世界上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的工程。所以从某种意义上讲,数据库是最典型的一门计算机课--理工结合,互相渗透。推荐教材:Silberschatz, et al., "Database System Concepts".
      网络的标准教材还是来自Tanenbaum:”Computer Networks"(清华影印本)。不过,网络也属于Hardcore System,所以光看书是不够的。建议多读RFC,从IP的读起。等到能掌握10种左右常用协议,就没有几个人敢小看你了。
      必须结束这篇“胡侃”了,再侃下去非我力所能及。其实计算机还有很多基础课都值得一侃,如程序设计语言原理,图形图像处理,人工智能等等。怎奈我造诣有限,不敢再让内行耻笑。
 
      最后声明:前后的两篇“胡侃”只针对本科阶段的学习。
      即使把这些全弄通了,前面的路还长......
 
10月10日

今天想到的一句话

      要像坚信主是存在的一样坚信一切都是是可计算的,要像坚信主是世间所有的真神一样坚信计算是全部的智能。
      好像好难懂......