lz是软件工程专业的一个普通本科生,三年多时间的本科学习过程中,我深感我们专业本科教学中存在诸多问题,最近花了一点时间简单总结了一下软件工程培养方案的专业课程中存在的问题,同时也提出了一些自己的意见,准备反馈给学院相关的领导老师。
事实上有的问题你知道,我知道,他们知道,他们知道我们知道,我们也知道他们知道,但就是没人愿意做出改变。我也清楚,这些意见大概率不会被学院所接受和采纳,但我依然想把我想说的东西说出来。知其不可为而为之,也未尝不可。全文共计11000字,可能需要花一点时间阅读。

前言

各位计算机学院的领导,老师,你们好!我是计算机学院软件工程专业18级的一名普通学生。我们学院的计算机科学与技术和软件工程都是教育部认证的A+专业,一般情况下可以认为在全国范围内属于顶尖水平,但是我接下来要说的内容,可能和A+专业这个名头没什么关系。

我想说的是,这两个专业在本科教学这方面仍然存在很多问题,尤其是软件工程专业,和世界一流大学的目标仍然有很大的差距。我自己是软件工程专业的,所以我对CS专业的情况不做任何评论,但是两个专业有很多课程是相通的,所以两者的情况我相信不会相差太多。有人说国内的本科生教育不是处于奔溃的边缘,而是已经崩溃,相比之下,我们的情况或许没那么糟糕,还不至于崩溃,非要说的话就像是人走到了悬崖边上,不知道什么时候就会突然向前迈出一大步。

我想根据自身这几年的学习经历来谈谈我认为软件工程专业本科课程中存在的一些问题和我的一些意见,希望能给学院的教学改革提供一个不同角度的观点。

下面我将从总体评价和具体意见两个部分来具体阐述我的一些看法。

总体评价

对比世界范围内的CS名校(MIT,Stanford,CMU,UCB)等学校的课程设置,软件工程专业的核心课程设置应该还是和世界接轨的,从大一春夏的《离散数学》开始,到大二的《数据结构基础》,《面向对象程序设计》,《高级数据结构与算法分析》,《数据库系统》,再到大三的《操作系统》,《计算机网络》,应该说计算机专业所需的核心课程基本都开设了,此外还有比较多的选修课程,应该说课程的广度还是有的,但是我认为在课程的设置和课程的内容上,软件工程专业仍然存在以下问题,我将从多个角度切入来陈述我认为存在的问题。

课程总体安排

缺少计算机入门课程

我们学校工信大类在大一的时候必须要修《C语言程序设计》和《程序设计专题》两门课程,以C语言为第一门编程语言进行计算机的入门,但是对于没有基础的人来说通过C语言入门是非常不友好的

同时,我们学校的C语言课程教学停留在只学语法的浅层(这一点对于任何编程语言课都一样),同学们往往只能学到一堆奇奇怪怪的语法用来通过理论题考试,另外《程序设计专题》使用C语言制作一个GUI程序的合理性也有待商榷。

我们可以对比以下外国名校的同类课程,以UCB的计算机专业入门课程《CS61A Structure and Interpretation of Computer Programs》为例,他们采用Python作为入门的编程语言,在学习通用的编程语法之外,这门课还介绍了一些简单的数据结构,SQL语法,正则表达式,面向对象的特性和编译原理的基本常识,最后甚至还需要自己动手实现一个编程语言的解释器。这样的课程作为入门的第一门课程显然比两门C语言课程学到的东西多很多,除了学习编程语法外(事实上这是最不需要老师讲的东西,而我们的老师们上课和考试最注重这些东西),还能建立起对计算机专业的总体认识。

因此我认为,我们需要更好的计算机入门课程。

缺少对基本工具使用的教学

