我在编程这方面有一点完美主义的癖好,可惜不论在中国还是美国,在学校还是职场,都常有令我匪夷所思、眼界大开的见闻。我思来想去,只能认定这是从教育界到工业界的一脉相承。

我对计算机专业教育积怨已久,也曾对不少人在私下吐槽过计算机课程的失败与混乱。今日将其整理一番,以后只需甩出本篇博文,想必能控制血压并省下不少打字的劲。

回忆

电子科大是我对计算机教育失望的源泉。我在事后回想,不幸中的万幸就是电子科大可以逃课、代课、夜不归宿,只要期末能过。于是我几乎没有去过一门专业课,有接近两年的时间在外地实习——那些低质量且无意义的课对我无异于荼毒。

现在回忆我和同学上过的课,处处都是令人啼笑皆非的故事:操作系统课要求背诵「预防死锁」和「避免死锁」的区别;八周的 Java 课用了两周教安装 IDE 与 JDK;大数据课考试是体力活,只须猛抄打印出来的 PPT;密码学课实验给 Windows Server 2003 配 SSL 证书,考试手算 RSA;汇编语言课考试默写汇编指令……各类软件工程课更是纸上谈兵,你画我猜,需求分析到手麻,计算机报告文学出神入化。

更致命的是,这类脱离实际、落后业界的课程却有着「重要」的意义:绩点。若你想要刷这个虚无缥缈的玩意,不论是为了出国还是保研,垃圾知识都会以极大的边际成本侵蚀你的时间。早在高三的时候,我就吐槽过高中教育是对时光的极大浪费,但彼时并未想到大学教育也难逃窠臼。不少同学早出晚归,浸淫图书馆,书本上的屠龙之术练到炉火纯青,可是尽管 GPA 高达 3.95,却写不好一个简单的程序。

诚然,我看待课程的视角存在一定的偏颇:我并不想成为计算机科学家,专业课里有用的知识我也基本在上课之前就已学过。可这更令我为其他同学感到惋惜:他们或许怀揣着梦想,对大学和教师充满信任,却未曾想只被灌入与现实脱轨到冥王星的废料。可是大学还为此趾高气昂,对着畸高的进修率得意洋洋,但在我看来,这只能说明就业成功率低罢了。

到了公司里,我更加体会到了如此科班教育导致的恶果。能进入字节跳动的,基本还是会写代码的,可是我能明显感觉到大部分程序员的技能是自限性的,既缺乏高效的学习能力,更是知其然不知其所以然。有的老员工的代码让我 review 到双眼冒火,从具体实现到架构设计都仿佛大脑缺了几根筋;还有的缺乏基本的理解和交流能力,一项简单的事物需要用不同的表达方式解释三遍才能听懂;新人往往最为恐怖,不少严重缺乏自学能力,Google 晾着不用,缠着人问最基础的通用问题,只差帮他逐行讲解代码。

而且根据我的观察,这是普遍问题,与教育背景并无太大关系。在字节的时候,最令我头痛的人,要么是博士,要么来自名校,不由得令人怀疑当今世界的计算机教育到底出了什么问题。在经历三年多的折磨之后,我对所谓的名校、学历彻底祛魅,以至于教育背景越好,我越会怀疑别人的能力。

再后来,我到了美国。虽然 UCR 算不上顶流,在中国人的眼里更不过是美国二本,但对美国教育和 UC 系统也能管中窥豹。说实话,我很失望,尽管本来也没带希望。这里的课程虽然少了中国特色的死记硬背,但依然乏善可陈。我上的硕士课程,不少名字里带有「advanced」的字样,却不过是将该领域的边角料搜罗起来,组成一个导论性质的介绍罢了。我实在难以想象,学完这些东西就能获得一个「master」的称号。

至此,我的信念更加坚定了:不要信任科班教育,不要指望从课上学到东西。

沉疴

这个世界的计算机教育确实不太对劲。有一本我受益匪浅的书,名叫《代码整洁之道:程序员的职业素养》(我强烈建议每一名程序员阅读此书),专门用了一章来批评科班教育并介绍计算机领域真正的辅导之道。

计算机科班毕业生的质量一直令我颇感失望。究其原因,并不是这些毕业生不够聪明或缺乏天分,而是由于大学并没有教授真正的编程之道。

……并不是所有的计算机科班毕业生都会如此令人失望,还是有不少优秀人才的。但是,我注意到,那些符合要求的毕业生有个共同点:他们几乎都在进入大学之前就已经自学编程,并且在大学里依然保持自学的习惯。

