View on GitHub

紫宸

计算机学院拔尖人才工程组

计算机工程教育的反思

这是个极度开放而变化的时代,计算机领域又是变化最快的领域。以前有码农是青春职业的慨叹,现在人工智能带来的人机之争,更让这个领域风云变化,人心惶惶。五年前,慕课初生,随后举国跟随,学堂在线,爱课程等纷纷如雨后春笋,此起彼伏。大有大学将不在,教育将完全扁平化,草根化的趋势。而收费阅读,定制教育,各路豪杰并起,利用APP,微信,各种手段,澎湃席卷而来。再后,高等学府们又掀起了SPOC,在慕课的基础上,凸显了教师的引导作用。注入了教育中更重要的交互性。有识之士又认识到,对于工程教育,没有好的实践教学,将无法撑起工科的天地。于是,虚拟实验甚嚣尘上。国家也出资在各个大学建立虚拟实验中心。教育2.0乘势而生,要用mooc,虚拟实验等将全民学习,继续学习,终身学习成为社会教育的一次大变革。当此之际,以麻省理工为首的世界最顶级大学,在教育从象牙塔中突围的时候,掀起了新工科运动。跨界,设计,创新,社会化等等。也许这是教育掌舵者,在浩浩洪流下,应对未来的思考和行动。

这是一个最好的时代,这是一个最坏的时代。狄更斯在双城记开始的话语,是我们这个时代的很好注脚。新的产生,旧的消亡。像泡沫一样破散,重聚。这个时代需要什么样的人,这个时代需要什么样的能力,计算机工程教育在这样的背景下,中国计算机工程教育在这样的背景下,我们到底需要做出什么?我们的学生工程能力差的呼吁还犹在耳畔,团队合作,组织性,协作性的倡导还正盘绕纠结。领导力,跨界与创新的奔流又汹涌而来。尘沙与狂风,洪流与礁石。我们到底应该做些什么?

世间万物,总是矛盾与统一。真正的方向,应该是冷静的观察与整合。潮流的方向,一方面是未来的方向,但也可能是众人的迷茫。游戏是众人的追逐,抖音成了海外下载最多的软件。但这些潮流是好的方向么?故,不因甚众而逐之,不因其寡而舍之,吾心当观,当辨,当识。下面,我们来思考一下,新时代下的育人的目标是什么?需要什么样的能力?

其实,变化万端的世界,我们也需要一些不变的东西。教育为了什么?为了成就更好的社会,成就更好的人。于个人,是幸福与快乐。于社会,则是个人在组织中发挥良好的作用。成就社会角色,我们才有物质和精神层面丰足的可能。而社会角色并非就能导致个人幸福,否则就不会有那么多事业有成,却郁郁寡欢,焦躁不安的现代社会个体。就不会有心灵鸡汤的滥觞。

从教育机构的角度,我们似乎更重视社会角色的完成。故,各种能力的培养成为我们教育者的焦点。虽然,成就个人幸福的素质,似乎从来不是我们教育最关心的。但在这个时代,这个机器角色被无限放大,人工智能呼啸而至的时代,个人的幸福似乎和社会角色的功用竟然反讽地产生了显式的硬连接。

我发现,导致个人幸福的能力,可以直接导致社会角色的成就!因为机器角色的入侵,人类不仅被物化的速度加快,甚至被物质凌驾的可能。那么多旧的职业似乎都有被淘汰的可能,曾经的香馍馍金融机构似乎成了裁员重灾区。于是,不论从社会一个个团体的生存,还是整个人类社会的胜利与涅槃,创新被提到了无与伦比的高度。创新能带来商业价值,能提高国家实力,能体现出人与人工智能的区别,能绽放出人类之所以为人类的精神光彩。创造力来自哪里?

