#工具
16 篇
摩斯电码:一张表、两处歧义、三个实现细节
摩斯电码本身很简单,麻烦都在细节里:点划的空格归属、全角符号的归一化,以及「一个单位」到底有多长。
原子写文件:先写临时文件,再 rename
直接覆写会在断电、崩溃、并发读的那一刻留下半个文件。临时文件加 rename 借文件系统的原子性把「半个文件」变成不可能。
Base64:它不是加密,也不是压缩
Base64 把 3 字节编码成 4 个可打印字符,体积涨三分之一。它解决的是「二进制不能安全穿过文本通道」,不是保密。
防抖与节流:差别只在「谁决定何时执行」
两者都是限流,区别是防抖由最后一次调用决定执行时刻,节流由固定时间窗决定。选错的典型症状是拖拽跟手但松手才更新,或者输入框该等却每 200ms 就发一次。
工期估算:为什么「大概三天」永远变成三周
估的是「写代码」的时间,交出去的是「写代码 + 联调 + 评审 + 改需求 + 等别人」的时间。把不确定的部分显式列出来,比把天数乘二更有效。
功能开关:它是负债,不是配置
每个开关都会让代码路径翻倍,而开关本身永远不会被删。给每个开关定一个移除日期,比设计一套精巧的开关系统重要得多。
git bisect:把「哪次提交弄坏的」变成一条命令
回归排查的瓶颈不是二分本身,而是没人说得出「什么样的提交算坏」。先写出能自动判定的脚本,bisect 才能把 n 次构建压到 log n 次。
语义化版本:主版本号的承诺是「不会静默改变行为」
MAJOR 不是「改动很大」,而是「有破坏性变更」。把重构当主版本号、把破坏性变更藏在次版本号,都会让下游的自动升级变成事故。
技术债的利息长什么样
技术债不是「代码写得丑」,而是「以后每次改动都要多付的那部分」。判断标准是可测量的:改一行要动几个文件、跑多久测试、有几处需要同时改。
手写 cron 解析器:五段、并集规则,以及 2 月 30 日
cron 的语法半小时能写完,难的是语义:日与星期同时限定时是并集而非交集,不存在的时间要有终止条件,7 与 0 都是星期天。
CSV 不是「按逗号切」:RFC 4180 的引号与换行
一旦字段里有引号,split 立刻出错:引号能包住逗号和换行,引号自己写成两个。三十行状态机比任何正则都可靠。
进制与单位换算:唯一非线性的是温度
2 到 36 任意进制互转要用 BigInt 兜住精度;十类单位换算中前九类是线性比例,唯独温度是仿射变换,写成一个倍率就一定会错。
颜色与对比度:相对亮度不是通道平均值
三种记法互转只是入口,真正容易写错的是 WCAG 对比度:先做 gamma 还原再加权求和。以及「这上面该用黑字还是白字」为什么不能看亮度是否大于 128。
哈希与校验和:为什么 CRC32 和 MD5 得自己写
浏览器只在安全上下文提供 SHA 系列,CRC32 与 MD5 不在 Web Crypto 里。顺带解决大文件不该一次读进内存,以及校验值不该靠人眼比对。
正则测试:命中、分组与替换预览,以及零宽匹配的坑
自己写一个正则测试页要处理三件事:把命中位置和分组讲清楚、把替换结果先预览出来、以及别让零宽匹配把页面卡死。
JSON 工作台:格式化、校验与结构对比放在同一个页面
从反复在终端写临时命令洗 JSON 的经历出发,做一个只在浏览器里运行的工作台:格式化、压缩、排序、带行列的错误定位,以及两份 JSON 的结构差异。
