问题

最近我司上线了一个新的模块,这个模块相当于是以前的模块的扩展。原始系统已经跑了三四年,且经过数次的迭代,始终很平稳的运行。 新模块上线后,原始的数据部分其实没有问题,出现问题的是新模块的一些操作会跟老模块的一些操作产生冲突,导致了问题的出现。 并且我最近在反思的时候,也发现了一些情况,明明在设计之初也规划好了一些测试用例。这些用例也覆盖的比较全面,但是有时候上线后,就会发生一些意想不到的问题。

那么这是什么情况造成的呢?

AI 给的答案

这是一个在软件开发中常见的现象,背后有多方面的原因。以下是一些可能的解释:

  1. 局限的视角和经验 当时的知识和经验限制:在初始设计阶段,团队的理解和知识是基于当时的业务需求和技术能力的,无法完全预测未来的变化或复杂性。 未覆盖的使用场景:讨论时往往基于已知的需求和假设,但软件实际使用时可能会暴露出未预料的场景。
  2. 需求变化和扩展 业务需求的演变:随着时间推移,业务需求可能会发生变化,导致设计中原本不起眼的决策变得重要甚至成为障碍。 新增模块的交互影响:每个新模块的加入都会增加系统的复杂性,可能会揭示设计中的不足。
  3. 设计的权衡和折中 初期的简化决策:为了快速推进项目,团队可能会选择权衡简化设计,而这些简化在初期是合理的,但随着规模扩大,可能成为问题。 技术债务的积累:有些问题在设计时可能已经被注意到了,但被认为影响不大或留待后续解决,结果在后期暴露得更明显。
  4. 缺乏全局视角 局部优化问题:设计阶段可能偏重于解决局部问题,而忽略了系统整体的耦合性或扩展性问题。 沟通的盲区:讨论时可能因为团队角色、经验背景不同,导致部分潜在问题未被充分关注。
  5. 开发过程的动态性 实现与设计偏差:实际开发过程中可能因为时间或资源限制,导致最终实现和原设计不一致,从而埋下问题。 运行时复杂性暴露:许多问题只有在运行时才能显现,尤其是性能、并发、错误处理等方面。
  6. 心理因素和认知偏差 “隧道视野”现象:团队讨论时可能过于专注某些方面,而忽略了其他潜在问题。 “正常化偏差”:设计时的小问题被视为无关紧要,甚至被默认接受,直到后期扩展中才发现它们变成了大问题。

思考

上面的第一点是无法避免的,随着技术的积累升级和业务的不断变迁,肯定会出现未被覆盖的场景。 第二点,确实是存在的情况,当复杂性增加的时候有时候确实会出现考虑不到的情况 第三点,这个我们还好,不会为了某些东西而去做简化,只不会会受制于当先系统的真实情况做一些取舍。注意:取舍不是简化 第四点,这个确实很明显,尤其是当沉浸某些东西时间长了以后,虽然思考问题会有深度,但是视角的局限性会大大减少 第五点,这个我们也几乎不会存在,当实现的时候发现会有差异的时候,都会及时的进行讨论。 第六点,这个也还好,我觉得更得力于我们的密切沟通和相关的取舍,尤其在取舍方面,我们都会进行很详细的记录。方便在后续的时候进行复盘。

接下来该如何解决问题

可以看到,上面的六点中,我们会通过沟通和多轮讨论规避掉一些问题,但是一些问题还是显而易见的,比如第四点和第二点。这个是无论如何也无法避免的,那么在后续的开发中我应该如何解决呢?

  1. 项目在不变增大的情况下,交合的部分会越来越多,边界也越来越不清晰。我觉得这时候就应该重新审视整个项目,重新划分编辑,对于交合比较大的模块,进行再次整理。做好更细节的记录
  2. 关于视角方面,就应该对新人进行更多的培训。我们自己则要不断的在更多的视角中观察问题,其实解决问题很简单,但是要注意解决一个点以后不会引发更多的问题,或者说对使用这部分修改的其他位置保持安全,不会有其他问题的产生。
  3. 及时更新测试用例。保持用例的使用能跟随当前版本。

标题的问题解决了吗?

貌似还是没有,一个新模块引入后,为什么会跟老系统处理平稳的数据产生冲突?由于没法举实例说明,我只能简单的复盘一下。 其实两侧的逻辑都没问题。老的系统把数据处理完以后其实是可以的,但是新的系统来了以后,由于对老系统保持了自信,就开始疯狂的分析问题。最终得到了一个哭笑不得的问题,老系统整体来看逻辑没问题,运行没问题,但是会有一些隐形的问题。才使这次的问题暴露了出来。隐形问题是什么呢?就是状态其实并没有到达最终态,处于中间态的数据,在使用上没有任何问题。所以当时测试也没有发现这问题,另一个问题就是状态的判定,这是一个很复杂的系统,有一部分的数据的状态,跟一些中间态的状态其实是一致的,所以造成了我们把中间态的数据当做了最终态。

那么来未来开发的时候,就要重新整理这部分的状态,做更细节的分离。每一步的状态保持唯一。其实也不算是中间态和最终态的问题,怎么说呢,就是没做好分离。模糊了一些状态。

总结

在如何解决问题的段落,我分析了一些情况和解决方案。后续总结就是加强评审和总结经验,把模糊的东西清晰起来。不要放过任何一出不清晰的地方。