计算机专业的学生肯定需要熟练掌握各种计算机中的基本工具的使用,比如Git,vim,命令行和shell脚本,Makefile和CMake,这些东西的重要性相比不用我多说了。虽然它们很重要,但遗憾的是学校并没有对这些工具如何使用进行过专门的教学,只是在用到的时候由同学们自己进行艰难的摸索和适应,而更多的同学选择了直接寻找替代品,比如用QQ和钉钉代替Git,以至于很多同学到了大三还不会使用Git和Github与他人进行合作代码开发

遗憾的是,我们的老师似乎往往沉溺于陈旧的理论,而对具体工具的使用嗤之以鼻,因此也没有相关的课程教会学生使用这些东西。反观MIT,他们专门开设了一门《6.NULL The Missing Semester of Your CS Education》的课程专门用来介绍这些工具的使用,而其他学校的很多课程中,如果用到了某些新的工具,也会有详细的速成教程(tutorial/crash course)让学生能够快速上手这些东西并完成作业

因此我认为,对于基本工具使用的教学也是计算机教育中不可或缺的一环。

课程时间安排不合理

18级软工的培养方案的时间安排存在多处不合理的地方,导致某几个学期课程特别多,某几个学期课程特别少,具体表现为:

  • 大一春夏和大二秋冬专业必修课程少,一年内一共只有离散数学和数据结构两门课
  • 大二春夏课程核心课程过多,学生压力过大,绝大部分保研规则中的专业核心课程都集中在这个学期(高级数据结构与算法分析,数据库系统,计算机系统原理,面向对象程序设计,软件工程基础),并且这些课不仅学分高,而且都有大作业和期末考试,给同学造成了极大的负担

课程冗余,学分压力过大

培养方案追求“大而全”,希望学生“面面俱到”,必修课和选修课学分都过多,并且需要修很多和软工完全没有关系的课程,这个问题具体包括以下几点:

  • 通识选修课学分要求太多,导致大二秋冬结束之前,同学们很难进入正轨学习专业课
  • 大学物理I, II和大学物理实验与软工的培养目标完全没有关系
  • 软工选修课要求的模块过多,并且每个模块都要修够学分,导致要修的选修课程学分非常多,同时各个模块的课程安排也存在一定问题,比如金融相关的课程完全没有必要学,“其他模块”的课程太杂太乱
  • 专业必修课的学分总的来说比较合理,但是以上几点造成了软工毕业要求的总学分太多,既没有起到培养学生的目的,也消耗了学生大量无所谓的时间

课程实际教学

课程内容/作业老旧

软工培养方案上的课程中,有一大批陈旧的课程,使用的教学材料/作业/考试/实验都使用了年代久远的旧版本,而没有做到与时俱进,定期更新,同时课程内容脱离实际,和科研、实际生产都有不同程度的脱轨,缺少较为前沿的导论性课程。

轻视代码训练,注重报告美观

软工的大部分课程的作业都是需要写代码的,同时也有一大批课程需要提交各类文档和报告,包括但不限于实验报告,项目文档,心得体会,阅读报告,课程论文等等,但是这些代码和文档类型的作业存在以下问题:

  • 轻视代码,老师从不会看学生的代码,也从来不会教学生如何写代码
  • 重视各类文档和报告的格式/排版/字数,而忽略实际的报告内容,实际上各类报告中充斥着不必要,没营养,纯灌水的内容,浪费了学生大量时间来撰写各种报告
  • 代码缺乏有效评分依据,因为老师不会看代码而只关注文档,所以学生也不会认真写代码,而是花费更多时间把报告写好看,不能确定文档中所说的各项功能是否已经在代码中实现

作业/实验内容随意,缺少有效指导

此外,许多课程中还充斥着随意布置的作业和实验,内容完全根据老师自己的喜好来决定,这一点在很多新开或者刚进行教学改革的课程中尤为常见,这些作业大多全凭诸位同学闭门造车来完成。很多作业和实验的要求以及指导书可能只有几页PPT或者Word文档内容空泛,没有提供给学生任何有效信息,完全看不出老师布置作业时候的诚意和作业本身科学性。

