近期关于计算机类专业本科生教育的一些思考
计算机学科是一门严谨的学科,讲求循序渐进,知其然知其所以然。作为一名热爱计算机科学,抱着一腔热情来到大学校园,渴望在大学中提高自己技术和能力的学生来说,随着年级的上升,对于课堂的认真程度越来越低下。倒不是我对于计算机失去了兴趣(笔者仍花大量时间泡在实验室,去研究计算机的基础),而是计算机专业的教育结构、教育方法已经不适合,不能促进学生真正的成长。
下面是我观察到或者我经历过的一些事情,用以佐证我的观点。
1. 课程明显注水,老师讲课慢且抓不住重点。
计算机编程语言有几十种,虽然各个语言的内核和精髓不同(如果相同都不能成为一种语言),但是每个语言在刚开始的基础语法,例如字符类型、循环结构、赋值语句、输入输出等等,几乎是大差不差的。当一个学生,特别是一个计算机类专业的学生,掌握一门语言后,再接触新的语言,理应相对较快。在课堂教授时,应当适当缩减基础语法的教学时间,多侧重这门语言的精髓部分,让更多的学生理解其中的精髓、其中的思想,而不是花了三四节课才讲到 for 循环。
2. 课程老套,技术落后。
在我刚上大学时(2024年),我一个没接触过编程的人,向我的老师(系主任)寻求编译器时,她推荐的是 VC6.0(1998 年推出,已停止维护)。一个大学,一个与时俱进的大学,使用的编译器居然比上大学的时间早了整整 30 年。这三十年,C 语言的版本发生了多少变化?C 语言的包又新增了多少?我们不得而知。但我们知道,如果一直用这个玩意用到毕业,计算机的出路又在哪呢?而且上述仅仅为一个缩影,Java、PHP 等等都在用老的编译器。这时候有的老师又要说了:我们培养的是思想,不是培养你学习的能力。好,那么我请问了,这和你不更新工具有关系嘛?一个全新的工具带给人不同的感受,如果不更新工具就培养了学习的能力,那么为啥我们不学驾马车了?马车在几十年前也是主流交通工具呀。
3. 教授内容少,不注重工程项目实际需要,假大空。
在大学计算机教室,几乎没听到过打断点、debug 这些词。如果不是我自学,可能我现在还在盯着报错,盯着循环一点点地排错。没有人告诉计算机的底层到底是如何运转的,线性代数、离散数学为什么要学。所有老师上来就教,那么没有一点计算机底子的学生就要问了:我学计算机的为什么要学数学?但其实不然,这些课老师上来就教,没有告诉大家为啥要上这个课。好嘛,那我为啥要上?假大空地上课,假大空地糊弄人。在现在编译程序越来越强的情况下,还有老师在教流程图。有时间不教 Git,不提 GitHub,不教 Markdown,不告诉大家开源……那么好,有人说我这个大学是思想的地方,是为你打基础的,好,Markdown 不够基础嘛?这不是记笔记的东西嘛?那么我再问一句,手写代码有个屁的思想。
4. 评价体系与“真能力”的脱节:
很多核心课程仍以期末闭卷考试为主,考核的是记忆和手写代码的能力,而不是设计、调试、协作、文档撰写、代码审查等真实工程能力。一个能高分通过 C 语言考试的学生,可能从未用 Makefile 管理过超过三个文件的工程,从未用 Valgrind 检测过内存泄漏。课程设计常常沦为“最后一周熬夜拼凑”,缺乏过程管理、代码评审(code review)、迭代改进的环节。没有 Git,就没有协作历史的追溯;没有 CI/CD,就没有自动化测试和构建的概念。
好,以上就是我观察到的现象。现象摆在这了,如何解决呢?
没有办法,我不知道。 多数高校的教育体系设计,其默认目标是培养“合格的、标准化的行业初级从业者”,而非“拥有强自驱力、现代工程视野、并能持续突破边界的创造者”。 对于后者,教育能提供的最宝贵的东西,其实是一个环境:图书馆、有潜力的同学、少数开明的老师、可以试错的低压力时光。计算机教育的问题是一个复杂的系统性问题,非一朝一夕能改变。但个体完全可以在认清其局限后,超越它,用自己的方式成长。
自学吧,孩子们, 计算机世界广阔而深大。计算机科学最幸运的一点是:它的全部知识、工具、社区,几乎都对自学者敞开。 一个历史系学生想自学前沿考古技术可能举步维艰,但一个计算机系学生,只要有网、有电脑、有英语阅读能力,就可以直接触达世界顶级大学的教学视频、工业界的最佳实践、开源社区的最新代码。我们需要真正的专家,去做一些看似 crazy 的、fundamental 的东西,去推动这个世界的进步。