我觉得创新有垂直创新和集成创新。真正的垂直纵深的创造能力,是非常困难的。石斧到钢刀,到枪炮,到导弹,到原子弹的垂直型创造横跨了人类整个的生存历史。这个演化过程是非常缓慢的。而集成创新,更多的是将不同领域的技术,想法,融合在一起。我们所经历的互联网创新基本就是属于这个范畴。本来PC机有一个能思考的CPU,将它移植到手机上,手机也就智能了。智能的心再移植到冰箱,电视等上面,就是智能家电了。CPU再放到更多东西上,放到生活和社会的各个角落,放到汽车上就是智能汽车,放到传感器网络中,就是物联网。

在垂直创造的同时,必须努力发展集成创新能力,才能快速收获创造的回报。要集成,首先得有集成的东西,因此需要跨界。所以新工科倡导的就有跨界能力。不是知道了多个“界”的知识,就能产生融合和跨界。必须要有串联和沟通的创造力。创造力本质上不是源于逻辑推理,逻辑让创造成为现实,但很难诞生创造的原点。往往,类比,联想,发散,洞见,直觉,顿悟等思维在当中扮演了核心角色。导致元素周期表的那个被蛇爬行的梦境;阴阳二爻撬动的二进制;奥伊斯特拉赫发明颤弓的梦;这里逻辑的身影消失在了绚丽诡影之后。离开了逻辑的强大工具,人们变得不知所措。似乎一切都有关于不断的努力,但却不知如何完成临门一脚。只有期待春雨的潜入与生发。

然,就算一点逻辑似乎也没有的东方禅宗的直觉似顿悟,也借助了语言透露出某种禅机。那个投水而逝的舟子德诚也留下了“满船空载明月归”的机锋。类比,联想,发散,直觉,洞见。这些正是艺术,这个领域的最擅长的东西。艺术!艺术的洗礼,将形成另外一种思维模式,一种情绪化的状态,一种非线性的信息处理模型(逻辑推理是线性化的典范)。我以为,对生命的热忱,在审美中搅动的情绪与冲动,以及艺术中浸泡出的发散性,它们以非线性方式组合关联了信息,创造了一种新形态的可能性。当然,这个可能只是一种雏形,唯有通过逻辑的雕刀细细雕刻形成。

看来,艺术与科学和工程终于因为人类社会角色的创造力需求走到了一起。有些可笑,但也是某种幸运。广义的艺术精神成就了个人的幸福,那个是被我们教育在很多时候遗忘或者说无力顾及的东西。而为了创造力,它们与工程携手了。当然,如何才能有效让双方结合,其实还是个课题。因为,似乎我们从未正面解决过这个问题。

然而,我觉得,艺术之于情绪的渲染,才是创作的根本,当然,也是个人快乐的源泉。不要为了和科学的有效结合,将这个慢慢滋润出的万物的快乐给扼杀了。大音希声,无用之用也许才是正道。这是个最坏的时代,也是个最好的时代。因为,我们可能抛弃桎梏教育成就最好的人这个真正任务的枷锁。创造力的培养,开启了一个新的时代。也可能为了创造力绞杀了心灵最后的给养。

现在,我们看到了这个时代最需要的东西,创造力的培养。也看到了,集成创新需要的跨界与多识。这是最顶层的目标。但,万物之立,当有其基。如根基不具,浮沙难筑高台。我以为,最简单的说,这个根基就是硬实力。创造力如果是软实力,专业能力就是硬实力。既不能自得于硬实力而看不起软实力,也不能因软实力而忘却硬实力。否则,只需要哲学家+数学家,什么专业领域的专家都不用了。我们,不能因为集成创新,资源整合的重要,而忘记了资源精进的重要!否则,就不会有中兴之悲凉。这个时代,大家都在说软实力的重要性,我就来说说硬实力,说说我们国家的现状,说说我以为的可能有效改善提高我们工程教育的途径。它既不偏颇于硬,也不偏颇于软。

