我在逛知乎的时候看到一个问题:
随手写了个回答,没想到很多读者都表示说出了心声,所以也同步发到公众号。
以下是原回答
我自己是 CS 科班的,读者里也有很多各大高校
计算机的同学,覆盖了上交、北邮、南邮、华科、川大、普通一本等等,根据他们反馈,总结了以下几点:
- 上课耽误学习,不上课考勤扣分,拿不了高绩点,耽误保研出国。不多说,懂的都懂哈哈。
- 课程设置不合理,实验课多,作业多,并且大多是写 Word 报告,实验报告就像这种(迪杰克斯拉算法):
- 占了很多时间,但是效果却不如自学,上课基本是放 PPT,考试内容全在 PPT 上,看书的同学没有背 PPT 的分数考得高,没有人愿意去啃那些大厚书,因为“性价比”太低。
- 都 2021年了,估计没有几个学校提交代码是用 Git、Gitlab 这些工具吧,评分也没有搞自动化测试。做悉大、MIT这些学校的 labs,都是直接去网站提交代码,跑 test case,马上就能知道哪些 case 没有过,再去 debug。
- 教材大部分使用自己编的,水平如何就不多说了,懂的都懂。很多书上还是用 VC 6.0 来写的 C,为什么不换用更加优秀经典的教材呢?顺便贴一个匿名回答:不过值得表扬的是,我们学校教材基本都是使用全英文黑皮书,比如《计算机网络:自顶向下》、《深入理解计算机系统》等,这样的学校我知道有 15 所以上,希望会越来越多~对于计算机的学生,最好的资料和书籍是美帝那边的,因为计算机就是发源自美帝。
- 讲课全程 PPT,放 PPT 就算了吧,很多 PPT 还是十几年都没更新那种(C语言 PPT 上用的还是 VC6.0....),什么 C 语言 main 函数返回值 void。
我看过的一门非常经典课程,MIT CS107,讲师全程几乎都是黑板粉笔板书,学生跟着老师思路学习,这才是最高效的,而且各自手写代码、手画栈帧、手写汇编:
在我大学期间,只有一位数学老师坚持板书,大部分基本就是放 PPT 了事,下面的学生纷纷拿起手机拍照,或者直接下课去拷 PPT,这样能学到多少呢?
- 代码量太少,很多同学到毕业估计几万行都没写到,但是真正想锻炼出极强的编程能力没有 10w 很难,这方面作为学生我们也要多反思,为什么平时没有写到这么多代码。
- 很多学校就是孤立的学了一堆 操作系统、计组、体系结构、编译原理、C、汇编,但是很少有同学能把这些课程连起来形成 CS 体系,这方面 CMU 的神书神课《CSAPP》又要提下了,幸好我们学校开设了系统编程的课程,教材就是 CSAPP,其它没有开设这门课的学校建议学弟学妹们自学。
- 课程设置杂乱,学了一堆的数电、模电、大学物理..... 想起大一被大物实验支配的恐惧,时间都费在这些上面了,说实话把这些课程压缩,上一些函数式编程、或者比较前沿的 CS 方向,我觉得对计算机专业更好!
- 核心课程上的太晚!我们学校大二下、大三才开始计网、操作系统、数据库原理等核心课程,太晚了,这些课程至少要在大三前完成,大三再开设图形学、编译原理等进阶课程,大四直接就是实践课程为主或者让同学们自己出去找实习!
我个人觉得大概这样设置CS课程更为合理:大一上:C/C 程序设计、高数1(初等微积分)、离散数学大一下:数字逻辑、数据结构、汇编语言、面向对象编程(Java/C )、高数2 、线性代数大二上:软件工程、数据库、Java/Python Web开发、组成原理大二下:操作系统、计算机网络、系统级编程(CSAPP)大三:软件测试、软件安全、课程设计、密码学、图形学等选修方向大四:实践、毕设、实习
另外,还有最大的问题就是OS、网络、数据库等 CS 核心课程上成了文科!缺乏一些动手实践 Lab,大部分都是写实验报告,就是不写代码。为什么美帝在数据库、操作系统、各种工业软件工程能力如此强悍?我觉得和他们 CS 强校的教育模式有关。国外,尤其是美国,很多高校 CS 教育极其注重实践,国内也就清北复交浙等少数 TOP 学校有少量的实践教学,其它大部分是念 PPT,课后作业就是做 Word 项目。因为很多老师自己也不会编程.... 更没法设计那些硬核的实验和辅助教学平台,不会编程的人教你编程......这结果能好么。就拿我自己来说,学校好歹也是个 985 吧,我上了三周的 Java 课,愣是没听懂在讲啥,最后看了几个尚学堂高琪的视频几天就入门了....
再来说美国为什么有强大的基础软件能力吧,这得益于他们的高校在培养学生造轮子的能力。比如国外是如何学习数据库的?就拿 MIT 来说,6.830 Database Systems: 这是一门数据库系统的一门核心课程。前半部分比较基础的数据库的知识,后半段主要在讲Distributed Databases的东西他们的实验是什么?是让你写个小型关系型数据库,比如 lab1实现数据库基本的存储逻辑结构,具体包括:Tuple、TupleDesc、HeapPage、HeapFile、SeqScan、BufferPool等。国内数据库教什么?教 SQL 怎么写,教数据库原理(这个还算好的)更有甚者实验就是安排用 Java 使用 JDBC 连接MySQL 写个应用。。。国外是如何教计算机网络的?手写 TCP!比如斯坦福 CS 144,CS144 Lab Assignments - 手写TCP - LAB4
国内是怎么教的?记住 TCP 三次握手、四次挥手、记住 DNS使用 UDP协议....国内大作业是什么?有些是 Word 写报告。。。有些是让你用一下 socket api 写个网络程序。。。好吧,其实会用 socket 的也挺不错的,最关键是有些直接让你写个爬虫、HTTP 服务,就算是使用了网络协议了。。。这是计算机网络原理吗?国外是如何教 操作系统的?比如 MIT 6.828,现在改名了。直接让你基于一个 xv6 去实现一些模块,比如文件系统、多线程。国内是如何教的?记住进程和线程区别、记住虚拟内存的各种组关联....当然也有一些学校会有实验,比如清华 ucore、哈工大 linux0.11、川大也有引入 nachos这就是为什么美国高校有很强的编码能力、造轮子的能力,因为他们的CS学生成长环境就是这样的。大多数高校老师升职不靠教学,所以大家都没把心思放在教学上,做“研究”发论文,不香么。设计这么多麻烦的实验不是给自己找麻烦么弄个 PPT、Word 多爽呀这个现象我估计还会一直持续下去,老实说,跟着学校的路线走,学计算机,大概率毕业即失业。
给大家列举一个我做过的国外老师设计的实验吧:模拟实现 TCP 可靠传输的人家老外老师就是给力,直接做了一个网站,这个网站你可以通过 TCP 连接上去,然后你需要创建几个节点,互相发消息。他们之间的消息都会经过老师的网站所以通过网站上是可以控制丢包率的,也能控制节点的拓扑结构,要求就是让你基于这种不可靠的信道,做出可靠数据传输!这简直就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我安排上!就是像下面图中一样,圆圈就表示你可达的范围,不同节点形成各种网络拓扑,可以调节网络 丢包率 Loss chance。
设计这些东西、实验系统、自动化测试评分系统,肯定需要花费老师大量时间精力,但是有没有带来多少升职上的产出,当然没动力去搞啰。反正吧,学计算机最好不要全部去跟着学校学,除非你学校很好,不然大概率毕业即失业。当然,说了这么多问题,也是有长处的,这里引用知乎一位答主邦彦的总结:
最后,附上这个回答下的一些评论:
郑重申明
本文非崇洋媚外,吐槽只针对部分高校的现象。像清华、哈工大、南大就有非常不错的课程,也在积极像 MIT、Stanford 学习,毕业的时候已经有自己造的编译器、OS、数据库等等,并且均使用 docker 和 gitlab CI 解决环境和自动化测试问题。-- 来自评论区但是这样的学校有点少,希望国内能有更多高校计算机教育模式能够早日跟美帝等 CS 强校接轨。培养更多基础扎实、编程能力强的学生,助力操作系统、数据库等基础软件、工业软件的发展。