这篇文章的草稿在我的Inbox里压了差不多2周,今天因一些机缘巧合决定将其完成。也是因为这些机缘巧合,此处免去10000字的疯狂叠甲。
本文更好的Markdown阅读体验参见:Jaison.ink
文章架构:
课程是知识海洋中的一座座孤岛
现象
微观解决方案
软工专业课有点“软”
现象
微观解决方案
宏观解决方案
后言
我爱软工
软工为大家赋能
本文的初心
我和软工的故事
关于评论
注释、延伸阅读及参考资料plaintext课程是知识海洋中的一座座孤岛#
现象#
在我看来,当前大部分课程的课程大纲,都像是在写这个课程的名字的全命题作文,而不是整个培养方案的有机组成部分。
而当前的培养方案,则像是一片互相之间不相连的岛屿,缺乏衔接、关联。
有一些可能有关联,但实际内容毫无关联的课程
以大一的物理课为例。作为非物理专业的学生,我们上着和物理专业类似架构的物理课程,但是没有他们那么长的时间进行教授。
这是一种怎样的情景呢?我愿称之为“高中式教学”,在物理的每一个大路上都选择一小块知识进行讲述,并试图“打造一个严密的知识体系”,就像高中的时候,光学热学电磁学运动学都学一点,只不过是用微积分来讲述。
结果就是,很多同学(比如我)上了一年的大学物理课,最后一个物理公式都没有记住,更别说对未来的科研或者创业或者理解什么问题有任何助益了。
课程之间的衔接没有做好
有些课的前置课程并没有教授。以我非常喜欢的大模型课实验课为例。这节课的jupyter代码框架其实写得非常非常非常好,有意思、注释详细且知识密度高,是那种可以拿上Coursera等在线教学平台的水平。但是我相信对于大多数没有学过Python的同学来说,这门课就是在玩AI,或者说被AI玩,这是极为痛苦的。
前置课程并没有真的教授前置内容
比如,高等数学、线性代数和概率统计课程几乎完全没有为后续课程做准备,而是不缓不慢地讲些简单而无用的计算。
专业课程不应该提供通识教育。
微观解决方案#
不是教这个课程名称下涵盖了什么内容,而是教这个课程名称下这个专业的学生需要的内容。
这就像在做一台家庭汽车时,哪怕这家公司有很好的底盘技术,也不应该给载小孩的父亲提供赛车弹射式零百加速按钮。
课程质量的第一要素不是全面,而是有趣
回到刚刚的两个例子,像物理这种跟软件工程关系不大的课程,不应该试图讲述一个完整的体系(这毫无作用且无法在极其有限的时间内讲清楚),而可以讲一些和计算机相关的有趣物理概念。
比如,在“如果实现常温超导,计算机会变成什么样?”这一问题下,可以引出热力学第二方程,信息熵,麦克斯韦妖,希拉德引擎,刘维尔定理(相空间守恒),朗道尔极限等有趣的物理概念,并且这些概念,真的和专业本身有关。哪怕讲不了这些概念,也可以以科普的方式,讲一些有趣的反常识的理论,比如相对论中的空间和时间的概念,质量和引力的概念,以吸引学生深入探索。否则学生(我)真的只会学完就忘,等于没学。
再比如,据我了解,不少同学会觉得线性代数没什么用,但如果线性代数这么讲呢:
在讲到线性方程和秩的概念时,引入神经网络,讲讲为什么不能零初始化隐藏层节点;在讲到商空间的概念时,以三维图像和一个分类问题的例子埋下支持向量机的种子;就算讲不了这些,也可以讲讲中国剩余定理念念古文嘛。
那我相信大家都会觉得线性代数非常非常有用(而且还很有趣)。实际上,这些数学课程恐怕才是软工学生和校外编程速成区分开的核心要素。重复一遍,他们真的真的非常非常有用。现有教授方式,会导致很多同学会觉得,这玩意学了反正也会忘的,就不会投入太多时间和精力,而只是追求个还不错的绩点。他们真的成为了“公共必修课”,人人学人人不会。
而且对我来说,物理和数学是很美的,是美的所以一定是很有趣的,但显然现在这部分课程没啥意思。
拉齐学生能力基线
这主要是解决课程衔接断层的问题。有两种解决方案:
1、在前面的课程中教授后续课程的前置内容。在大一的程序设计等课程中,添加Python相关内容。实际上,我觉得c和c++两个学期的内容学一个学期就够了,剩下一个学期可以留给python/java。而且,据我耳闻,南校有非常非常有趣且硬核的python课程(暗示)。
另外,软工似乎缺乏一门像Harvard CS50x那样的导论课程,很多同学到了大二还是不会用terminal、git、gdb、cmake、vscode、github codespace,甚至没有github账号(此处所有“同学”单指虚构人物书苏)。更不要提The Missing Semester这样锦上添花的课程了。
2、在课程的开始,提供自学材料补齐前置知识。这是国外顶尖大学的通常做法,以书苏最近在学的Stanford的CS229为例,吴恩达在课程的前几节课,提供了线性代数 ↗,概率统计 ↗,Python ↗的notes/Discussion Class,帮助学生获得课程所需要的前置知识。(其实根据其版权规定,翻译一下拿来用就行)
大家可以花点时间自学
可以去看看上交的同学写的大学生存手册,里面有解释原因。可以去看看csdiy.wiki,里面有课程推荐和路线。
如果你决定要自学一个东西,那就抽时间把它好好学了,不要只看个视频不做lab和homework/quiz,最好把课程大作业也做了,相信我他们的时间收益率比看视频更高。
另外,不要顾此失彼,不要崇洋媚外,不要翘课。
%%其实还有不少更微观的建议,但此处Margin不够🐶。%%
专业课有点“软”#
这里的软,一方面说的是有些课程难度比很多学生的现有水平低,另一方面是知识密度不足。
如何评判一个课程是否“硬核”呢?要看学生平均能从中获得多大的“增量”,点了多少新技能点/获得了多少新知识。听不懂的不算,已经会了的也不算。
现象#
课程从过于简单的地方开始
以数据结构课的理论课为例。我知道很多课程都可以美其名曰:“我们要考虑完全没有基础的同学”,但我怀疑如果书苏只上过这门课,恐怕不一定能做出其实验课的题,更别说做出初级实训课的题了。所以现实情况是,暂时没有基础的同学听不懂,有基础的同学不愿意听,结果是 没人听。
这里我给一个统计数据,在一门我觉得讲得还挺不错的理论课上,某一时刻全课室听课的人数为11 / 82。(这里的统计严谨性请参考注释)这当然有很多原因,但我想说明课程真的不够“硬核”。
另外,就在我们隔壁课室上课的珠数的数据结构课,可是质量高得不得了。(可以去看看我上上条帖子分享的题目)
课程知识密度不足
这就像是一块本应紧实美味的“压缩饼干”,被硬生生泡成了一碗“稀粥”。
这就像是运行一个算法,本来可以用“O(1)”的常数时间复杂度搞定,却采用了一个“O(n²)”的低效算法。
以另一门实打实的专业课计算机组成原理为例,这门课讲得其实算是很用心的了,ppt做得很好。但是我很难想象,讲了两周才开IEEE浮点数,前面一直在讲一些可以一笔带过的明日黄花,有点丧失重点。我甚至遐想,我是不是可以每天花20min对着PPT借助Gemini自学完成课程。作为一个还在学习这个课程的学生,我没有资格评判logisim及其相关的数字电路知识是否重要,但我知道,在CSAPP里用gdb和汇编语言拆Bomb,用位运算解决一些谜题,是真的痛并快乐着。
而对于软件工程导论这门课,我的话或许会有点重。这完全可以开成两次讲座。
一门课无论本身重要与否,只要学生学不进东西,其实就是水课。
微观解决方案#
Show some fancy thing.
我非常清楚,不能太浮躁,要打好基础,不要天天想着学些“高级”的东西。但是,干巴巴地讲计算机怎么加减乘除,或者c++中类属性和实例属性的区别,真的有点无聊,真的会让人不小心睡着。
如果,我是说如果,能像cs61a的ant lab一样,让学生学习类和对象时,一不小心做出了个“植物大战僵尸”呢?我相信学生的基础会更好,我们会对学习更有激情。(顺便一提,这些国外课程的lab很多都是允许照搬的,清华就照搬了mit不少课程)甚至,像南大那样,学着OS搞出了个简易版本的个性化Linux,在“一生一芯”中做出个小芯片?
调研清楚学生的学习能力和总体水平
软工学生没那么傻,没那么蠢,没那么菜,没那么懒。正相反,绝大多数软工学子怀有一颗热爱学习的心(只是有时候课实在是太水了或者实在听不懂在讲啥,顺势躺倒)。
宏观解决方案#
在后续年级的培养方案中减少必修课程
减少必修课程的学时或者更改其教材(毕竟很多课程是摁着教材讲的)
减少毕业学分要求(课程质量高的大家自然会上,课程质量低的上了等于没上)
增加各种可选课程,小学分的短期课程。
老师没必要讲太久,学生也没必要天天从早到晚都在上课。有精力了自然就会去搞科研搞创业。
好累~
%%其实绩点/综测制以及老师的评价体系恐怕都是有很大问题的,这里略过。%%
后言#
%%泪目,终于写到后言了。相信读者要是真慢慢读到这也会泪目,怎么还没结束。%%
软工为大家赋能
软工是一个神奇的地方,他是我从小到大呆过的,PDi指数(权力距离指数)最低的地方
(这也是我认为写这篇文章可能有一定价值的原因之一)
如果用组织管理的方式分析,软工在赋能上面做得非常非常非常非常非常好,比如将宝贵的课题分享出来(这是哪个天才想出来的,和Google定期在大会上公布idea如出一辙),提供学生需要的平台和资源,让学生有机会做自己想做的事。只是软工作为一个新学院,在很多“流程”上可能还是有些问题(但其实已经是中大所有学院中做得非常非常好的了)。
为什么这篇文章压了很久,最终还是写了,还是发出来了呢?因为我今晚去听了下创业班的讲座(这个讲座真的挺有意思的,没去的同学可以看下回放),我感受到学院领导其实对学院存在的宏观问题门清,而且有非常动人的激情和呕心沥血的真诚。我感觉我提点学生角度微观的问题,可能真的会在未来慢慢解决。(也希望不要朝令夕改,还是要充分调研,一步一个脚印)
本文的初心
我邀请你做一个思想实验:
假如有这样一个学生,在大学之前从来没有学过编程,在中大就读软件工程后,他每节课的每一分钟每一秒都在认真听老师讲课,从来没有睡过觉,认真完成所有作业,并以应试教育的方式认真复习每一场考试,但除此之外,他没有自学培养方案之外的任何东西。他是否能获得一个很好的出路?(比如一家国内大厂的Offer,一个世界顶尖大学的就读机会,或者一个还不错的创业想法)
这就是在问,这颗种子,是会长成参天大树,还是变成丛生的灌木?是会泯然于芸芸众生变成乌合之众,还是Think Different,Make Different?
我感觉在当前的课程体系和课程质量下,emmmmmm
软工很好,但还是希望软工变得更好。
我和软工的故事
趁这个机会分享下我和软工的故事吧。我是转专业的同学。当时转专业时在软工和计算机之间选择(喜欢相关的东西,做起来有成就感),为什么选了软工呢,说实在的,最大原因是因为软工保研率比计算机高得多,其次才是想离开生活了19年的广州去别的城市看看。我大一一年还算努力,但是对卷绩点卷综测这种事情感到由心的厌烦,最后看到国奖获奖者的一堆水赛和“社团干部”加分其实很是不服气(原专业),就想找个保研率高点的地方,有保障地做点自己想做的事。
我原本就知道软工是新学院,可能很多东西会做得比计院好(也有差的),但是软工还是惊讶到我了。
第一次是选宿舍,宿舍的分配填写表上详细的询问了我的各种生活习惯和需求,这对于一个大一被宿舍环境搞得神经衰弱的人来说实在是太温馨了。
第二次是软工集市,我惊讶于这里的开放自由,理性的交流氛围,相比于校园集市,这里没那么多奇葩人奇葩事,“噪声”还是少得多(虽然有些冷清😄)。很久以前有个同学问了个高数问题,我当时还在珠数,刚好在复习数分,花了2个小时研究并回答之后非常有成就感(这其实是软工集市对我的赋能)。
第三次是和学院的助教和老师沟通,他们真的很温柔且有帮到我很多(但是不方便讲哈哈哈哈)。
第四次是……忘了。
也许你会说(原叠甲部分,你如果没有觉得这篇文章是piece of shit,可以跳过不看)
%%鬼知道我每天梦里都在怎么给这篇文章叠甲,但其实发现大多是妄想,大家其实都很好%%
也许你会说,这小屁孩完全没有方案可行性分析。
是的,这是学生视角巨大的局限性,但也是学生视角巨大的优点。不应该让提出问题的人对解决问题负责。暂时忽略那些执行上组织上的各种困难,意味着透过一棵棵树看见背后的森林。
也许你会说,这只是你的一面之词,实际情况一定有很大的偏差。
没错,我对学生需求和学生能力的判断都太独断了,但是课程问题一定存在,而且不小(统计数据可以说明这点)。
也许你还会说,中大只不过是一所普通985学校,你怎么能对他有这么高的期望?你怎么能拿那些世界顶级课程进行对比?
Hinton出现之前多伦多大学算个屁?要这么说,港科大也不过是个建校34年的“双非”😆。人生是反归纳的,不要让过去的失败或成功定义自己,同样,一个学院一个学校的发展也是反归纳的。至少作为一个高考不小心爆炸不甘心地来到中大的人,我不想把中大的未来定义得比南大甚至武大差。
也许你会说,写这么长有谁看啊。额,我尽力缩减了,你也看到这了(这是一个恒真命题)。
关于评论
大家可以随意批评本文,也可以对自己的课程提出建议,但是请保持理性,然后在对课程提建议时尽量带点礼貌,都是自己人(gaginang),而且大家都不容易。
啊啊啊,愿软工变得更好。
共勉。
注释和延伸阅读#
关于11 / 82这一统计数据
在这个统计数据上,我本来想做得非常严谨。要双盲,多次取平均,多个课程取平均……但我实在是懒,所以我选取了一节我觉得还挺不错的理论课,在第一节课开始的第20分钟从前往后数了每行正在抬头看黑板的人数并求和(11)(只数我看那一行的一瞬间 不管ta是否又改变了状态),并在下课时一行行数了课室中的人数并加上了第二节课上课前进来的人数(82)。如果你对这个数据的精确性有疑问,你可以自己数一数试一试。实际上这个数据可能是低估的,因为有的同学并不会全程抬头听讲,也可能是高估的,因为有的同学可能只是抬一下头以表尊重,并没有在听讲。
关于信息熵等内容
可以看Eliezer Yudkowsky在LessWrong上的科普 ↗
关于“赋能”和“流程”
我本来想花点时间入门下管理学的,因时间紧张未成行。
可参考《重新定义公司:谷歌是如何运营的》以及罗永浩的十字路口对李想的访谈。
-End-