新的研究发现,一个程序的核心功能仅在于一小部分封装的代码。

如果你是一个软件开发人员,有人问你,你写的代码中有多少是真正在实现实际功能的,有多少是填充物、无价值的或者只是因为实际运行编程语言所需要的? 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可用于支持基于关键字的编程,也就是说,我们可以通过一个小型的关键字组来创建可用的代码。

来源:51CTO

你的代码糟粕比精华要多得多相关推荐

  1. 涨知识|最新十种深度学习算法要点及代码解析「精华」

    https://www.toutiao.com/i6634340699275788813/ 2018-12-13 13:10:15 摘要:前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受 ...

  2. 整洁代码之道——重构

    写在前面 \\ 现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求.在这个信息爆炸技术日新月异的时代,需 ...

  3. 谁都忍不了烂代码,如何用重构的方式让它整洁起来?

    写在前面 现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像 Winston Royce 瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求. 在这个信息爆炸技术日新月异的时代,需 ...

  4. c语言作业统计字符,C语言统计字符数(示例代码)

    输出样例 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...

  5. MYSQL注入天书之前言

    写在前面的一些内容 请允许我叨叨一顿: 最初看到sqli-labs也是好几年之前了,那时候玩了前面的几个关卡,就没有继续下去了.最近因某个需求想起了sqli-labs,所以翻出来玩了下.从每一关卡的娱 ...

  6. 100本最棒的web前端图书推荐

    100本最棒的web前端图书推荐 01.<JavaScript DOM编程艺术第二版(中文)> 语言:中文 类型:pdf 简介:这本书作为被大家推荐的最多的前端入门书籍是有道理的. 他能真 ...

  7. spring cloud contract的应用实现与概念理解-服务请求者一侧的落地-细节较多避免踩坑卡壳

    笔者的经验认为,微服务的出现,是为了应对传统SOA架构在多服务背景下的疲软,本质上是SOA的进一步衍生.是一种治理服务的手段.而微服务之所以能够解决传统SOA.单块大单体程序的问题,原因在于微服务自身 ...

  8. 精通Node.js: 你应该阅读的书籍

    最开始的几年,在应用服务器编程领域,我存在着一个选择.那时候,我已经远离了C一些时间,喜欢上JavaScript很长时间. 我喜欢JavaScript是因为JavaScript很轻,很优雅,很容易表达 ...

  9. html5 promise,从HTML5与PromiseA+规范来看事件循环

    写在最前 本次分享一下从HTML5与PromiseA+规范来迅速理解一波事件循环中的microtask 与macrotask. 欢迎关注我的博客,不定期更新中-- JavaScript小众系列开始更新 ...

最新文章

  1. Java学习lesson 09
  2. Git——git push 错误[error: src refspec master does not match any]解决方案
  3. DNS resolving 占用大量日志
  4. 操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成
  5. C#获取二维数组的行数和列数及其多维。。。
  6. Android 11源码下载和编译
  7. MapXtreme实用技巧
  8. funcode黄金矿工(提高篇)
  9. openCV实现车牌号识别
  10. 基于matlab的相关模板图像匹配技术
  11. 第二章 让你的kali系统变得更好用
  12. linux系统——窗口管理器和桌面环境的区别
  13. 关于组织自定义皮肤/主题的一点思考
  14. 一个虚拟摄像头Filter(Virtual Cam Capture Filter)
  15. ImgURL一款简单纯粹的图床程序源码
  16. 在pycharm中如何使用pyinstaller
  17. PHP时间差七个小时怎么回事,php 怎么解决8小时时间差的问题
  18. Vue md编辑器的使用及md的渲染
  19. 谷歌学术高级检索笔记-检索逻辑和技巧
  20. Nginx实现前后端分离(springboot+vue)+双机互备

热门文章

  1. Android中的PopupWindow详解
  2. 基于double-check模式尝试将消息放到batch中
  3. UITableView 顶部空白总结
  4. lodop打印不显示页码_CAD上明明有图,但是打印的时候不显示怎么办?原来要这样设置...
  5. Python应用——自定义函数:分割PDF文件函数
  6. 解决Warning: Ignoring InnerClasses attribute for an anonymous inner class
  7. 针对Web应用的【攻击模式篇】
  8. Paramiko,数据库
  9. Log4j写入数据库详解
  10. socket.io,io=Manager(source, opts)