逻辑先行:90%程序员忽略的三大编码铁律
|
去年二月,我蹲在三号机房听空调外机震得像快散架的拖拉机——当时没关窗,雨刮器在玻璃上甩出三道模糊的弧,一下、两下、停了。对面工位老陈正用左手小指关节敲击键盘空格键,哒、哒、哒,节奏比心跳还准。我盯着他后颈那块还没褪干净的晒痕,忽然想起来,这人上周五改完登录态逻辑,当天晚上就辞职了。 不是他写崩了,是他看崩了。那天我拿他PR过了一遍:三百七十二行新代码,核心是重写权限兜底校验,但他在第十八秒就卡住了——倒不是看不懂,是看懂之后不想动。他说:“这个if里套了个try,try里又调了个callback,callback传的又是另一个闭包……它不长,它拧着。”我点头。他把咖啡杯推远,杯底在木纹贴面桌上划出一道浅白印子,接着补了句:“逻辑没立住之前,你让我写个hello world我都想删库。” 我说服不了他,因为我也刚被干趴过。就在前一周,我们给支付路由模块加灰度开关,我拍板让前端直接读 localStorage 里的 flag。结果上线第三天凌晨两点十七分,某支行的扫码付款全走错了通道——不是代码没测,是没人在逻辑图里标出“当用户同时打开五个Tab时,localStorage 的写入时序会触发竞态”。那个flag被两个Tab同时修改,最后存进去的是个半截值。运维在电话里吼得我耳膜疼,而我手边泡面盒还开着盖,油星子浮在汤面,没动过。 所以我现在信“逻辑先行”这四个字,信得有点后怕。不是因为它多高级,是因为它活下来了——不是靠文档,不是靠Code Review checklist,是靠优胜劣汰。去年改版十三个中台系统,凡是在动第一行代码前逼团队画出完整控制流+数据流向+异常分支的模块,交付周期平均压掉四成,缺陷密度低到测试都懒得提bug单;反观那些说“先跑起来再重构”的,六个项目里有五个卡在联调阶段反复撕扯——其中三个最后砍掉了整块需求,就因为没人敢碰那段“运行得好好的逻辑泥潭”。 可这话说出来还是轻了。真要较劲,我得承认:不是90%程序员忽略它,是95%以上压根没机会验证它。很多所谓“线上稳定运行三年”的逻辑,其实是靠日志打点硬扛住边界case堆出来的侥幸;它们根本没经过抽象检验,只是还没触发最坏的那个组合。上周跟架构组老赵在茶水间撞见,他叼着没点着的烟问我:“你猜咱们现在主链路上,还有几处真正的‘确定性状态转移’?”我没接话。他笑了下,把烟按灭在盛满凉茶渣的纸杯里,杯沿沾着半粒枸杞。 三大铁律?第一,函数签名必须能读出它的所有副作用——不是靠注释,是靠名字和参数类型自己跳出来骂你。第二,任意嵌套层级里的判断条件,如果拆不开成原子布尔表达式(比如 !user?.profile?.verified || user.role === 'guest' 这种就算合格),立刻回滚,重写。第三,所有异步链路,只要中间存在非幂等操作,就必须显式标注恢复路径或失败补偿点——不是放个catch console.error() 就叫兜住了。这个我敢打包票:上个月验收B端合同生成服务时,对方CTO亲自盯流程图,指着其中一段说“这儿少了一个事务边界”,我们当场补了八张白板草稿,才让他松口签UAT确认单。他走后保洁阿姨进来换垃圾袋,顺手把那叠白板纸揉成团扔进了黑袋子。 我原以为光靠流程规范就能守住这条线。结果上个月内部技术沙龙,听见一个实习生讲她怎么用TypeScript的never type来强制编译期阻断非法分支——她没提逻辑图,但她在每个union类型的处理入口都塞了assertNever()。那一刻我觉得自己像个还在用纸质流程图的守墓人。但转念又想,也许她只是没碰过那种连JSON Schema都救不了的业务耦合场景?这个我说不准。 昨天中午行政部来收旧设备,拖走三台显示器、一台A4纸堆满的工位隔板、还有我抽屉最底下那本《UML精粹》——封面已经磨毛边了,书页里夹着去年十一月某次灰度发布前的手绘流程草稿,铅笔写的,被咖啡渍晕开半个“rollback”。其实我早就不翻它了。现在我电脑桌面放着个实时更新的Mermaid流程图窗口,只要有人提交新模块,自动同步依赖节点,红色报警框只闪一次:「未关联逻辑拓扑」。没人点确认,CI直接挂起。 但说实话,这套东西管得住我们自己,管不住甲方派来的外包开发。他们照着接口文档写实现,写得贼快,变量名带拼音缩写,三行代码两个this,一个Promise.resolve().then().catch().finally() 裹着七个回调。上周五最后一次并网测试,对方负责人发来截图,显示“调用耗时稳定在三百一十毫秒”。我盯着那个数字看了四十八秒。没回。后来我点了杯冰美式,店员递过来时指尖碰到我的手腕,凉的。
文章配图,仅供参考 所以我不推方法论了。下周一开始,所有新任务卡上强制带一张逻辑拓扑草图,不用Visio,手绘也行,哪怕就画几个方块加箭头,但得有人当面给我讲清每一个叉号从哪儿来、往哪儿去。讲不清的,退回需求池。至于老系统……先不动。反正它们也没打算活过今年Q3。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


14年程序员实战:多端网站资源优化全平台指南
