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

我的公司将做出一个建议,以改写该应用程序的一部分,以降低复杂性,提高质量和模块化,并可以在没有回归的情况下添加更轻松的新功能。在做出任何承诺之前,他们想对现有代码的质量有所了解,并要重复使用其中的多少重写或部分重写。

收获是,我必须在很短的时间内(几天)这样做,因此我试图制定一个计划,以在如此短的时间内完成。我的想法是:

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

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

我不确定我可以从中获得什么样的数字,如果这真的意味着什么,我会觉得管理层要求的是错误的方法,因此第二个问题将是:有人有更好的主意吗?

我将不胜感激对此的任何想法、建议、评论。

编辑:我将添加两个死代码检测器: 都柏林大学二氯二苯醚

有帮助吗?

解决方案

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

我们也面临着完全重写的困境。然而,有几个因素反对它:

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

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

尽管很复杂,你还是想重写吗?

  • 重点关注代码错误。带有大量红色的大饼图很有说服力。
  • 解释该计划的属性以及它们如何不符合公司愿景。
  • 显示超出当前要求的增强选项,并描述当前版本无法应对挑战的原因。
  • 与真实用户进行访谈。他们可能会指出当前版本的重要问题。
  • 便宜但善于估算。您可能会将一些费用推迟到维护阶段。

你不想重写吗?

  • 重点关注成本,尤其是客户重新测试所有内容所需的工时。
  • 指出破坏功能的潜在问题。
  • 要求一名全职文档撰写者。

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

其他提示

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

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

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

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

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

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

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

收集一些统计数据和一些事实,写一份报告并发送给公司。他们会希望最大限度地降低成本,并且会要求您避免修复未损坏的代码。您从统计数据开始,然后是事实和关于时间/受影响代码的大致百分比/定价的主张。

通常,遗留的 Struts 应用程序维护起来很麻烦,已经做过了。如果这不是你工作的一部分,我会说放手吧。如果您遇到不涉及很多模板并且会进行很多更改的“独立”页面,建议使用其他技术重写它们。

您非常关注可维护性和可扩展性。

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

当您必须花费两个月的时间才能看到第一次改进时,就需要有人提前管理客户的期望。

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

我会着眼于 Spring 或 EJB 3.0 的标准化,但不会同时关注两者。

我自己还没读过,但我想知道迈克尔·费瑟斯的书是否 “有效地处理遗留代码” 有什么好的想法吗?

更新:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top