写代码前没理清这三大逻辑?90%的Bug由此而生
|
接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机震得我手一抖,饭盒盖弹开,米粒蹦到咖啡机残骸上。那台咖啡机上周就坏了,修了三次,最后一次师傅拧着螺丝说“主板跟情绪一样,不稳定的”。 我原以为是缓存击穿,切进监控看,绿色那条线一直在抖,不是掉,就是抖,像心电图上卡住的房颤。老张冲进来吼“是不是你刚上线那个灰度?”他工位隔断上贴的便签卷了边,蓝墨水洇出“订单状态流转”几个字,底下还有一行小字:“别动status字段——小王上个月回滚三次”。我翻了翻堆栈,不是缓存,是订单服务里一个定时任务调了个新接口,超时设成3s,结果下游根本没接timeout逻辑……它自己卡着等5秒才return。 去年二月,那会儿我们还没把幂等键从body里拎出来,直接拿requestId当去重ID——可前端发重试时,压根不重置requestId,它就一路复用,结果支付回调里两条一样的notify_id,一条成功一条失败,库存扣了两遍。我盯着日志刷得太快看不清,滚屏速度比人眼追得还急,最后一行停在“OrderStatus: PAID → CANCELLED”,而上面三行是“PAID → PAID → PAID”。谁在工位上打电话谈房租,声音嗡嗡的,混着机箱风扇那点持续不断的嗡嗡响。 这三大逻辑?第一是状态跃迁边界——不是画个流程图就完事。你得问清楚:CANCELLED之后能不能再pay?refund之后还能不能cancel?产品经理点头说“当然不能”,可代码里那个if (!order.isFinal()) { pay() },压根没校验refund_time非空。第二是数据归属权,字段谁读谁写谁兜底。那个status字段,前端要展示、风控要拦截、结算要对账、财务要归档……四个系统都往里写,连个注释都没写“写前请先GET /v2/order/{id}/lock”。第三是失效时机——缓存什么时候该删?数据库写成功但MQ丢消息了,缓存还挂着;定时任务凌晨三点跑,结果上游还在回滚中,它照常update,脏数据就埋下去了。 你肯定改过线上字段。上周五我就见李敏蹲在DBA旁边,鼠标悬在alter table语句上半天不敢敲,她说“怕触发主键变更导致binlog解析崩”,其实她怕的是那个祖传的ES同步脚本——三年前写的,没人敢碰,靠cron每分钟全量捞一遍。脚本注释写着“by old-zhou 2021”,但old-zhou去年就转去做BI了,走之前顺手删了文档库里的README.md。 优胜劣汰?真不是鸡汤。我见过三个团队做同一类营销活动模块:A组每次上线前花三天画状态机+上下游契约+异常兜底清单,B组写完直接提测,C组边上线边补case。三个月后,A组那个模块没人改,偶尔加个字段,改完测完一小时发版;B组被叫停两次,回滚四次,最后砍掉70%功能;C组——呵,他们现在连数据库都不敢连,全是mock,因为一连就超时,查了两周才发现是某条索引建错了,错在2019年那次迁移,一直没发现。 所以别跟我扯什么“需求太急”——急死也得先问清:这个按钮点下去,状态到底怎么变?这个接口返回的user_info,哪个字段允许为空?这个定时任务扫出来的数据,万一中间挂了,有没有续扫能力?不问,你就只是给生产环境递火柴。 外卖筷子掉在地上那会儿,我捡起来涮了涮继续吃。后来发现筷子头裂了缝,藏污纳垢,但没换新的,就继续用。有些逻辑也是这样。你明知道那块校验漏了,但“反正现在没出问题”,结果等哪天流量一涌,慢查询拖垮整条链路,复盘会上有人说“早该加兜底”,而你说“当时没人告诉我status字段会被风控写”。 我上个月想改那个祖传ES同步脚本,fork完代码,搜了下“retry”,发现它只重试一次,失败就扔进死信队列,而死信队列没人消费,积压三天就自动删。我问运维,“死信队列多久清一次”,他说“哦,那个啊,上月配了TTL,72小时”。我点开Kibana搜ERROR,关键词一输,跳出来第一条是“java.lang.NullPointerException at com.xxx.es.sync.ESSyncTask.syncUser(ESSyncTask.java:144)”,而144行是:user.getProfile().getAvatar()。profile字段是nullable,没人告诉过他。
文章配图,仅供参考 所以现在我写新模块,第一件事不是建Git分支,是打开飞书文档,标题打一行:“【必答】这三大逻辑今天必须敲定”,底下空三行,等前端、后端、测试、产品,一人填一行。填不满?不开工。有次填到第三行,产品经理写“以最新PRD为准”,我当场退出页面,关了电脑。第二天他带着打印好的PRD复印件过来,第8页手写了三行批注,钢笔字歪歪扭扭,末尾画了个圈:“此处status变化,前端需同步改toast文案”。 咖啡机还坏着。我打算下午再去拧拧那颗松动的排风螺丝。至于那三大逻辑——下次再有需求评审,我准备带个录音笔。不是信不过谁,是怕自己听岔一个字,又去修那个永远修不好的咖啡机。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


小程序搜索排名低迷?外链权重隐形逻辑揭秘
营销运营双轮驱动的架构级效能提升逻辑
代码即文档:逻辑清晰、规范至上的技术写作之道
无代码7年实战:运营中心数据权限三级精准管控
无障碍设计:从第一行代码起的科技尊重
大数据架构师避而不谈的3大代码陷阱
Q2电商剧变:直播与AI重构增长逻辑
