日常之间

去哪里看看

留一点时间给自己

我是哇袄高高🌟(WaaoGG),在这里记录生活、折腾技术,也收藏值得回味的瞬间。

← 返回手记
·3518 字 / 约 11 分钟生长中

作业0分,怒气满格:我给DDL装了个防空警报

因为忘记作业截止时间喜提0分,我把一腔怒火变成了一个Windows桌面应用:自动汇总思源学堂与MOOC/SPOC的任务,分开记老师要求和系统截止,识别补交与重复来源。这是一份人类负责破防、AI协助施工的开发回忆录,也是一场对付遗忘的赛博整活。

我的阅读角落 ↗
本篇目录 · 10 个小节
漫画中的大学生面对屏幕上的红色0分怒敲键盘,日历和闹钟包围电脑,另一侧筑起提醒系统的防线

0分。不是低分,是0分。

事情的起因非常朴素。

我忘了作业截止时间。

然后,这一次作业被判了0分。

没有什么跌宕起伏的技术事故,没有什么值得写进故障报告的宇宙级异常。我的大脑只是对一个重要日期执行了最经典的操作:稍后提醒我。然后永不提醒。

一个0,安静、圆润、没有棱角,却精准地给我的精神状态做了开颅手术。

我承认,截止时间不是我发脾气就能改的,忘记也是我自己忘的。但承认事实和当场破防完全不冲突。

我的内心状态大概可以翻译成:

啊???

作业还有截止时间???

不是,我知道有,我只是——

好的,0分。

行。

既然我的脑子不愿意干活,那我就找个东西替它上班。

我只是想记个作业,怎么还要跨平台打副本

学业通知分散在思源学堂、中国大学MOOC,还有MOOC里的SPOC。这个平台看一眼,那个平台翻一下,进去再找课程,找到课程再找作业。

它们没有共同组成一个邪恶组织。

但对于一个已经漏过DDL的人来说,这种体验很像:你以为自己只是在读书,实际上还兼任了多平台情报分析员。

我需要的东西并不玄学:

把我参加的课程里,那些需要我交东西、做测验、参加互评的时间,给我摆到一个地方。到点叫我。

最好不要让我自己逐门课打开。

最好不要让我每次想起来才点同步。

因为一个必须“先想起来自己可能忘了什么”才能工作的提醒器,多少有点把消防栓装在着火以后才会出现的地方。

于是,这个东西有了名字:课期。

听起来很文雅。

实际立项动机非常不文雅:我不想再被一个0打得神志不清。

第一条军令:不要给我造一个需要手动喂饭的提醒器

最开始就定下了一个原则:正常登录有效的时候,应用应该自己发现课程、自己读任务、自己定时采集。

不是我把网页抄给它。

也不是我每门课进去点一下,它才假装自动化。

我已经证明过自己不适合担任这个系统里最可靠的定时器。再让我负责定时触发同步,等于让逃过一次闹钟的人管理钟表厂。

最终选择的是Windows本地桌面应用。电脑开着、程序运行、网络正常,它就在后台干活;默认每30分钟同步。关掉主窗口收进托盘,真正退出才停。

至于电脑关机以后还能不能继续采集?

不能。

我在写提醒器,没有给笔记本电脑修仙。第一次登录、登录过期、验证码,也还是得我自己处理。自动化能接班,不能替平台撤销认证机制。

这次开发是和AI代理一起推进的。我负责提出需求、纠正不符合习惯的地方、亲自登录和验证系统通知;AI代理负责大量实现、排查、测试和打包工作。本文里的“我怒搓”,主要描述怒气归属,不伪装成每一行代码都是我独自手敲。

截止时间居然还分流派?我当场又红温了

做着做着,一个看起来很简单的问题露出了它的獠牙。

老师说什么时候交,和系统什么时候关门,可能不是同一回事。

假设老师要求周三交报告,系统周五才截止上传。这两个时间都是真的,不能拿其中一个盖掉另一个。

如果只保留系统时间:我可能周五快乐上传,然后发现老师周三就要。

如果只保留老师时间:我又看不见系统还剩多久能交。

如果粗暴取更早的那个:看起来很贴心,实际上把两个不同的要求搅成了一碗看不出原料的粥。

