近日,来自知乎网友的灵魂一问:“如何看待清华大学自动化系 2020 年大一 c++ 大作业是写一个功能更强大的雨课堂(雷课堂)?”在网上讨论火热。雷锋网编辑也看了下这个作业,表示连题目都没看懂,学渣哭泣......
 
  为什么要设计这样一个作业?
 
  首先,我们来看下这个作业设计的大背景。
 
  受疫情影响,在线教育成为这段时间学生和家长的常态。据教育部数据,截至 4 月初,参加在线课程学习的学生达 11.8 亿人次,参与在线教学教师 1600 万人。
 
  清华大学以“雨课堂”为主、腾讯会议和 ZOOM 等网络会议软件为辅,2019-2020 春季学期共实现了 4422 门次课程的网络教学。“雨课堂”以 Office 插件形式,实现一对多的 PPT 展示、在线答题、弹幕、随机点名等师生互动的交互式教学,并可以汇总关键词、懂/不懂、签到、在线时长、注意力集中程度、答题情况等群体和个体统计数据。但网络会议软件在多方语音互动、快速屏幕/窗口共享切换等方面特色突出,但教学信息统计功能缺失。
 
  因此,在本学期 C++ 课程开始前的系统测试中,有同学建议自主开发一款集合雨课堂和网络会议优点于一身的网络教学软件,经讨论,清华大学以“雷课堂” (Thunder Class)为题,设计了本学期的大作业。
 
  堪称史上最难作业:清华大学自动化系 2020 年c++大作业
 
  那么,这个作业的主要内容什么呢?
 
  作业主要分为四个部分,即基本功能要求;系统设计要求;代码与发布要求;报告要求四部分。
 
  1. 基本功能要求(*代表教师用户具有的功能)
 
  1. 1 用户登陆:根据用户名密码登陆软件,三次密码输入错误自动退出雷课堂软件。根据账号类型(教师/学生)不同自动切换功能。必须包含一个账户名为 Admin,密码为 Admin 的管理员账号,此账号仅能用于管理教师和学生账户的增删改。(不需考虑如何在增删改用户和密码后通知该账户持有者。毕竟我们有微信)
 
  1. 2 语音设备选择和切换:教师开始上课前/学生加入课堂前,应可自主选择语音输入和播放设备;并可在课程持续期间随时切换语音设备。
 
  1. 3 共享屏幕*:教师在上课过程中,可共享整个屏幕或某个窗口内容给全体同学(包括但不限于 PPT 和代码编辑器);可随时切换共享源、停止或再次开始共享屏幕。
 
  1. 4 语音直播*:开始上课时,自动开始语音采集,并实时的通过网络传送给所有已经连接到本课堂的学生。
 
  1. 5 随机语音提问*:教师可一键(单次鼠标点击或单次快捷键)在全体在线同学中随机选择一名。被选中的同学的麦克风将被自动打开,并发送给教师和其余全体同学。教师可再次一键结束此次语音提问。
 
  1. 6 在线发题*:教师可在上课过程中多次动态编辑并向全体同学发送单选/多选题,并实时统计个选项选择人数、选择每个选项的同学名单、每位同学作答的耗时。教师亦可随时中断发题,但仍需统计上述信息
 
  1. 7 在线答题:学生在收到试题时,应弹出置顶窗口显示题目和选项,并开始计时。直到学生提交答案或教师中断发题时,才关闭窗口,并将答案和耗时反馈给教师。
 
  1. 8 学生签到:进入课堂时自动签到。而教师可收到何时学生签到和退出课堂的信息。(多次签到和退出均需记录)
 
  1. 9 注意力:课堂持续期间,学生签到后,“雷课堂软件处于焦点窗口状态的时长”与学生在线时长的百分比,将在下课时反馈给教师做记录。
 
  1. 10 上课/下课*:上课时,教师端开始随时接收用户登录请求,并根据用户名密码自动决定是否允许学生端连入。一旦允许连入,之后的语音、屏幕共享均、语音提问、在线答题信息均会传送给该同学。教师下课时,应在接收了全体在线同学的注意力数据后再断开与学生端的网络连接,之后自动生成全部课上统计信息,以文件形式存储并在教师端界面上显示。
 
  1. 11 进入课堂/退出课堂:在输入了教师端的 IP 地址(或 IP 和端口号)后,连接到教师端,实现进入课堂功能并开始网络数据通信。如在 30 秒内不能连接到教师端,应弹出提示。在主动退出课堂或直接关闭了软件时,应向教师端发送注意力数据,再断开与教师端的网络连接。(不需考虑如何获取教师端 IP 和端口号,毕竟我们有课程微信群)
 
  1. 12 麦克风管制:除非收到教师语音提问,否则麦克风时刻处于静音状态。
 
  2. 系统设计要求
 
  2. 1 除程序主函数(广义的主函数,可能是 WinMain 或其他)和必要的友元函数(要在报告和程序中额外说明每个友元函数的不可替代性:为什么一定要用友元才能实现)外,不允许出现任何一个非类成员函数。
 
  2. 2 任何不改变对象状态(不改写自身对象数据成员值)的成员函数均需显示标注 const。
 
  2. 3 全部类分为三大类:界面类(开发环境提供的、与图形界面相关的类)、业务流程类(仅有一个,用于和界面实现耦合)、核心类(其余全部类)。仅有界面类可以用开发环境自动生成代码框架。仅有业务流程类可以包含开发环境提供类的指针。核心类只允许使用C++11 支持的标准语法、STL、操作系统 API。(此条为强烈建议,未实现界面类和核心类分离将严重影响成绩)
 
  2. 4 全部语音、屏幕共享、网络传输等需使用操作系统 API 的相关操作,均需封装成类代码,再被其他核心类使用。不允许其他核心类直接调用操作系统 API。
 
  2. 5 除界面类外,任何第三方类库的使用,只能处于源代码级别,不可依赖 lib/so/dylib 文件(静态库也不可以)和 DLL 文件。全部第三方类库需在报告和程序中著名来源和版权信息。
 
  3. 代码与发布要求
 
  3. 1 通过开发环境自动生成的界面类代码,全部数据成员和成员函数需在类声明时加以注释,函数体内的必要步骤要加以注释。
 
  3. 2 其他全部类代码的数据成员和成员函数的声明和实现均需加以注释,成员函数的必要步骤要加以注释。
 
  3. 3 其他代码规范需遵循学堂发布的编码规范要求。
 
  3. 4 发布的程序必须是可运行于 Win10/Mac os 10.14 操作系统下的 32bit 或 64bit 的 Release 版本:不依赖于具体开发环境的依赖库、不依赖操作系统驱动或功能模块配置、仅仅软件自身可执行文件和必要的数据库库文件(如使用了数据库)。在不可避免的依赖数据库驱动时,应提供自动化安装包:运行安装包即可自动安装和配置数据库驱动、安装软件本身的可执行文件和数据库库文件。特别地:只要可执行文件和数据库库文件的相对路径不变,数据库驱动、可执行文件和数据库库文件安装的绝对路径不可影响软件正常运行。(Mac os 也仅可用 C++ 编程,不可使用 Object-C、Swift 或其他语言)
 
  看完作业要求的雷锋网编辑,我只想问:“这个作业是有可能完成的吗”?
 
  打开网友的评论发现,我才发现,不是我一个人.......
 
  清华大学自动化系 2020 C++ 大作业引热议,网友:建议直接入职 BAT!
 
  @ATP 合成酶:不只是图像,做直播需要实时采集,压缩成 H264,然后再用 RTSP/RTMP 推流出去,光直播这一项难度就太大了。
  
  @Reading:按照这个发展速度 10 后,人均院士。
 
  @就是想换一个名字:震惊!清华软院大四特奖得主的编程水平还不如自动化大一学生。[捂脸][捂脸][捂脸][捂脸]
 
  @学渣不配拥有网名:哈哈哈救救孩子。
 
  @木菜 Kina2:还有 C++ 写跨平台图形界面……我已经无法想象这个难度了…
 
  @一个笨比:建议直接入职 BAT!
 
  但总的来说,让大家觉得难的点主要是两个:一是工作量极大,即便是程序员也需要两年才能完成,二是难度系数极高。
 
  最后,弱弱的吐槽一下,也就是清华大学敢出这个作业,学生们也敢接招,换做我,估计就是直接退学了.......