单元测试到底是什么?应该怎么做?
场景计费、折扣或状态流转代码频繁修改时,人工回归慢且容易漏边界。单元测试应在秒级反馈核心规则是否仍符合预期。 原理“单元”是可独立验证的行为边界,不必机械等同于一个方法。测试遵循准备、执行、断言,隔离网络、时钟和随机数等不稳定依赖。TDD 用红、绿、重构循环推动接口从使用者视角形成。 设计步骤从高变更、高故障代价的纯业务逻辑开始;为正常、边界和异常路径列用例;通过依赖注入替换外部系统;断言可观察结果而非内部调用细节;命名描述场景与预期,并让测试数据最小化。 权衡Mock 提升速度和隔离性,但过度 Mock 会复制实现、让重构变脆。覆盖率能发现未执行代码,却不能证明断言有效。TDD 有助于设计,小型探索或胶水代码则未必值得严格先测。 实践建议单测、集成测试和端到端测试分层使用;禁止真实等待与共享可变数据;失败信息要能直接定位业务条件。修复线上缺陷时先写复现测试。评审关注场景质量而非数字,持续删除重复和无价值测试,保证套件始终快速可信。 落地检查上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对应;在预发布环境模拟依赖不可用、进程重启...
软件工程简明教程
场景需求不完整、多人协作和线上变化使软件开发不是简单编码。若只靠个人经验推进,范围、质量和进度会在后期集中失控。 原理软件工程通过需求、设计、实现、验证、发布和运维形成反馈系统。瀑布适合边界稳定且审计严格的项目,迭代模型用短周期吸收变化。复用、分治、逐步演进和权衡优化是跨模型通用的基本策略。 设计步骤把目标转成可验证的用户场景并标注非目标;按风险优先拆分里程碑;为架构决策记录背景与替代方案;让代码评审、自动测试和持续集成前移反馈;发布采用灰度与回滚,线上指标再反哺下一轮需求。 权衡更多文档提高可追踪性,也可能快速过期;更短迭代响应快,却增加协调和发布频率。复用能节省开发,但通用组件的适配成本可能高于复制。选择流程时应看风险、团队规模和监管要求。 实践建议用最小但完整的交付闭环替代形式化堆砌:每项需求有负责人、验收条件、监控和复盘入口。关键决定写 ADR,普通讨论留在评审。定期衡量交付周期、缺陷逃逸率和恢复时间,避免只用代码行数或忙碌程度评价工程效果。 落地检查上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对应;在预发布环境模拟依...
RestFul API 简明教程
场景订单接口从 /getOrder、/updateOrder 演变出大量动作名后,调用方难以预测路径、状态码和重试行为,网关缓存与监控也无法统一。 原理REST 把服务能力抽象为资源,使用 URI 表达身份、HTTP 方法表达操作语义。GET 应安全且幂等,PUT 表示整体替换并应幂等,PATCH 表示局部修改,POST 常用于创建或非幂等命令。状态码与响应体共同描述结果。 设计步骤先识别订单、支付等稳定名词并设计层级;再定义读取、创建、修改、删除的前置条件;为分页、排序和过滤采用统一查询参数;错误体包含稳定错误码、可读消息和追踪号;最后用 OpenAPI 固化契约并做兼容性测试。 权衡纯粹资源化并不适合所有业务动作,例如退款审批可建成子资源,也可采用命令端点。前者语义统一但模型增多,后者直观却容易退化为 RPC。HATEOAS 解耦流程,但客户端实现和团队成本较高。 实践建议不要把数据库表直接暴露为 API;创建接口返回 201 与 Location,异步处理可返回 202;幂等写入支持业务幂等键;版本升级优先做向后兼容。对 400、401、403、404、409、429 ...
代码重构指南
场景功能迭代越来越慢时,团队常在“继续打补丁”和“推倒重写”之间摇摆。真正可控的做法,是在保持外部行为不变的前提下持续改善内部结构。 原理重构不等于性能优化或需求开发。它通过提炼函数、移动职责、消除重复、收紧依赖等小变换降低认知复杂度。自动化测试、类型检查和可观测基线共同证明行为没有意外改变。 设计步骤先建立失败可见的测试和性能基线;选定一个明确坏味道,例如过长函数或散落规则;每次只做一种结构调整并立即验证;保持提交小且可回滚;完成后比较接口、日志、指标和资源消耗,再进入下一步。 权衡局部重构风险低,却可能长期受旧边界限制;整体重写结构自由,但双轨维护和需求漂移风险极高。性能改动有时会牺牲可读性,应以测量结果证明必要,而不是把“更快”当作重构理由。 实践建议功能开发前先清理阻碍点,开发后再消除临时结构;评审发现问题采用童子军式修复。数据库、公开 API 和序列化格式属于外部行为,必须迁移而非直接改名。若缺少测试,先加特征测试记录现状,再谈结构优化。 落地检查上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对应;在预发布环境模拟依赖...
代码命名指南
场景同一代码库里同时出现 data、info、obj 和含义不明的缩写时,开发者必须反复跳转才能理解业务,评审也会把时间浪费在猜测上。 原理命名的本质是建立领域概念到代码符号的稳定映射。类和接口通常使用大驼峰,方法与变量使用小驼峰,常量使用大写蛇形,URL 与文件常用短横线。规范只是外形,更关键的是名称能表达职责、单位、状态与副作用。 设计步骤先维护团队统一的领域词汇;为布尔值采用 is/has/can,集合使用复数,时间和金额带上单位或币种;方法名用动词说明行为,查询与命令避免混淆;发现名称需要注释解释时,优先缩小作用域或重新抽象。 权衡长名称信息充分但阅读噪声更大,短名称简洁却依赖上下文。局部循环变量可以短,公共 API 必须明确。统一风格有价值,但批量改名会制造巨大 diff,因此应结合功能修改分步推进。 实践建议禁用无业务含义的 Manager、Handler 滥用;不要把类型重复写进变量名;缩写只保留 HTTP、ID 等团队共识。借助 IDE 安全重命名并运行测试,接口字段改名则提供兼容期。好的名字应让调用处像一句可验证的业务陈述。 落地检查上线前还应做一次桌面演练...
系统设计知识体系:设计模式、工程基础、认证授权、数据安全与常用框架
场景接手一个业务系统时,团队容易直接讨论框架和中间件,却忽略工程质量、权限边界和运行模型。结果是局部方案都合理,组合后却难以演进。 原理系统设计不是组件清单,而是把需求、约束、模型和反馈闭环串起来。设计模式控制代码变化,测试与重构保证演进安全,IoC/AOP 管理依赖与横切能力,认证授权保护资源,调度和推送处理时间与连接。 设计步骤第一步澄清用户、流量、数据敏感度与一致性目标;第二步划分领域和信任边界;第三步为同步请求、异步任务、实时连接选择模型;第四步定义可观测指标和故障策略;最后用小规模压测与威胁建模验证关键假设。 权衡更强的一致性、更细的权限和更多抽象都会增加成本;简单方案交付快,却可能把扩展压力留给未来。设计应围绕当前风险保留演进接口,而不是预先堆叠所有“最佳实践”。 实践建议文档至少记录目标、非目标、关键时序、数据所有权和回滚方案。优先消除不可逆决定,把可替换细节延后;对安全、数据丢失和跨团队契约则尽早确认。评审时要求每个组件回答“解决什么约束”,避免技术选型变成名词竞赛。 落地检查上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的...
系统设计基础专题:RESTful API、软件工程、代码命名、重构与单元测试
场景接口频繁变更、命名难懂、重构不敢动、测试只追覆盖率,是很多项目进入维护期后的共同症状。它们看似独立,实则都源于缺少稳定契约和反馈机制。 原理REST 约束负责外部资源契约,清晰命名负责代码中的认知契约,单元测试提供快速反馈,重构则在行为不变的前提下调整结构。软件工程把这些活动组织为可重复过程,使需求到交付可追踪。 设计步骤先用用户场景定义验收条件,再建立资源模型和错误语义;实现时统一命名词汇表,保持模块职责单一;对核心规则写快速单测,对边界写集成测试;每次小步重构后立即运行验证,并在评审中记录设计取舍。 权衡严格规范能降低协作成本,但规则过密会压制交付;单测速度快,却不能替代数据库和网络验证;重构改善长期效率,却会占用短期产能。应依据变更频率和故障代价分配工程投入。 实践建议把检查项放进模板和流水线,而不是依赖口头提醒。新功能同时提交契约、测试和可观测指标;发现坏味道采用顺手清理,不开启无边界“大重写”。定期删除无效规范,让流程服务于质量,而不是让团队为流程制造材料。 落地检查上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对...
Java 26 新特性概览
说明26 尚未广泛 LTS,内容以 OpenJDK 开发分支为准。本文作为动态提纲:随 GA 发布补 verified 特性。 预期主题语言简化、并发模型(虚拟线程与结构化并发成熟)、性能与安全基线增强。具体以 jdk.java.net 为准。 自学习惯固定一个 pet-project 跑最新 JDK,CI 矩阵保留 LTS + latest,避免升级断层。 课堂外的思考学习「Java 26 新特性概览」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬编。讨论后把新认识补进笔记末尾。 可复现实验为每个主题保留最小复现:一段可运行的 Java 片段、一条 jcmd/jstack 命令,或一组压测对比。记录环境(JDK 小版本、CPU 核数、容器限制),结...
Java 25 新特性概览
版本定位25 继续半年发布节奏。企业主力仍在 17/21,此版本适合早期 adopters 验证预览语言特性。 学习建议每出一个 JEP Target 25,用 JShell 或单测验证;记录 preview 开关与编译器告警。 稳定 vs 预览生产禁用 preview;库作者若使用预览 API,需 shade 或多 release 编译,成本较高。 课堂外的思考学习「Java 25 新特性概览」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬编。讨论后把新认识补进笔记末尾。 可复现实验为每个主题保留最小复现:一段可运行的 Java 片段、一条 jcmd/jstack 命令,或一组压测对比。记录环境(JDK 小版本、CPU 核数、容器限制),...
Java 24 新特性概览
跟踪方法非 LTS 版本以 OpenJDK Release Notes + JEP 列表为准。关注 Language/VM/Library 三类。 常见方向模式匹配完善、灵活构造函数 body、性能与 GC 持续改进、Foreign API 成熟。具体 JEP 编号随发布调整,笔记只记录验证过的环境行为。 实践使用 sdkman 安装 24-ea,单独模块开 –enable-preview 做实验,与生产 LTS 隔离。 课堂外的思考学习「Java 24 新特性概览」时,我把自己放在线上值班的情境里:如果告警与这一主题相关,我能否在较短时间内建立假设并用数据验证?这种提问方式逼迫我从「看过」变成「讲得清楚、做得到」,也避免笔记沦为标题摘抄。 与同事的讨论方式我会用白板画出状态机、内存布局或调用链,请同事挑错。若被追问「更高并发或更老 JDK 版本会怎样」,答不上来就回到文首原文链接查 primary source,而不是凭记忆硬编。讨论后把新认识补进笔记末尾。 可复现实验为每个主题保留最小复现:一段可运行的 Java 片段、一条 jcmd/jst...