所以课期里,老师要求日期和系统截止时间分别保存、分别展示、分别提醒、分别标记完成。只有日期没有时刻,就老老实实写“未注明时刻”,不擅自替老师在晚上十一点五十九分敲钟。

课期演示任务详情:老师要求10月28日交报告,平台系统截止10月30日23:59,两类期限分别显示

图中是合成演示数据,用来展示两类日期的区别,不是我的真实作业要求。

更关键的是,平台显示“已提交”,也不代表某项独立的老师要求就自动完成了。线下报告该交还是得交,所以又有了单独的“老师待办”。

开发到这一步,我终于明白,自己想做的不是把网页上的日期全部粘贴进列表。

我想做的是:别让我用一个正确的日期,错过另一件正确的事。

“已结束”不等于“你已经寄了”

紧接着,补交出现了。

思源学堂的一些任务可能已经过了正常截止,却仍有补交情况。在实际读取记录中,就出现过“已结束”和“要求补交”“去交作业”同时存在的情况。

所以,“时间过了”不能被程序直接翻译成“棺材盖焊死了”。

任务现在至少要分清:

  • 已完成。
  • 逾期未提交。
  • 逾期,但明确可以补交。
  • 需要重新提交。

如果还有明确的补交截止,就再记一项独立的期限。原截止不消失,补交截止也不冒充原截止。

课期演示补交详情:保留10月25日原截止,并独立列出10月31日的补交截止及允许补交的文字依据

这张同样是演示截图。真实运行已经识别到可补交任务;图中的具体补交日期用于展示功能,不是经过核验的真实课程期限。

我不想再看见一个软件对着还能抢救的作业,提前给我奏哀乐。

当然,页面上只孤零零出现“补交”两个字,也不能直接判定现在一定能补。这个词可能描述历史,也可能是别的状态。程序要留证据,不能看见两个字就宣布复活成功。

MOOC和SPOC:同一份DDL,没必要给我发双份精神损失

另一个很有节目效果的问题是重复。

MOOC里有课,SPOC里也有对应的课,同一个测验可能以两个来源出现。

人类:一份作业。

电脑:我发现了两份威胁!

我:你闭嘴,让SPOC先说。

于是加了SPOC优先的处理:确认课程名、任务名、种类、期限等相符,而且匹配没有歧义时,优先展示SPOC,把重复MOOC来源折叠进去。

这里不能拿标题相同就一刀切。期限不同、老师要求不同、明确学期冲突,都得保留;公告也不能随手吞掉。更不能因为MOOC显示已提交,就替SPOC盖一个“你已经交了”的章。

在一次真实数据库副本验证里,89条原始任务与公告记录保留,展示层折叠成70条,19条重复MOOC来源没有再单独占位。

不是删库瘦身,是减少重复报警。

课期任务总览演示:已完成与逾期任务分开,任务卡片展示老师要求、系统截止、补交截止与SPOC优先折叠信息

总览截图为合成演示数据。上面的89、70和19来自一次本机历史快照验证,不是截图里的数量,也不是当前实时任务清单。

我漏交一次作业已经够难受了。

没必要让同一个DDL换个皮肤,再来揍我一遍。

通知:你说你通知了,但你到底通知到哪了

真正让我见识桌面开发幽默感的,是通知。

“系统接受了发送通知”是一件事。

“我真的看到了通知”是另一件事。

“我点了通知以后,应用真的打开通知中心”是第三件事。

这三个步骤的关系,大概和“我买了健身卡”“我去了健身房”“我真的练了”差不多。不能拿第一步的成功,宣布第三步已经完成。

这次就踩到了:开发运行版的点击跳转成功,不等于正式安装版也成功。后来排查发现,本项目的开发快捷方式和正式版共用了通知标识,却指向不同程序。

简单说,通知在喊课期,路牌却可能把人领去开发程序。

修复时把开发版与正式版的标识分开,处理冲突快捷方式,再验证正式版。

期间还发生了一件很难绷的事:为了验证通知,测试脚本会限时自动关闭窗口。等我准备点通知,窗口已经没了。

我当时的反馈非常精炼:

