一项新的研究发现,程序的核心功能仅存在于一小部分封装代码中。如果您是一名软件开发人员,有人问您,您编写的代码中有多少实际上是在执行实际功能,有多少代码是填充的、毫无价值的,或者只是实际运行编程语言所需要的?95%?75%?50%?两者都不!新研究发现,只有大约5%的代码真正提供了核心功能。研究人员表示,与自然语言一样,一些——甚至可能是绝大多数——书面代码在功能上是无效的。《stalks of wheat》一文的作者认为,只有一部分代码代表了功能的语义核心,我们称之为精华,其余的都是糟粕。根据作者的说法,一个功能的核心可以封装在一小组关键字中,称为“最小可区分子集”或MINSET。我们可以通过将方法分解为词素(即用空格或标点符号分隔代码),丢弃那些对函数的行为不重要的,同时将其余部分映射到关键字来做到这一点。然后将这些关键字导入MINSET。为了验证MINSET中的代码仅占全部代码一小部分的理论,研究人员从Apache、Eclipse、GitHub和SourceForge***下载了1,000个Java项目。在总共超过10亿行的Java代码中,首先淘汰简单的方法(token少于50个)。只剩下不到190万种不同的方法,然后从中随机抽取10,000种来确定他们的MINSET。研究中使用的代码和数据可以从Bitbucket下载。以下是该研究的主要发现:MINSETS出奇地小。方法的平均MINSET大小为1.55个关键字,最大值为6。MINSET的大小不会随着方法的大小而增加。事实上,如果你只看前1000个方法,平均和最大MINSET关键字分别下降到1.12和4,这表明,正如作者所说:“即使对于一些异常大的方法,MINSET也是一个独特且灵活的指标。”大多数代码都是垃圾。平均而言,一个方法中只有4.6%的唯一语素可以在MINSET中排名。也就是说,95%以上的代码都是渣滓。但是,有几个关键点需要指出。首先,MINSET本身不可执行:它只是表征核心功能的最小代码集合。剩下的95%里的一些代码(前面叫dross)并不是没有用,因为程序运行还是需要的。其次,虽然这项研究只关注Java代码,但作者建议这些发现应该适用于其他语言,尤其是C和C++,因为这些语言具有相似性。关于这项工作的意义?研究人员指出了MINSET的潜在应用:改进代码搜索——MINSET可用于根据相似查询对代码搜索结果进行排名。智能IDE-具有MINSET索引数据库的IDE可用于生成类似的代码,支持自动代码完成,并加快调试过程。替代编程形式——MINSET可用于支持基于关键字的编程,也就是说,我们可以从一小组关键字创建可用代码。