新时代的新工科,已经有许多厉害的学校实践,并给出了新的学习方式。强调设计性,强调工程实践性,强调开放性等等。我说说我对硬实力的理解。知识的外在形式在不断变化,特别是计算机领域。语言都是不断出现,框架满天飞。这是外在的变,内在在变化么?其实它的内核没有变化。从核心知识架构,到思维模式。因为,越核心,就越接近基本规律,而基本结构和规律是几乎不会变的。记得我的导师,给博士生上操作系统课程时,就感慨地说,都几十年了,好久没去动这些东西了,但unix操作系统还是过去的那些东西。为什么呢?因为操作系统是整个计算机领域软件部分,最基本的那一层东西了。它直接和硬件打交道,对上层提供服务。还有什么是基本层的那些东西呢?编译器、数据库。一个是创造软件的软件,一个是管理数据的最复杂结构,系统软件里最复杂和困难的软件,涉及到计算机领域最重要的算法,知识(和数据库,编译器,并发都有管理)。 编译器这些年,也没有真正翻天覆地变化。记得当年一个师兄讲,他的熟人出去读这个领域的博士学位,后来都换方向了。没啥新的东西了。数据库领域,也就因为大数据的诞生,刺激了非结构化数据库的崛起。然而,它设计的关键技术和规律还是那些几十年前的东西。而分布式大数据领域最厉害的模型,google提出的Map Reduce其实非常的不先进,居然还有中心节点。但别人通过调优,就是那么厉害。

如果没有基础领域的革命,应用领域是不会产生本质的变化。而作为应用领域最底层的系统层,因直接依赖和耦合于基础领域的设施。比如计算机的目前的体系架构。我估计,量子计算机如果不通用化,系统层的软件不会发生巨变。我师兄告诉我,记得他当时设计一个一天有10几亿的记录的专用数据库时(客户用Oracle系统,直接性系统崩溃),他参考的论文是1960年代的最经典文章,他直接去看这些经典算法的提出者的文章,然后,再根据操作系统的一些文件特性,就改进出了适合他需求的专用数据库。他基本不看现代作者的文章,因为,那些为了某个小点的大动干戈已经不会为他带来真正的价值,而且,后面的作者的文章,已经不会描述当初的缘由和设计的困惑与取舍,对他思路帮助不大。

系统层的核心模式,知识变化不大,和应用领域千变万化有什么关系呢?似乎系统层是打刀的,应用层是舞刀的。铁匠和武术家没啥大关系吧?和一些业内人士聊过,硅谷的创新公司中很牛的那种人,好多都是有系统级经历的人。比如以前是做操作系统的。我师兄,他一直做操作系统,后来做SaaS,做数据中心的监控服务。他们的系统最后在美国成功的卖了。他们卖掉的系统不是系统级的软件,而是应用系统,多数时候要和java与JavaScript打交道。很明显,他是一个代表,代表了那些做系统的人,后来却在应用领域彰显出十分强大的生命力和驾驭力。并没有因为应用领域新技术的千变万化,失去了他们的竞争力。相反,却展现了最为优秀技术的品质:能快速切入新领域,攻克各个难题,独当一面。

回到刚刚的问题,打刀的和舞刀的关系。这个比喻其实有点误导,应用领域造出来的也是软件,系统层的软件也是软件。既然是软件,他们就有本质的相同,就有相同的规律和技术甚至技巧。比如,软件的重用性,在操作系统层和MIS系统中都存在。一个利用函数指针,回调函数搞定;一个利用被包装的函数指针,虚函数搞定。其实,他们是精神相通的。这就意味着,系统层精通的人,在遇到新的计算机问题时,其可以用于触类旁通的知识和模式是具足的。但反过来,应用软件因为在上层,其外在形式的变化就是最为剧烈的。而且好多重要的模式,知识被层层封装,装扮,一般的人已经无法看到下面的机制和模型的东西了。往往还跟随着变幻的形式,自然在乱花渐欲迷人眼的追逐中,并没有留下对本质的洞见。所以,他们面对新的形式的东西,往往不知所措。根本上,就是因为他们缺乏一个可供参考,比对,思考的知识原核。我称为系统观。

只要在系统级有过实践经验的人,都会或多或少地形成系统观。这个系统观,包括:反映计算机系统运行规律的思维模式,思维警觉,重要的关键的知识集合。它绝不是简单的思维模式,也不是简单的知识集合。这个好理解,只有思维,不可能任何高智商的人,怀揣一本字典就成了翻译家。因为思维的连接需要肌肉记忆。如果每一个翻译中的单词还需要去查字典,需要分析思考,理论上是有给出好的翻译的可能性,但实际可行性,可操作性就完全为零。所以,我强烈反对思维派的做法,他们鼓吹知识不重要,记忆不重要,只要会搜索就好。