这样随意布置的作业不仅使得教学质量降低,而且给同学们完成作业造成了非常大的困难,同学们在闭门造车的过程中浪费了大量时间,又不能和课堂所学知识充分结合。

缺少可靠的助教团队辅助教学

很多课程的助教难以发挥助教的作用,大多数时候都只是一个帮老师批改作业的工具人。一些课程可能助教自己本科阶段也没有学过或者学的很精通,或者助教们作为研究生本身就很忙,因此就出现了以下问题:

  • 助教不能及时回应学生们的问题
  • 助教自己没做过课程大作业,对大作业内容不熟悉,不能对同学形成有效指导
  • 助教权力不够大,无法对老师导致的一些教学问题进行及时纠偏

偏重理论考试导致考试周压力大

软工的很多课程都有平时作业+实验+大作业+期末考试,但是考试以外的作业成绩在总评中占比仍然不高,依然是期末考试占大头,导致同学们在考试周期间需要兼顾各个课程的大作业和期末考试,复习压力非常大,虽然平时作业和大作业工作量也花费很多时间,但是因为占总评不高且大家没什么区分度,导致大家异常重视期末考试

互评打分引发恶性竞争

不少课程需要同学之间互评作业,但是这种做法在别有用心的人的操纵下逐渐变成了同学之间互相攻讦,挑刺,打低分,挖掘个人信息,钻评分规则空子的恶性竞争,其带来的影响之恶劣,我认为远超过上面所说的其他任何问题。互评成绩计入课程总评严重影响了教学成绩评定的合理性和公正性,同时在大内卷的环境下,也导致了同学之间剑拔弩张,互相算计,对学生未来发展没有任何利好。

互评的本意是让同学们互相评价作业代码和文档,但是实际互评中大部分同学都不会仔细看代码和文档中的内容,而是利用规则漏洞,抓住一些细节死咬不放,想尽办法给人打低分,比如挑语法错误,数代码注释,找个人信息,完全失去了互评所谓的“本意”

具体课程内容

“软工”系列课程存在严重问题

作为软件工程的特色之一,软工的同学都需要学不少软件工程相关的课程,包括软件工程基础,软件工程管理,软件需求工程,软件质量保证与测试,这些课程饱受软工同学们的诟病,却始终没有做出令人满意的改变,我认为这几门课程至少存在以下几个非常严重的问题:

  • 四门课程内容严重重复,占用大量无效课时,软件工程基础已经基本覆盖了软件工程理论的核心知识,而这些内容要在软件工程管理,软件需求工程,软件质量保证与测试中翻来覆去再讲一遍,没有任何实际意义
  • 课程作业的载体雷同,除了做网站就是做网站,除了写文档就是写更多的文档,严重缺乏新意,文档中同质化的内容非常多,有价值的东西很少,老师根本不会仔细看学生提交的文档,而是通过页数来评估工作量,有的课程对网站的开发也没有任何实际意义上的检查,整门课程下来如同儿戏。
  • 负责上课的教师大多已多年未接触实际的代码开发和实践,讲课内容局限于书本理论而无任何实际价值,同时很多内容老师自己也未必了解,只能念PPT或者一通即兴乱讲,对学生没有任何帮助甚至有害

金融课程既不金融也不计算机

软工的培养方案需要学生修很多“金融”课程,包括国际证券市场导论,共同基金概论,外汇交易系统,股票交易系统等等。据说上这些金融课程的目的是培养计算机和金融交叉人才,让学生掌握金融信息技术,但实际上这些课程既不金融,又不计算机,一方面作为金融课讲的比较浅显,考试也停留在背ppt的层次,另一方面完全没有体现出这是一门计算机课程。

这些课程有一个共同特点:整个课程下来基本都是在讲一些概念性的东西,然后考试和写课程论文,而没有任何代码开发的实践,对软件工程专业的学生来说,更适合作为通识课而不是专业课。

问题总结

