本科大一,刚学了16周C++,能做个什么项目?
清华大学自动化系2020年的大一C++大作业,是这样要求的:
开发一款集合雨课堂和网络会议优点于一身的网络教学软件。
是的,你没看错,不是学生信息管理系统,告别数据库的增删查改,而是——
比清华大学在疫情期间使用的直播教学工具,雨课堂,功能更强大的在线教学系统,雷课堂。
消息一出,瞬间成为热议焦点,不仅清华同学们的朋友圈被刷屏,还火到了知乎「热榜」第一!
惊掉下巴的我,不禁想起了一个段子:
已知 1+1=2,请求地球的半径。
嗯…不愧是清华。
动手试试做个视频会议软件吧!
所以,雷课堂到底是怎样一个大作业?
不妨一起来看看具体要求(部分简写):
1. 基本功能要求(*代表教师用户具有的功能)
1.1 用户登录:涉及对用户名密码的存储,以及数据库增删改。
1.2 语音设备选择和切换:用户进入课堂,可自主选择语音输入和播放设备;并可在随时切换。
1.3 共享屏幕*:教师可共享整个屏幕或某个窗口内容给全体同学;可随时切换共享源、停止或再次开始共享屏幕。
1.4 语音直播*:实时音频流传输。
1.5 随机语音提问*:教师可一键随机选择一名同学,被选中的同学的麦克风将被自动打开,并发送给教师和其余全体同学。
1.6 在线发题*:可动态编辑、发送选择题,实时统计选择人数、名单、作答耗时。教师可随时中断发题,但仍需统计上述信息。
1.7 在线答题:学生收到试题时弹出置顶窗口,并计时。提交答案或教师中断发题,才关闭窗口,并将答案和耗时反馈给教师。
1.8 学生签到:进入课堂时自动签到。教师可收到合适学生签到和推出课堂的信息。
1.9 注意力:“雷课堂软件出于焦点窗口状态的时长”,与学生在线时长的百分比。
1.10 上课/下课*
1.11 进入课堂/退出课堂
1.12 麦克风管制
2. 系统设计要求
2.1 除程序主函数和必要的友元函数外,不允许出现任何一个非类成员函数。
2.2 任何不改变对象状态(不改写自身对象数据成员值)的成员函数均需显示标注const。
2.3 全部类分为三大类:界面类、业务流程类、核心类。仅有界面类可以用开发环境自动生成代码框架。仅有业务流程类可以包含开发环境提供类的指针。核心类只允许使用 C++11 支持的标准语法、STL、操作系统API。(此条为强烈建议,未实现界面类和核心类分离将严重影响成绩)
2.4 全部语音、屏幕共享、网络传输等需使用操作系统API的相关操作,均需封装成类代码,再被其他核心类使用。不允许其他核心类直接调用操作系统API。
2.5 除界面类外,任何第三方类库的使用,只能处于源代码级别,不可以来 lib/so/dylib文件(静态库也不可以)和 DLL 文件。
(完整版请戳文末链接)
看完所有要求,大家都被如此庞大的工作量惊呆了。
整整 3 页需求,涉及语音获取和网络传输、视频音频处理、WinSocket 网络编程、数据库……
这要是甲方爸爸的需求列表,那写的真是清晰无比,让人不禁想点个赞。但作为初学者的大作业要求……
清华特奖直言:我也做不出
面对如此作业,网友们也不淡定了,各路选手纷纷出面置评。
(PS:以下内容均授权转载)
首先登场的是清华大学核科学与技术硕士在读生,表示其他院系也不能落后。
不愧是你清课堂,轻易做到了腾讯程序员做不到的事情。
其他院系也不能落后啊!
工物系大作业: 组装一个托卡马克装置,要求实现氘氚聚变点火,并约束等离子体100秒。
航院大作业: 设计一台隐身战机,要求性能不输于美国的F22。
微电子大作业: 制造一颗CPU,性能超过线程撕裂者3990X。
电子系大作业: 设计一款5G基带,性能超过高通的X55外挂基带(加分项:将5G基带集成进手机Soc)。
生物大作业: 研发新冠病毒疫苗,16周提交临床实验数据。
数学系大作业:证明哥德巴赫猜想,16周答辩。
物理系大作业: 统一四种基本作用力。
能动系大作业:设计制作H级燃气轮机。
新闻学院大作业:拍一部院线电影,要求豆瓣评分9.0以上,16周拿龙标,暑期黄金档准时上映。
生医工程大作业:实现脑机接口,可以输出文字(加分项:输出语音)
这位王同学,你太优秀了,坐下!
清华特奖选手也登场,出面表示:这个我也做不出来。
我,大四,软院,清华特奖,做不出这个大作业。
用C++写socket编程,是我在大三的时候写FTP服务器用到的。
用C++写web应用,我不会。用Django+vue还勉强可以,是我在大三做软工竞赛平台的时候用到的。
用C++处理图像,得用OpenCV吗?
如果自动化大一就达到了我大四的水平,我无话可说。长江后浪推前浪,00后是真的厉害。
救救孩子吧,我记得往年应该只是个学生信息管理系统?
特奖这事一般不拿出来说,都是过去的事了。但是,为了拯救九字班,该派上用场的时候还是能拿出来用一用……
接下来登场的是留学生选手,帝国理工学院岩土工程学在读博士生,一波回忆杀赢得了不少赞同。
清华老师特别喜欢干的一件事情就是搞一根很长的尺子,然后测测同学们水有多深。
他在布置作业的时候就知道同学们完成不了。但是有的人完成了1%,有的人完成了5%,他想看看“天才”会不会出现。
但是对于同学们来说,这是完全不同的一件事:大作业需要学生不断地去博弈。咱们先不论大作业内容是什么,清华学生在做之前,要先折腾清楚以下几件事,并做出选择:
1、要不要自己从头开始认真做,还是直接网上抄现有代码?如果自己认真做,然后做个漏洞百出的半成品拿了低分,别人抄现有代码拿了高分怎么办?
2、老师和助教们会认真批改代码吗?还是仅仅看个框架?然后他们突然宣布:诶呀大作业么就是让你们体验一下,重在参与,你们也太认真了。最后张三的大作业糊弄了一下拿了90分,我花了好几个礼拜认真做拿了91分,这公平吗?!
3、我花20小时做出来的东西很可能跟张三花2小时做出来的东西没什么区别,那我努力有个屁用?
4、我都折腾这个大作业去了,那么我其他科目的学习时间要怎么安排?!
虽然专业不同,但是土木系也有类似的情况。一个三学分的混凝土结构设计课,当时大作业是要求我们设计一栋混凝土大楼出来(没看错,一个本科生搞一栋大楼出来)。这期间最消耗时间的就是楼层荷载的验算,需要对照超级冗杂的规范逐步查验。
我当时埋头苦干,花了大量精力反复验算,后来还迟交了,拿了低分。一问同学们,他们说他们的荷载都是编的,反正老师也不会查。
后来我去质问老师,老师说这个课本来就是让你们体验一下工程的设计过程,结果倒不是主要的……
尼玛你怎么不早说?!故意的吧。
清华大学副教授刘知远也回复了这个问题,建议合理设计发展目标,不盲目攀比内卷。
话说这学期我们OOP为了避免大一同学就内卷、匹配2学分工作量,刚把大作业给砍掉了。
前年是开放选题的OOP大作业,结果很多同学争做酷炫界面、网络通讯等模块,脱离了OOP课程的学习目标。所以,去年限制了大作业选题,设置了Bonus,本意是同学如果觉得考试不理想,可以通过做Bonus补偿分数,结果是几乎所有同学把所有Bonus都做了,让为师叹为观止。
作为任课老师,我也是花了两年时间才揣摩到同学心理,可以说,咱们同学实在太拼,为了多得几分什么事都干得出!为了让OOP回归2学分的工作量,今年几位合开老师和助教商量后就把大作业砍了,加强了日常作业进行规定动作练习,还是希望同学能够回归OOP课程本来的学习目标、全面发展为好。
最后还是建议合理设计发展目标,不盲目攀比内卷,从自己做起,从现在做起吧。
当然,还有选手做出了温馨提示:
同学们,现在退课还没结束呢!
补充:大类分流也还没结束呢!
布置作业的老师现身说法
舆论热议之下,任课教师专门给同学们进行了大作业讲解。
清华信息科学技术学院本科生、知乎答主孙恒详细分析了“雷课堂”大作业每一项要求的难点之后,综合评价说:
实际上对比一下贵系软工大作业的话,不难发现这个需求即使放在软工里也是非常艰难的,况且软工是一个贵系的、大三的、多人组队的、可以任意调库的大作业。
怀着疑问,他全程跟了一下大作业讲解这堂课,并分享了答疑内容。(原文链接见文末,未经原作者授权不得转载)
根据任课老师的解释,作业的重点不在于实现功能,考查的重点是对类的设计。
并且,在老师的规划里,这个作业占时在50~75小时。
但对此,孙恒等同学表示惊讶:
我们惊讶的是老师竟然认为这个任务只需要 75 小时就足以完成;对于很多自九同学来说,他们惊讶的是 75 小时意味着剩下的日子里竟然每天都要用两小时花在大作业上。
根据知乎答主王聿中,清华自动化系C++任课老师,针对如此热议,给出了最新回复:
△图源:知乎答主“王聿中”
嗯,确实比清华学生作业更难的——是合理地给清华学生布置作业。
不过对于这个作业,我们也悄悄问了国内大厂的朋友,已经涉足视频会议的他们表示,不愿意对这个作业难度给出评价。
但是!如果这份作业做得好,他们那里绝对高薪以待——实习也行,一直等到你毕业。
真是作业做得好,offer不用愁。
One More Thing
最后,这次清华课堂大作业的讨论之下,也有更多人回(tu)忆(cao)起遭遇过的令人头大的大作业。
如果有些事你难以忘怀……