vlambda博客
学习文章列表

如何优雅地实施高等教育——以一位java助教为例【投稿】

    “作为老师,我就像你坐火车偶然碰到的旅客,告诉你某处有一座名山,值得你今生一游。我也许会把你带到山脚下。你也许会沿着山路走到山顶,也许坐缆车上去了,也许走到一半迷了路,也许在杂草丛中走出一条新路,也许在山脚下兜了两圈就走了。也许轻轻松松,也许非常吃力。不过,那都是你自己的事了。你的个性和投入,而不是我怎么教,决定了你能学到什么。”

——题记

   

    周老师在北京某高校向来以意识流的上课风格著称。他的课上,向来是课本摆在一旁,讲到哪里则随心所欲。开学的前两周,他用十几个课时给同学们亲切地讲授了费米子和玻色子的产生与湮灭、Anti-De-Sitter共型场对偶、Pauli不相容原理的外微分表达、一般流形上的Stokes公式……

    或许这所高校的老师们上课风格大都如此。我有幸听过刘思齐老师在新冠时代录制的课程。和当下的教材一比,“高屋建瓴”之感立刻显现。他会告诉你,这个知识点可以在哪本书上找到最详实的资料、最厉害的结论。几乎每一节课,你都能学到某个知识点在当下的学科体系内能得到的最强结论,或是最前沿的进展,还能知道有哪些书好值得一读。

    他们突破了现行教材的局限,为学生打开了广阔的天地,告诉了那些想要走遍名山大川的同学,哪里有这世界上最美的风景。所谓“五岳寻仙不辞远,一生好入名山游”,不是课堂本身,而是学生们自身的个性和投入,决定了他们能看到怎样的风景。

    我常常为自己没有这样优秀的老师感到懊恼。缺乏广阔的视野,便只能偏安一隅,把这世界的一角当作世界之全,在本就不大的池塘之中,无意义地重复自以为高深的知识。如《庄子·逍遥游》所言“朝菌不知晦朔,蟪蛄不知春秋”。无“抟扶摇而上者九万里”之眼界,便无从理解“而后乃今将图南”之大志。或许这就是内卷的本源。

    但有这样一位助教,改变了我们这偏安一隅的现状。关于他,可以讲的故事太多,且从很久很久以前的一次习题课说起吧。

    一个周五的下午。以摸鱼且放水的教学心态著称的程设老师,布置了筛选0-1000内前100个素数的作业。其本意则是,不允许使用算法,只用素数的定义进行筛查。这是多么局限同学们视野的规定啊?这位优秀的助教,语重心长地对同学们说:“这个题目如果你们使用Eratosthenes筛法来写,我就给你们A+。”和上文中提到的那些老师不同,这位助教不给出任何参考资料。我认为,这是互联网时代最好的一种教学方式。给出资料,反而是限制了同学们的视野。譬如说吧,那些教授可能会告诉你,潘承洞、潘承彪的《初等数论》第一章有关于这个算法的简单讨论,或者你也可以看陈景润的书,第一章也有相关内容。这就把同学们的视野给限制住了。若不然的话,如果有同学误打误撞看到了这些【图1】,他的收获,难道不是其他同学的千百倍吗?

    此后,每次作业他都给出一些奇怪的加分点。这些加分点和这门课几乎没有任何关系。那些教授无非是在这门课的基础上做一些小的拓展,如讲n维欧式空间拓展到一般度量空间或是拓扑空间。而他,则是把同学们带入了和这门课完全不相关的领域。至于这门课本身,则不在他的考虑范围之内。

    譬如说吧,有一次我写了一个程序,非常好地体现了面向对象的思维——把所有的变量进行了封装,采用了一系列面向对象的设计思想。结果他给了我A-。

我问他:“我的代码不是写得很好吗?”

他说:“哪里好?”

我说:“这非常面向对象,所有的变量都采用了封装机制,耦合度非常低……”

他说:“我不管这些。”

是啊,面向对象,难道不是每个学生都要掌握的内容吗?为每个变量提供装箱,面向接口进行实现,难道不是每次作业的常规操作吗?为每个类重写toString(),equals()方法,对外提供setter and getter难道值得一提吗?完成老师要求的内容,就想得A?

简直是痴心妄想啊!

相反地,难道面向过程,不才是面向对象的灵魂吗?你看这优雅的HashMap,你看这美丽的自平衡二叉树,你看这漂亮的快速幂!这才是我们要掌握的东西啊!

他还给我们介绍了UML图,让我们提前感受架构师的生活。同样地,他没有给出任何参考资料,只是在群里丢了一个5页的英文文档,以及轻描淡写地一句:“用UML图可以提高我判作业的心情。”不过据我所知,他基本没怎么判过作业,直到期末周的ddl前。

最让人感动的,莫过于期末的大作业了。一如既往地,不给任何参考资料,不告诉你需要用到哪些知识。要求是用你完全没有学过的知识做一个项目,顺便帮看不懂的代码挑挑错,然后画一个UML图显示一下各个类之间的关联、泛化关系。

多么漂亮的作业啊!

什么叫优秀助教啊!

什么叫人生导师啊!

就在两天的时间内,我学完了或许是一个学期的内容:StringBuffer、StringBuilder、Random类、Collection接口、TreeSet、HashSet、ArrayList、LinkedList、泛型机制、HashCode、HashMap、二叉树……

至此为止,我依旧无法看懂他的作业到底在讲什么。

这位以放生心态著称的教授果断终止了本次作业,改为加分作业。这是多么悲哀的一件事啊!这难道不是对同学们自学能力的摧残吗?同学们本可以在4个学分的课上学到8个学分的内容,这难道不是一件好事吗?

大一的生活至此圆满结束了。纵然将来,那些代码和算法,与我们的生活毫无关系,纵然有一天,我们会将曾经让我们秃头的这些东西全然忘记,但是,这位优秀的助教必将永远活在我们心中。

 

写在最后:

    无论如何,这次作业我尽力了。原本的计划是把多线程部分学完,全力把本次作业做好,然后开源,写不出来的同学可以直接拿代码。反正我估计他也看不出来。但终究是高估了自己的学习能力。这两天什么都没干,从早学到晚,往往是学得头都炸了以后滚去睡觉。即使如此,DDL前也没能学到File类。前面得Map,Set,List也是马马虎虎、不明不白。

    这次作业确实远超我个人能力。但我由衷地希望认真做了本次作业的同学真的能学到一些东西,而不是一知半解地写了点自己都看不懂的代码,敷衍了一份报告便了事了。我想这不是高等教育的目的。既然来了大学,你的终极目标是学到最厉害的知识,掌握最强大的能力,而不是分数或别的。虽然后者确实重要。柏拉图在《理想国》中指出,善的理念会带来善的结果。我认为理想中的教育也应该是扎实的知识架构换来漂亮的成绩。但现实却不如人意。

    我衷心地祝愿,大家将来遇到的老师,都是告诉你何处有名山大川的“旅客”,你能顺着他们的指引,通过自己的投入,看到和别人不一样的风景。我也衷心地祝愿,大家永远不会遇到那些从来不告诉你风景在哪,却要求你交一篇游记的怪物。