QCon 旧金山 2024:重构大型、顽固的代码库

演讲者及背景

Jake Zimmerman(Stripe Sorbet 技术负责人)和 Getty Ritter(Stripe Ruby 基础设施工程师)在 2024 年 QCon 旧金山会议上发表了题为《重构顽固的遗留代码库》的演讲。

主要观点

  1. 顽固代码库的常见问题
    Zimmerman 列举了 2017 年公司调查中关于顽固代码库的常见抱怨。他强调,重构的最佳方式是由一个团队集中推动,专注于专业知识、激励自动化,并提高完成的可能性。
  2. 集中化迁移的关键要素

    • 杠杆作用:使小规模的解决问题团队能够对系统行为产生重大影响。
    • 渐进式进展的“棘轮”机制:类似于只能单向旋转的机械齿轮,确保重构的不可逆进展。
  3. Sorbet 的作用
    Zimmerman 介绍了 Sorbet,一个用于 Ruby 的类型检查器。Sorbet 通过提供杠杆点和良好的“棘轮”机制,帮助重构大型顽固代码库。

关键细节

  1. # typed 注释的使用

    • # typed: false:用于语法和常量。
    • # typed: true:用于方法中的推断。
    • # typed: strict:用于需要签名的方法。
      Zimmerman 提醒,truefalse 的使用顺序可能会带来意外后果,并通过代码示例展示了如何通过调整注释类型逐步解决问题。
  2. 开发者满意度的提升
    通过使用 Sorbet 提供的杠杆点和“棘轮”机制,大量顽固代码库得到了重构,从而显著提升了开发者满意度。

Ritter 的观点:模块化的重要性

  1. 模块化的必要性
    Ritter 讨论了如何使 Ruby 单体应用更具模块化,并通过一个包含个人身份信息的简单日志应用示例说明了模块化的重要性。
  2. 代码复杂性的问题
    尽管代码意图良好,但在处理日志时可能会引入复杂的逻辑,导致代码纠缠不清。
  3. 模块化的两个杠杆点

    • 打包:Sorbet 中固有的功能,但不足以解决模块化问题。
    • 分层:Eric Evans 定义的分层原则强调,任何层的元素只能依赖于同一层或更低层的元素,向上通信必须通过间接机制。

实践中的挑战

Ritter 引用了 Walter J. Savitch 的观点:“理论上,理论与实践没有区别。但在实践中,有区别。”他指出工具初期的不足,并建议不要急于启动项目。一个团队可以成功重构大型顽固代码库。

总结

通过集中化迁移、使用 Sorbet 提供的杠杆点和“棘轮”机制,以及注重模块化,团队能够有效重构顽固的遗留代码库,提升开发者满意度和代码质量。

阅读 17
0 条评论