我认为以上所有问题可以归结为,当前软件工程本科生培养的主要矛盾,是软工学生日益增长的计算机专业知识学习需要和软件工程这个一流学科的本科培养方案设计不科学不合理之间的矛盾

我们不妨和CS领域的国际名校(MIT/Stanford/CMU/UCB)进行一个简单的对比,我将我的一些调研情况做成了下面的表格仅供参考:

我校 国际名校
课程设置 培养方案课程繁多,大而全,什么都需要学,却什么都学不深 需要上的课程数量较少,但是课程大多比较硬核,难度高,工作量大,学习收获多
课程内容 很多课程多年没有修改课程内容,部分老师尸位素餐,在教学方面不思进取 课程内容会随着相关领域的发展每年进行更新
作业内容 代码训练被花式写报告取代,要写的报告名目繁多且工作量十分饱满,各类文档和报告代代相传,基本不会变 更注重代码和课程Project,很多课程的作业围绕一个Project展开,并由学生分多次完成,组合成一个完整的项目,大部分时候不需要学生写大量文档和报告,同时会调整作业内容防止学生互相抄袭
作业指导 很多作业/实验的指导聊胜于无,全靠学生自己探索 作业和实验都大多提供详细的指导和操作步骤,并给出明确的目标,提供详细的指导书和说明文档,很多作业提供初始代码,学生需要按照要求写最为核心的部分
作业评分 主要通过老师和助教人工审核作业打分,有的课甚至有互评等荒唐现象,部分代码作业可以通过PAT网站提交并自动评分 很多代码作业都提供了比较翔实的测试数据,同时会使用一些GradeScope
助教团队 大部分课只有一个助教甚至没有,助教对学生可以起到的帮助较少,主要负责批改老师布置的作业 很多课程有3-5个助教,一些课程甚至有数十人的助教团队,助教需要负责布置作业,写初始代码和实验指导,有专门的时间用来给同学答疑
考试 考试占总成绩比例高,复习压力大,没有公开的复习资料不同教学班级对“透露”期末考题的情况不一致 会提前公开最近几年的考试题和答案供学生复习
开源情况 绝大部分课程都对外开放,少量入门级课程在中国大学MOOC这样的平台上 网络上可以找到很多名校公开课程,不仅开放课件,还开放课程视频/课程作业/课程项目
学费 享受国家补贴,但是软工学费相比于计算机和信安贵很多,但正常情况下低于2万人民币 数万到数十万美元不等

具体意见

合理规划课程模式

删减培养方案中的不必要学分

现有的软工培养方案依然存在学分过多,学生负担大的情况,在思政课和通识选修课的学分无法压缩的情况下,我认为应该删减培养方案中专业选修课的所需学分,减少课程的内容重合度,将内容重复的课程剔除,我认为可以尝试的方式有:

  • 减少软件工程系列课程
  • 减少小学期,尤其是大三暑假的小学期
  • 减少金融和网安模块的学分要求
  • 减少“其他选修课”模块的学分要求
  • 减少沟通技巧等主干课程

参考国外名校课程的成功经验

计算机领域的国际名校(如MIT/CMU/Stanford)有大量公开的计算机教育课程,很多课程广受好评,和我们的部分课程形成鲜明对比。在世界一流大学们已有的大量成功经验下,我们也可以尝试参考他们的教学模式进行改进。

招募高年级本科生组建助教团队

我们学校的助教制度存在这样几个问题:

  • 助教作为研究生有自己的研究方向,不一定跟课程契合,可能因为时间久了对课程不够熟悉
  • 考试周和项目验收等时间点,同学们对答疑的需求比较大,一个助教忙不过来
  • 助教拿到的补助不够多,导致很多助教难以用心完成助教工作
  • 助教拥有的权利不够大,可以将布置课程作业/课程项目的权力交给助教,让助教负责每年更新课程的作业内容,但是这样一来一个助教很显然无法完成工作,因此我们需要更多的助教,以助教团队的形式来服务课程教学

加强和互联网业界的合作

