惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
博客园 - 司徒正美
Last Week in AI
Last Week in AI
爱范儿
爱范儿
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
量子位
V
V2EX
博客园 - 叶小钗
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog

博客园 - buguge

交易成功还要记 3 笔账?我们直接砍到 1 笔—— 网络红包记账的一次自顶向下业务层重构 分享一次针对hardcode的小重构:不要把 package 名写死在代码里 聚合系统设计:如何为银行代付通道抽象出公共的代付接口能力 如何自定义 MyBatis枚举处理器(EnumTypeHandler):分享从 “同包同名 shadow 覆盖” 到 “官方扩展点” 的重构经历 这儿也改状态,那儿也改状态,连AI都理不清楚了… 不妨试试这个状态机good-practice 业务解耦的经典实践:从订单表解耦开票业务说起(以滴滴网约车开票为例) 从 `int` 到 `Duration`:一个缓存 API 的三次演进教会我的事 最差实践(bad-practice):开发者在方法里直接实例化线程池对象,然后...(应用gg了) 【HttpClient最差实践(bad-practice)】开发者在 http 工具方法中直接实例化 HttpClient,然后…… Crypto、Cipher与Password:Java加密开发的三个核心概念 知识VS技能:如何优雅判空? 20260604SR超时问题排查 推敲见文章:从 `try..catch` 看异常日志打印的正确姿势 #解决问题要彻底# 慢SQL治理完成后,如何防止同类问题“死灰复燃”? 别留小尾巴/尽快剪掉小尾巴:从一次“ABA”字段重命名,谈谈“解决问题要彻底” 常见的OOM错误 ( OutOfMemoryError全类型详解) 开发者暴露了一个无需授权访问的裸接口,我问:如果有人暴力请求怎么办? 【SQL性能优化篇】有了!治理慢SQL“WHERE create_time ORDER BY id”的良药---规避“Using filesort”性能杀手 高效查询商户日终余额:一个SQL的优化实践 Hutool 的 `TimedCache` 到期会自动清理吗? ——————hutool cache的"惰性清理"和"定期清理" Fastjson枚举反序列化:当字符串不是枚举常量名时,会发生什么? fastjson-EnumDeserializer类及源码分析 随笔20260309:我们都是围城里的人 `UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only` 异常解析 认识2个单词:goal/target —————— 为什么Maven是 "goal" 而不是 "target"? 聚合系统设计:策略模式(Strategy Pattern)在银行通道对接场景中的应用 这样构建对象,太帅了!—— 阶梯式Builder模式与代码整洁之道 注意!字段数据类型不匹配,这个sql会很慢 还在用ArrayList?用HashSet吧!--性能对比 分页查询还在用create_time去做降序?
从合同甲方是荒谬的“JD”谈起:软件开发不应遗忘的“常识”
buguge · 2026-05-14 · via 博客园 - buguge

一、一个“低级”但真实的Bug

最近,系统在调用外部服务商API接口生成合同时,出现了令人啼笑皆非的一幕:合同中甲方的企业名称,竟然显示为“JD”。
image

显然,这是一个Bug!

经排查,问题根源在于:系统数据库中存有合作企业的“企业自定义名称”(运营或内部人员设定的别名),也存有合作企业的“企业营业执照上的法定名称”。而开发者在拼接数据、调用API时,未经审视地选择了前者,将其作为具有法律效力的合同主体名称上送了出去。

于是,一份严肃的商业合同,甲方赫然写着“JD”——一个在法律世界里毫无意义的简称。

二、常识的缺失:当技术思维遇上现实规则

别的不说,就说我们都签署过的劳动合同。试问,合同上雇主的名称,可以是“腾X”、“阿X”这样的简称吗?

显然不能! 作为雇员的你,是绝对不会接受这样的劳动合同的。因为这样的合同不具备法律效力。

劳动合同、采购合同、任何具有法律约束力的书面文件,其主体名称都应是经官方登记、具有法律效力的完整名称——对企业而言,是营业执照上的名称;对个人而言,是身份证件上登记的姓名。署名“阿猫阿狗”的合同,只是一纸空文。

这是一个基本的生活与商业常识,几乎不言自明。

那么,为什么在软件开发中,我们会生成一份甲方为“JD”的合同?

