对前三年的一点总结

上个月保了个研+国庆疯玩了几天之后,我决定来总结一下大学前三年的一些经历,经验和教训,留作一个样本供后来人参考

全文共6000多字,预计阅读时间20分钟

目录

  • 阴差阳错进软工
  • 专业课的学习感悟(以及吐槽)
  • 对专业课的一些思考
  • 关于软工的绩点和保研

阴差阳错进软工

lz是浙江人,得益于浙江大学在省内的政策性倾斜加上自己高考确实考的还行进了工信,填志愿的时候高中的班主任极力劝我去学数学,不过当时的我觉得自己数学竞赛都拿不到大奖,大概也没啥学数学的天赋,就没填数学相关的志愿,而因为高中的时候物化生学的都不咋地(尤其对生物深恶痛绝)因此也没有报相关专业,思来想去就报了工信。

确认主修专业的时候我填了软工,一个是因为大佬们更喜欢报计算机,软工相对而言竞争不那么残酷,另一个是当时听说软工可以不修硬件课,能省不少事情。不过读了三年之后我发现这句话都是flag

所幸最后混进了软工,当时寝室4人里3个人报了软工,没想到最后都进了,上个月还都保研了,不得不说也是种缘分。

专业课的学习感悟

对于写代码,我属于半路出家的类型,上大学之前也没接触过任何编程,因此虽然已经大四了代码能力也非常一般,大一刚入门的时候连在IDE里创建一个工程项目都不会,整个大一基本就接触了一点C语言编程和离散数学的东西,剩下的时间都在摸鱼和基础课里度过了。

真正接触专业课大概是大二开始的,后面陆陆续续学了很多专业课,虽然大部分时候都靠考试前补天来学习,不过我还是总结了一些经验规律和诸位分享,下面分课程来讲讲我的一些学习经验,以及我个人对这门课程的评价(10分制评分),同时我也把一些课程资料上传到了这个GitHub仓库中,供大家有需要的自行取用,希望能对各位有所帮助,对这一部分不感兴趣的可以直接跳到下一节

大一下

离散数学及其应用

  • 总体难度:7,个人评价:6

离散算是我第一门接触到的专业课,这门课主要讲一些和计算机相关的数学知识(基本停留在高中水平,如集合论,排列组合,归纳证明,算法复杂度)以及图论,感觉很多东西和数据结构是重复的,没必要讲两次,并且这门课有4学分,考试也不容易,想取得好成绩的人不能放松警惕,至于作用我想可能是把数学的符号体系引入计算机中,至于能用得上多少又是另一回事。

大二上

数据结构基础

  • 总体难度:8,个人评价:9

数据结构算是质量比较高的一门专业核心课,既讲理论也有很多代码实践,我认为计院的数据结构基础的教学目标就是学会套用各种数据结构的模板进行编程(感觉大部分练习题和Project都是这样,听说现在Project的难度有所提高),当然这课对于OI选手可能就是纯送分课了,平时注意代码一行行自己写就可以,不过考试可能并不简单(我印象里),另外互评真的傻逼中的傻逼,上大学之后第一次体会到了人心的险恶

数值分析

  • 总体难度:8.5,个人评价:8

当时选数值分析是因为软工大二上安排的课过少(这个问题听说现在有所解决),于是选了一门这课凑学分,结果一来发现这课难度不是一般的大,并且曾多次萌生退课的想法,这课的难点主要在于上课老师讲的云里雾里听不太懂以及编程题比较搞人心态,而这课的精髓也就是在8个编程题里,考试反而比较简单,基本都是套公式,并且开卷。

大二下

高级数据结构与算法分析

  • 总体难度:9.5,个人评价:8

难度比较大,平时可能感觉不是很深,但是考试难度高(不过听说今年的难度有所下降),难题主要出现在算法分析那一部分,感觉本身能把这部分讲清楚的老师就不多,考试还出这么难的题,不过多刷刷平时分做点bonus最后也不至于太惨。整门课程的内容应该是比较硬核的,但是计院几个专业大二下普遍忙的爆炸,不会有太多时间投入到ADS上面,注意一下早点开始复习ADS,可以在PTA上给陈越送点钱买历年卷。

计算机系统原理

  • 总体难度:7.5,个人评价:0

烂中烂,上过这课的软工人对此应该都深有体会,至于有多烂,没上过这门课的人可以去看任课老师的查老师评论

数据库系统

  • 总体难度:9,个人评价:6

