-
代码重构的安全手法:小步、可回滚、有测试
重构失败很少是因为设计能力不够,多数是因为一次改动太大:改到一半发现行为理解错了,此时进退两难——往前是未知,往后是几百个文件的 diff 已经无法撤销。让重构可控的核心不是技术,是把不可控的部分切小。 重构与改行为是两件事 重构的严格定义是:在不改变外部可观测行为的前提下,改变内部结构。一旦同一次改动里既改结构又改行为,就失去了判断依据——出了问题是结构改错了,还是新行为本来就有缺陷?无法分辨,
Cache 孙
-
单元测试怎么写才有价值:测试边界与可测性设计
一套 90% 覆盖率的测试套件,完全可能是零价值的:改错一个判断条件,测试照样全绿;重构一次内部实现,三十个用例同时变红,其中没有一个对应真实缺陷。覆盖率衡量的是"代码被执行过",它不衡量"错误能被发现"。 价值来自改动时的信心 给测试估值的一个近似公式是: 测试的价值 = 改动时提供的信心 − 维护这些测试的成本 分子取决于"如果我改坏了,会不会红",分母取决于"我改对了,会不会也红"。多数团队
码同客
-
代码注释应该写什么:什么该写、什么不该写
"代码要有充分注释"这句话害了不少项目。它没说清楚"充分"是多少,于是有人给每一行都配一句中文翻译,评审时谁也不敢说不对——毕竟注释多一点总没坏处。 有坏处。注释和代码一样是要维护的资产,而且它比代码更容易腐化:代码错了测试会挂,注释错了没人知道。 注释的唯一价值 注释能提供的价值只有一个: 补充代码本身无法表达的信息。 代码能表达"做了什么"——读一遍就知道了。代码表达不了的是: 为什么这么做
舒野
-
错误处理设计:异常、错误码与 Result 类型
翻一遍多数项目的代码,错误处理基本只做了三件事里的一件:把错误往上抛。一个 try-catch 包住,打印一句日志,然后 throw new RuntimeException(e) ,链路上每一层都这么来一遍。最后用户看到"系统繁忙",开发看到二十行一模一样的堆栈。 完整的错误处理包含三个环节: 分类、传播、处理 。多数代码只实现了传播,分类和处理都缺失。 三件事缺一不可 分类 发生在错误产生的那
沈让
-
正则表达式实用指南:文本处理的通用钥匙
写代码写到一定阶段,几乎绕不开正则。它不是什么高深学问,但绝对是投入产出比最高的技能之一:一套模式语法,通吃日志清洗、配置提取、批量替换、输入校验。麻烦的地方在于它长得像天书,写错了还不报错,只会匹配不到。这篇文章按"元字符 → 分组 → 匹配策略 → 坑 → 场景"的顺序把实用部分过一遍,示例以 Python re 为主,转到 JS 只需把 re.findall 换成 matchAll 一类调用
栈外游
-
Windows 文件检索技巧:从文件名到内容搜索
在 Windows 上找文件这件事,体验一直是分裂的:资源管理器右上角的搜索框慢得让人怀疑人生,但换个工具又能秒出结果。这种差距不是玄学,背后是索引机制的差别。把原理搞清楚,检索效率能上一个台阶。 一、Windows 自带搜索为什么慢 默认情况下,资源管理器的搜索是在 遍历 :你输入关键字,它从当前目录开始逐个打开目录项去比对文件名。目录层级深一点、文件数量上万,等待时间就以分钟计。开了索引服务(
林见川
-
代码生成器实践:模板、AST 与批量改造
一个有六七十张表的服务,手写数据访问层要花几天,而且每张表的写法会逐渐产生偏差。一个 API 废弃需要在三百个调用点上加参数,手工改要一天,还容易漏。这两类问题的共同点是:工作量大、模式重复、出错点分散。代码生成是处理它们的常规手段,但生成方式的选择会直接影响后续维护成本。 模板生成与 AST 改写的分工 两条路线的适用边界很清楚,判断依据是"目标文件是否已存在、是否需要保留人工修改"。 维度 模
许既白
-
Windows 命令行效率指南:PowerShell 实用技巧
在 Windows 上折腾自动化,早晚会从 cmd 迁到 PowerShell。cmd 的命令是"字符串进、字符串出", dir 的结果是一段文本,想二次处理还得靠 findstr 拼正则;PowerShell 从设计上就是对象管道, Get-ChildItem 输出的是带 Name 、 Length 、 LastWriteTime 属性的文件对象,下游 Cmdlet 直接按属性过滤排序。理解这一
码同客
-
压缩包格式怎么选:zip、7z、tar 的适用场景与坑
打包文件这件事,日常天天做,但真要问"该用哪个格式",很多人是凭习惯:默认双击用哪个就一直用哪个。实际上 zip、7z、tar.gz 这几类格式的定位差别不小,选错的代价从"对方打不开"到"安全漏洞"都有。 一、zip:兼容性的默认答案 zip 的最大优势是 不用解释 。Windows 从 XP 时代就原生支持右键解压,macOS 的归档工具认它,各种网盘、邮件附件、在线预览大多对它最友好。给别人
朔风
-
API 调试入门:把接口问题调明白的排错思路
接口出问题时最常见的场景是:页面上报了个含糊的错误,开发和测试互相问"是不是你那边挂了"。把接口问题调明白,靠的不是猜,而是一套分层排查的思路——先确定问题出在哪一层,再在那一层里找证据。这篇按"分层定位 → 状态码 → 头信息 → 超时与重试 → 抓包与日志 → 常见故障"的顺序把方法过一遍。 从现象到定位:先划层,再猜原因 一次 HTTP 请求穿过的东西比大多数人以为的多:客户端 SDK、本地
KernelPan
-
Git 分支管理实战:从单人开发到团队协作规范
一个人写代码的时候,分支管理几乎是不存在的问题:所有改动都在 main 上,提交记录再乱也只有自己看得见。一旦进入多人协作,分支策略就会立刻变成绕不开的话题——谁的代码什么时候合、出了问题怎么回滚、发布版本和日常开发怎么并行,全都压在这一层上。 这篇文章不讲"某种分支模型是唯一正确答案",而是把几种常见做法的适用场景、取舍和落地细节讲清楚,方便你在自己的团队规模下做出合适的选择。 一、单人阶段:一
North 北境
-
性能剖析入门:CPU、内存与 IO 的 profiling
"这段应该很慢,我优化一下"——这是性能优化里最贵的一句话。凭直觉改代码,改完压测发现没变化,甚至更慢,这类事在大多数团队里都发生过。 原因不神秘:现代软件的性能瓶颈位置高度反直觉。一个看起来很重的序列化调用可能只占 2% 的时间,而一个不起眼的 HashMap 扩容占了 30%。经验可以缩小搜索范围,但替代不了测量。 别猜,先量 直觉定位的失败率高,有具体的机制性原因: 调用次数比单次耗时更重要
Corin
-
语义化版本与发布纪律
版本号是一种契约:它告诉使用方"升级这一步,我需要付出多少注意力"。 1.4.2 → 1.4.3 意味着可以直接升, 1.4.2 → 2.0.0 意味着要读变更说明、可能要改代码。契约一旦失真,版本号就退化成一个递增的序号,使用方只能选择永远不升或者每次都全量回归。 三段各自的契约 MAJOR.MINOR.PATCH : MAJOR :包含不兼容的变更。使用方必须修改代码或配置才能升级。 MINO
NullRef
-
结对编程与远程协作的工程习惯
结对编程最常见的失败形态是两个人坐在一起,一个写代码,另一个看手机。名义上在结对,实际上是一个人写代码加一个观众,成本翻倍,收益接近零。结对要有效,需要角色分工是真实的,而不是两个人轮流打字。 驾驶与导航 两个角色有明确的分界: 驾驶者(driver) :操作键盘鼠标,负责把想法落实成代码,处理语法、命名、编辑器操作这些细节。 导航者(navigator) :不碰键盘,负责观察全局——当前写法是否
HexCreek
-
批量文件重命名实战:从 Excel 公式到一键预览
整理下载目录的时候,大概率会碰上这样的场景:几十上百个文件名乱七八糟,有的带"最终版",有的带"(1)",有的是中文和拼音混排。一个个手动改显然不现实,于是很多人第一个想到的办法是——用 Excel 拼一条 ren 命令,复制到命令行里跑。 这个办法我用了很多年,它确实能解决一部分问题,但坑也不少。这篇文章把重命名的常见需求、几种实现路径、以及"先预览再执行"这个安全习惯讲清楚。 一、先看清需求:
HexCreek
-
正则性能:回溯陷阱与优化手法
一条看起来人畜无害的正则,可以让服务在几十个输入字符上跑满 CPU 几分钟。这类事故的特征是:输入不长、CPU 打满、没有堆栈增长(不是死循环,是在穷举),而且只在特定格式的字符串上出现。理解引擎的执行模型之后,这类问题是可以提前看出来的。 回溯引擎的执行模型 主流语言(PCRE、Python re 、Java Pattern 、JavaScript、.NET)的正则引擎都是回溯型 NFA。它的工
裴鹿
-
结构化日志规范:可检索性设计
线上出问题时,能不能在几分钟内回答"这次失败影响了哪些用户""哪个下游慢了""从什么时候开始的",取决于日志长什么样。同样写了日志,有的团队一条命令就能筛出结果,有的团队只能 grep 半天然后靠猜。 纯文本日志难以聚合 2026-10-21 10:23:11 INFO order created, id=88213 user=u_1029 amount=199.00 2026-10-21 10:
叶南
-
调试方法论:从现象到根因的系统化排查
多数调试时间不是消耗在"想不出来",而是消耗在"想错了方向"。差别通常不在智力,而在是否把排查当成可收敛的流程来推进。 现象、触发条件、根因是三个层次 把这三件事混为一谈,是低效调试最主要的来源。 现象 :可观测到的异常表现。例如"下单接口有约 5% 的请求超时"。 触发条件 :让现象出现的输入、时机与环境组合。例如"仅在优惠券面额大于订单金额、且用户是首次下单时出现"。 根因 :代码或系统中那个
许既白