根本原因在于,开发者有时会陷入纯粹的“技术实现”思维,而短暂地屏蔽了支撑这个功能存在的、最基本的现实世界规则与常识。

在这个案例中,开发者的思维链路可能是:

  1. 目标:调用接口,生成合同。
  2. 实现:从“企业”对象中,取出“名称”字段,填充到合同模板。
  3. 完成:接口调用成功,合同返回。

这条链路在技术上完全通畅,但它缺失了最关键的一环:对所处理数据之意义与用途的常识性审视。开发者关注了“如何生成合同”,但忽略了“一份有效合同需要什么”。当“企业名称”仅仅被视作一个待填充的字符串(String),而非一个代表法律主体的严肃标识时,错误便悄然发生。

三、“常识”是连接数字世界与现实世界的桥梁

软件开发,从来不是构建一个悬浮于真空中的数字王国。绝大多数软件,尤其是企业级应用,其核心价值在于对现实业务流程的建模、流转与赋能。这意味着,代码的逻辑必须尊重并贴合现实世界的规则。

这种“现实规则”,往往就体现为一种“常识”。它不需要高深的技术文档来定义,却至关重要:

  • 财务系统必须懂得“借贷平衡”是常识。
  • 库存系统必须理解“出库量不能大于库存量”是常识。
  • 合同系统,正如本例,必须明确“合同主体名称需法定、完整”是常识。

缺乏对这些常识的理解和尊重,系统就会生产出技术上正确、但实质上荒谬甚至有害的结果。 “JD”合同就是一个典型案例——它完美地通过了所有技术校验(字段非空、接口成功),却在商业和法律层面完全无效,甚至可能构成风险。

四、如何将“常识”内化为开发能力?

要避免这类问题,不能仅依赖开发者个人的“悟性”或“细心”,而应通过流程和方法,将“常识”的运用固化为团队的基础能力。

1. 需求与设计阶段:多问一句“为什么”和“是什么”

  • 当接收到“在此处展示企业名称”的需求时,应主动追问:“这个名称用在什么场景下?它的法律或正式效力要求是什么?”
  • 在设计数据模型时,像“企业名称”这样的字段,如果可能用于正式场合,其字段命名就应避免歧义。例如,可区分为 companyAlias(企业别名)和 companyLegalName(企业法定名称),从源头提示其不同用途。

2. 代码实现阶段:建立“业务逻辑”检查点

  • 在处理核心业务数据时(如生成合同、创建订单、发起支付),应有意识地进行一次“常识性校验”。例如,在获取企业名称用于合同时,可以增加简单的断言或日志:“确保此处使用的是法定名称,而非简称”。
  • 编写关键数据映射或转换代码时,在注释中明确记录业务规则。例如:// 注意:合同甲方名称必须使用营业执照上的法定全称,参见字段 companyLegalName

3. 测试与审查阶段:引入“领域专家”视角

  • 单元测试和集成测试不应只测试“功能是否跑通”,还要测试“业务逻辑是否正确”。可以针对“合同生成”功能,设计用例验证当传入简称时,系统应如何表现(是拒绝,还是自动转换?)。
  • 代码审查(Code Review)中,评审者除了关注技术实现,也应从业务常识角度提出问题:“这里用的名称,放在合同/发票/报告里合适吗?”

4. 培养习惯:永远对数据保持“敬畏”

  • 开发者应养成一个思维习惯:屏幕上的每一个数据,都对应着现实世界中的某个实体、某笔交易或某项权利。 在随手将它们传来送去之前,花一秒钟思考一下它的现实意义。

五、In a word:优秀的开发者,亦是领域的理解者

“JD”合同事件,与其说是一个技术失误,不如说是开发者对业务本质理解的短时失焦。它提醒我们,软件开发不仅仅是与编译器和API打交道,更是对我们所支持的业务领域的深度理解与模拟。

真正的“工匠精神”,不仅体现在代码的优雅与性能的高效上,更体现在对每一个数据、每一条逻辑所承载的现实意义的敬畏与准确把握上。

让我们在追求技术精进的同时,也永远保持一份对生活常识、对商业规则、对法律边界的敏锐与尊重。因为,我们构建的系统,终将服务于这个充满规则与常识的现实世界。