这门课作为计院大二下另一门四学分的课也比较硬,不过能把这门课讲好的老师更少,我个人觉得这课内容太多,放在一个学期上非常不合理,并且这门课前后内容联系的并不紧密(前半部分讲SQL和数据库的应用,后半部分讲数据库系统的设计,数据库系统这门课本身就是由两门数据库课合并而来的),miniSQL这个大程如果真的一行行从头开始写工作量非常大,容易出现期末考试周debug暴毙的情况,所以我建议把这课拆成两个门课,前半部分提前到大二秋冬,这样或许可以减轻一点大二春夏的压力。

这课的考试比ADS简单一点,基本每年都是同几个套路的大题,而且开卷。(不过我们那年考了一堆奇怪的题,像是为了反套路而反套路)

安全编程技术

  • 总体难度:8,个人评价:8

课程内容还可以,实验里有很多简单的CTF题(简单这一评价出自打CTF的室友),但我感觉还是挺难的,老师讲的还可以,时间充足的人可以尝试选一门试试,给分很高。

密码学

  • 总体难度:8,个人评价:3

我上的Diffie的密码学,不是小白的,最大收获是结课一个月之后突然说这个课可以算对外交流申四课分,上课感觉意思不大,主要是听老爷子讲密码学发展史,个人对这方面不感兴趣,所以听的也很无聊,不过事情很少,一共只有两次作业,不在乎成绩的话很适合作为选修课混学分,作业建议找几个人讨论一起做,因为正常情况下一个人很难做出作业里莫名其妙的题目

信息安全原理

  • 总体难度:6,个人评价:6

比较水,对安全不感兴趣,别的没印象了,只记得做了一个比较水的Project(其实就是报告+PPT展示),然后因为疫情考试取消了。

面向对象程序设计

  • 总体难度:5,个人评价:8

这个课虽然叫OOP但实际上是C语法导论,上课通篇在讲C的语法细节了,考试考的也都是这些东西,所幸大部分东西讲的不深,不需要“精通C++”也可以学会,作业都是比较开放式的编程题,感觉难度在所有专业课中应该是偏低的,大作业有的班比较烦要做个基于QT的大程,我们当时做了个对象序列化的东西。考试复习刷文印店历年卷就可以。

面向信息技术的沟通技巧

  • 总体难度:3,个人评价:1

难度较低,但是因为有10人大组合作所以难免会血压升高,个人认为是计院最莫名其妙的课之一,烂课,虽然给分高,但还是烂课,大家捏着鼻子忍忍就过去了。

软件工程基础

  • 总体难度:随队友靠谱程度而变,个人评价:2

逆天程度和计算机系统原理一个等级的课,应该是软工全家桶的青春版,上课讲一些莫名其妙的软工理论,作业需要5人一小组,25人一大组来开发一个xx网站,整个课程最糟糕的体验可能就在这一部分,组队是随机分配的,并且人和人之间的沟通会出现各种各样的问题,如果你当组长可能会在这门课上花掉很多时间来集成和对接(当然我没当过),比较搞心态,对于普通人而言工作量也不那么大。

考试有选择题题库,刷刷就行,考前看看一些关键的图怎么画(比如类图,CRC卡,顺序图等等),后面大题要画

服务科学导论

  • 总体难度:2,个人评价:1

老师好像只负责上课瞎吹,整门课结束不知道讲了什么,最后大作业选题非常宽泛,也不会看具体的实现和效果,拿高分的关键是idea够新颖+PPT够好看,听说有没写代码只做了一个精美PPT也可以4.8的,总体来看是一门送分课程。

大三上

Java应用技术

  • 总体难度:6,个人评价:7

这门课的Java局限于JavaSE,而不涉及JavaEE,大部分时候靠自学就可以没必要听课,不过侧重代码实践的课一般都是这样,编程作业里感觉比较有意思的一个是写爬虫+搜索引擎,另一个是写多人聊天室。考试半开卷,但是对语法细节考的比较多,这也是我对这门课评价不高的原因。

操作系统

  • 总体难度:6(教改班写kernel的难度为10),个人评价:7

lz上的是普通班,比较水,几个实验大多是Linux内核相关的一些魔改,找份前人工作一步步操作下来应该问题不大,考试难度也还好,混学分比较轻松。不过学完之后才发现,自己对操作系统的理解只停留在八股文概念的层次,对操作系统内核真正的工作机制并不了解,这些东西应该要在教改班才能学到,不过教改班难度很大,听说很折磨,不过现在已经全面教改了,所以也没得选,大家一起坐牢。祝还在上这门课的同学好运。

计算机网络

  • 总体难度:8.5,个人评价:2

计网感觉内容也比较散而多,而且考试都是王道408上的题目,建议想考高分的同学多刷。这门课让我印象深刻的是一些莫名其妙的实验,感觉用GNS3软件进行模拟实验既没啥意思又浪费时间,这也一直被人诟病,不过学院似乎一直都没有对这门课进行过调整。

