这学期我上了一门“新课”《计算机组成原理》,还有一个月就该结课了。说是新课,是因为课程大纲里的大部分内容对我都是陌生的。本科的时候,我学的也是《计算机组成原理》这门课,是张悠慧老师开的,用的是CSAPP那本书,从我们那一年开始,不再“造机”(即知名的“奋战三星期,造台计算机”),而是改用Y86,在仿真器上学习。严格来说,CSAPP这本书讲的更多的是“计算机系统”,与“组成原理”还不完全一样,所以这学期准备这门课真的是无比困难。
眼看到了期末,课快按部就班上完了,感谢哈工大刘宏伟老师的视频,没有他,我不知道这门课要怎么能够讲完。但这门课真的上得难受,前段时间在小红书上读到一篇文章,题目大概是“我们北邮的计算机教育的确是有问题的”,写得直接,也戳中了不少我心里积累的困惑。遗憾的是,当时没有保存,现在已经看不到了。
实际上,与其说这是“北邮的问题”,倒不如说是“我们国家的计算机教育的确是有问题”。除了清华等少数学校,大多数学校的计算机专业基础课都很难让学生建立对计算机的整体理解(甚至清华现在能不能做到也存疑)。包括“计算机组成原理”、“计算机网络”、“数据库原理”在内的很多课程最后被讲成了概念的集合,学生听到了许多抽象的甚至错误的名词,记不住,也不知道他们之间的关系,更不能拼凑出一个计算机系统的工作机制。
我就拿计算机组成原理这门课先立个靶子。刚才提到CSAPP,它是一本好书,因为它真的建立了“系统观”,我想这是计算机教育最核心的内容。而这一学期,我反复在我的Channel和一些群里批判的,是目前国内大部分计算机类专业都在使用的唐朔飞版《计算机组成原理》。这本书陈旧、过时,与现代计算机格格不入。陈旧这一点,已经是“原罪”了,学生听课完成作业,看的是几十年前的模型;而他们手里的电脑手机则在运行一个完全不同的体系。抛开陈旧,我觉得最核心的问题实际上是难以帮学生建立“系统观”。作者试图把她见到的所有计算机组成的知识都放到这个课本里,然后试图设计一个“抽象但看似完备”的体系。让我举几个例子:
在讲“数的表示”时,作者是这么定义原码的:
$$[x]_原= \begin{cases} 0,x & 2^n > x \ge 0\\ 2^n-x & 0 \ge x > -2^n \end{cases} $$
原码实际上就是符号位加上|x|的二进制,这么定义既无必要,事实上也无意义。增加了学生的理解负担,也脱离了数要在计算机的字长范围内运算这样一个现实的限制。其他关于数的表达也与之类似。这种写法本质上体现了一个我国很多教材长期存在的问题:教科书倾向于以形式化、抽象化的数学表达来描述本不需要这样处理的概念,结果让学生远离机器本身。
再举一例:
控制单元控制一条指令执行的过程实质上是依次执行一个确定的微操作序列的过程。由于不同指令所对应的微操作数及其复杂程度不同,因此每条指令和每个微操作所需的执行时间也不同。通常将如何形成控制不同微操作序列所采用的时序控制方式称为CU的控制方式。常见的控制方式有同步控制、异步控制、联合控制和人工控制四种。
- 同步控制方式:同步控制方式是指,任何一条指令或指令中任何一个微操作的执行都是事先确定的,并且都是受统一基准时标的时序信号所控制的方式。
- 异步控制方式:异步控制方式不存在基准时标信号,没有固定的周期节拍和严格的时钟同步,执行每条指令和每个操作需要多少时间就占用多少时间。
- 联合控制方式:同步控制和异步控制相结合就是联合控制方式。
- 人工控制方式
我做了一些调研,并没有找到什么商用计算机的CU是采用“异步控制方式”的(虽然确实有一些试验性质的设计),似乎是为了“完备”而“完备”。
如果问学生真正需要什么,我想答案还是“系统观”,知道计算机是由哪些部分构成的,知道这些部分之间的边界和接口;当运行一条指令时,能想象它从编译器一路被翻译到机器,再从取指到访存的过程。《Computer Organization and Design》那本书里提到的“七个伟大思想”,特别是抽象,实际上构成了整个计算机学科的主线。可惜这样的思想,在多数课程中很难被系统地呈现出来,特别是在当前的课程体系下。这些年,许多学校都在“减课”。课程数量减少,实验负担减少,学生有了更多时间自主发展。但计算机是一门工程为先的学科。工程的基础如果铺得太窄,后面的系统观就难以建立。倒是我当年学编译原理、汇编语言、形式语言与自动机、嵌入式系统的时候,反而更容易看到不同层次之间的联系,也更容易体会到计算机系统作为一个整体的精巧。
到了LLM的时代,这个问题更突出。今天的AI已经能取代很多老师了,能回到老师们回答不出来的问题;当然也能取代学生,做作业,特别是编程作业的能力远超所有学生。但我认为,AI无法替学生形成系统观——系统观不能从文本里得到。这是一种长期训练出来的直觉,需要看过真实的系统,做过实验,犯过错误。这恰恰是老师所能提供的。
计算机本应是一个充满逻辑之美、工程之美的学科,却会被教成一堆令人望而却步的名词表。我没想好这门课究竟应该怎么改。教材可以换,实验可以换,考核方式也可以换,这些都只是表层。但一定得改,不然下一代学生依旧要重复今天的困惑。毕竟,这门课承载着我们理解计算机的起点,而起点错了,后面便很难再走稳。
作者: Erik Gazi