据说计算机学科是一门强调实践,和业界结合比较紧密的工程性学科,杭州的互联网业界资源应该也可以算比较丰富,我认为可以利用这些资源优势,聘用校外的一些深耕技术和相关工作的从业者来执教一些实践性质较强的课程,比如软件工程系列课程,让拥有较多业界实践经验的人带同学们尽早了解计算机产业界真实的工作情况和氛围,这么做可以帮助同学们尽早建立职业观,了解自己专业真实的就业情况,同时也可以改善部分课程的实践教学非常糟糕的现状。

同时,也可以在一些课程中引入一系列Guest Lecture,邀请相关领域从业人员介绍课程相关内容在业界的技术发展现状和前沿领域的研究成果,让同学们对业界前沿有更好的了解。

重建课程评价体系

改变“唯报告论”的作业评价方式

前面已经提到过,我们学院大部分课程的大部分作业都需要写各式各样的实验报告/文档,撰写这些繁文缛节的文档不仅浪费了学生大量的时间,也无益于学生掌握更多的知识,而是为了拿到更高的分数将心思都花在写出好看的报告上。同时通过报告评分,很大程度上依赖于老师和助教的主观感受,很多时候并不能正确反应同学们实际做实验的情况和代码运行的结果(因为老师并不会盯着学生做实验,也不会去运行学生提交的代码)

参考世界名校的成功案例,对于需要写代码的作业的评分方式,应该往基于自动化测试的方向改进,比如老师给出作业的框架代码,由学生完成其中的关键部分,然后通过教学网站(本地运行也可以)和已经准备好的测试点来自动化评估作业的结果。这就需要学院拥有一套自己的在线自动测试系统(国外很多课程都用的是GradeScope),PTA网站或许可以起到部分类似的功能,但目前来看PTA还是只能运行一些单文件编程题,而不能对一个工程项目进行测试。

同时对于一些没有固定测试标准的作业(比如开放式的大作业),也不应该让同学们写长篇大论的报告,而是应该采取尽可能精练的格式,比如外国一些名校的Project提交的报告一般是用Latex学术论文模版写的短文,一般在5页左右,非常锻炼同学的写作能力,同时又能控制“水报告长度”的现象。

总的来说,就是作业不应该只用报告作为评价依据,更应该注重其具体的实现过程,以代码的功能而不是报告的词藻和格式作为评价作业质量的依据。

取消或调整“互评”环节

以我个人的观点来看,计入总成绩的互评是无论如何都不应该出现在正常的教学过程中的,因为学生的成绩是以学校的信用来背书的,而同学之间相互评分很明显是对学校信用和公信力的毁灭性打击,因为同学之间是存在竞争关系的,并非利益无关,GPA的竞争导致互评必然会出现同学之间相互攻讦,倾轧,恶性竞争等现象,显然这无益于教学和培养。

我认为应该取消课堂教学中所有需要计入成绩的互评,不应该以学生之间互相评价作为课程成绩评定的依据。

减少期末考试占比并公开考试科目的历年卷

考试周爆炸似乎是计算机学院一贯以来的传统,在大作业,课程论文,项目答辩,期末考试多重压力使同学们往往难以兼顾,“爆肝”“刷夜”等行为也无益于同学们的成长和身心健康,所以我认为学院应该想办法减轻同学们在考试周时候的压力,比如减少考试课程数量,减少考试的成绩占比。

另一个很重要的问题是,我们学院现在的课程考试历年卷往往是不公布的,这就造成了班级和班级之间严重的不平衡,有的老师会在考试前有意无意的“指导”同学们“复习”考试“重点”,而有的老师则不会,这就造成了非常严重的信息不对称,同时,因为不公布历年卷,老师们往往懒于更新考试题库,总是在几张历年卷里固步自封,考试跳脱不出历年卷的桎梏,这会导致拥有历年卷信息的人在考试中具有极大优势,严重影响考试的公平性。反观世界一流大学,他们的很多课程会主动开放往年考试的题目甚至答案,这么做不仅可以减轻同学们的复习压力,减少不同人之间的信息差,同时可以倒逼老师推陈出新,让考试更能考查学生对知识的理解而不是对刷题套路的钻研和雕琢。