没有记忆,就没有思维,就没有智慧!

当然,只有知识的记忆,也不可能形成专业领域的智慧。你背下字典也不会是翻译家。这些知识能被贯穿起来,是需要专业的训练。比如,在计算机软件领域就是要写代码。在知行合一中,这些知识点才能成为将来能被用于思考和解决问题的知识点,而不是孤立的没有能量的静止的信息。思维模式,是最为有效地串联知识点,让他们生动和鲜活的发动机。

所以,系统观中,核心知识集合和思维模式两者的并重是好理解的。而思维警觉是指,在思考过程中,对于细节有高度的警觉,这种警觉会将目前的细节和熟悉的各种关注点高效匹配。这样,就特别容易发现潜伏极深的问题。比如,计算机中并发任务的同步就是一种警觉。这种警觉不是你看了操作系统书就可以获得。必须从许多次痛苦中建立起的。就如同一个被火烧伤的人,对火焰的高度警觉。我做过实验,在思考系统处理消息循环时,当你将一个系统的细节一环环展开给初学者,即使他们知道同步的知识点,依然不会在对细节的梳理和审视中突然被同步的警觉刺痛。他们完全看不到那个潜伏的问题。这些警觉点,是整个思维高效性,严密性,安全性的催化剂。

因为,系统级的知识变化最缓慢,甚至相对静止,所以我们在系统级积累核心知识和思维模式就是最划算的。因为一次投入,不必为形式的变化而苦恼。更关键的是,系统层的知识,能渗透到整个计算机全栈中。用到新知识的学习和难题的解决中。所以,它能成为不变应万变的根本。是这个快速变化时代的定海针。是计算机工程领域的核心“硬实力”。

在阐述了这个观点后,我们来看看计算机工程教育的现状和解决方案。

一直在说我们的学生实践能力差。在没有严格考核的情况下,实验基本是一个班几个人做,其他人围观。好多人毕业时,代码量不超过两百行。因为,既然可以抄,为什么要写呢?如果代码量不够,一切都是扯。代码就是计算机软件领域的知行合一的行。这个问题经过这么多年改革,得到好的解决了么?在没有真正有效考核措施之前,在学校整个大环境的淘汰竞争(严进宽出)改变之前,难。

给大家举个简单的例子。冒泡排序的循环,从0开始,从1开始,上限是小于等于还是小于。从前往后循环还是反过来,都是费神的细节。这几个点的组合又有许多变化。要一个老师在面对100个人的时候,慢慢来品味这些差别,这是不可能的。加入这些点的变化最后是否正确需要5分钟的分析时间,100个人就需要500分钟。如果有10道练习题,就需要5000分钟,80多个小时,每天工作8小时来批改,要十天。如果一周两次课,每次布置10道题。一周的题量需要20天的批阅。就算配个助教也改不完。而真正复杂的题目,要看懂说不定都要分析半小时,这样难度将呈几何级增长。何况这样强度的批阅中,可能还要出现疏漏。教师还要做科研,要发文章,请问能够实现真正的严格考核么?

没有严格考核,就没有认真到位的练习,就建立不起肌肉记忆。所有的以工程为导向的学科,本身就包含了强烈的技术性。技术,技巧都是习而后得的,非知之而得。没有习得的刻苦训练,一切都会完蛋。所以,在计算机领域,没有代码量,一切都是空谈!听出国的师兄弟们谈及,在美国的名校,他们往往一门课的代码量都会有5000行左右。许多人要熬夜到凌晨两三点才能入睡。而我们毕业时,都到不了200行。这样的对比,令人喟然。