窗口关了我咋验证。

这句话没有任何编程术语,却精准覆盖了整个测试方案的致命缺陷。

最后改成独立、正常运行的正式应用,不设自动关窗计时器。等到真正点通知能进通知中心,才算这关过了。

桌面开发教我的第一课:不要用“我发出去了”,替代“人收到了”。

AI可以当侦察兵,但别让它代我交作业

既然已经开始整活,那AI和API也安排上。

默认提供商是DeepSeek,同时保留OpenAI、Anthropic协议兼容配置。AI可以辅助看任务说明和已经提取的附件文字,识别出来的新日期先进入待核对,不去改系统截止。

但它不是一个潜伏在后台、悄悄替我烧API余额的神秘室友。启用、允许发送课程文字,再点分析,才会发给所选服务,还有每日次数上限。

本机API则让其他程序能够读取任务、课程、通知,或者请求同步。默认关闭,启用后只监听本机,访问需要令牌。

它能提醒我交作业。

不能替我交作业,不能替我答题,也不能给这次的0分施展大复活术。

我只是漏了DDL,不是准备让软件替我把大学读完。

“无”就是“无”,别把我的桌面办成待核实批发市场

前面忙着做谨慎判断,做着做着,又差点谨慎过头。

页面没显示提交状态:待核实。

没读到某项规则:待核实。

一眼望过去,全是待核实。

那我开发的是提醒器,还是给自己开了个待办事项增殖器?

所以我又补了一条很朴素的要求:平台上没找到的,就按照没有算。

最后落到界面上是:成功读取后,没有日期显示“无”;没显示提交状态,就写“无提交状态”;没有补交规则,就写“无补交说明”。不再仅仅因为缺了一项信息,就把任务塞进待核对。

但“没看到提交状态”也不能被悄悄写成“明确未提交”。这两件事不是同义词。读取失败、还没读、日期年份需要推断,则继续留着核对入口。

我需要的是有用的提醒,不是一个满屏幕红点、最后逼我练成“全部忽略”神功的软件。

暴怒不能当数据库,但可以当启动资金

最后,这个因为一个0分启动的项目,真的做成了本机应用,更新到了1.0.2,配了图文README,源码也放上了GitHub仓库。

这当然不意味着事情从此完美。页面结构会变,登录会过期,OCR会认错,电脑关机会罢工。自动化做的是减少漏看的机会,不是签一份“以后绝不漏交”的玄学保险。

发布环节也很现实:我想让GitHub远端自动构建,结果当前授权缺少workflow权限,流程文件写好了,暂时推不上去。我一时又没法登录补授权,于是先继续手动上传安装包。

截至这篇稿子整理时,安装包上传和Release发布收尾仍在进行中。这里先不给自己颁“已经成功发布”的奖杯。

在这个故事里,真正完成的事情是:那个只存在于“我下次一定记得”里的愿望,终于变成了一套会自己去看课程、记下期限、保留依据、尝试把我叫醒的程序。

它不能把已经拿到的0分改掉。

这也是整件事最气的地方。

我已经写出了一个DDL提醒器,却还没有找到给时间安装撤销按钮的方法。

但下一次,至少别再让我和截止时间演这种戏了:

DDL:我来过。

我:啊?

成绩:0。

这一次,给DDL装上警报。给我的脑子,外包一个值班员。


本文缘由“忘记作业截止时间导致一次作业被判0分”来自本人叙述;没有虚构具体课程、扣分通知原话或补交承诺。开发过程依据课期项目的本机记录、测试与实际界面验证整理。封面为AI生成漫画,不是真实成绩截图;三张应用截图由隔离的合成演示数据生成,不含真实账号和课程内容。

也许还想读

本站近期内容回顾:课期与 wxomni 开发手记 ↗「日常之间」十月小站回顾:从初创打招呼到工作流折腾与助手落地 ↗我给 Vibe Coding 写了一份轻量工作约定 ↗

聊聊这篇内容

阅读设置

让浏览更顺手

搜索内容Ctrl / ⌘ K
返回首页 / 文章 / 日常g h / p / m
向下 / 向上滚动j k
关闭菜单或弹层Esc
打开帮助?