另外公开历年卷也可以遏制学校文印店老板对教学资源的盗印和窃取行为

调整特定课程内容

这一部分主要讲一些我个人对特定课程的看法和意见。

开设面向大一的入门课程

前面我已经提到培养方案中,大一的专业入门课程太少了,和本专业相关的只有C语言程序设计/程序设计专题/离散数学三门课程,而前两门课程是工信大类共通的课程,离散数学则是一门彻头彻尾的理论课,缺少代码实践,并且离散数学中的很多知识其实在高中数学里就有所涉及。因此我认为我们的培养方案中缺少真正的,属于计算机学院的入门课程。

我认为开设面向大一的入门课程是非常迫切而且有必要的,面向计算机专业的入门课程应该要包含以下内容:

  • 教会学生程序设计的基本原理而不是面向考试的,佶屈聱牙的,老师自己也没写过代码只是对着ppt念的语法细节,并且使用类似于Java/Python之类更容易入门的编程语言进行教学
  • 教会学生使用各种计算机中的基本工具,比如Linux命令行,Shell脚本,git等等,帮助学生建立好一套自己的代码开发工具链
  • 提供一些难度不高但是工作量较大的Project帮助没有编程基础的同学快速掌握基本的编程能力
  • 让同学们能够对计算机尤其是编程语言的工作原理有初步的认识

这些东西不一定要在一门课里全部讲完,但是非常有必要传达给一个计算机的初学者。

离散数学和数据结构基础

离散数学这门课的作用感觉非常尴尬,一方面,它的很多内容比如集合论,组合计数等等在高中数学里已经有所涉及,另一方面里面的树,图等内容又和数据结构基础有所重叠,虽然离散数学课上讲过但是数据结构基础还会翻出来再讲一遍。所以这门课的内容显得有些重复,同时作为现有培养方案的第一门专业课,离散数学的内容在接下来的专业课中用到的说实话比较少,因此可以适当删减里面的部分内容,或者针对某一章节开设新的课(如图论)让有兴趣的同学选修。

总的来说以一门纯理论课开启计算机专业课的学习这一做法的合理性有待商榷。

数据库系统

这门课被“誉为”计院大二下的三驾马车之一,因为它是专业核心课程,学分高,工作量大,考试难,但我认为这门课程有这样几个问题:

  • 内容割裂,前半个学期讲的SQL语法和后半个学期讲的数据库系统设计原理内容比较割裂(据说之前是两门课程合并而来的),并且内容太多,作为4学分的课完全塞不下这么多东西,导致老师上课也只能讲个大概,囫囵吞枣,同时SQL部分的预修要求不是很高,只要学生会基本的编程就可以,而后半部分系统设计实际上需要同学对计算机底层有比较清楚的认识才能学,而大二的时候培养方案上还没学过操作系统一类的课,实际上以当时大部分同学对计算机底层的认知是不适合学这部分内容的
  • 作业太多,我印象里学这门课的时候每周都有理论题作业,还有5个实验,期中期末各有一个Project,放在大二下这种学业压力特别繁重的学期很明显负担过重
  • 课程大作业是写一个miniSQL,但是老师基本除了几页说明文档以外给不出任何有效的指导,全看学生自己摸索,并且从头开始写一个miniSQL工作量极大,说实话,大部分人很难真的实现其中的一些关键设计比如Buffer模块和Index模块

