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

jts*_*son 15 java reformat reformatting

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

答案必须安抚非技术人员和技术人员.

编辑:2010-03-12对您的技术进行澄清; reformat =仅限空格的更改 - 没有"组织导入"或"成员变量,方法等的重新排序"

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

编辑:2010-03-12我会很快发布自己的答案,虽然John Skeet的回答是关于钱的MD5建议(注意-g:无关闭调试).虽然它只涉及技术方面.-jtsampson

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

有几个人提到了源代码控制和随之而来的"乐趣".我特别没有提到,因为这种情况已经很好理解(在我的背景下).谨防"加油站"的影响.请参阅下面的答案.

Jon*_*eet 37

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

编辑:正如评论中所指出的,二进制文件包含行号.确保编译时-g:none省略调试信息.那应该可以改变行号 - 但是如果你改变名称这是一个更严重的改变,那么这可能确实是一个突破性的改变.

我假设您可以在没有任何人关心的情况下重新格式化和重建 - 只需将重新格式化的代码检查回源代码控制就应该给予任何关注.我认为 Java类文件中没有任何内容可以提供构建日期等.但是,如果您的"格式化"更改字段的顺序等,则会产生重大影响.

  • 相反,JVM严重依赖于符号引用.因此,代码中使用的任何类,接口,方法或字段都将在Class文件中插入其名称(String).此外,如果您正在使用调试模式进行编译,则任何变量名称甚至源行号的更改都将导致不同的类文件. (2认同)

cod*_*eim 34

在商业环境中,您有两个挑战.

  1. 技术
  2. 政治

从技术角度来看,重新格式化是一项成熟的技术.结合散列/校验和,只要语言不是空白敏感,您在技术上可以安全地执行此操作.您还希望确保在没有主要叉子等待合并的停机期间执行此操作.实际更改将无法与重新格式化分开,因此请单独进行更改.对于在叉子上工作的人来说,合并可能非常困难.最后,我只会在实施完整的测试用例覆盖后才会这样做.因为原因2 ......

在政治上,如果你不知道如何说服管理层,你怎么知道它是安全的?更具体地说,它对您来说是安全的.对于一个掌控商店流程的高级,值得信赖的开发人员来说,这是一项更容易的工作,但对于在大型政治红色组织中工作的开发人员,您需要确保覆盖所有基地.

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

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

  1. 来源控制
  2. 适当的测试覆盖率

那你没事.

然而,思考这一点:管理层现在意识到你正在百万线项目中进行"大规模改变".重新格式化后会报告以前未发现的错误.您现在是导致此错误的主要嫌疑人.它是否"安全"具有多重含义.这对你和你的工作可能不安全.

这听起来很陈旧,但几年前我记得发生过这样的事情.我们在夜间维护窗口后的一天内收到了一个错误报告,我只进行了重新配置并重新启动了IIS服务器.有好几天,故事是我必须搞砸了,或者部署了新的代码.没有人直接说出来,但我从副总裁那里得到了这样的表情.我们最终将它追溯到已经在代码中的错误,之前已被推送过,但是直到QA人员最近更改了测试用例后才出现,但老实说,有些人甚至不记得那部分; 他们只记得第二天来到一个新的bug.

编辑:回应jtsampson的编辑.你的问题不是关于如何做到的; 它是"如何说服管理层确保其安全".也许你应该问过,"它是安全的吗?如果是的话,怎么做,安全." 我的发言指出了你的问题具有讽刺意味,因为你认为它是安全的,不知道如何.我很欣赏重新格式化的技术方面,但我指出,任何非平凡的事情都有风险,除非你把合适的人放在上面,否则它可能会被搞砸.这项任务是否会减损程序员的其他任务,将他们拖延几天?它会与其他编码器的未提交修订版冲突吗?源头是否正在修改?是否存在任何对空白敏感的嵌入式脚本,例如Python?任何事都会产生意想不到的副作用; 对于我们的环境来说,很难得到一个没有人在分支机构上工作的时间窗口,大规模重新格式化会使他们的合并变得非常丑陋.因此,我厌恶大规模重新格式化,手动或自动化.

  • 将空格添加到.java文件不应该影响.class文件的校验和. (4认同)
  • 好吧,我的答案有点通用.由于OP说他只有.java文件,所以每个.class的MD5/SHA总和对我们来说就足够了.然后我们的工作是向管理层解释哈希是如何工作的. (2认同)
  • 除了添加空格会影响MD5/SHA总和. (2认同)

lav*_*nio 13

使用务实的方法:

  1. 构建应用程序.
  2. 保存应用程序.
  3. 重新格式化代码.
  4. 构建应用程序.
  5. 区分二进制文件.

  • OP说**.java**文件; 他们都是编译的. (4认同)

Pad*_*ker 8

我会用四个字.

来源控制.单元测试.


Sim*_*mon 5

嗯,这根本不安全,你不可能说服他们.作为管理了大量开发的人,我不会在任何收入所依赖的商业代码库中考虑它.我并不是说代码格式化没有优势你喜欢,但你的格式化不会涉及一些代码更改的机会是零.这意味着收益微不足道的风险很大.如果你必须这样做,那么在你修复代码时就要零碎地做,不要大打折扣.对于作为程序员的人来说,这可能是一个很好的决定,但对于他们来说,这对管理层来说是一个糟糕的决定.