关于“学而习”的大讨论
邹欣老师的Blog在这里:现代软件工程 习而学的软件工程教育
然后也读了很多同学的观点。
想起来高中时候,老师教我,一个好的议论文,必须在开头亮出自己的观点。(好吧那是为了应付高考。我扯远了] 。不过,我的观点是,不能完全赞同邹老师和部分同学的观点。对于邹老师过分强调“习”的比例,我有不同的看法。
邹老师说的“习而学”对不对?我说对,很好,很必要,特别是对于工程人员来说,必须要“习”才能得到一个真实的能力!那么我为什么要驳斥邹老师的这个观点。是因为我觉得人世间为什么这么多争论,根本的问题是大家并没有站在同一个背景上,或者说大家辩论的条件其实是不一样的。所以才会导致了很多很多争论。
一个小例子:
有一段时间,我十分爱玩一个叫“实况足球”的体育类游戏。在场上控制[范.巴斯滕]风驰电掣十分High,一场个人独进10+个球。但是一遇到高难度的AI,或者跟同学踢对战的时候就显得十分捉急。我就很不服气啊,然后一直在踢,在苦练,但是一直见不得提高,自己总是用一些最基本的动作和最简单的战术,自己使用经典荷兰队甚至被中国队血虐[我不是黑中国啊]。然后同学看不下去了,才说,你应该去看一下教程,去网上找找教学视频,去找那些打得好的人问一问,果然,不久之后我就有一个质的飞跃。
你一定以为我写这个例子是为了说明“学”比“习”更重要,其实不是。我发现,如果没有之前我自己瞎踢乱踢的那一段时间,那么我根本不知道我自己的弱点在哪里,我跟不知道为什么这样的战术在实际中行不通,我不知道什么动作是高级动作,我不知道我将要向高手们“学”什么东西?而且,我可以断定,如果我每天把时间都花在打游戏上(10小时),一周七天,我五天都在打游戏,那么就算我没有“学”,我总也会摸索出一套方法来,只是比较慢而已了。这样看来,貌似“习”才是必须的啊?!别急,我们在看一个例子。
另一个例子:
很多人在Blog中都提到了我们大一的时候一门选修课——Java。(实质上应该叫“Java语言程序设计”),但是课上根本没有,对就是根本没有教会我们如何使用Java语言解决工程上任何实际的例子。甚至Console 输出 Hello World!\n 都是自己查的Baidu。然后考核方式是“开卷答题”+“2000行Java大作业”。学了半天什么什么历史,什么什么面向对象的啥啥啥,能写程序吗?开卷考试抄就行了。大家都是80、90分。大作业怎么办?谁都不会写,写出来都是面向过程风格的C-style的代码。能完成一个工程么?肯定不能。那怎么办?只有拿别人的代码抄抄改改。[对老师我不评价,学不会是我自己在下面练的太少,老师不布置不讲,不等于自己不去学习是吧。不过对于这个老师,当你们在学院里提到这个人,然后看看学长,辅导员,老师的表情,你就懂了。有人问,为什么他还能留在这,这种问题谁知道,我不知道。]
好吧,这个例子,更一步加深了邹老师的“习而学”的观点。学习程序语言设计,你不上机,永远也学不会。这个是毋庸置疑的!“习”的重要是显而易见的。“学”的死板和低效,每个人也都有深刻的体会。说了这么半天,我不是搬起石头砸自己的脚么,我自己的论点呢?
好了,开始我的观点了。记得我一开头说的么?争论的根本的是大家并没有站在同一个背景上,或者大家争论的都不是一个东西!
在建国初期,一直到当代的很长一段时间里,我国与先进的资本主义国家有着很大的差距,国家建设需要十分多的工程师,所以,包括院校大调整之类的,出现一批又一批工科见长的专业院校。也包括我们北航。这个确实给当时国家输送了一大批优秀的建设人才。才是,慢慢的,国家有钱了,工程建设都上去了,才发现这个措施的漏洞有多那么大!!那就是我们的工程实践确实上去了,但是基础科研领域十分薄弱。就拿北航来说,最近几年也提出要建设综合性大学,增加理科实验班什么什么的。大家都明白,理论能力上不去,那么实践中就会遇到瓶颈。
茅先生的Blog中提到的观点,邹欣老师提到的观点,以及邹欣老师的本科生课程计划,无疑是十分好。但是他们都是在工程实践领域得出的结论。我们每个人都认同,在工程实践领域,确实需要大量的“习”,而且在“习”中获取能力,锻炼能力,比“学”要来的实际,要来的高效,要来的更扎实。但是大家有没有意识到,邹老师的Blog中一上来说就自己是工程类学科。是软件工程!那好,暂时不提那些纯理科的科目。就说说我的专业,全名叫——计算机科学与技术,一级学科(学科代码:0812),我的专业方向是——计算机软件与理论,二级学科(081202)。那我就问了,是不是,我们大学生来到了大学里,就一定要去进行工程领域的实践,是不是去工程领域实践,就一定要对软件代码的编写十分熟练?我说不是。邹老师作为企业人士,明白工程上需要什么样的人才,针对这样的人才学校应该怎样培养,确实不错。一点都没错。大学的很大一部分使命确实为社会输送合格人才。但是,并不是所有的人都会去做Dev,所以,我觉得邹老师的计划,只能适合软件工程的学生。(以后如果有软件工程这个一级学科的话)。
以我自己为例子。我现在跟随老师,做一个关于社区演化的相关研究。就是通过对现在各种流行的线上网络社区的变化进行分析。这学期,为了做这个的相关研究,我一直在追踪Stanford、CMU等等几个牛逼的组的研究,每周给老师讲一次PPT,汇报一次论文阅读的情况,然后也在不停的完善综述,自己读的论文应该快有40多篇了吧。我觉得,这就是一直在学,而且,包括在读论文的同时,我也意识到大一的时候学习的《数学分析》这么课的重大意义。但是这里面好像都没有设计到任何工程上的事情。也证明了之前学习包括《离散数学》图论,包括网络科学导论之类的课程的重要性。我想,这些东西,每天不停在写代码。不停做工程上的实践,可能会一点帮助也没有。特别是,如果大一大二像邹老师安排的课程那样,那么我可能完全没有兴趣,或者能力,或者时间去完成这样一个非工程实践类的理论研究。所以我觉得这种东西为什么要争论呢?工程上确实应该这样做,没说不对,但不是所有都适用啊。就像一个同学说的,如果我们只需要专业技能,那么大家都去上技校了,何必辛辛苦苦来上大学。
学的东西或许在短时间内,看不出成效,就像基础研究领域可能100年都不会有什么改变世界的突破,但是学的东西,在你心中留下的东西,一定是对你的未来十分必要的。我觉得你“习”的量决定了你当前这个层次的高度和能力,但是你“学”的量决定了你到底能到什么层次!
最后,我想说,“学”和“习”其实真的并不矛盾。特别是那我第一个小例子为例,只有大量的“习”,才明白学的意义和方向。但是只有“学”才能让你的习有一个大突破。到达一个新的层次。所以,在本科生教学中,特别是那种,既不是“软件工程”也不是“理论物理”这种课程上,学和习都不能偏颇。在具体教学中,老师可以通过习告诉大家为什么要学,然后通过学,来让大家明白习得逻辑和本质。知其然,知其所以然。学习结合,才能真正学好——计算机科学和理论。