如何审计一个大型Java/J2EE Web应用程序的最佳方法

15

我需要审核一个多年演化的大型 Java/J2EE 网页应用程序。它是由另一个公司编写,而不是我所在的公司。在目前的状态下,这个应用程序已经变得难以演进和维护,新的功能很难添加,并且经常导致错误,有时甚至会在生产中出现。似乎存在一些复制粘贴的代码,导致了重复代码的问题。当前应用程序是一种在线购物网站,有一些类似 CMS 的内容。它主要使用 Struts,代码的较新部分可能使用了一些 Spring,也许还有一些 EJB。虽然有一些单元测试可用,但数量不多。这些都是我听说的,我还没有看到实际的代码。

我的公司将提出建议,重写这个应用程序的部分内容,以减少复杂性,提高质量和模块化,并使添加新的功能更容易且不会导致回归。在做出任何承诺之前,他们希望对现有代码的质量有一些评估,并评估其中可以重用多少,以便在必须进行全面重写或部分重写时,能够有更多的把握。

问题在于,我只有非常短的时间(几天)来完成这项任务,因此我正试图制定一个在如此短的时间内可以完成的计划。我的计划是:

  • 检查 "基本" 事项 - 异常处理、日志记录
  • 检查层次结构的级别(视图、控制器、DAO 层)
  • 测量单元测试的实际覆盖率
  • 可能运行一些 Checkstyle、Findbugs 和 PMD
  • ...

因此,实际问题是,我应该考虑/检查/测量等其他哪些事项?我不确定我能从中得到什么样的数据,或者它是否真正有意义。我有一种感觉,管理层要求的方法有些错误,所以第二个问题是:是否有更好的想法?我将欣赏任何关于此事的想法、建议或评论。

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


1
你确实有很多事情要做。我不会相信现有的单元测试,除非验证它们。你肯定需要某种回归测试来确保重写的代码仍然满足功能要求。你清单上的项目是一个好的开始,尤其是你提到的静态分析工具。 - rich
4个回答

8
我曾经有两个与你相似的网站应用程序。我停止使用FindBugs和Checkstyle,因为它们显示了超过10,000个问题点。这些应用程序使用JDBC级别数据访问、JSP进行展示,并且使用自定义框架进行请求分派。幸运的是,这些低级设置使我能够在中等难度上进行扩展和修复。在这个三年的项目中,只有大约20%的原始代码保持不变。不久之后,其他所有内容都需要更改、替换或删除(最终我才能使用FindBugs和Checkstyle)。
我们也面临完全重写的困境。然而,有几个因素反对这样做:
- 不确定客户是否愿意支付完全重写的费用。 - 功能和技术文档缺失,完全重写风险很大。 - 完全理解整个应用程序的工时太高。客户希望尽快得到所需的更改。 - 用户习惯于演示和页面行为。似乎很难说服用户使用旧功能的新界面。 - 如果我们进行完全重写,我们需要提供完整的文档。对于更新,我们只需要记录我们的部分。 - 如果程序可以正常工作(多或少),很难说服管理层(本公司和客户)重新编写。 - 公司有自己的PMD规则,代码没有通过。最简单的方法是争辩说只有新部分通过测试就足够了。
它归结为你实际想做些什么。
如果你想重写,尽管复杂,请考虑以下事项:
- 强调代码错误。大型饼图中有大量红色是有说服力的。 - 解释程序属性,以及它们如何不符合公司愿景。 - 显示超出当前要求的增强选项,并说明当前版无法应对挑战。 - 与实际用户进行访谈。他们可能会指出当前版本存在的重要问题。 - 要便宜,但却是一个优秀的估算师。你可以将一些成本推迟到维护阶段。
如果你不想重写,请考虑以下事项:
- 强调成本,特别是客户重新测试一切所需的工时。 - 指出破坏功能的潜在问题。 - 要求全职文档撰写者。
如果你想体验代码,请尝试将Hello World!函数/屏幕添加到应用程序中。这告诉您可以实现新功能的难度和速度。

谢谢kd,这正是我有点担心的,就是checkstyle和类似的工具可能无法提供相关数据。我认为客户对重写没问题,但你指出的问题确实很重要,感谢分享。 - Billy
2
+1漂亮的展示了两个选项,以及如何向管理层解释事情 :-) - KLE

3
实际上他们不会支付完全重写的费用,因为:
- 1.经济衰退,从头开始重写的成本将很高。 - 2.他们可能正在努力尽快出售公司。 - 3.管理层对软件开发一无所知。
首先,我建议提供一些简单的事实:
- 使用工具显示项目的SLOC - 运行计划中的FindBugs并可能运行PMD,以估算缺陷 - 进行快速的分析会话 - 检查不同的层次 - 查看资源是否通常关闭(流、Hibernate或JDBC连接等) - 查看是否在不适用的地方使用技术(EJB、Web服务等) - 查看他们如何处理异常和日志记录 - 查看是否存在过多或不足的抽象 - 查看是否可以添加一些基类以减少代码重复
如果他们没有提供有关应用程序体系结构的文档,请尝试绘制一个快速的图表。
收集一些统计数据和事实,编写一份报告并发送给公司。他们希望将成本最小化,并要求您避免修复未损坏的代码。您可以从统计数据开始,然后是事实和提议,包括时间/受影响代码的大致百分比/定价。
通常,遗留的Struts应用程序很难维护,我已经做过了。如果这不是你的工作的一部分,我会说放手不管。如果您遇到不涉及许多模板且经常更改的“独立”页面,请建议使用其他技术进行重写。

2

我非常喜欢你的清单。我认为你有一个出色的攻击计划来开始。

我建议考虑只使用Spring或EJB 3.0进行标准化,不要同时使用两者。

我自己没有阅读过,但我想知道Michael Feathers的书《遗留代码有效工作》是否有好的想法?

更新:

也许你可以通过将它们放在自动化构建和持续集成平台(Cruise Control、Hudson或Team City)上来帮助事情。如果必须重构,它会很有帮助。


谢谢提醒,我其实有那本书!我一直在思考分析的过程中忘记了看它 :-) - Billy

2
你非常注重可维护性和可扩展性,这是非常正确的。我想补充一下,需要考虑重新启动项目所需的时间。他们是否使用源代码控制?是否有集成和用户验收测试的单独环境?是否有构建服务器?如果需要花费两个月才能出现第一个改进,那么就需要提前管理客户的期望。

谢谢Hans,我假设有一些源代码控制,不确定其他的链条,这是我需要检查的事情! - Billy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接