陆本cs论纲
本人打算发知乎的一个回答,是本人一年半以来观察的合集,先放到博客上preview
为什么现在的大学生很难真正学好编程?
我认为这个问题的核心是先进生产力和落后教育制度的矛盾,导致了一个囚徒困境。
我在知乎上看cs教育问题看了很久了,同时具有对cs的一些了解,和cs陆本课班学习体验,很想说一说自己的可能偏向学生视角的认知
学好编程是什么
在讨论“为什么很难真正学好编程之前”,或许我们首先要给“学好编程”下个定义,参考我很认可的什么才算是真正的编程能力?回答,这里面讲真正的编程能力拆解为层层递进的四个层次:
0: 可以完全理解一问题,并且给出对应的代码
1:能在0之上加上工程方法
2:对整个计算机stack有认识,能把各种技能混着耍
3:对不理解的CS&数学知识能在遇到的时候快速的补起来
我个人在cs的学习中很认可这种划分,但是我还想补充一层前置能力 ** -1 :信息搜寻和利用**,这里姑且列举一下我认为这个能力应该包含什么:
提问的智慧和组织语言。即在编程时遇到问题,怎么有效的组织和表达自己的问题。
大模型提示词技术和如何利用大模型解决问题
阅读文档和快速上手某门技术
计算机科班现状
列举了上述五个能力,在我们来检视一下陆本计算机科班对这五个能力的锻炼到底怎样,我要先指出陆本计算机教学的基本困境:
陆本困境
这是我发明的词,我认为是理解陆本计算机问题的核心——这既不是学生的问题,也不是教师的问题,更像是一个囚徒困境,两方都采取了对自己有利的策略,但是达到的不是整体最优解。这套区分度-考试-做题的制度在要掌握的的知识信息量比较小的情况下(中学)还能运作的比较良好,但是到了要掌握的的知识信息量极大的情况下不可避免的达不到它声称的目标。
这个困境的逻辑链如下:
首先,由于学校争取qs排名,资金,甚至是上级文件的要求,陆本学校普遍实行正态分布制度,它强制要求课程优秀率低于某个阈值
其次,陆本重视科研而非教学,导致在教学上资源不足,老师和助教没有能力和意愿通过编程大作业来区分这个正态分布,大多数采取了用考试作为主要区分度的策略,而编程实验不会拉开很大的区分度
第三,就业率下降,国际局势紧张的社会大环境使学生出路减少,只能激烈地竞争有限的优秀率以求继续读书,所以学生也或是处于路径依赖,或是处于利益的考量,选择了对自己竞争优秀率有利的策略,即编程实验应付过去,做题和准备考试认真——简称为事少分高的策略。
总而言之,这个囚徒困境以表格的形式展现如下:
学生认真学习
【学生 +100】学到了很有价值的东西 【教师 +10】丢失了一些科研和发文章的时间,但是得到了学生的爱戴
【学生 -100】认真学习但是毫无收获 【教师 +20】省出了一些科研和发文章的时间
学生用事少分高的策略
【学生 +10】没学到什么,但是成绩还可以 【教师 -50】丢失了一些科研和发文章的时间,学生不认真学习感觉很难过;甚至以大量的编程取代考试根本得不到教务的认可
【学生 +10】没学到什么,但是成绩还可以 【教师 +20】省出了一些科研和发文章的时间
注:这个“内容现代的课程”,姑且理解为比较重视编程,而没有那么重视考试,同时课程质量大于平均值的课程
-1 :信息搜寻和利用
这部分在陆本里并没有任何对应的课程——可能有一些通识的课程,但是侧重科研文献检索和利用,和cs这个前沿的利用互联网为主的信息检索和利用差别略大。
我的经验观察是这部分,这部分陆本没有教的能力,大学生自己掌握的也不甚乐观,可能有诸多原因:
信息环境差,百度基本上搜出来的结果没法看,这部分就不展开了,懂得都懂
基本没有这方面的教学,靠学生自己体会,很多人四年下来只学会了上CSDN抄作业
有些好的学校的算法/linux/ctf社团会教,但仅仅是少数学校
0: 可以完全理解一问题,并且给出对应的代码:
这部分的能力理论上是【程序设计基础】,【数据结构】,【算法设计与分析】这几门课培养的能力——必须要承认,陆本对这方面的能力培养的其实比其他维度好不少——首先这些课程是本科低年级课程,教育质量还没有本科高年级课程那么崩坏;另外,不少陆本学生能接触到leetcode/蓝桥杯/acm竞赛,还是能开发和锻炼一下这部分能力的。
但是很遗憾的是,由于陆本困境,只能以考试论英雄,考试考查的内容又侧重死记硬背而不是解决问题的能力...
1:能在0之上加上工程方法
这部分的能力理论上是【软件工程】培养的能力,但是很遗憾的是,软件工程的课程质量和学到的东西就算是在陆本里,也算最差的一环——不信的话,看看世界一流大学浙江大学的软工36章吧。
在这部分,实践开发优质项目的机会,比0中做能锻炼能力的算法题的机会少了不少,这部分的课程完全变成了做题和写意义不明的软件工程文档,或许有开发工程的机会,但基本上是学生信息管理系统,图书借阅系统这种技术含量不高,内卷都在卷gui的项目——从这里又能学到什么呢?
当然,陆本学生也不是完全接触不到实践开发优质项目的机会,最近网上流行的csdiy,或者更早的MIT, CMU项目全家桶,以及国内这几年的一生一芯,机会还是大大的有的,但是对于这部分的项目,学校的认可度比起算法竞赛明显下降一个档次,如果说算法竞赛获奖还能保研加分,做这些项目对于陆本的评价体系真的是0收益乃至负收益的:
如果你是计算机类专业的学生,某种意义上事情更坏,当你发现身边的同学靠背书和刷题库就能取得满绩点的科目,而你花了大量力气去拜读各位“大神”推荐的国外经典课程与原版图书,做了一堆实验,结果取得的分数只是堪堪能够过目,这种挫败感是难以言喻的。
而且,说真的,在周围人都在写灌水论文、做不知为什么能立项成功的神秘科研项目、拿着一个个难度不高于“图书管理系统”的东西去参加各大比赛的时候,他们的光鲜履历蹭蹭蹭往上涨,保研加了好多分,而你呢?你正在打“内功”,对着砖头一样的“名著”汲取“顶尖教授的倾囊传授”,你不知道这么做有什么意义,但大家都说这样很好。然后,你在学习这些知识的过程中渐渐建立起了比周围人更好的抽象概念,你觉得很不错,但周围人已经拿到保研资格了,你作何感想呢?
https://www.zhihu.com/question/595969891/answer/3060352057
2:对整个计算机stack有认识,能把各种技能混着耍
这一部分理论上是下述核心课程和选择方向的课程的组合:
核心能力:计算机组成原理,操作系统,计算机网络,(有的学校有)计算机系统导论
选择方向:数据库,编译原理,计算机图形学,人工智能,数据科学...
根据我的观察,这类陆本课程其实上限和下限挺大的——似乎是好学校和一般学校的分界线?如南大大名鼎鼎的ICS PA质量上完全不输海外一流学校。但普通一些的学校只能对着几本指定教材高中照本宣科式的讲授,学生做做王道考研草草了事;实验课有,但是距离深入理解技术栈还差得远,比如我随手从csdn上检索的某普通学校的操作系统实验,确实可以帮助理解一些基本的操作系统概念,但是也未必有多深入...更不要说很多普通学校的同学,如果0和1的能力没有学的很好,到现在可能完成这类实验都比较费力,可能干脆csdn或者gpt抄一抄了事。
但是就算是南大,由于陆本困境的存在,抄袭率高居80%
985学生会沉默,211学生会流泪的真相
我们拿来了某985学校的某二年级下学期某课程某作业的全部79份提交(感谢相关任课老师/助教的大力支持)。这个作业正常实现大约有500行代码,如果独立实现,每个人的代码肯定设计得完全不一样,相似度很低。
然后跑的结果(加以人工判定)是:
65/79 (82%) 的提交是被确定为抄袭,即一份作业由另一份作业做少量修改得到。
42/79 (53%) 的提交相似度>99%,大约相当差了几个printf语句。
这只是个保守估计:我们按照所有代码对的相似度排序,一个一个看下去,直到看到第一对(人工)认为不是抄袭的代码就停止。再考虑一些没有提交作业的同学……嗯……你懂的,事情比想象还要严重
3:对不理解的CS&数学知识能在遇到的时候快速的补起来
这部分一个前置的要求就是 -1 信息搜寻和利用,然后在搜寻到信息之后,根据已有的对知识体系的理解,加工整合到你的认知之中去,这部分分或许可以分为数学和cs两类讨论。坦率地说补cs知识的能力的部分,我认为是上述能力0,1,2的总和,因人因校而异的元素比较大,但是数学还是有一些可观测的共性。
对于不理解的数学知识可以快速补起来,理论上是由大学的数学基础课:数学分析/微积分,高等代数/线性代数,概率论和数理统计,离散数学这几部分组成的。理论上应该通过这些知识的学习,对计算机要用到的数学体系有一个了解,但是:
对于清北,c9这一个tier的学校而言,数学考试走到了偏难怪的这一侧【增加案例】
对于普通一些的学校而言,由于教科书的糟糕和教师资源的匮乏,很难把数学概念教好,考试只能内卷各种计算,甚至背课后作业考原题。
据我的身边统计学,在陆本学习数学对大多数人都算创伤性体验了,很难讲建立起一套完备的对数学的认知。
【todo-打磨表达】想到机缘巧合我在一个群聊里看到的讨论,看了这个讨论我才明白数学到底该怎么学:
因为这个最适合自学且我心中认为 胜过一切definition theorem proof类型的教材,是一个真的可以教会你的 让你爱上数学的教材 学微积分理论和证明 [20:59]从0推出微积分 [21:00]从加法开始构造
第一章就是先建造出自然数,然后慢慢建造别的一切 [21:00]和编程一样 [21:01]build everything yourself amazing tour [21:01]u can not miss it bro @AvidLexbuild everything yourself
没必要学别的了 你也不是数学专业 [21:02]hhh [21:02]唯一看上瘾的数学书啊 [21:02]真的 [21:02]你懂么 什么叫自己可以造出来的 激动心情
什么叫知道原理的心情 [21:03]不是给你一个概念 诺 我们得到一个定义 然后显然 可证 @AvidLex不是给你一个概念 诺 我们得到一个定义 然后显然 可证
就是啊 [21:06]反正数学这个东西就是玩的公理定义,在这之上建造出一切 [21:06]只有你自己能够知道这一路逻辑链条这么建立起来的
你才会舒服 [21:06]按理说学好的标准就是给你基本的公理和定义 [21:06]你可以自己造出需要的一切
我们甚至加法都要自己造出来 [21:07]我们默认我们没有这些便利的 api [21:07]hhh [21:07]我们如何可以写出这些api并证明我们的api可以正确工作呢
这样我们就可以信任我们的api 然后调用他们建立更高级的东西了 [21:08]数学和编程和计算机 [21:08]异曲同工
"你们怎么办,只有天知道"
我上述列举的问题很难从宏观层面的教育改革来解决,无论是就业环境,还是老师的唯科研论,还是正态分布的要求,基本上很难改变——如果不是越改越糟的话。但是在这个制度的边缘或者外部,还是有很多转机的,无论是这两年很火的学生编撰的csdiy,或者教师为爱发电的教育项目一生一芯...这些项目也好,对陆本的集体批判也好,都集中出现在这几年,现在教育制度和日新月异的计算机技术的矛盾越来越激烈了。
当然,说了这么多宏观的层面,似乎啥用也没有,于是我也想给出一些对个人的建议——其实学习编程真的不难,在这里粘贴我最喜欢的一个答案的阐述:
编程一点都不难;它只是和你十几年来在学校受的教育格格不入而已。
自小你受到的教育,总是:
1、记忆和理解一个个的知识点
2、给你一个未完成的拼图,让你把自己记忆的、某几个合适的知识点以正确的姿势放进去(超过三个就是难题,超过五个就是压轴题!)
3、好了,满分
换句话说,你从未学过创造;你只是被训练的极为擅长“填补拼图中缺失的一角”而已。
作者:invalid s 链接:https://www.zhihu.com/question/311432227/answer/706661772 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我认为学会编程的核心能力就无外乎我搬运且列举的5条——掌握到1:能在0之上加上工程方法这一水平,你已经是一个优秀的码农了,若是掌握到2,3,这就是一位计算机科学家的标准了——这每一条虽然不简单,但是远没有难到令人望而却步的地步,它只是和18年以来的做题训练不符合罢了。
以上,希望各位好运。
Last updated