如何说服管理层重新格式化整个Java代码库是安全的

2022-09-02 22:46:39

如何向管理层证明,在大型代码库中对所有.java文件进行批量重新格式化(以使代码符合公司的编码标准)是安全的,并且不会影响功能。

答案必须安抚非技术性和技术性。

编辑: 2010-03-12澄清你们之间的技术;重新格式化 = 仅空格更改 - 没有“组织导入”或“成员变量、方法等的重新排序”。

编辑: 2010-03-12感谢您的众多回复。我很惊讶有这么多读者投票支持mrjoltcola的回应,因为它只是一个关于偏执的陈述,绝不是对我的问题提出答案。此外,同一位撰稿人甚至发表了一条评论,重申了这个问题。WizzardOfOdds支持这一观点(但你可能没有阅读所有评论来查看它)。-jtsampson

编辑: 2010-03-12我很快就会发布我自己的答案,尽管John Skeet的答案是正确的,MD5建议(注意-g:none关闭调试)。虽然它只涵盖了技术方面。-jtsampson

2010-03-15 我在下面添加了自己的答案。为了回应“安全”的含义,我的意思是Java代码的功能不会受到影响。对Java编译器的简单研究表明情况就是如此(但有一些警告)。这些警告是“只有空白空间”的,并被几张海报指出。但是,这不是您要尝试向BizOps解释的内容。我的目标是引出“如何证明这样做的合理性”类型的答案,我得到了几个很好的回应。

有几个人提到了源代码控制以及随之而来的“乐趣”。我特别没有提到这一点,因为这种情况已经很好理解(在我的上下文中)。谨防“加油站”效应。请参阅下面的答案。


答案 1

如果它只是重新格式化,那么这不应该改变编译器输出。在重新格式化之前和之后,获取构建的哈希值(MD5应该足够好) - 如果每个文件都相同,这显然意味着它不能改变行为。无需运行测试等 - 如果输出的字节与字节相同,则很难看出测试将如何开始失败。(当然,仅仅为了展示它而运行测试可能会有所帮助,但它们不会证明任何相同的二进制文件不会证明的东西。

编辑:如注释中指出的那样,二进制文件包含行号。确保 使用 进行编译以省略调试信息。这应该可以接受行号更改 - 但是如果您要更改名称,那将是一个更严重的更改,并且确实可能是一个重大更改。-g:none

我假设你可以重新格式化和重新构建,而不需要任何人关心 - 只有将重新格式化的代码检查回源代码管理应该给出任何值得关注的理由。我不认为Java类文件中有任何给出构建日期等的东西。但是,如果您的“格式”更改了字段等的顺序,则可能会产生重大影响。


答案 2

在商业环境中,您面临两个挑战。

  1. 专门的
  2. 政治

从技术角度来看,重新格式化是一种成熟的技术。结合散列/校验和,只要语言不区分空格,从技术上讲,这样做是安全的。您还需要确保在没有主要分支等待合并的停机时间内执行此操作。真正的更改将不可能与重新格式化分开,因此请单独进行更改。对于任何在分叉上工作的人来说,合并可能非常困难。最后,只有在实现完整的测试用例覆盖之后,我才会这样做。原因2...

在政治上,如果你不知道如何说服管理层,你怎么知道它是安全的?更具体地说,它对你安全吗?对于一个资深的、值得信赖的开发人员来说,他控制着商店的流程,这是一项更容易的工作,但对于一个在一个大型的、政治性的、红胶带的组织中工作的开发人员来说,你需要确保你覆盖了所有的基础。

我在2010年提出的论点可能有点太聪明了,但是解析器,重新格式化器,漂亮的打印机只是软件;它们可能有由您的代码库触发的错误,特别是如果这是C++。如果没有无处不在的单元测试,使用大型代码库,您可能无法100%验证最终结果是否相同。

作为一名开发人员,我很偏执,这个想法让我感到不安,但只要你使用:

  1. 源代码管理
  2. 适当的测试覆盖率

那么你没事了。

然而,想想看:管理层现在意识到,你正在一个百万行的项目中“大规模变革”。重新格式化后,将报告以前未发现的错误。您现在是导致此错误的主要嫌疑人。是否“安全”有多重含义。这对您和您的工作来说可能不安全。

这听起来很老套,但几年前我记得这样的事情发生了。我们在夜间维护窗口后的一天就有一个错误报告,我只对IIS服务器进行了重新配置和重新启动。几天来,故事是,我一定是搞砸了,或者部署了新代码。没有人直接说出来,但我从一位这么说的副总裁那里得到了眼神。我们最终将其追溯到代码中已经存在的错误,该错误之前已被推送,但直到QA人员最近更改了测试用例才显示出来,但老实说,有些人甚至不记得那部分;他们只是记得第二天来一个新的错误。

编辑:回应jtsampson的编辑。你的问题不是关于如何做到这一点;它是“如何说服管理层它是安全的”。也许你应该问,相反,“它安全吗?如果是这样,如何安全地做到这一点。我的发言指出了你问题的讽刺意味,因为你认为这是安全的,而不知道该怎么做。我很欣赏重新格式化的技术方面,但我指出,任何非平凡的事情都涉及风险,除非你把合适的人放在上面,否则它可能会变得混乱。这个任务会减损程序员的其他任务,让他们偏离几天吗?它会与其他程序员未提交的修订冲突吗?来源是否正在修订中?是否有任何对空格敏感的嵌入式脚本,例如Python?任何事情都可能产生意想不到的副作用;对于我们的环境,很难得到一个时间窗口,没有人在分支上工作,大规模的重新格式化将使他们的合并变得非常丑陋。因此,我不喜欢手动或自动进行大规模重新格式化。


推荐