- 今天下午
- 研发有个数据误更新
- 需要回滚数据
- 在利用DBA提供的数据找回功能时
- 刚好我在旁边看着他在处理
- 眼瞅着生成的加滚SQL文件没有换行
- 一个大文本没有分行
- 所以有文字都在一行上
- 很难阅读
- 研发得自已处理下这个文件才能看
- 我让他换个文本编辑器试一下
- 结果还是不分行
- 我问另一个经常用这个功能的同事
- 以下是对话
- “你以前用的时候也是这样吗?” - 答:oracle就是不会分行,MySQL没问题 - “那怎么没跟我提起过呢“ - 答:以为就只能这样,不分行了处理下也能用 - .... -
- 我说这是一个bug
- 得处理一下
- 所以bug第一步
0.发现问题
- 一个平台或功能得有个反馈的机制
- 经常有同事或用户
- 在使用时发现了问题
- 不一定会主动反馈
- 需要有一定的鼓励措施
- 我在做大多数功能的时候
- 会强调如果使用过程中有任何问题
- 都可以找我沟通
- 每次有人找我反馈问题时
- 都会积极响应
- (有时候是用户操作有问题引起的)
1.确认和复现问题
- 收到反馈后
- 需要自己确认和复现这个问题
- 要有再次触发的条件
- 某些极端的情况下
- 可能会很难触发和复现问题
- 此时需要自己阅读代码
- 找到可疑的模块
- 再在脑海里重构流程
- 从而发现问题
- 我知道这个能力不是所有人都具备的
- 但个人觉得这是一个好的程序员
- 应该具备的能力
- 在此过程中
- 有一定的概率会发现
- 这个问题可能是个bug
- 可能不是个bug
- 如果不是bug也需要找到问题所在(通常都是流程的条件不具备)
2.定位bug代码
- 通过现象
- 找到问题代码
- 这个定位过程有长有短
- 有时候甚至需要很久很久
- 反复的阅读代码
- 增加日志
- 才能定位到问题代码
- 如果是很长时间以前的代码
- 那简直是个灾难
- 也因为这个原因
- 我不喜欢把项目的架构设计得太复杂
- 因为时间长了
- 我可能已经记不得当时是怎么设计的了
- 就很头疼
- 在我主导的项目里
- 都力求简单
- 类设计通常都是按小模块独立
- 有时候我也需要阅读和调试别人的代码
- 讲真的
- 有的时候真的非常费劲
- 这可能就是不同人的不同表达差异
- 我也跟正经的研发同学
- 聊过这类问题
- 其中有非常善于review别人代码的
- 经常发现和定位问题的团队管理人员
- 他们有一种能力
- 就是架空与代码层去思考bug
- 以及某种直觉
- 猜到可能是哪个逻辑没有处理好
- 这个真的很厉害
- 需要长时间的一线代码管理
- 以及不断的定位和处理bug
- 才能产生的熟练程度
3.处理bug
- 定位到问题后
- 处理bug
- 也会有很多种处理方式
- 如果bug不好处理
- 可能会需要隐藏bug
- 而不是真正的解决
- 包括在某些特定的条件下
- 直接返回error
- 或者增加前置验证
- 也有可能会替换某些参数和执行路径
- 更多的是
- 需要真实的处理掉bug
- 有可能是增加或修改逻辑
- 有可能是增加不同的执行路径
- 处理方式很多
- 这里要强调的是
- 一定一定要注意
- 在修改bug的时候不要引发新的bug
- 在某些复杂的项目里
- 这是个很困难的事
- 需要额外的注意和思考
- 这需要很强的思考能力
- 我每次改bug时
- 都会反复思考可能漏掉的部分
- 是否会引起其他问题
- 是否有更完美的解决方案
- 哪怕是今天下午的的一个文件内容没有分行
- 这个小bug
- 我在修改的时候
- 都在思考会在哪些情况下
- 产生不好的影响
- 额外说一句
- 修改bug做的动作和修改的代码
- 要尽可能的少
4.验证修改
- 在本地测试
- 在进程测试
- 在线上带数据测试
- 修改完bug
- 哪怕是个很小的改动
- 也要努力在不同的场景下测试
- 这是很耽误时间
- 且看起来没用的动作
- 早些年
- 我也是个非常自信的
- 甚至在线上环境直接改动态代码
- 但是不断的发生了一些意外
- 让我接受了测试的必要性
- 虽然我还是很自信
- 但我还是会在一点点的小改动
- 都会在不同的环境下验证
- 以确保影响在我的可预计内
- 虽然这确实会耽误了我的一些“宝贵时间”
- 当然一个成熟的项目里
- 通常有一个叫“测试组”的团队
- 来协助你做这些工作
- 但我还是习惯自己做好自己的测试
5.验收
- 找到问题的反馈者
- 以及其他可能的用户
- 确认问题已修复
真实的案例
- 程序总有bug
- 发现它解决它
- 下午的这个文件不换行的bug
- 因为当时我刚好没啥事
- 所以发现问题后
- 我就开始着手解决
- 在此次bug处理中
- 1.确认和复现问题(3分钟)
- 2.定位bug代码(5分钟)
- 3.处理bug(2分钟)
- 4.验证修改(15分钟)
- 5.验收(1分钟)