我们需要怎样的计算机科学教育
一直在想,轮到我自己来写教材,书的主题是什么。有的从软件硬件接口入手,有的从体系架构入手,还有的从性能设计入手。这些切入角度都不错,不过我今天找到了更好的——从『计算思维』入手。
而我们的学科设计和教材往往两头够不着,在各种条件的制约下成了『四不像』。而具体到计算机科学上,我的感觉是没有真正让同学们喜欢上这门本来非常有趣的学科,症结在哪里?今天无意间找到了答案——计算思维。其实倒也不复杂:从我们的教材开始,就没有着力去培养『计算思维』,或者说没有把一门实践学科以实践的方式来进行教学。
那么,计算思维到底说的是什么,不同人有不同的理解,我们来看看 Jeannette M. Wing 最初于 2006 年提出时的定义(是我 CMU 的教授,也跟着沾沾光)
计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动
具体的表现呢?
- 本质是抽象和自动化
- 递归思维
- 通过约简、嵌入、转化和仿真等方法,把一个困难的问题转化为我们已经有办法解决的问题
- 通过合适的表示及建模方法来使问题得以解决
- 把数据转换成代码,把代码转换为数据
- 通过抽象和分解来解决复杂问题
- 通过简洁和优雅来判断系统设计的优劣
- 通过冗余、容灾和错误处理来从最坏情况中恢复
- …..
仔细回忆一下,其实我们所学的很多东西,都是围绕着『计算思维』的,或者说,是为了培养『计算思维』而准备的。而一旦拥有了『计算思维』,就意味着能够以计算机科学的角度去思考,才能更好地去利用计算机的力量来解决问题。
然后我们就会发现,教育工作者和企业最希望学生拥有的能力,都包含在其中了,比如:
- 持续学习能力 -> 利用抽象和自动化等特性
- 独立解决问题的能力 -> 通过抽象和分解来解决复杂问题
- 逻辑分析能力 -> 通过约简、嵌入、转化和仿真等方法,把一个困难的问题转化为我们已经有办法解决的问题
- 开源精神 -> 通过简洁和优雅来判断系统设计的优劣
- 理论与实际结合 -> 把数据转换成代码,把代码转换为数据
所以核心是:想办法在课程设计上和习题上击中这些要点。比如说,开一门课一定是因为学生的能力培养需要什么,而不是为了教书而教书。也应该摒弃『计算机基础教学就是教学生怎么将计算机作为工具使用』这种错误思想,而是着眼于培养『计算思维』能力。
据此,给自己开出的药方是:
- 用经典案例结合计算学科基本问题讲述计算机科学的来龙去脉,并结合相关学科展望学科融合与跨界发展
- 通过动手实验了解计算机本质与解决问题的基本步骤(习题要好好设计)
- 每一章节都要围绕『计算思维』来写,帮助读者建立完整的思维框架,尤其是在抽象和自动化这两个层面上
- 针对重要的设计思想一定要用翔实的例子帮助读者理解清楚,更重要的是点出设计背后的思考,也就是『为什么要这么设计』
- 多一点私心:加入更多中国与汉字相关的内容,让读者了解我们在数字浪潮中的位置(比如说处理器相关的内容在介绍 x86-64 的基础上加入龙芯的内容)
有了魂,剩下的血肉就好组织了。
把教学目标落实到章节
以下补充来自当年《计算机系统导论》的前言、结语草稿,以及为教材寻找素材的《内核恐慌话题笔记》。两份教材草稿中的占位日期不作为实际写作日期。
首先要明确读者:这里主要面向本科低年级学生,以及会写程序、但对底层概念还不清楚的学习者。章节的任务不是把定义放齐,而是帮助读者建立软硬件之间的联系,理解同一个问题为什么可能有不同层次的解决办法。
原先给每章设计的顺序是:
- 背景:先说明问题从哪里来,为什么值得解决。
- 抽象与约定:讲清这个系统提供什么服务,以及边界在哪里。
- 实现:逐步把抽象变成可观察、可操作的结构。
- 取舍与延伸:指出本章为了容易理解而省略了什么,还有哪些不同设计。
- 项目与验证:给出构建步骤和检查方法,让读者知道自己是否真正完成了任务。
这样的安排希望让“先抽象,再实现”不只是一句口号。每个阶段都要有具体目标、指引和反馈,让读者知道学到这里能够做什么,也知道卡住时可以回到哪一个问题。
为教材寻找有趣的入口时,我还整理过播客里的话题。键盘可以引出输入与编码,字体可以联系显示技术,并发与异步可以引出不同协作模型。话题本身不是教学成果,只有把它接回要解释的概念,才不至于变成知识点之外的热闹。
最终想培养的仍是持续学习、独立解决问题,以及把理论放进实践中检验的能力。教材既要激发兴趣,也要为读者继续探索留下路径。
相关文章
- 学习的悖论:用指标观察进步,而不是代替目标2026-11-06
- 直面世界,面对疾风2017-02-27
- 做人,做事,做自己2017-01-18
- 小土刀的生产力指南2016-12-10