机器学习算法在软件生态建设中的应用(1)
机器学习算法在软件生态建设中的应用(1)
首先定义一下本文中所述的软件生态的定义。一个新的操作系统,提供一套全新的API,以此为核心所构建的所有软件系统,我们定义为软件生态。比如iOS及AppStore上的各种软件是软件生态,Android及Android应用也是软件生态。
软件生态具有网络效应,新的软件生态的建设,有非常大的困难。但是,一旦软件生态形成,护城河效应也很强。
但是,构建生态的困难,在于用户的学习曲线较高。一方面,通过商业的力量分享利益让用户加入到生态中来;另一方面,在API的易用性和降低学习曲线方面,也是需要大力改进的一个课题。
代码推荐系统
随着推荐系统的发展,软件工程推荐系统于2010年被Martin P. Robillard, Robert J. Walker和Thomas Zimmermann提出。在参考文献1《Recommendation systems for software engineering》中,作者提到了三种推荐系统的用法:
- eRose系统:通过挖掘历史提交信息,推荐如何修改
- Strathcona系统:推荐API在真实场景中的使用情况
- Suade系统:代码浏览系统
样例推荐
下面是Strathcona中推荐API用法的一个示意图:
Strathcona
Strathcona是2006年的技术,我们选择更新一点的2015年的《How Can I Use This Method?》为例,介绍API sample推荐系统的实现方法。
样例推荐三步法如上图所示,API样例推荐主要有三个步骤:搜索、去重和排序。
搜索就是去整个代码库中去查找相关API使用的代码段。
但是,代码段可能会有重复,大量的重复会给用户带来不良体验,所以去重工作也很重要。
最后,要根据相关度进行排序。
搜索部分,其实还包含了有技术含量的如何切片的过程。这是通过参考文献4的切片方法来实现的。
代码去重,本身仍然是一门热门的话题。比如参考文献5和6的技术。
最后是根据热度排序,我们可以使用参考文献7的技术。
基于句法的补全
不同于词法补全,句法补全是高一层的推荐算法。我们可以采用基于图的代码统计语言模型来实现。
我们来看下基于抽象语法树的句法补全的示意图:
AST
共享浏览数据
来自微软研究院的一项研究,采用通过将程序员编程过程录像,然后将对某模块熟悉的程序员的浏览记录分享给新手的方式进行推荐。
Sharing Navigation Data
编程网站挖掘
除了以上基于代码和程序员操作的方法,另外一个非常有效的方法就是搜索stackoverflow这样的编程问答网站。
我们来看个示意图。程序员只要正常写代码,根据预先设好的敏感度,系统就会随着程序员的编程来推荐相关的样例:
mining stackoverflow 1
程序员在左边写代码,右边就提示stackoverflow网站上的结果。
mining stackoverflow 2
其系统架构,以eclipse ide为例,如下所示:
mso arch
参考文献
- Robillard, Martin, Robert Walker, and Thomas Zimmermann. "Recommendation systems for software engineering." IEEE software 27.4 (2010): 80-86.
- Holmes, Reid, Robert J. Walker, and Gail C. Murphy. "Approximate structural context matching: An approach to recommend relevant examples." IEEE Transactions on Software Engineering 32.12 (2006): 952-970.
- Moreno, Laura, et al. "How can I use this method?." Proceedings of the 37th International Conference on Software Engineering-Volume 1. IEEE Press, 2015.
- Tsantalis, Nikolaos, and Alexander Chatzigeorgiou. "Identification of extract method refactoring opportunities for the decomposition of methods." Journal of Systems and Software 84.10 (2011): 1757-1782.
- Roy, Chanchal K., James R. Cordy, and Rainer Koschke. "Comparison and evaluation of code clone detection techniques and tools: A qualitative approach." Science of computer programming 74.7 (2009): 470-495.
- Kamiya, Toshihiro, Shinji Kusumoto, and Katsuro Inoue. "CCFinder: a multilinguistic token-based code clone detection system for large scale source code." IEEE Transactions on Software Engineering 28.7 (2002): 654-670.
- Keivanloo, Iman, Juergen Rilling, and Ying Zou. "Spotting working code examples." Proceedings of the 36th International Conference on Software Engineering. ACM, 2014.
- Nguyen, Anh Tuan, and Tien N. Nguyen. "Graph-based statistical language model for code." 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering. Vol. 1. IEEE, 2015.
- Ponzanelli, Luca, et al. "Mining StackOverflow to turn the IDE into a self-confident programming prompter." Proceedings of the 11th Working Conference on Mining Software Repositories. ACM, 2014.
- Proksch, Sebastian, Johannes Lerch, and Mira Mezini. "Intelligent code completion with Bayesian networks." ACM Transactions on Software Engineering and Methodology (TOSEM) 25.1 (2015): 3.