按照我的分析,岂非老外也面临相同的问题,为什么别人可以。我们就不行?有许多因素,可从学生的考核机制的不同,从教师等多个方面去分析,就不在这里展开。我只针对批阅量太大这个问题来说。因为,他们采用了自动化的批阅工具。我遇到一个本科生,给我抱怨我们的编译原理课程,虽然写了编译器的练习,但他超额完成了整个可运行的编译器,而他的同学们的运行都有问题,却可以得到高于他的分数。为什么是这样?为什么我们不能像某外国高校那样直接将源码提交给自动测试系统。测试通过了,自然就有了分数,才有了后面更多维评价的可能。韩老师,为什么?我默然。

我的观点是,自动化的测评,是在现有资源限制下,解决严格考核的我能看到的出路。有观点认为,如果能激活大家的主动性,是否就更好?我的观点是,规则解决平均问题,主动性是锦上添花。说个简单的比喻。让一个爱打游戏的游戏迷,必须每天打三个游戏,还必须达到某种程度。我想,如果没有强制,他们都会之选择一个游戏投入进去。如果三个游戏代表三门课程的练习,你就会发现,我们很难同时对几个东西保持极高程度的兴奋和兴趣,这是人的天性。所以,只能画底线来保证。总之,严格考核是保证,兴趣是画龙点睛,但靠不住。也不能报太大希望。

说到这里,我以为,围绕系统能力,系统观进行以充分代码时间为基础的体系化设计,并以严格考核为底线的保证。是一条非常有效的,可持续发展的专业硬实力培养路径。

回头我们来看看,这些年我们对于实践教学做出的工作。之前因为企业说我们培养出的学生无法和企业对接,学习的知识陈旧,无法应用。于是,各种校企合作的尝试纷纷出现,成为主流的似乎唯一的声音。但是,这些年过去了,似乎这个问题并没有得到根本解决。分析原因,不外乎有这些点。

企业毕竟是商业单位,不可能将资源持续投入到学生培养上。也不可能将真正主营的业务交给学生来练手。曾经,有些研究生到外企,也就是搞搞翻译工作。就算有些预研性的东西可以交给学生来做,但数量很少,还要经过层层考核才能进去。无法解决大量学生的问题。况且,企业的任务深浅,复杂,知识的所涉都会不同,如果靠它去建立核心的实践能力,从教育来讲,是很不稳定的。而如果和一些教育培训机构合作,其实,对方也就是个简化版的学校罢了。他们并非倡导真正的业界前沿。我就看过,再次进行C语言培训的企业合作单位。

其实,如果对核心能力进行了过硬的培养,和企业的对接是非常容易的。我带过的本科生,经过了系统能力的系统培养,到企业实习都获得了很好的评价。从未遇到过所谓所学过时之说。那些过时,其实是因为他们根本“未学”,“未习得”!真相就是这样简单,那些经典从未被他们真正掌握和习练。一个从不拉琴的人,你就算用天下最好的训练体系来培养他,也是无能为力的。

所以,面向企业的合作没错,但是,那只是一个开眼界的机会,绝不是百炼成钢的关键。如果不能自身硬,眼界再开,也只是过眼云烟。必须立足学校培养核心的工程能力,建立培养体系,这是我的观点。通过体系化的深度实践的系统能力培养,是培养真正业界所需的一条捷径。也是一条艰难的路。

说完了硬实力的培养想法,看看和软实力培养的关系。目前,跨界,创新等各种尝试席卷全球。我们应该跟上么?应该,但还是必须将没有解决好的问题做好,否则,新的尝试无法真正落地。实践能力,硬实力培养的问题不能很好解决,那些软实力的尝试没有生根的舞台。

那为什么国际一流大学都在尝试,而且似乎也颇有心得?我觉得一定要观察环境。一个好吃的橘,换了生长的环境,可能就变成了酸的枳。这是古人都发现的问题。我们的学生,从小没有鼓励独立自主,应试教育没有给他们探索精神,如果像老外那样被扔到一个开放的环境中,他们往往不知所措。而工程领域不像单纯的数学问题,可以只面对想面对的条件。那些未知的干扰因素,往往导致了问题的复杂性。这对我国的学生都是莫大的挑战。如果我们不尝试帮他们建立一些荒野求生的技能,直接扔到外面去求生。估计大多数会因为挫败感,放弃挑战。然后厌学,然后沉迷于游戏。所以,即使要引入开放性的教学,我觉得为了我们的国情,必须做出引导性的课程内容建设。

