15

我必须审核一个已经发展了几年的大型 Web Java/J2ee 应用程序。它是由其他公司编写的,而不是我正在工作的公司。在目前的状态下,它已经变得难以发展和维护,新功能难以添加,并且经常导致有时会出现在生产中的错误。似乎有一些复制/粘贴的代码导致代码重复。当前的应用程序是某种在线购物,到处都有一些类似 cms 的内容。在代码的较新部分中主要是 Struts 和一些 Spring,也许是一些 ejbs 投入了很好的衡量。有一些可用的单元测试,但不是很多。这些是我被告知的事情,我还没有看到实际的代码。

我的公司将提议重写此应用程序的部分内容,以降低复杂性、提高质量和模块化,并使其能够添加更简单的新功能而不会出现回归。在做出任何承诺之前,他们希望对现有代码的质量有所了解,并评估其中有多少可以重用,以便对必须要做的事情有更多的猜测——完整重写或部分重写。

问题是我必须在很短的时间内(几天)内完成这项工作,所以我正在努力制定一个在这么短的时间内可以完成的计划。我在想的是:

  • 查看“基本”内容 - 异常处理、日志记录
  • 查看分层级别(视图、控制器、dao 层)
  • 测量单元测试的实际覆盖率
  • 也许在项目上运行一些 Checkstyle、Findbugs 和 PMD
  • ...

所以实际的问题是我应该考虑/检查/测量/等哪些其他事情?

我不确定我能从中得到什么样的数字,如果它真的意味着什么,我觉得管理层的要求是一种错误的方法,所以第二个问题是:有没有人有更好的主意?

我将不胜感激任何想法,建议,对此发表评论。

编辑:我将添加两个死码检测器:UCDDCD

4

4 回答 4

8

我有两个与您具有相似设置的 Web 应用程序。我停止使用 FindBugs 和 Checkstyle,因为它们显示了超过 10.000 个问题点。应用程序使用 JDBC 级别的数据访问、用于表示的 JSP 和用于请求分派的自定义框架。对我来说幸运的是,这些低级设置使我能够在中等难度下进行扩展和修复。在 3 年的项目中,只有大约 20% 的原始代码保持原样。迟早,其他一切都需要更改、替换或删除(最后我能够使用 FindBugs 和 Checkstyle)。

我们也面临着完全重写的困境。但是,有几个因素不利于它:

  • 不确定客户是否会为完全重写付费。
  • 缺乏功能和技术文档使得进行完全重写存在风险。
  • 完全理解完整应用程序的工时太高了。客户希望尽快进行请求的更改。
  • 习惯于演示和页面行为的用户。似乎很难说服用户为旧功能使用新界面。
  • 如果我们进行完全重写,我们需要提供完整的文档。对于更新,我们只需要记录我们的部分。
  • 如果程序有效(或多或少),很难说服管理层(自己和客户的)重写
  • 该公司有自己的 PMD 规则,代码没有通过。更简单的说法是,新零件通过测试就足够了。

它归结为您实际上想要做的事情。

你想重写,尽管很复杂?

  • 把重点放在代码错误上。带有大量红色的大饼图令人信服。
  • 解释程序属性以及它们如何不符合公司愿景。
  • 显示超出当前要求的增强选项,并描述当前版本如何无法应对挑战。
  • 采访真实的用户。他们可能会指出当前版本的重要问题。
  • 便宜但很好的估算器。您可能会将一些成本推迟到维护阶段。

你不想重写?

  • 强调成本,尤其是客户重新测试所有东西所需的工时。
  • 指出破坏功能的潜在麻烦。
  • 要求一个全职的文件编写者。

如果您想品尝代码,请尝试添加 Hello World!应用程序的功能/屏幕。这说明了您实施新事物的难度和速度。

于 2009-06-21T18:28:55.113 回答
3

事实上,他们不会为完全重写付费,因为:

  • 这是经济衰退,你从头开始重写的成本会很高

  • 他们可能正试图尽快出售公司

  • 管理层对软件开发一无所知

我首先要了解一些简单的事实:

  • 使用工具显示项目的SLOC
  • 按照您的计划运行 FindBugs 并最终运行 PMD,只是为了估计缺陷
  • 进行快速分析会议
  • 检查不同的图层
  • 查看资源是否普遍关闭(Streams、Hibernate 或 JDBC 连接等)
  • 查看是否在不适用的地方使用了技术(EJB、Web 服务等)
  • 了解他们如何处理异常和日志记录
  • 看看是否有太多或没有足够的抽象
  • 看看你是否可以添加一些基类来减少代码重复

如果他们没有为您提供有关它的文档,请尝试绘制应用程序架构的快速图表。

收集一些统计数据和一些事实,写一份报告并发送给公司。他们会希望将成本降到最低,并且会要求您避免修复未损坏的代码。你从统计数据开始,然后是事实和一个带有时间/受影响代码的近似百分比/定价的命题。

通常遗留的 Struts 应用程序是一个需要维护的皮塔,一直在那里。如果这不是你工作的一部分,我会说放手。如果您遇到“独立”页面,这些页面不涉及很多模板并且会进行很多更改,建议您使用其他技术重写它们。

于 2009-06-21T23:44:37.800 回答
2

我非常喜欢你的清单。我认为你有一个很好的进攻计划开始。

我会着眼于对 Spring 或 EJB 3.0 进行标准化,但不会同时对两者进行标准化。

我自己没看过,不知道 Michael Feathers 的书《Working Effectively With Legacy Code》有什么好的想法吗?

更新:

也许您可以通过将它们置于自动化构建和持续集成中来帮助它们——Cruise Control、Hudson 或 Team City。如果您必须进行任何重构,它会有所帮助。

于 2009-06-21T13:44:57.093 回答
2

您关注的是可维护性和可扩展性。

我会补充一下重新启动项目需要多长时间。他们使用源代码控制吗?他们是否有用于集成和用户验收测试的单独环境?有构建服务器吗?

当您必须在第一个改进出现之前花费两个月的时间时,有人需要预先管理客户的期望。

于 2009-06-21T15:29:00.830 回答