The Daily WTF 中文 笔记

The Daily WTF 中文

Daily WTF是一个由Alex Papadimoulis创建的以编程为导向的幽默博客,基于软件开发和技术世界的故事。它主要集中在项目问题、代码示例和与IT相关的趣事上。该网站包含了许多开发者分享的真实世界经验,他们在工作中遇到的奇怪和有趣的事情,无论是技术性的还是个人性的,但总是与相关技术相关。

笔记线程

DNS 中的 CAA 记录类型允许域名所有者指定哪些证书颁发机构(CA)有权为其域名颁发证书。该记录类型最初在 RFC 6844 中定义,随后由 RFC 8659 更新,但其核心概念保持不变。CAA 记录的一个关键特性是“颁发者关键”(Issuer Critical)标志,旨在促使颁发机构在颁发证书前验证该记录。该关键标志被设计为标志位掩码的第 0 位,因此启用它应使用值 128。然而,一种普遍的误解导致许多人使用值 1,将第 7 位误认为是关键标志。这种误解在尚未仔细阅读 RFC 的用户中广泛存在。Let's Encrypt 等证书颁发机构面临两难:要么严格遵循规范并拒绝配置错误的记录,要么为了保持功能而迁就这种广泛存在的错误。它们选择了后者,实际上将值 1 接受为关键标志的别名。这一决定承认了用户错误的现实情况,而非严格遵循原始规范。所提供的 filterCAA Go 代码片段展示了这一机制在实际中的处理方式。它过滤“issue”和“issuewild”标签,并检查是否存在未识别的关键标签。值得注意的是,代码会检查标志是否设置为 128(正确值)或 1(广泛使用但不正确的值),以判断是否存在未识别的关键标签。同时接受这两个值反映了对关键标志方面广泛用户错误的迁就。作者质疑在此类标志中使用位掩码的明智性,因为这导致了混淆和错误,并建议更简单的标志机制可能更具可读性且不易出错。尽管承认位掩码的实用性,但该轶事突显了其复杂性如何在实际实现中引发严重的运营问题。技术规范、用户理解与实际实施之间的相互作用是一个反复出现的主题。
由于性价比高且节能,分体式空调系统在老房改造中广受欢迎,但其对红外遥控器的依赖使得与家庭自动化系统的集成变得复杂。 一个常见问题源于这些系统内部的温度转换逻辑,特别是在摄氏度与华氏度之间转换时。一个试图将分体式空调集成到家庭自动化系统中的开源项目,揭示了其温度转换方法存在缺陷。该项目的代码使用查找表来实现摄氏度与华氏度之间的转换。这些查找表包含特定的、往往不准确的映射关系,导致与标准转换公式存在偏差。例如,18°C被错误地映射为65°F,而非更准确的64°F(四舍五入后)。 这些查找表的设计表明,其目的是对转换值进行近似处理,而非进行精确的数学计算。作者最初认为这是该业余项目的一种天真的优化尝试,但代码中的一条注释澄清说,这些是“基于遥控器的直接映射”。这表明,不准确之处源于遥控器本身。 遥控器很可能因其嵌入式微控制器的限制而使用查找表,该微控制器可能无法高效处理浮点运算。因此,当用户在遥控器上设置 72 华氏度(72F)等温度时,遥控器会在将命令发送至设备前,先在内部将其转换为近似摄氏度值(例如 22.5°C)。这种近似虽然在大多数情况下“足够好”,但会导致精密自动化出现不一致的情况。 作者认为,根本问题并不在于这个业余项目的代码或遥控器本身,而在于全球范围内持续使用非标准单位(华氏度),这导致了这些不精确的转换。
Rachel 加入了一个新团队,她的上司 Zane 强调以指标驱动的方式,专注于以最低成本最大化小部件(widget)的产量。自动化生产线涉及复杂的软件,由于测试限制,变更仅在真实生产环境中进行验证。Rachel 的初始任务是更新一个 Google Sheets 指标仪表板,该仪表板从六个数据库拉取数据,尽管用户始终更偏好 Excel。团队仅追踪输出指标,如“单位时间内生产的小部件数量”,缺乏详细数据来解释系统行为或瓶颈。例如,自动化质量控制扫描仪并未记录拒绝小部件的原因,甚至没有直接记录被拒小部件的数量。软件变更的评估基于整体输出指标,这使得验证变得困难,因为这些指标存在噪声,且受软件本身之外的外部因素影响。Rachel 尝试实施一项变更以记录被拒小部件,最初却因环境因素而非其代码导致的指标回退而受阻。由于测试运行有限且需考虑指标回退,简单的变更可能需要数周才能验证。Rachel 开始在代码中添加仪器化(instrumentation)以收集更详细的数据,希望构建一个有用的系统模型。然而,Zane 仍固守于对关键输出指标的即时改进。他驳斥了收集数据以理解指标为何如此表现的價值,声称此类诊断数据并非“关键指标”。这造成了 Rachel 对系统理解的渴望与 Zane 对顶层绩效指标的关注之间的根本冲突。Rachel 通过一种妥协策略解决了这一矛盾:确保她为改进顶层指标所做的任何变更都包含用于解释变更行为的仪器化。这一策略使她既能满足 Zane 对指标改进的要求,又能逐步提升系统的可观测性。最终,深入理解复杂系统相较于在没有全面洞察其驱动因素的情况下推动顶层指标,始终处于较低优先级。
CdXz5zHNQW_B1k6IsjyP4.png
在大型机上常见的平面文件数据库将数据存储在定长字段中。一条典型记录如"JOHN SMITH 12343rd St"依赖于已知"JOHN"占用 8 个字符、"SMITH"占用 8 个字符等。这种刚性结构使得修改(例如添加中间名缩写)极为困难,通常要求创建新表、进行数据迁移,并更新所有消费该数据的软件。为缓解这一问题,聪明的开发人员引入了“填充(padding)”,即在记录中预留额外字符。例如,一条记录可能以 16 个未使用的字符结尾。当需要新增字段(如中间名缩写)时,可以通过缩减填充空间来插入该字段,从而避免更改记录的总长度。这种方法虽不优雅,但可避免昂贵的模式重构和数据重排。填充通常分布在记录的各个部分,允许新列消耗这些预留空间。尽管填充空间最终可能耗尽,但这一策略显著延长了平面文件模式的运行寿命,而无需进行大规模重构。Brenda 的团队支持一个使用此类 VSAM 平面文件的大型机系统,因此需要将数据提取到现代关系型数据库(RDBMS)中。为此创建了一个 ETL 流程,大型机团队提供了描述文件结构的“拷贝书(copybook)”。然而,ETL 开发人员错误地处理了填充,导致字段被拆分,使得部分填充被当作独立的数据元素。起初这似乎无害,因为报告中的填充字符会被剥离,且通过连接字段即可重建数据。关键错误在于仅针对生产环境的大型机进行了测试,而该环境当时没有正在运行的功能会消耗填充空间。当这些功能在生产环境的大型机上上线后,ETL 流程生成的报告便因混入了原本被占用的填充数据而遭到损坏。由于 ETL 开发人员是合同工,且其解决方案基于有限的测试“按设计运行”,他们拒绝重新处理。因此,大型机团队被迫寻找其他填充字段,以避免影响现有报告。