我们的教学资源就那么多,在软硬实力两手都要抓的今天,如何将力量用到刀刃上,是需要非常认真思考的。我以为,以前的工程实践教育的措施,就有很大的偏颇。导致真正的基本功没有,只是有个企业合作的形式罢了。代码量不够这个最基本的问题没有解决,一切的高级而美好的努力都将化为泡影。都不说系统能力体系化培养的建设本身,只是这个代码量导致的硬实力幻灭都会妨碍我们在软硬实力上的所有努力。有些点看起来不那么高大上,不那么炫目。但他们真的可能是巍峨建筑的关键点,举之则立,毁之则溃。记得,父亲给我讲过,以前家里的老宅用久了倾斜了,一般的木匠都没有办法。直到遇到从江浙来的木匠,找到一根柱子,将绳套在一个位置,一拉,房屋就正了。这个方法是如此简单,简单到听起来没有一点精彩。但整个房屋却得救了。

当然,系统能力的培养如何做,各有其道。真正的难点在于,系统软件本身非常复杂,如果要自己构建一个小系统,将是十分巨大而艰巨的任务。只有很少数精英分子才有机会完成。虽然,我国不少顶级大学在实践这条国外顶级学校曾经走过的路。

当然,我也尝试了一条轻量级构建+逆向析构的敏捷之路。这个轻量级构建的关键是借助病毒攻防作为粘合剂,以有趣又实用的角度整合各方面的系统知识,形成系统观。而逆向析构则依靠前面的积累,进一步将底层知识粘合起来。而在病毒习练之前,代码量的积累则是通过一个C++实现的分阶段画板程序,既积累了代码量,更展现了模块化设计这一重要的软件设计思想。最终形成了有趣的插件化架构。其实,我在大学一年级和二年级的少数学生中实施了该方案,观察到了可喜的结果。他们在大约半年的业余时间学习后,不仅完成了插件化画板,还能撰写病毒。而之后,他们就自动具备了一定深度的逆向分析能力,而且,在之后的自学中就能独立完成实验性的操作系统撰写。他们在画板练习和病毒撰写中,并未学习过C++,汇编语言,计算机组成原理,操作系统,数据结构等相关知识。只是会一点最基本的C语言。因此,他们完全是采取了做中学的方式。

为什么在如此多的基本课程没有学习的情况下,他们能自学成功。我以为是因为主线—病毒的实验和教学材料,进行了诱导式,阶段化的细分和引导,才能慢慢帮助他们度过难关。这又涉及到系统级思维训练的内容了。总之,初期精心的诱导性设计,加后期的放飞,就解决了中国学生开始不知所措,野外生存没有方法可借鉴的问题。我问过两个学生,他们并没有病毒的基础,在50个实验中,他们没有参考任何纸质或网上的关于病毒的资料。这就是考验教学内容的设计了。

世界有精彩,而我们如何纳为己用?这是个需要认真思考的问题。我的思考就是。软硬都要抓。硬实力以系统能力的体系化,深度实践化培养为基础。必须重建经典系统级课程的培养体系。而考核必须严格,对于代码的考核尽量用自动测评来完成。这样,在这些客观性的东西上教师可以不费力,而能将精力花在引导学生上。花在因材施教,画龙点睛上。更关键,学生会被倒逼认真实践,实实在在地过了实践这个朴实而艰辛的关口。我以为这是我们目前教学中非常low的一个缠绕多年的死穴,解之则生气勃发,一切皆有可能。否则,便是龙困浅滩,一毛钱难倒英雄汉。

在此基础上,设计软实力的培养体系。这部分有纯粹的软实力的培养,比如领导力,艺术等。还有一部分是和硬实力培养融合的,比如团队化,社交化下的跨界型项目驱动的培养。

来自 http://blog.sina.com.cn/s/blog_7d5a09f90102y09l.html