针对上述问题,我认为可行的解决方案是:

  • 将数据库系统重新拆分成两门课程,一门主要讲数据库基本概念和SQL语法,另一门讲数据库系统的设计,同时应该将前半部分的内容提早修读,这是因为Web开发需要用到SQL,而软工同学大二下就会碰到若干门需要做Web开发的课程,比如软件工程基础,所以应该早一点学习SQL和Web开发相关的技能
  • miniSQL课程项目进行调整,调整的方式具体可以包括:
    • 对整个项目进行拆分,将关键模块进行解耦,并且将大作业分散成若干次完成,每一次由同学实现miniSQL中的一个关键模块
    • 课程组提供miniSQL项目的总体框架代码,让学生去补充其中的关键代码,而不是在没有任何指导的情况下从头开始写,关于这一点,可以参考CMU15-445,UCB CS186等课程的Project
    • 在项目提供代码减轻学生负担少做一些dirty work的前提下,将大作业改成单人完成
    • 提供每个模块的单元测试供学生debug,同时用测试点通过情况作为打分依据而不是课程项目报告

计算机系统原理

这门课早已超出了软件工程专业同学们对低质量课程的忍耐底线,在软工同学之间的评价也早就已经是不能更烂了,虽然我听说前几届一直有同学对该课程提出强烈抗议,不过至今为止楼老师还是一直活跃在软件工程专业的讲台上,因此我对这门课也就没什么意见了,希望楼老师生活愉快,万事如意,享受作为大学教师的每一分每一秒。

软件工程系列课程

软件工程系列课程(包括软件工程基础,软件需求工程,软件工程管理和软件质量保证与测试)存在的问题我在前面已经说过了,这里就不再重复。我认为可以改进的地方有

  • 删减培养方案中需要修读的软工课程数量,合并几门课程中完全重复的内容,减少每门课的工作量和学时
  • 减少课程中对软件文档的要求,少写莫名其妙的文档,更加关注小组的代码合作实现,建议用小组项目代码仓库的commit记录作为评价每个同学工作量的依据。少写无聊报告,多合作开发代码
  • 聘用长期活跃在开发一线的从业者来授课,让同学们能尽可能贴近实际的生产环境开发代码。关于这一点,更简单的方法是取消所有软件工程课程,改成每个同学去企业实习,用实践经验代替抽象授课。当然这一点实行起来难度较大。
  • 在开设软件工程相关课程之前,先开设Web前后端开发相关的课程(比如可以将B/S体系软件设计放到大二上学期),因为这些课程都需要用到Web开发,很多同学都是快要提交代码了才临时抱佛脚学一学Web开发,更有甚者只负责写各类文档而没有任何代码贡献,这很明显是背离软件工程初衷的。另一方面Web开发课程并不需要很多先修知识,只需要一定的编程能力和SQL语法知识,完全可以放到大二先上,掌握Web开发的相关技术对同学们后期的实习和工作也有一定的帮助。

计算机网络

计算机网络作为培养方案里的核心课程,其课程内容也饱受诟病,这门课存在的问题包括:

  • 计算机网络作为一个需要大量知识点堆砌的课,老师上课时的效果非常糟糕,基本就等于朗读一个个知识点,同学们去上课的效果聊胜于无
  • 我们学院的计算机网络课程理念存在问题,是从最底下的物理层开始讲逐渐讲到应用层的,这种底层逻辑对于计算机专业来说是非常劝退的,因为计算机专业没有学过相关课程,对底层并不了解,不一定清楚信号在物理层是怎么传播的,从物理层开始学容易让同学们怀疑人生。国内外名校的课程一般采用的是自顶向下的逻辑讲课(即从应用层开始讲),相比之下更容易让学生接受
  • 实验设计存在严重问题,实验室接设备、GNS3模拟组间路由器网络等实验并不适合计算机专业的学生,不仅需要花费大量时间,而且实验器材存在较多缺陷(比如实验室里的交换机是坏的,GNS3模拟软件会出现莫名其妙的崩溃),同时实验内容主要是拼接若干网络设备并在终端输入指令(其中有大量指令是重复的操作),给学生的观感和体验非常糟糕,同时也对掌握上课讲的大量堆砌的知识点毫无益处。另一方面,编程实验太少,完全不注重对网络编程能力的培养
    • 关于这一点,据我了解外国名校的计算机网络课程的Project和实验往往更偏向于编程项目,比如Stanford的计算机网络课程是8个实验实现一套TCP/IP通信协议栈
  • 期末考试复习的工作量巨大,考试题层次止步于背诵大量知识点,且班级和班级之间的信息差较为严重

