本前言涵盖软件工程三卷书的内容,其中本册是第1卷。.
软件工程——艺术、规范、工艺、科学、逻辑:软件工程是艺术[296—298]、规范[179]、工艺[399]、科学[226]、逻辑[253],以及下列的实践[254]:
基于科学的洞察对软件(即技术)的综合(即构建、构造),以及
为了探清和发现现有软件技术的可能的科学内容,对其的分析(即学习、研究)。为了做到这一点,
软件工程——抽象与规约:软件工:程运用抽象和规约。
抽象被用于把开发分割成可管理的小部分,从时期、阶段和步骤中的高层抽象到低层抽象(即具体化)。
规约记录并关联所有层次的抽象。
三卷中的第1、2卷详细地探讨了抽象和规约。
软件工程——三部曲:软件工程包括应用领域的分析,(对新软件的)需求综合和分析,以及该软件的设计(即综合和分析)。冈此,软件工程由以下组成:
领域工程,正如这几卷所展示给你的一样,它涵盖了许多学科的丰富领域,
需求工程,正如我们在这几卷中将再次看到的一样,它有教科书通常所没有探讨过的许多方面,
软件设计,涉及软件体系结构、构件复合和设计等。
第3卷详细地探讨了该三部曲。
软件工程——实际问题:另外,软件工程包含许多实际问题:项目和产品管理;原则、技术和工具,它们被用于确保可能在地理上分散的人员能够有效地一起工作,被用于依据多种开发处理模型巾的一种来选择、调节、监测和控制工作;计划、调度和分配开发资源(人、材料、资金和时间);相关的事务,包括成本预算、遗留系统、合法性等。
在本书中,我们将刁;涉及软件工程面向管理的那些刻画。
本卷中的每章以及其他几卷,都以一个提要开始。与本前言相关的一个例子如下:
假设:你拿起这本书,是由于你有兴趣了解软件工程并可能学习一种软件工程的新方法。
目标:这几卷的主要目标是向你展示理解软件的崭新方式:它强调(I)软件工程是信息科学的一部分,而信息科学是基于(i)数学,(ii)计算机与计算科学,(iii)语言学,(iV)硬信息技术(计算机与通信、传感器与执行器)的可用性,以及(v)应用。进一步来说(II)该信息科学取决于许多通常以下列名字为人所熟知的哲学问题,如认识论、本体论、部分关系学。
效果:帮助你成为真正的专业软件开发工程师,并且是在该术语最宽泛的意义上,正如这几卷所倡导的那样。
方式:非技术的、推理的。
. 开发大规模软件系统是很困难的。构建它们且使得它们(i)解决真正的问题,(ii)正确、人性化,而且(iii)良好地服务于需方组织,都是非常困难的。
本套丛书提供了业已被证明具有下列性质的技术:(i)能够使大规模软件系统的开发比绝大多数当前的软件工程师所了解的要简单许多,(ii)能够产生比通常所遇到的系统更高质量的系统,并且(iii)能够准时交付。
因此,我们强调本套丛书所针对的软件工程的下列性质:值得信任和可信的方法、更高质量的软件产品、更高质量的软件开发项目、开发者和需求方的个人满意,也就是说,软件丁程师及其管理和用户及其管理。我们的目标是,如果有挫折,那么也要少些挫折,并多些魅力和欢乐!
丛书的成因
关于为什么必须写这几卷,可以给出许多原因1:
形式技术应用于软件工程的所有阶段、时期和步骤,应用于各种各样的软件开发中。但是却没有已出版的按照如下方式涵盖软件工程的教科书:就如我们稍后将对软件工程该术语的描述那样的,(除了其他的“非形式”基础之外)也基于形式技术基础的教科书。形式开发(即规约、精化、验证)的书籍更像专著而非教材,并且它们所涵盖的主题相当狭隘:通常只是软件规约,也即抽象软件设计及其具体化的规约。这几卷中的形式规约,不只应用到软件,也应用到它们的需求规定,而且作为(在任何书籍或讲义集中)全新的贡献,它也应用到了领域描述。
本套丛书的作者对于现有教材声称涵盖软件工程主题的方式长久以来感到不太满意。
现今“所有”有关软件工程的教材就程序设计方法学的非常基础的问题而言都是失败的2,特别是对于形式技术来说。如果它们确实给出了所谓的“形式方法”的材料,其中有一些也确实这样做了,则该材料典型地被“隐藏”在一个独立的章节中(如其名所示)。在我们看来,非形式技术和形式技术的相互作用,也即非形式描述和形式描述之间、非形式推理和形式验证之间的相互作用等等,遍布软件工程的全部。(使用)形式技术潜在的能力塑造开发的所有时期、阶段和步骤。传统的软件工程问题,诸如软件过程、项目管理、需求、原型、确认(更不用说验证了)、测试、质量保证和控制、遗留系统以及版本控制和配置管理,我们通过非形式和形式技术的合理混合展示出这些辅助但关键的软件工程问题可以得到更好的处理。勿容质疑,本套丛书将会解决这些“抱怨”。
在我们看来,现今所有的教材都没有适当地考虑软件开发者并没能充分地理解软件所嵌入的领域,也即产生希望拥有“该新软件”的领域!正如上面所提到的,我们的书的一个主要的新“特点”是将软件开发过程中所说明的这些问题进行分离——在这一期间开发者首先花费大量的时间和精力去理解应用领域,并为该应用领域的理解编制文档。
在我们看来,现今所有的教材都没能系统地给出“始终贯彻”和“扩展”的原则、技术和工具。通过“始终贯彻”指那些通过大量的例子给出涵盖开发所有的主要时期、阶段和步骤的原则、技术和工具。通过“扩展”指可以应用到最大型规模软件开发项目的原则、技术和工具。
在我们看来,现今一些教材完全忽略了程序设计,即设计问题。从程序设计方法学的角度来看,没有对软件开发的任何方法论方法的假设。
在我们看来,现今的其他教材,没能做到逐步精化(即实现之间的关系的开发观点)。
现今还有其他的教材没有设计的观点。
最后,我们认为现今所有的教材都没能适当地将上述尽管更加理论性的观点与诸如以下的普通的、工程问题的观点结合起来:(i)开发过程模型(“瀑布模型”、“螺旋模型”、“迭代模型”、“进化模型”、“极限程序设计”等等),(ii)质量管理, (ii)测试和确认,(iV)遗留系统,(v)软件再工程,等等。
丛书的不足
这三卷书的主要不足在于我们过于简单地探讨了正确性问题,也即单一和成对(开发步骤相关)规约的性质验证(定理证明、模型检查)。
在这几卷的其他地方和适当之处,我们会解释为何我们不引入与验证相关的大量资料。寻找这一知识的读者,可以参阅大量的教材(书籍、期刊和会议论文集的文章),或等我们觉得能够胜任为该主题编写一本足够一般性的教材。现今的教材更多地与一个特定的记法系统(即规约语言)相关。
显然我们并不知道有关如何开发所有‘可能种类的软件所需要知道的全部,而这几卷中也并非包括我们所知的全部。通常软件开发用到多种多样的技术和工具。
任何我们所讨论的特殊技术和丁具,我们对其讨论都达到了某个相当的深度,但是还没有达到对一个专业的千程师在相关领域的足够深度。例如:
编译器开发:我们谈到了许多对于真正的专业编译器开发者所必需的内容,但并不是全部。我们探讨了我们认为所有的软件工程师应当知晓的内容。并且我们对它的探讨采用了我们所发现的所有编译器教材都严重遗漏的方式。请参见卷2,第16至20草。
操作和分布式系统开发:我们仅探讨了规约并发系统的一般原则和技术。
嵌入式、安全关键和实时系统:基本上与操作和分布式系统讨论的内容一样:我们强调卷2探讨了规约嵌入式、安全关键和实时系统的技术。这些技术及其基本记法是:佩特里网[284,379,393 395]、消息[277-279]和活序列图[159,248,295]、状态图[244-247,249]、时态逻辑1188,326,327,360,387]及时段演算[491,492]。
不过,在卷3第28章领域特定的体系结构将在一定深度上给出应用下列的开发上的原则、技术和工具:翻译系统(解释器和编译器)、信息系统(数据库管理系统)、反应系统(即嵌入式、实时及安全关键系统)、工件系统(工单系统)、客户/服务器系统、工作流系统等等。该章的讨论是新颖的,并且受到Michael Jackson的问题框架概念[282]的很大影响。因此我们讨论了我们认为所有的软件工程师,无论其专业是什么,都应当了解的内容。并且我们认为他们应当了解的内容要远远多于绝大多数的软件工程教材所提供的内容。
正如其他地方所解释的那样,这几卷建议上面提及的专业领域中的教育和训练可以在学习完卷3后进行。并且那些专业领域教材的许多内容实际上应当重写:改写为形式规约等等。
着手方法
我们的教学方法寻求找到“问题的根本”。我们认为这些根本由对下列问题的基本理解构成:(ii)“如何描述”的语言学,(ii)“描述什么”的近乎于哲学的问题,(iii)语用、语义和句法的语言学(即符号学)问题,以及(iv)使用数学(即使用形式规约语言)构造简明、客观的系统描述(因此也要理解其语用、语义和句法——独立于应用现象的语用、语义和句法)。
所以本书从探究以上四个问题入手。在卷2中,我们以四个独立章节(第6章到第9章)来探讨符号学(语用、语义和句法)这一主题。
同样这也是全新的:现有的有关软件工程的教材完全忽略了对这些问题的提及。对毕业于任一具有良好声誉的学术机构的一个现代的、专业的软件工程师来说,若没有掌握这四个教育基础(i-iv),对作者来说都是难以想象的!唉!而这并不是例外,而是现在的惯例:他们根本就没有了解过这些问题!
软件新观
这几卷将为读者提供看待软件和开发软件过程的全新方式。它们将为读者提供一个用于理解和开发软件的完全显著不同的方法。可能最好这样来描述该“新观”:软件不仅是一件融合思考(分析)、描述(综合)和推敲(推理)这些智力过程的产品,更是艺术品。软件,更容易作为知识的量化,如与应用领域的关联度(也许它是,也许它不正确的产品),人使用的适合度(人机交互),正确性(产品正确或错误)等。而难以找到作为产品的可量化(如便宜、快、小等标准用语)材料和标准。
掌握抽象——这几卷的一个主要论题,相对没有掌握抽象而言,它给任一开发者提供了更好的机会来得到正确的产品和令产品正确——即使同样是这些人并没有使用这几卷中许多的形式技术。绝大多数的从业软件工程师都没有掌握抽象。但从其本质上来讲,软件是而且也必然是抽象的:当自动化软件用于支持过去常常是人类工作过程的自动化时,该自动化软件不是“那些人类的过程”,而仅仅是它们的一个模型、近似和抽象。
我们希望将软件开发的观点看作某事物,它在开发的时期、阶段和步骤中进行,而且对于其来说,现在已有将这些时期、阶段和步骤相互关联的明确的技术。但是这样的开发几乎没有在有关软件工程的标准教材中予以探讨。我们希望采取这样一个软件开发的观点,其中可以形式地给山这些时期、阶段和步骤的规约,可以形式化关系,并且在得到保证的时候,甚至可以形式地验证该关系。至少在小规模和,卜等规模软件开发中,并且至少20年来,这一观点已经是可行的了。但是这样的开发几于没有在有关软件工程的标准教材中予以探讨。我们希望推进一个软件开发的观点,其中开发者创建抽象、培养抽象的能力和使用抽象。就仿佛这里所有层次中的程序设计者踌躇满忐、饶有兴趣地“离析”美妙的抽象并让他们找到对于程序的方式。最后,这些程序设计者止那些抽象来矾定系统的主要结构、确定美:正如用户所感,简洁和精确!这样的开发可以扩展到大规模系统。现在它成为可行的、可管理的和可提供的。可以把它教授给绝大多数的在学术上可以教育的学生们,他们也可以对其进行学习。
“轻量级”形式技术..
许多从业的程序设计者避开:形式推理6或者说就是避开形式规约7,并且一些学术界人十也表达了对其的保留态度。
我们的方法是一个更实际的方法。我们考虑到了一系列的开发:从系统开发,经过严格开发,到达形式开发。通过系统开发,我们指形式地规约开发中一些步骤的开发。通过严格开发,我们指表达和形式地证明系统开发中一些证明义务的开发。通过形式开发,我们指形式地
证明大多数重要的证明义务和严格开发的其他引理和定理的开发。
为了遵循这几卷的原则和技术,我们建议“轻量”前进:系统化的开始。形式地规约你的应用领域、需求和软件设计的最为重要的刻面。然后从那里开始程序设训(即编写代码)!
从实践来看[145],软件开发正确性的最为重要的改善是系统化的积累。这几卷主要,可能也是几乎完全地关注于系统化。某些特定种类的应用保证更高层次的信任,因此似乎严格开发实现了可信性的下一个更高的阶段。最后,也有少数的客户愿意接受现今形式开发相当高的成本:心脏起搏器、助听器植入、核动力装置的混合控制器、无人驾驶地铁及诸如此类。
卷3第32章32.2节讨论了相当数量的有关所谓的“形式方法”的信条、错误理解和错误观念。本卷的第1.5.3节和卷3第3章3.1节讨论了为什么方法不可以是形式的,但一些技术却可以是。
“超级程序设计师”
许多从业程序设计人员和一些学术界人士坚信程序设计人员无限制的个人主义:他们担心,不得不遵循许多方法原则和形式技术可能会压制“超级程序设计师”的创造性和生产力。我们并不担心。我们已经造就了超过100名的理学硕十沦文研究生。绝大多数在丹麦的不到8个的软件公司工作。所有人都或多或少的遵循这几卷中的许多原则和技术。他们当中的绝大多数都是超级程序设计师。
下文是其他学者和我以前的学生,同样还有和我一样在教授和传播类似于这几卷中的方法和技术的在世界各地的同事们所表达的。我在此强调:
这几卷中的原理和技术,即使只是“轻量级”遵循,即使很难显式地遵循,但只要你在学习这几卷的时候掌握了它们,它们将改变你对软件工作的态度。而这将是不一样的。
我们确信,从现在起,你将更多的去享受“超级程序设计”,享受成为一名程序设计者,并且“在许多小的方面聪明伶俐,设计聪明的小技巧来把事情做的更好、更快。”我们不能否认在低层的聪明伶俐的核心作用8。我们将用许多可传授的工程原则和技术来增强你在这个方面可能已有的任何技能。“成功的程序设计者既是野兽也是天使。”
我们断言我们同样能够给出几个中等规模的软件开发,其中对这几卷的原则的知晓似乎在设计优雅、优美的产品方面提供了巨大的帮助。而且“美就是我们的工作”[206]。
何为软件工程
我们继续在本前言的第1页所开启的对软件工程的刻画。
软件工程:对我们来说,在最一般的意义上,“软件工程”和其他各种各样的工程一样,是一个专业的集合,这些专业基于科学的洞察力构造的技术,或者分析技术以探究其科学的内容(包括价值),或者通常两者兼而有之。
“软件工程师”:因此软件工程师(但请参见下文有关对该术语的批评)“跨越”了一方面是计算机科学与计算科学和另一方面是软件人工制品(软件技术)之间的“桥梁”,基于从计算机和计算科学的许多学科所建立的知识休所获得的洞察力对后者进行构造(或研究)。
更通俗地说,软件工程包含用于下列目的的一般和特定的原则、技术和工具:(i)分析那些易于通过计算给出解决方案或支持的问题;(ii)综合这样的(诸如软件的程序的)解决方案:(iii)在大的项目(即涉及到多于一个开发者的项目,和/或结果软件将被其他(人员)使用而非开发者自己的项目)中进行该分析和综合;以及(iV)管理这样的项目和产品(包括计划、预算、监督和控制该项目和产品)。
但是我们可以把一个主题称作软件工程并不必然意味着我们可以谈到“软件工程师”。如上所述,同时我们希望这几卷的读者都能清楚的明白,软件工程是由我们可能本来希望称之为“软件工程师”的人来利用的一组原理、技术和工具。但是对任何人来说,在没有进一步、更加“狭窄”的鉴定的时候某人就被冠之以软件工程师似于是有问题的。它将会给这条那个人是一个软件工程师消息的接受者传递这样的信念,这里所述的人能够专业地处理几乎任何软件的开发。与Jackson[280]一致,我们断言并不存在软件工程师!有编译工程师、嵌入式系统(软件)工程师、信息(和数据库)系统(软件)工程师、银行业务软件工程师等等,就如同我们说起汽车工程师和电力工程师而非机械或电气工程师一样。
因此我们断言这几卷中的原则、技术和工具适用于广泛的专业范围内的软件工程师。这几卷给出’了这些跨越最广泛的可能范围的原则、技术和工具的应用示例。原则、技术和工具一般来说是有用的且能够被应用到行业和应用的广阔领域中,这一事实只是意味着学生们必须另外学习所选定职业的专门教材,如编译器开发、安全关键的实时软件开发、数据库系统等等,以成为适当的专业软件工程师。
作者的愿望
因此我的希望如下:给你提供一小不同种类的教材:将超过30年的精彩的程序设计方法研究和控制实验实践放到更广阔的软件工程的舞台上来;为你展示当遵循浯言学、哲学、符号学和数学的教学基础,软件开发将会是怎样一个美妙绝伦的世界;以及将超过25年的逐渐发展的课堂讲义变为一套连贯的、一致的和相对完全的三卷书。
我写下了这几卷,是因为我曾想理解如何开发大规模软件系统。当我开始的时候,大概25年以前当我开始为这个主题书写课程讲义的时候,我所知道的比现在要少的多。同时我对于许多聪明好学的学生参与到该实践中来感到无比的高兴。我发起了为诸如CHILL[234,235]和Ada[121,122,145]这些不易使用的程序设计语言的编译器的大规模商业开发,由此我斟酌和修正了我的想法。在测试这些想法的同时对有关软件工程的写作已是一个变得清醒的经历。软件工程中仍存在许多我不得不写、考虑和体验的边边角角。同时,这就是你所得到的了!
这几卷是我的代表作。
这几卷在软件工程教育课程中的作用
这几卷的目标读者是谁呢?下文中间接地回答了这个问题。
在产生硕士学位的学术性软件工程教育这一更大的环境中,我们如何看待这几卷书所扮演的角色呢?图1将帮助我们回答这个问题。9
我们强调这里将这几卷放在学术外的软件工程理学硕士教育课程的上下文中——不要与计算机科学理学硕士教育混淆。前者的目标是工业界的程序设计者:商业软件的开发者。后者的目标是在学术性研究机构中有用的理论家。关于一个类似的在(理论)计算机科学理学硕士学位的学术性课程的上下文中的场景,有关另一个图的另一个解释也可以给出,以及为学术性软件工程理学学士教育课程的本科生教育的另一个解释。
前提条件或者“并行”课程:我们假定这几卷的读者——或者正在上基于这几卷的卷1的课程的读者逐渐——熟悉命令式、函数式、逻辑、并行和机器程序设计的一般性主题。这些主题的教学必须涵盖有关特定语言的技巧学习和训练,比如函数式程序设计的SML(标准ML)[241,350],逻辑程序设计的Prolog[270,319],模块(即面向对象)程序设计的Modula—3[242,361],Oberon[478]和Java[9,14,225:316,425,463],以及occam[330]和某一精选的“流行技术”的硬件(比如类似于Intel)的芯片。它们的教学也必须涵盖——在基本的程度上——有关于这些程序设计方式和语言的理论背景的知识获得:递归函数理论[129,402]、逻辑程序设计的逻辑[270,319]、命令式程序设计的Hoare逻辑[11,12]以及并发进程代数(CSP[267,268,405,411]和佩特里网[284,379,393-395])。机器程序设计主题[344,456,463]是唯一真正面向硬件但并不是面向硬什设计[257,376]的课程。没有涵盖协同设计[440],即组合的硬件/软件系统设计(典型的比如嵌入式系统,见下文)。但是可以“添加其他的框”!在上述几种的课程中包含或是另外的一些课程,我们期盼读者具有一些算法和数据结构的能够实际应用的知识,即熟悉这些经典和现代的算法和数据结构和具体复杂性度量[7,324,337,451,475]。
辅助课程:结合软件工程的学习,这几卷也是它的一部分,我们假定读者对达到学士程度的所列科目的数学觉得轻松自在,或变得有此感觉。我们建议[485],一个让人高兴的“短小的”介绍,以及对离散数学的大量介绍[195]。我们发现[195]对于该主题的一个完全独立并且是主修的课程来说,是一本非常好的教材。一本假定每个软件工程师都有的书。类似地,但是更多地被看作是学期项目的一部分和实验室(包括自学)工作的其他形式,我们期望读者对实际的、已有的平台技术(软件工具试验箱)感到适度轻松。
主要课程:在尝试后续课程的广度和深度之前,这几卷也用于有关软件工程的三个主要课程中。另外我们建议得到这两本书[218,220],第一本作为辅助材料,第二本特别是用于填补这几卷中没有讨论的验证(即设计演算)部分。
后续课程:传统的软件工程更多地关注于“过份的自省”,即计算系统的内省部分:编译器、数据库系统、分布式系统、操作系统、实时(容错和)嵌入式系统等等。理想上现在对这些主题的探讨应当基于形式规约和设计演算并从它们的角度来进行。(给定1、3个单元的工作量的)嵌入式系统的主题可以深入到包括硬件/软件协同设计[440],并且在其他方面相当依赖于其他系统工程的问题。
另外,我们恳请每位软件工程的学生进行两个“实践”:一个大项目的,面向讨论/研究小组的“系统编程”课程和一个类似“应用系统”课程,分别进行实验性和探索性的研究和开发一个非常重要的硬件/软件控制系统和一个商业的、工业的或其他的应用,这几卷中提示了很多这样的例子!
提示的最后一个软件工程课程:“软件工程管理”。我们有许多关于这个主题的课程材料。暂请参考Hans van Vliet的杰出著作[464]。
形式语言的语言学,包括形式语义的理论,是专业的工程师应当具备的非常重要的知识。与之有关的两门课程:图3最左边第三行和第四行的框。举例来说,语言学课程可以基于David A.Schmidt或John Reynolds的著作。参考资料是[410]和[400]。举例来说,语义学课程可以基于[170,232,401,409,452,472]中的任意一个。
为什么这么多材料
这几卷某种程度上是完备的。我们期待这几卷用于大学和学院的课程,以及由读者自学。一些大学和学院在一些课程中涵盖了部分材料,这些课程在我们同样也给出的这些课程材料中是较早的部分。因此它可以被假定而省略掉吗?不,不完全是这样,因为其他的大学和学院没有涵盖这些作为前提条件的材料。因此这几卷必须反反复复地涉及这些内容。由于这几卷严重地依赖于数学——不是任何高级的东西,也不是需要了解或使用任何高深定理的东西——我们需要在第3、9章简要重述这些材料中的一部分。这里我们也要解释和说明λ演算。
由于现实生活现象无论其是否显然都必须被感觉到,也就是说,必须被概念化,在卷3的第3、5、6、7章,我们将深入探讨什么构成了方法学,什么是定义,什么是现象和概念,以及什么是描述。
由于语言对于我们在软件工程中所做的一切来说是那样重要的基础,而且由于我们不能依赖于那些已经学到(即知晓)的必需知识,因此我们也同样需要去深入地探讨语用、语义和句法,总体来说,就是语言符号学,无论其是形式的还是非形式的。由于自动机和有限状态机类似地构成我们的科学和工程中不可缺少的组成部分,我们也同样需要在卷2的第11章讨论该主题。在探讨所有这些辅助概念的时候,我们改变对其的讨论方式:我们从非传统的角度来介绍它们。由此我们期望读者对其获得一个完全不同的视角,它与工程更加相关而可能不是科学,它与实践更加相关而不是理论。在任何实际的课程中,教师因此可以基于当地的课程来省略一些“深入探讨”的材料。
课程中如何使用这套丛书
与这几卷一起,我们计划通过因特网:
http://www.imm.dtu.ak/~db/The—SE—Books
提供内容详尽的一组电子文档:
各种建议的课程结构(有对各卷的章节和幻灯片的参考)
小组项目描述——一些带有解答
大型开发示例
形式方法的URL
形式方法工具的URL
自本书出版之日起,真实身份的教师可以通过出版社获得
几千页的postscript/pdf课程幻灯片
选定练习的解答
有代表性的(学生)项目报告
幻灯片将涵盖这几卷文本的一个很大的子集。通过绝大多数计算机上的阅读软件,教师可以亲自选择那些涵盖适当课程的幻灯片。
本书的简要介绍
本书分为三卷。每卷分为若干部分。绝大部分由若干章或附录构成。
绝大多数章都提供了练习。一组特定的练习给出了系统的描述。它们的给出几乎贯穿整个卷1。这些练习在附录A中予以介绍。
所有的卷都有大量的交叉引用的索引和文献引用。在卷1中,有术语表附录B。它用于涵盖整个三卷。该术语表的阅读可以独立于这几卷的其他部分。
卷2的附录A给出了类型、值、函数、变量、通道、对象和模式以及在它们其中大多数之上的参数的命名习惯。
本卷的简要介绍
本卷有若干章节。这些章节被编组为部分。图4提炼出这些章节之间的优先关系。这也是对学习本卷大致顺序的建议。
第1章是学习所有其他章的前提。
第2~4章可以被在学校学习过一定离散数学的读者略过。
第5~6章可以被在学校学习过更多离散数学的读者略过。
第7~9章只能被熟练掌握所提及主题的读者略过。
第10~16章组成卷1的核心部分。在第1章之后,如果你继续学习第2章,则你应当学习第2~9章的全部。
在第1章后,如果你继续学习第5章,则你应当学习第5~9章的全部。在第1章后,如果你继续学习第7章,则你应当学习第7、9章的全部。
在继续学习19~21章之前,你可以略过第17和/或18章。
在完成第16~21章中的任一章后,你可以结束本卷的学习。
学习第22章没有任何害处。
大多数章节中的小节可以略过。特别是那些具有较大的例子,或是结束章节的部分。
这样教师和读者能够组织许多适当的课程和学习。...