序
由
于量子计算已经逐渐成熟,学习计算机科学的同学和老师们应该具有这方面的基本知识,因此本次修订笔者在第3版的基础上增加了新的一章“量子计算概论”。笔者耗费了相当多的心力和时间,先实地讲授“量子计算”课程,形成讲义,写完后又反复修改,直到满意为止。希望读者能借由笔者的努力成果,对于稍嫌深奥的量子计算有较清晰的认识。
笔者深信专业的基础课程对学生至关重要,应当由最优秀的教授用最好的教材来讲授,不仅能激发学生的兴趣,启迪学生的思维,更能够使学生领略“学通”的广度与“贯穿”的高度。同学们得以感受优秀教授的亲炙、熏陶,兴起对本学科高山仰止的孺慕之情,如此初学者方能端正学风,热情向学。然而笔者从事教学工作多年以来,无论中外,总觉得缺少一本合意的计算机导论教科书,能兼顾广度与高度,同时趣味盎然。凭此愿望,感谢因缘具足,得以成书。以笔者在计算机领域三十多年的科研经验和人生积累为因,著作此书,旨在为学子们提供一本内容丰实、形式活泼的计算机导论教科书,为学子们揭示计算机科学的美与真意。笔者在2012年以国家特聘专家的身份全职回国任教,以此因缘实现这回旋已久的心声,历经了数年来多次修订和增补,第2版、第3版分别增加了“并行计算”“机器学习概论”各一章,本次修订增加了“量子计算概论”一章,内容不断充实。相信各位读者在读了本书以后,将会对计算机科学建立正确而全面的认识,必将功力大增!
笔者认为这本书至此可以说是计算机导论教材中最全面的教材之一,内容包含: 计算机组织结构,数字逻辑基础,汇编语言,程序语言基础和Python,算法基础,操作系统,并行计算,网络原理,信息安全,机器学习,量子计算。希望读者能自行学习,多多利用本书,或合并阅读笔者的另一本书《编程导论——以Python为舟》(第2版)(ISBN 9787302594581),相信对读者将来的相关面试、笔试,乃至于整体提高计算机素养都会大有裨益。
笔者写这本书的目的就是希望它成为计算机科学导论教材中的经典之作。它非常适合信息专业的学生在大一或大四时学习,或作为基础教材,来了解计算机科学的核心知识之所在; 或在毕业前复习及补充知识,准备求职或研究生面试时所用。而非信息专业的学生也可以借助它较完整地理解计算机科学的相关基础知识。此外,各年龄层的读者都可以把它当作一本有趣又有真材实料的书去阅读。笔者相信这本书就是有这样的趣味、广度与深度,值得再三玩味。
问曰: 请解释书名
这本书的名字“计算机科学导论——以Python为舟”,是取其大意而简略为之。假如列出全部的意思可能就太长了: “计算机科学导论及它的美和相关的领悟——本书以Python为工具”。
“计算机”在此泛指一切利用程序而执行计算的系统。这个程序可以是随意改动的软件,也可以是已经固化而不能随意改动的固件或硬件。这类计算系统包含汽车、家电、机器、航空航天等各领域的智能控制系统,包含人人都有的手机系统,也包含各式各样的计算机、多核系统、分布式系统等。
而“计算机科学”是设计和应用计算机的理论、技术和工程的总括。随着时代的进步,计算机科学的范畴也越来越宽广,包含了软硬件工程、计算机网络、物联网、信息安全、大数据等相关领域。
在此笔者要特别提醒学习计算机专业的同学们,“计算机”和“计算机科学”这两个词汇在中文里常常混用而不加区分,但是用在英文中就要注意,不要引起笑话。计算机是机器,而计算机科学是门学科。假如有人问你“你的专业是什么”,你用中文回答“我的专业是计算机(或软件)”,这在中文里是通的,但是翻译为英文就不通了。你不能说“My major is Computer.”或“My major is Software.”,这样的话是不通的,因为Computer是机器,而不是专业,Computer Science或Computer Engineering才是专业。所以你应该回答“My major is Computer Science.”或者“I study computer science.”。又如“软件学院”的英文不是“School of Software”,而可以是“School of Software Engineering”。假如不注意词汇的使用,“汽车学院”变成了“School of Automobile”,渔业学院就变成了“School of Fish”(一群鱼),那就成笑话了。因此,学科与非学科的词汇不要混淆。
“导论”是指用较为简洁的语言来论述这一学科的基本和整体的思想,从而使读者对该学科有较为正确和系统的把握。对应的英文是“introduction”,在这个词汇上,中文“导论”远胜于英文“introduction”的内涵。“导论”这个词有引导之意,而“introduction”则欠缺这个含义。这本书的目的是,除了给读者一个概括性的、深入浅出的介绍外,也要激发读者的兴趣,引导读者进行更深入的学习。
“以Python为舟”是“以Python为工具”的意思。Python是一种很好上手的语言,例如要计算一些数值(存在于X数组中)的总和与它们的平均值,我们可以在几分钟内写出如下Python程序:
X=[10,4,6,9,12,92,138,26,98,21,8,98]
sum=0
for i in X:
sum = sum + i
print("总和是:",sum," 平均值是:",sum/len(X))
#len(X)代表X数组的元素个数
这个程序简单易懂。用循环(for语句)重复执行加法的方式把X数组里的元素一一累加到 sum里,最后用print输出结果。至于这个for循环需要执行几次,写程序的人不需要在程序里特别写明,而是交由Python语言的解释器去理解。这使得程序员的负担减轻了很多。
这本书用Python作工具来介绍计算机科学,介绍如何用计算机来解决问题,计算思维是什么,程序是如何在计算机里执行的……书中提供了很多例子,几乎所有的例子都是用Python语言实现的。学生能从这本书中学到如何写基本的Python程序。
然而笔者要在此强调的是: Python是我们学习计算机导论的工具,不是目的!Python语言的功能非常强大,它是功能齐全的面向对象语言(Object Oriented Programming Language),甚至也包含了一些函数语言(Functional Programming Language)的功能,有许多复杂、有趣的特性。在编写本书时,笔者要不忘初心,不去讲述Python语言的一些复杂功能及其细节。例如,下面这两种定义5×3的全0二维数组(或列表)的方式是有差别的,差别在哪里?了解这些细节对于“计算机导论”这门课的学习是没有必要的。
这本书里会介绍面向对象编程的基本特性,因为面向对象的概念已经成为计算机编程的常识。但是,本书不会多讲Python作为面向对象语言特有的复杂功能,这反而会模糊焦点。“以Python为舟”是套用佛学的用语。我们利用舟船来渡过大海,我们的目标是渡过大海,而不是研究舟船的颗颗螺钉和片片甲板,不要让舟船成为我们完成学习目标的障碍。在计算机导论的学习中,若以舟船渡海为喻,我们只要能掌握舟船航行的技巧就可以了。另一方面,对初学者而言,掌握Python的基本技巧也是门重要的学问。所谓“一通百通”,学好Python,对大家学习其他计算机语言有极大的助益。
“领悟”就是感想。原来想用的书名是“谈计算机科学的美”,因为太长而没有用。然而“领悟”的本意就是要说说计算机科学的美。这门学科的美体现在各个方面,有“她”应用的广泛,有“她”将科学与工程的结合,有“她”解决问题方法的理论之美,凡此种种,难以穷尽。笔者仅举一例在此描述。计算机科学是一门独特的学科,它不仅要设计出给定问题的解决方法(称为“算法”),也要研究这个问题本身的难度(复杂度)有多大。这在其他学科是很少见的。也就是它研究“问题”的本身,而不只是设计出解决问题的方案就罢了。计算机科学的“科学”之名,大体来自于对问题本身的分析吧。
以下面几个不同的问题为例,看看这些问题的难度(复杂度)的差异。例如有n个数,存储于x[1],x[2],…,x[n]中,n 是个较大数,如100000。
问题一: 求和,Sum = x[1]+x[2]+…+x[n];
问题二: 排序,对x[i]的值由小到大排序;
问题三: 划分,是否存在x[i]加起来刚好等于总和的一半。举个小例子,例如x=[100900230021,58710120012,7,42190100005,10011],输出的答案是YES,因为100900230021+7 是数组x中所有数总和的一半。
在现今的计算机科学知识中,我们知道上述的问题一和问题二都是可以快速解决的,问题二比问题一更复杂一些,但是都属于所谓“多项式时间”内可以快速解决的问题,这类问题通常是在以“秒”为单位的时间内可以用计算机解答的问题。但是问题三就不一样了,计算机科学从理论上证明这是个非常复杂的计算问题,所以到现在为止我们人类尚未找到一个快速的、“多项式时间”的解决方法。当x和n是较大数时,用现在的技术找出解答所需要的时间可能要以“世纪”为单位来计算了。一个是秒,一个是世纪,其差别是巨大的。而问题三这类的复杂计算问题实际上还有很多。问题三的最直接解法是试验所有的子集合(其实只需要试验其一半个数的子集合),看子集合内的数加起来是否刚好等于总和的一半。大家知道,n个元素所组成的集合其子集合数量高达2n(2的n次方)这么多。当n是100000时,这个数是比天文数字还大的数字!然而,当x[i]的最大值不太大时,用“动态规划”技术来解这个问题是较快且实际可行的解决方案。“动态规划”技术会在本书的第5章讨论。但是当x的值很大时,动态规划的求解也要花很长的时间。
有趣的是,这些复杂问题的存在对于人类来说并不一定是坏事,信息安全的加密技术常把这类复杂计算问题用作防御信息泄露的“利器”。请看以下的问题。
问题四: 因数分解。给定Z,这个Z是两个200位的不同质数X和Y相乘而得的,求X和Y的值。举个很小的例子,例如输入是12233883694360273618474283231,输出是241364017659577 和50686443708503。
这个问题是网上交易时所用加密算法RSA的“武器”,因为至今没有找到能快速解这个问题的算法(已知的算法都要花几百年的时间才能算出X和Y)。正因如此,黑客就没有办法快速分解Z,而找出密码X和Y。也可以说,现在全球的网上金融交易、购物等人类社会的重要经济命脉,竟然就构筑在这个看似非常简单的问题四(因数分解)的复杂度上,怎不令人惊叹啊!假如某位读者有一天能找出快速求解的算法来,其影响力会是惊天动地的。
然而,利用量子计算竟然有算法(称为Shor算法)可以较快地破解因数分解问题,这在世界上掀起了对量子计算研究的热潮。该算法的前提是制造出一个有足够多量子比特的量子计算机,有了它就能解决200位因数的因数分解问题,虽然量子计算机发展得很快,但是在短期内还是很难制造出量级如此高的量子计算机,所以如今通用的网络信息安全机制还是保险的,详细讲解请参阅本书的第11章“量子计算概论”。
问曰: 请简要介绍每一章及其作用
第1章: 计算机学什么
本章描述计算机的广泛应用,以激兴趣; 讨论“计算机”是什么,以正其名; 谈过去、现在和未来,以知往来; 接着简述计算机系统、硬件、软件,以知其廓,辅以用Python实现的求解平方根的几种不同程序,以表算法之美。本书最大的特点就是没有虚话,第1章就直接利用实际的例子,指出计算机科学的核心。写出平方根求解的程序并不简单,本章利用Python写出三个程序。第一个程序简单但是性能不高; 第二个程序利用二分法技术,效率提高不少又学习了基本算法; 第三种方法最快速,利用函数微分求切线的基本数学知识,可以几步就算出精确的平方根。一步步地优化,尽显计算机科学的美。本章也将简述现在前沿的应用之一,那就是大数据的应用,用许多例子来讲述数据分析对我们社会的益处。我们也会谈论用大量数据的方式来计算圆周率的做法和对数据分析与逻辑推理的正确态度。最后讨论计算机科学的美,我们从应用和知识面的广阔这两方面来讨论。
第2章: 神奇的0与1
本章介绍二进制和其他进制的转换及其原理。组成计算机的计算能力的基本元素是二进制0与1的开关,这些开关可以由0或1的控制信号来决定开或关的输出状态,开与关的输出状态又分别称为0或1。所以,输入的控制信号与开关的输出状态都可以用0或1表示。例如,输入控制信号是1时,开关状态是0; 输入信号是0时,开关状态是1。开关的输出又可以变成其他开关的输入控制信号。而这许许多多简单的二进制开关就能构建出任何逻辑运算。本章会向读者展示逻辑的威力。逻辑可以实现加法运算——加法竟然是逻辑做出来的,这让一般同学较难理解。大家可以想想自己小时候是怎样学会加法的,可能大部分人是用数数法吧。但是计算机的加法器是用许多开关构建而成的,加法这个最基本的运算对于计算机而言是一系列逻辑运算的集合,这确实有趣!而在有了加法和负数的二进制表达方式后,就可以做减法了。然后,乘法也可以实现了。其实整个计算处理和控制单元都是用这些开关组成、用逻辑运算实现的,令人叹为观止。用二进制单元还可以构建出存储单元和图像单元来,把存储、计算处理,以及输入输出单元综合起来,可以构建出无比复杂的计算系统。本章最后谈0与1的美。这一章是将来学“数字电路”“计算机组成原理”“计算机体系结构”等课程的基础。
谜语一则: 沙老师问小明,有一种东西,它开了(open)就暗了,它关了(close)就亮了。请问这是什么东西?
答案是: 电灯。因为电路“open”是断开,是断路。电路“close”是闭合,是通路。所以开灯的正确说法是“turn on the light”或“switch on the light”, 而不是“open the light”。自然语言是很有趣的,但有时候是ambiguous(模棱两可)的,有点恼人。
第3章: 程序是如何执行的
任何计算机都包含中央处理器(CPU)和主存(main memory)。中央处理单元是负责计算或读取数据的,而主存是负责存储程序和数据的。本章讲述CPU如何从主存中读取一行行的程序指令(汇编语言),所读的程序指令如何指使CPU执行计算或者去读写主存上的数据。本章通过解释汇编语言的指令及程序,清楚地描述计算机程序的执行过程、CPU与主存的关系和互动,使读者对计算机程序的工作方式有正确的认识。另外,函数调用是程序执行中最重要的知识之一,本章描述Python是如何调用函数的,接着描述执行函数调用时对于变量和返回地址的管理。本章也会描述几种最常用的程序语言,如C、C++和Java。本章最后谈计算机程序的美。这一章是将来学习计算机编程语言、计算机组成原理、编译原理和操作系统的基础。
本书从第3版开始特别配套了一个供教学用的汇编语言模拟器,名为SEAL(Simple Educational Assembly Language),读者可以从出版社网站下载此工具。利用此工具,读者可以执行书中所描述的汇编语言程序,清楚了解函数调用时栈帧是如何建立的,以及函数内局部变量等重要知识。
第4章: 学习Python语言
本章列出Python语言的最重要的知识。同学们只要知道这些基本Python知识就可以编写程序了。学习一种新的编程语言时,最先要了解的是一些常用的内置数据结构。例如,Python的列表(list)和字典(dictionary)是很强大的,要用Python写程序的同学一定要熟悉列表和字典的使用。接着讲述Python的自定义数据结构——类(class)和面向对象编程的基本概念,我们会用一个关于学生选课、考试和算分的例子来说明面向对象编程的方式。本章是很独特的,坊间还没有任何一本Python书能达到我们精简、求实的目标,在短短一章中全面讲述Python语言的各种性能。最有用的是我们的“经验谈”,读者请多体会和学习。学习任何语言(包括计算机语言)的诀窍是“多看、多写、多玩”。要多“赏玩”Python,相信Python比任何游戏都好玩。这一章是学习任何其他程序语言的基础。
Python也有令人烦恼的地方,Python语言v3.0及以上版本和v2.0版本的有些用法不兼容。例如,在v3.0及以上版本中,print后面一定要有括号,而不能用raw_input()。所以大家在学习Python时,要选择v3.0以上版本的教程。请注意,本书使用的是Python v3.0以上版本。另外,Python语言和所有语言一样,总有些不统一的规则,大家需要小心。而本书注重计算的基础知识,不会太着重于这些特例的学习。
例如,以下例子展示了一个语言的实现细节会导致程序输出结果与数学结果不一致。
x1=123456789
x2=2097657821235948841
y=19
z1=x1*y
z2=x2*y
int(z1/y)#int(x)代表x取值为整数
123456789#正确,等于x1
int(z2/y)
2097657821235948800 #竟然不等于x2!请思考要如何写使z2/y == x2(答案见第4章)
再强调一次,本书用的是Python v3.0以上版本。
第5章: 计算思维
本章非常重要,也是本书的亮点之一,计算机科学的美尽在此显现。一个大问题的解决方案是由分立的小问题的解构建而成的。具体而言,就是对递归概念的扎实学习。希望各位同学从现在开始都尽量用递归的方式思维,而这种思维方式是大部分同学在接触计算机算法之前很少知道的方式。例如在一个平面上,一条线可以分出两个子平面,两条线可以分出4个子平面,那么n条线最多可以分出多少个子平面?假如F(n)是n条线最多分出的子平面个数,只要我们找出F(n)和F(n-1)的关系,这个问题就能马上解出来了。大家试试看,解答在第5章。
在递归的概念下,我们学习分治法和动态规划,这两个方法是解决问题最常用的方法。而在日常生活中最常用的贪心算法是有其局限性的: 贪心算法很少能得出最优解来,我们不可不知。例如,从A地开车到B地,要经过多条道路,如何选择最快速的路径?贪心算法是在A处选择最畅通的那条路,然而,这条道路之后可能就是堵塞的道路。贪心算法只顾眼前,而不看全局,通常没有能力找到最优的全局解。本章以“老鼠走迷宫”为例,看我们如何用计算思维来轻松地解决问题。学习了计算思维后,对我们的为人处世也会有所影响吧。本章是同学们将来学习数据结构、算法分析与设计的基础。
第6章: 操作系统
操作系统是计算机教育中最重要的知识之一(此外还有算法和体系结构),学生一定要牢固地掌握操作系统的知识。不管是手机(安卓、iOS)还是计算机(Linux、 Windows)都是以操作系统为硬件接口和软件平台。本章首先解释开机时系统内部经过了哪些步骤,而一个计算机系统内会有多个程序(可能几十个程序)在同时执行,然而在硬件上,只有相对较少的CPU核可以使用,这就需要操作系统来管理程序和所有硬件资源。操作系统的主要功能有: ①管理各种外围硬件设备,例如U盘、网卡、键盘等,并管理文件系统; ②管理程序共享的资源,例如CPU、主存等(一个计算系统会有许多程序同时在执行或等待执行); ③管理和调度多个程序的执行; ④提供程序和硬件的衔接,即提供各种系统的服务和接口。同学们一定要理解操作系统的内部机制,这样将来才有能力实现一个“计算机系统”。本章也会讨论文件系统,以及Python是如何读写文件的。本章是将来学习嵌入式系统、网络、信息安全的基础。
第7章: 并行计算
多核系统简言之就是一个系统可以使用多个计算和存储单元,并且在多个核之间有通信和同步的机制。并行计算是基于多核系统的软件编程技术。并行计算能够提供两个优势。第一,能充分利用多核硬件,使得执行时间大幅缩短。第二,能直接和方便地利用计算机来模拟真实多并发的情景,使得编程简化。本章讨论并行计算的基本概念,也提供了许多Python多进程的实例。其中有计算方差等科学运算的例子,这些例子显示并行计算能提高执行速度。在模拟情景方面,有对于商品市场考虑供给与需求的价格模拟的编程,这个例子非常有趣,对于同学们提高对经济学的理解有相当的帮助; 另外有对于多部电梯的控制模拟的编程,同学们从这个例子能明了虽然每部电梯是独立运行的,但是每部电梯的运行方向及开停仍然需要其他电梯的信息。本章末会对并行计算进行较深刻的讨论,也会讲述云计算的概念。本章能打好将来学习并行计算及多核系统结构的基础。
第8章: 计算机网络与物联网
计算机网络是个非常复杂的系统,当我们在微信上发送一个笑脸给对方时,这个笑脸的传递要经过层层的转换和编码,经过环环的连接和控制,其复杂的程度可以说是人类科技文明的高度展现。本章简要介绍网络的各个层面,学完本章将会对计算机网络有一个正确而全面的认识。另外,本章介绍网页的原理、网页访问的流程、静态和动态网页的差别,列举网页制作的实例。本章将是学习计算机网络课程和网页制作课程的基础。
互联网的触角不断延伸,逐渐渗透到我们的日常生活中,从而催生出一种新型的网络——物联网(Internet of Things)。物联网被认为是以物品为载体,通过射频识别等技术传感设备与互联网建立连接,从而实现物与物之间的互连。在物联网的时代,每个物体都可以寻址,每个物体都能实现通信,每个物体都能控制。这样的物联网时代将让我们充满期待。本章所介绍的物联网将是物联网相关专业课程的基础。
近年来,计算机网络的发展给人类文明与商业模式带来了巨大的改变,通常我们身处在这个改变中而不自知。我们理所当然地习惯了这些改变,信息在网上得知,购物在网上交易,娱乐在网上享受,朋友在网上结交……当我们把情感的交流诉诸网络,人与人之间的交流好像是快了,但是深层的感觉又好像远了,交流中多了即时反应的只言片语,而少了静下心来的倾诉衷肠。有多少人很久没有在深夜花几小时写封沉甸甸的信给远方的亲人了呢?
第9章: 信息安全
信息安全这门课是笔者最喜欢讲授的课程之一。它的内容很有趣。一方在进攻,另一方在防守。我们要全面地了解各种黑客进攻的手段,才能较完整地学习各类防御的技术。本章首先谈计算机的常见威胁,包含客户端的威胁、服务器端的威胁和网络上的威胁。接着讨论各类安全技术。对信息安全而言,最重要的是密码学,因为密码学是很多防御方法的理论基础。例如A要发送一个信息M(如信用卡密码)给B,我们怎么知道信息M在中途有没有被人改动过?这就需要密码学的技术。B收到M后怎么知道这个M是从A来的?这也需要密码学的技术。我们怎么保证M的原文在途中没有被人偷看?这同样需要密码学的技术。
入侵检测、防火墙、网络安全、杀毒软件、系统安全都会在本章讨论,对新型的手机系统安全也会涉及。最后,我们谈谈对信息安全的领悟。本章和前面各章的集合都是信息安全专业的基础。
第10章: 机器学习概论
人工智能已经发展多年,机器学习作为人工智能的重要分支,近年来取得了突出的成果。对于某些应用,较容易取得相关数据作为“训练集”,利用训练集来调试特定函数模型内的系数,使得函数的计算结果能与事实相符,这种技术称为机器学习。基于不同的函数模型,有不同的机器学习技术。本章详细介绍几种重要的机器学习技术,有基于线性代数的函数模型,有基于概率的数学模型,有简单神经网络模型,有多层次神经网络模型,等等。由于原理复杂、多样,要如何深入浅出、清楚地解释原理,笔者煞费苦心。本章所有的程序都是利用Python完成的。同学们需要知道,学习本章最重要的是理解机器学习的原理,然后再做编程实验,不要舍本逐末。市面上专注于Python编程的机器学习书籍有些本末倒置。同学们也应该了解,机器学习并不等于人工智能,而只是人工智能的一部分。人工智能的发展还有着漫漫长路,我们一起共同努力吧。
第11章: 量子计算概论
量子计算已经成为世界科研竞争的焦点之一,计算机专业的学生应该要具备量子计算的知识。由于量子计算的思路与传统计算差异很大,一般初学者较难进入其领域。本章深入浅出又有条理地提炼出量子计算的精髓,相信读者会受益匪浅。量子计算的基本单元是量子比特(qubit),它的性质远超越传统比特的性质。简而言之,量子比特具有量子物理的量子叠加、量子干涉、量子纠缠和量子测量等性质。量子叠加使得一个量子比特可以同时拥有不同幅度(称为概率幅)的0和1状态,由于量子叠加,在计算中可以视0和1为同时存在,甚至同时计算,但是在测量时会以概率方式“塌陷”成0或1的基态。量子计算的基本计算单元是一些基本闸门,这些闸门在数学上表示为酉矩阵(Unitary Matrix)。利用量子干涉与纠缠的性质,酉矩阵对量子比特的状态进行转换以达到计算的目的。本章先解释量子物理的四大性质,及量子比特的特性和数学模型,然后解释用闸门构建出的量子线路及其数学意义。本章也呈现了一些经典的量子算法,如DeutschJozsa算法、Parity问题、Grover算法、量子隐形传态、Shor算法。读者研读完本章后将对量子计算有较为清晰的认识。
问曰: 这本书如何作为教材
这本书是以“计算机导论”课程的教材为目标而编写的,内容非常丰富,适用于各种学时数量的课程。笔者建议讲授时宁慢勿快。不要只是单方面传授,不要“填鸭”,要营造活泼的课堂气氛,引导学生学习,多在课堂上讨论,多问学生问题。相信老师们在教这门课时会对计算机科学产生更多的心得和体会吧。
“计算机导论”课程是计算机专业课程体系的第一门课,至关重要,最好有实验课配合教学。例如配置实验课,包含Python编程。本书的前6章最为基础,需要花较多的时间。如果学时不够,可以略去后几章,或者放到第二学期再上,或者让学生自行阅读。如果学时数允许,希望老师能安排时间讲一讲第11章“量子计算概论”。笔者通过这些年来的教学,发觉学生对量子计算的兴趣是相当大的。
可选择的课时安排如下: 第1章4~6学时; 第2章6~8学时; 第3章6~8学时(配合汇编语言SEAL工具); 第4章6~8学时(若有实验课,可在实验课上讲授,总之有机会就让学生多动手); 第5章6~8学时; 第6章4~6学时; 第7~11章的学时酌情而定。让学生清楚掌握前6章的内容,这门课的教学就算是成功了。其实这本书的内容足够作为两学期课程的内容,由授课老师酌量教学。
建议老师、同学们参考和阅读笔者的另一本书《编程导论——以Python为舟》(第2版),两本书一起研读收效更大。在笔者任教的华东师范大学,同学们就是学习这两本书,大一上学期结束前,同学们的期末大作业就可以自行设计和开发游戏,用Python编程实现所设计的游戏,撰写报告和使用手册并进行现场演示,其成果令人欣喜。同学们充分掌握了计算机科学的核心知识,并对计算机科学产生了极大兴趣,这就是身为老师的欣喜之处吧。
本书里还有三位代表性人物: “小明”是位活泼好问的学生,“阿珍”是位认真负责的研究生助教,而“沙老师”代表笔者和授课老师。他们在本书中的问答还是有些深意的。
感谢
要感谢的人很多。首先感谢我的家人——我的妻子诸葛晴凤教授和我的女儿沙奕兰。她们的支持和鼓励,使我可以花时间和精力来完成这本书。为了这本书,我时常工作到深夜,谢谢家人的体谅和我妻子对撰写这本书的实质性帮助。除了家人外,还有我所在大学的研究团队,他们在汲汲于科研之时,还要帮助我来撰写这本书,我很感激。我们心中抱持的信念是一致的,那就是写出一本最好的计算机导论的书。整本书的内容和例子都是基于我的想法组织而成的,书中的大部分Python程序都是我自己编写和调试的。这本书是我们花心血写成的,然而疏漏之处在所难免,我们会持续改进,所谓任重而道远,此之谓矣。
沙行勉
2025年1月