针对上述问题,我认为可以改进的地方有:

  • 改变整个课程的教学体系,改成自顶向下的方式进行授课
  • 修改课程实验内容,删除或删减GNS3的实验,参考国外课程的做法,将课程实验改成以编程为主的Project,比如实现一个简单的TCP/IP协议栈。
  • 公开期末考试历年卷等资料,做到班级之间信息透明,而不是部分班级老师针对性的泄题

Java应用技术

这门课的内容偏向于讲Java的语法细节,同时内容局限在JavaSE中而不涉及Java Web的东西(比如Spring框架),除了作业量比较大以外和C程序设计并无太大差别,因此我认为这门课或许可以提早到大二上半学期,这个时候软工的专业课比较少,而这门课本身也没有很高的预修要求。对于课程内容本身我也没什么别的意见,只能说这样的课对于大三同学来说学了也意思不大。

大规模信息系统构建技术导论

这门课程在我们修读的时候刚好碰上了课程改革,我们这一届的作业是实现一个分布式的miniSQL,而上课主要讲了一些分布式系统和大数据相关的东西,虽然看起来目标很宏大,理想很丰满,但是这门课程依然存在许多问题:

  • 上课内容和课程项目不沾边,讲课内容比较枯燥乏味
  • 课程项目没有有效指导,和miniSQL一样也是通过几页文档和PPT下达要求,之后就让同学们自身自灭等待验收,实际体验非常糟糕,所有东西都要自己摸索,最后做出来的东西符不符合规范,大家也都很难说
  • 在原本的miniSQL上进行扩展这一要求不是很合理,因为这受到原本miniSQL的完成质量影响太大,如果全部从头重写又太花时间,导致这一作业非常尴尬。

我认为可以改进的地方有:

  • 讲课内容可以更注重一些分布式系统的内容,可以参考MIT的分布式系统课程6.824
  • 作业内容应该降低Project的难度和学习曲线,减轻大作业的工作量,降低难度,提供代码框架和测试数据
  • 同时提供一些平时的编程作业供同学们练习和实践
  • 课程使用的编程语言可以考虑go

金融相关课程

软工培养方案中金融相关的课程存在的问题我前面也已经说过了,这些课程既不金融也不计算机,金融类课程的改进方向应该是让它们看起来更像是一门计算机课程,至少应该让学生接触到金融行业中和软件/代码/编程有关的一些东西,我认为可以改进的地方有:

  • 课程应该更加注重金融相关的代码开发实战,股票交易系统,外汇交易系统等课程可以带领学生接触和尝试开发简单的金融交易系统,当然也可以讲金融数据分析之类的,总之不应该是一门只有背书,论文和考试的理论课
  • 纯理论式的金融课建议取消,不适合软件工程专业的同学学习

开设不同方向的导论性课程

我们学院的本科生同学未来会有很大一部分选择继续深造,也有同学会对某一方向的技术和发展特别感兴趣,因此学院应该开设一些计算机各个研究方向的导论性课程,让同学们了解这个方向的发展过程,最近几年的学术/业界的理论和技术发展现状,帮助同学们对自己感兴趣的方向尽早建立有效的认知,也能更好的选择未来的路。

后记

以上内容算是我的一家之言,我作为一个大四本科生的眼界和见识也不会比诸位领导老师来的宽,姑且算是我的一番妄言。我不知道写了这么多东西,学院的领导老师看到之后会不会有所反应,会不会在以后做出一定的改进,但是我希望学院的领导老师可以更多的倾听来自同学们的声音,对本科教学中存在的不足之处及时改进。最后也祝愿计算机学院以及计算机学院的本科生教育越办越好!