这门课应该是从物理层开始讲讲到应用层的,但我觉得这种教学模式过于劝退,有兴趣的同学可以去看看《计算机网络:自顶向下方法》和CS144(作业是自己实现一个TCP),感觉这样的计网质量比较高。

软件需求工程

  • 总体难度:1或者10,个人评价:0

已经不想多说了,具体的可以看我之前发的帖子 https://www.cc98.org/topic/5030415 反正这课真的绝绝子

软件工程管理

  • 总体难度:1或者10,个人评价:0

和软件需求工程一起评分,虽然课程内容和软件需求工程一样感人,但是给分往往比软件需求工程高,所以评分比软件需求工程好一点,具体的难以用语言描绘,建议自己选课亲自体验,18级软工因为培养方案的绝妙设计不得不同时体验软件需求工程,软件工程管理,软件质量保证与测试三门课(应该说以前都是这样),听说以后只要选两门上就行,也算是巨大的进步。

软件质量保证与测试

  • 总体难度:6,个人评价:0

之前听说是外国教授来上这门课,真的到上课的时候发现授课老师是一个中国光头,上课基本以瞎侃为主,需要做几个莫名其妙的作业,有爬虫,有写测试报告,也有写算法代码的,总体来说不难但是好像也学不到啥东西,考试按照最后一节课讲的考纲来准备就可以,覆盖率100%

大三下

B/S体系软件设计

  • 总体难度:5,个人评价:7.5

上课没怎么去,自学了一套过时的前后端开发技术(React+Spring Boot)做了一个网站,体验还不错。难度不大,因为整个课的任务就只有做个网站,最后只要基本功能都有,前端不是丑的离谱应该都可以拿高分,当然也有做的特别好看的。

数据挖掘导论

  • 总体难度:6.5,个人评价:6.5

这门课以前是蔡老师上的,听说讲的东西非常硬核,是统计机器学习的入门课,不过今年改成李老师上了,好像更偏重实践,讲的内容比较水,几个小作业时间比较紧,工作量也不小,大作业是做一个Kaggle上的竞赛题,不过对rank没有要求,关键在于体验一下,总的来说中规中矩吧,以凑学分为主,想学统计机器学习的可以找个外国网课。

职业发展规划讲座

  • 总体难度:0,个人评价:6.5

这门课内容比较丰富,有阿里hr讲座,简历一对一修改,企业参观,人物访谈,模拟面试(最后的大作业),据说目的是帮助同学们进行合理的职业规划,不过很多环节比较浮于表面,印象比较深的是人物访谈环节我去访谈了胡神@ 冰冰的小冰,在1897门口电话聊了一个半小时,收获还是比较多的,具体的访谈内容我也在这个帖子里发过,大家有兴趣的可以看看。

计算机科学思想史

  • 总体难度:3,个人评价:3

凑学分的课,上课几个老师轮着来讲,据说要点名但除了最后一节课一直都没点过,最后一节课点名没到可能要挂科(存疑,老师这么宣称的),作业是一篇文献综述+一次三分钟小组展示,应该说事情非常少,而且难度也低,比较适合混学分。

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

  • 总体难度:8.5,个人评价:8

这课据说要对标MIT6.824等著名分布式系统课程,但是上课效果并不令人满意,老师的讲课方式和授课内容都不太令人满意,而课程的Project是在数据库系统的miniSQL基础上做一个分布式的miniSQL,作业要求有点云里雾里,不过最后大家都做出来了,认真做Project的话收获还是比较大的,不过这门课应该有比较大的改进空间,我们今年貌似是第一次改成这样,以后有机会也会去给任课老师提提意见。

项目实训

  • 总体难度:7.5,个人评价:4

大三短学期的课,要连着上两周,事实上这时候大家都有了自己的规划——实习,就业,考研,保研,出国,因此这门课的时间就非常尴尬,浪费时间而且没啥新东西,基本就是把前面软工全家桶的东西再实践一次,不过这次的完成度要求应该会比较高。一般是做个搜索引擎,主体功能勇Elastic Search就基本能搞定,其他杂七杂八的功能看自己高兴往上加就可以,不过这段时间反正也不能跑路实习,不如多花点时间做。

对专业课一些思考