不要误解我的意思。我认同在大学里是有可能获得良好教育的,但是我也认为,在大学里完全也可以蒙混过关,混得一纸文凭,其实什么都不懂。

——《代码整洁之道:程序员的职业素养》

作者并未详细讲述科班教育的欠缺,我姑且在此班门弄斧,根据我的经验与观察提出几点。

第一点,就是通识教育的欠缺。当然,每个大学都有打着「通识教育」的旗号强迫学生必修的课,可是培养方案的设计者对通识教育有根本上的误解。计算机领域的通识教育不是 C 语言、数据结构、算法,而是形式逻辑、信息检索、计算机林林总总的事物背后提纲挈领的思想。我们需要逻辑思维来理解事物背后的原因、直击问题的要害,也需要 Google、Stack Overflow 来检索早已超越人脑容量的资料。而计算机里的几个核心思想,一旦理解就可以一通百通,就比如「高内聚、低耦合」不知是多少系统与设计的核心奥义。可是大学的通识教育执着于对基础学科和理论知识的雨露均沾,以及面向考试的囫囵吞枣、死记硬背,最后培养出的只会是高考般的思维模式,追求背诵而非理解,顺从而非质疑,饭来张口而非自行探索。

第二点,便是专业知识的陈旧。倘若技术教得好,大学至少还能与培训班一较高下,稳定输出社会可用的螺丝钉。可惜的是,大学教师的知识几乎全面落后时代一二十年。计算机是一门高速发展的新兴学科,诞生至今不满百年,却已有多次翻天覆地的变化。而教师早就与工业界脱轨,真正愿意跟随时代的屈指可数;即使知道新鲜的知识,也不太可能以课堂的形式教出来,因为还要考虑老教师的感受。而落后的知识放到工业界完全无法使用,可是学生也没有从大学获得正确的学习方法,于是只能寄托于在研究生阶段学会更多。但研究生的课程也逃不过对本科的机械重复,付出三年的机会成本却吸收了更多的垃圾。在某种层面上,本科的计算机教育成效甚至不及 2.5 年制大专或者转码培训班。

第三点,带着我个人的一些成见,那就是缺少技术之外的教育,特别是对表达和美感的培养。在我的观察中,很多程序员的语言能力都有所欠缺,审美也令人堪忧。语言能力不仅决定说话是否颠三倒四,更是逻辑思维的重要体现。如果在写软件文档时无法适当地给出上下文、考虑读者是否能够理解,那么写代码时也很可能无法因地制宜选择合适的逻辑;而对事物缺乏美与丑的辨认能力,则可能在设计架构、数据结构时大而化之,贻害无穷。可是大学仿佛并不理解这一点,就像我本科的电子科大,一所纯正的理工科院校,文科专业必修数学、物理,理工科却只有一门轻易水过的「人类文明经典鉴赏」。这让我想起理工科对文科的普遍歧视,哪怕自己说话都不一定顺溜。

我至今感激自己在机缘巧合之下做出了正确的选择,可是面对莘莘学子,我只能报以一声叹息。

死结

那么解决方案是什么呢?很可惜,我不知道。现代大学制度对诸多传统学科都工作良好,可是面对这样一门日新月异的新兴专业却屡遭挫败。《代码整洁之道》里提出要建设公司内部高效、非常规的辅导制度,认为培养成熟开发人员的重任无法寄希望于大学,我很难不赞同。

但要真没有一点建议,那未免过于悲观。在我看来,大学的计算机专业最亟待改善的就是引入真正的通识教育:一门形式逻辑、一门信息检索,而且要贴近现实生活。我看过中国的《形式逻辑》一书,还是过于理论化,应当结合更加真实的例子,比如网络上的骂架都产生了哪些逻辑谬误。而信息检索该教的其实是《提问的智慧》,毕竟现代人都会打开网站搜索,却不一定会选用正确的关键字。这些知识几乎对每个学科、每个人都广泛适用,绝非仅仅计算机一个专业。只是,考虑到中国的国情,即使是这点建议也未必行得通就是了。

总体来说,我认为计算机的大学教育是一个死结。它可能需要大学体系的彻底革新,否则我们还是只能倚赖个人的兴趣、选择、运气能引领其走上一条正确的道路,或者让社会上的前辈付出巨大的心力将其重新辅导成才。

最后,还是照例声明一下,我的见识有限,无法涵盖世界上的所有大学,也没有谈及研究型的教育。但我相信我所表达的是计算机专业课程教育的常态。我爱计算机,我不喜欢这个常态。