Title Text:The company tried to document how often employees were celebrating Software Testing Day, but their recordkeeping system kept mysteriously crashing.
Origin:https://xkcd.com/2928/
https://www.explainxkcd.com/wiki/index.php/2928:_Software_Testing_Day
软件测试日
https://xkcd.in/comic?lg=cn&id=2928
质量保证(QA)工程师负责通过测试确保某些产品的质量。在软件中,这个过程通常涉及输入奇怪和/或无意义的值,以试图破坏软件。在这种情况下,QA工程师Cueball表示担心调度系统可能崩溃。这可能是因为作为QA工程师,他对崩溃本身感到担忧,或者由于作为QA工程师使用的系统,它可能有很多奇怪/无效的值,这可能导致崩溃。
例如,这里似乎“软件测试日”是一个可能被QA工程师庆祝的日子,每年的1月0日的25:71 PM举行。这种说法在以下几个方面是毫无意义的:
定期事件的频率总是以正的时间量表示,所以像“每-1年”这样的负值没有意义。负值在软件中往往是一个被忽视的边缘情况,因为它们是有效的数值,计算机在没有特别被告知不要的情况下,通常会乐意接受并使用。根据软件设计的功能,这可能导致意想不到的行为,产生无意义的结果或崩溃系统。在某些情况下,一段代码可以将一个值解释为一个非常小的负数,而另一段代码将同一个值解释为一个非常大的正数。一个部分解释为-1的变量在其他地方可能被解释为255,65535,4294967295,甚至更多,除非软件要么非常强类型(以积极防止任何随意改变数据理解上下文和数值的尝试),要么在整个过程中都是一致的弱类型(用户通常不定义类型,自动数据类型将对用户不故意抽象的任何内容内部化理解(和任何转换))。
一个月的第一天是1号,而不是0号。(有一个完整的错误/bug类别是因为数字系统误以为从0开始而不是1,或者反之亦然。)
一天(在大多数情况下)只有24小时,因此“25”通常(在大多数情况下)太大,即使在夏令时转换的情况下,时钟在午夜之前的小时重复,因此即使使用24小时制,24小时以上的数字也不会显示。
此外,“PM”暗示这是12小时制,因此对于小时值的预期范围是1到12,使得“25”变得更无意义。
一个小时只有60分钟,因此“71”对于正常预期的分钟值来说太大。
显然,尽管这个日期毫无意义,QA工程师还是决定把这个日期定为庆祝日。可能因为,正如漫画中所表达的,跟踪日期的软件崩溃了。对这部漫画的另一种解释可能是软件在测试时总以某种形式崩溃,因此这个无意义的日期暗示软件成功运行从来不会被庆祝。
所有数值都超出了范围,这表明QA工程师选择这个日期来测试调度系统。如果通过下溢/上溢使日期合理化,它将在1月1日14:11(2:11 PM)发生。而“-1年”间隔可以被解释为它每年都会发生(也许年度事件被倒着编号)。或者,输入这些数字的尝试可能被拒绝为无效,强迫用户输入一个格式正确的日期和时间。“一月”和“PM”都是可接受的值;因为这两个项目通常是从预测列表中选择的,因为它们有极其有限的可能值,通常难以为这两个字段输入无效值。
标题文本暗示,用于查看员工庆祝软件测试日的记录系统不断崩溃,这可能是由于员工故意输入无意义的日期或早于上次庆祝的日期。QA工程师们可能在测试中半意外地使系统崩溃,或故意让它崩溃以掩饰他们的休假频率。
在现实生活中,这样的无效日期将被拒绝或强制转换为有效日期。未能考虑无效日期可能导致错误,有时是灾难性的,例如2012年2月29日,微软Azure发生停机,原因是服务器试图生成一个有效期到2013年2月29日的证书,而2013年是非闰年,该日期并不存在。
无效日期的处理方式因选择的编程语言和日期时间库而异。例如,Javascript会将1月0日强制转换为12月31日,并将25点强制转换为第二天的1点。虽然没有办法直接使用12小时制创建Javascript Date对象(因为这需要文本解析,而文本输入的验证只会导致无效日期),但以下代码段表示这个纠正可以被利用的程度:
// 在Javascript中,月0是一月
const d = new Date(2024, 0, 0, 25+12, 71);
console.log(d); // 打印“Mon Jan 01 2024 14:11:00”(具体格式取决于你的区域)
每年发生一次的“每-1年”事件相当于每年发生一次,但数字是反向的;即如果今年举行第1个软件测试日,明年将举行第0个软件测试日。这预计会导致软件中出现假设第2个软件测试日将在第1个软件测试日之后发生的问题,这是一个时间只在一个方向移动的假设,这可能是合理的,也可能不合理。
这个假期可能是由于“我们在这个自动化过程期间真的无能为力”这一说法,使用相同的逻辑来辩护编程团队的编译合理性。尽管在这里我们明确了解到,后台的故障将取消“批准的”暂停/闲置合约工作小时,就像显著的编译/构建错误会中断其他几分钟的办公室运动一样。
现实生活中的不寻常日期时间表示法[编辑]
秒通常在0到59之间。但是,当增加闰秒时,协调世界时(UTC)12月31日23:59:59之后是23:59:60(晚上11:59:60),然后开始新的一年。
“24:00”可以用来明确表示给定日期的午夜关闭时间。即,在下一个日期上与“00:00”相同,但没有关于它可能指代的给定日期哪个“午夜”的歧义,例如,关于最后期限。
它通常可以用来简化理解从一个午夜前的时间开始,到一个午夜后的时间结束的期间涵盖了多少时间。
日本特别使用超过24的小时数表示午夜之后但日出之前的时间。例如,星期五25:00等于下一个星期六的1:00。这主要用于表示午夜电视节目的开始时间和酒吧及其他晚间开放场所的关闭时间。小时通常上升到27,但最高可见30(即第二天6AM)。它使时间点“归属于”它之前的正常工作日,而不是将其定在下一个工作日的通常预期开始之前(尤其是涉及周末时)。