上了这么多软工培养方案上面的专业课,我的感受是虽然专业课门类开的比较全,但是也存在非常多的问题,这和A+学科的身份是明显不匹配的,我觉得主要的问题有:

  • 一门课涵盖内容过多,一个学期根本上不完,而且压力集中在Project和期末考试上,导致很容易出现期末崩盘,典型的比如数据库系统
  • 课程实验和lab太旧,用的还是十年前那套东西,而且实验和lab对理解知识没有很大帮助,可能就是单纯的体力活,比如计网实验
  • 开了一堆莫名其妙的选修课,比如软工的金融模块,上了一堆既不够CS又不够金融的课程,除了凑学分我想不出上这些课的理由
  • 软工全家桶浪费学生大量时间,流毒太深。从软件工程基础开始,到软件工程管理,软件需求工程,软件质量保证与测试和项目实训,事实上几门课的内容重合度非常高,不管是讲课的内容还是作业(都是若干文档+做网站),而上课的时候老师基本都在扯一些过时的理论,自己可能既没做过软件,也不懂具体的工程技术。
    • 这几门课都是以做网站为教学目标的,一连串的课下来同学们做了一堆莫名其妙的垃圾网站,但是web开发技术上却难有提升(除了个别真的很用心在做的人),因为课上没有任何的指导,同学们对网站的要求也是能跑就行
  • 一些课程的上课内容过于水,很多课程看起来是丰富了培养方案,实际上就是在给已经忘记掉专业课怎么讲的老师一个凑课时的机会,上课大部分时候都是拿出自己实验室里做的一些成果来跟同学们做talk,或者讲一些入门程度的,百度一下都能搜到的东西,当然这些课一般给分都很高,这里我不点名是哪些课程,请诸位对号入座。
  • 各式各样的实验报告层出不穷,导致很多同学忙着卷报告而忽略对知识的学习,大部分课程都要写一些信息熵非常低的报告和文档,重形式和长度而忽略内容,当然计院很多课都有这个问题。据我了解
  • 一些课程的Project脱离实际,完全不考虑普通学生的能力水平(或者说普通学生也应该有这些能力,但是因为培养方案的问题完全没有培养起来),给出一个很大的目标和宽泛的需求,却没有多少指导和说明,什么都要从头开始写,我也不想说是哪些课,上过的同学应该都深有体会
  • 一些课程的内容和讲课风格可以说是“罄竹难书”,上完之后令人麻中麻,比如计算机系统原理

目前来看软工的培养方案上的课程质量还有待提高,不过这只是我的一家之言,如果有其他看法也欢迎在下面的楼层分享,但是好课也不是没有,上过的这些课中还是有一些我觉得比较好的课程的,但总体来看质量确实非常一般,如果满分10分的话我个人最多只能打7分。我不知道其他软工的同学对这些课的评价如何,但是如果真想学某门课,还是建议去找CS四大名校的公开课资源,不要为了学知识而选某门课,不然上完之后大概率会感觉比较失望。

关于软工的绩点和保研

软工的保研绩点是比较高的,软工和计院的同学应该都早有耳闻,一方面是软工出国的人少,另一方面软工的课确实比CS和信安要水,没有硬件课和编译原理之类的东西,确实更容易拿高分,加上这几年愈演愈烈的绩点大放水,评奖评优和保研时候的绩点线自然就水涨船高了。关于计院保研,搜相关关键字就可以获得大量有效信息,但总的来看,保研是一场信息差的较量

而除了一些比较硬的课以外,软工大部分课混个高绩点都是不难的,只要正常做完作业和考试即可,一般来说4学分及以上的课都比较硬而且难取得高分,这些课往往平时压力比较大,而且需要期末考试,但其实平时作业和大作业的区分度并不会很高,关键往往还是期末考试,如果想拿高分可以早点开始复习、刷历年卷,在这几年越来越卷的大趋势下也有人用刷考研题的方式复习关键专业课,事实证明这种操作对于刷高分而言确实有效。

同时软工的专业核心课程基本集中在大二,尤其是大二春夏,我印象里我们这届软工一共大概30多学分的专业核心课程里,有超过20学分是在大二春夏学期上的(ADS, DBS, 计原, OOP, 软工基,沟通技巧),同时这个学期也是软工最忙,大程最多,考试最多最难的一个学期,要注意合理安排。

当然如果不在乎绩点,上面的话都可以当作fp(文件指针),趁早面向实习/面向面试学习比较有用,可以搞点自己的小项目或者学点技术栈,学校里的东西对找工作帮助最大的可能就只有学历,大部分课程项目看起来都不太能写道简历里面去,除了miniSQL以及操作系统课上可能会有的kernel,印象里当时找实习的时候整天被问miniSQL,其他的基本没怎么问。

如果真的想学某门课的知识,可以看胡神的这个帖子 找对应的外国公开课来学,一般这类课会比学校里对应课程的质量要好一些,尤其是作业。

想说的暂时就这么多了,不知道诸位对我说的这些问题有什么样的看法。