1.1 编程与数学
那么,这种泛型编程的想法是从哪里来的?我们又应该怎样来学习它呢?这种想法是从数学中衍生出来的,尤其与抽象代数(abstract algebra)这个数学分支有关。为了使大家能够理解这种编程方式,本书会对抽象代数做一些介绍,并着重讲解怎样从抽象的运算属性来认识对象。这个话题一般是数学专业的大学生才去研究的,然而笔者认为,它对于我们理解泛型编程会起到关键的作用。
实际上,还有很多基本的编程概念也同样来自数学。对这些概念的产生及变化过程加以学习,能够促使我们更好地思考软件的设计问题。比方说,欧几里得(Euclid)的《几何原本》(Elements)虽然是两千多年前写成的书,但是其中的范例仍然具有很高的参考价值,它可以告诉我们,怎样用一些较小且较易理解的组件来构建一套复杂的系统。
尽管抽象是泛型编程的要义,但这个抽象却并不是本来就有的。我们必须从具体的事物入手,才能够获得更为抽象的认识,要想对某个领域进行正确的抽象,就必须理解该领域的细节。
抽象代数里面的抽象很大程度上是从另外一个数学分支的具体成果中得出的,那个分支比抽象代数更为古老,它叫做数论(number theory)。为此,我们还需要介绍数论中的某些关键概念,这些概念与整数的属性有关,其中尤其值得注意的是可除性(divisibility)。
我们在学习这些数学知识时所使用的思路可以对编程技巧起到提升作用,此外我们还会看到,对于当前某些软件来说,有一些数学成果本身就具有极其重要的意义,这尤其体现在给网络隐私与电子商务软件提供支持的加密协议上。本书最后会举例来说明某些数学知识在此类协议中的运用情况。
笔者会在数学和编程之间来回游走。当我们讲解某些重要的数学概念时,笔者会穿插一些对具体算法和通用编程技巧的讨论。笔者对其中某些算法只会给出简要的描述,而对另外一些算法则会在整本书里进行详细的讲解,并将其泛化。除了个别章节只谈数学或只谈编程之外,大部分章节都会同时涉及数学和编程这两个方面。