假如你是一个软件开发人员,有人问你,你写的代码中有多少是真正在完成实践功用的,有多少是填充物、无价值的或许仅仅因为实践运转编程言语所需求的? 95%? 75%? 50%?都不是!新的研讨发现,只要大概5%的代码是真正在供给中心功用。
研讨人员以为,就像自然言语相同,一些——乃至可能是绝大多数——写下的代码本来对于功用是不起作用的。《stalks of wheat》一文的作者以为,只要一部分代码代表了功用的语义中心,咱们称之为精华,而别的的则是糟粕。
该作者表明,一个功用的中心能够被封装于一个小型的要害词调集中,这被称为“minimum distinguishing subset” (“最小的差异化子集”)或MINSET。咱们能够经过将办法分解为词素(即,经过空格或标点符号分隔代码),丢掉那些对函数行动不重要的内容,一起把剩余的映射到要害词中。然后将那些要害词导入到MINSET。
为了查验此理论,即MINSET中的代码只占悉数代码的一小部分,研讨人员下载了1000个来自Apache、Eclipse、GitHub和SourceForge最受期待的Java项目。在算计超越10亿行的Java代码中,先除掉简略的办法( tokens低于50)。就只剩余不到190万的不一样办法,然后从中随机抽取10,000条,断定它们的MINSET。研讨中运用的代码和数据可从Bitbucket下载。
以下为研讨发现的首要成果:
MINSETS出奇的小。办法的均匀MINSET巨细为1.55个要害词,最大值为6。
MINSET的巨细并不随办法规划的添加而变大。事实上,假如只看最大的1000个办法,其均匀和最大MINSET要害词分别为降到1.12和4,这表明,正如作者所言:“即便是对于一些反常巨大的办法,MINSET也是一项既共同又灵敏有用的目标。”
大多数代码简直尽是糟粕。均匀来说,在一个办法中只要4.6%的共同词素能够位列MINSET。也就是说,95%以上的代码都是糟粕。
不过有几处要害的当地需求指出来。首要,MINSET自身是不行履行的:它仅仅表征了中心功用的代码的最小调集。剩余95%中的一些代码(前面称之为糟粕)也不是无用的,因为还需求它们来运转程序。其次,虽然这项研讨仅着眼于Java代码,不过因为言语的相似性,作者表明这些发现应当也适用于别的言语,特别是C言语和C++。
对于此项工作的含义?研讨人员指出了MINSETs的潜在使用:
改善代码查找——MINSETs可用于根据相似查询的代码查找成果排行。
智能IDE——具有了MINSETs索引数据库的IDE可用于提出相似的代码,支撑主动代码填充,加速调试进程。
备选的编程方式——MINSETs可用于支撑根据要害词的编程,也就是说,咱们能够经过一个小型的要害词组来创立可用的代码。