<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Improving Recall in Code Search by Indexing Similar Codes under Proper Terms</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Abdus</forename><surname>Satter</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Institute of Information Technology</orgName>
								<orgName type="institution">University of Dhaka</orgName>
								<address>
									<settlement>Dhaka</settlement>
									<country key="BD">Bangladesh</country>
								</address>
							</affiliation>
						</author>
						<author role="corresp">
							<persName><forename type="first">Kazi</forename><surname>Sakib</surname></persName>
							<email>sakib@iit.du.ac.bd</email>
							<affiliation key="aff0">
								<orgName type="department">Institute of Information Technology</orgName>
								<orgName type="institution">University of Dhaka</orgName>
								<address>
									<settlement>Dhaka</settlement>
									<country key="BD">Bangladesh</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Improving Recall in Code Search by Indexing Similar Codes under Proper Terms</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">61AD7E824CAF5E89E791E93876C85F00</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T10:49+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>code search</term>
					<term>code reuse</term>
					<term>method search</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>The recall of a code search engine is reduced, if feature-wise similar code fragments are not indexed under common terms. In this paper, a technique named Similarity Based Method Finder (SBMF) is proposed to alleviate this problem. The technique extracts all the methods from a source code corpus and converts these into reusable methods (i.e., program slice) through resolving data dependency. Later, it finds similar methods by checking signature (i.e., input and output types) and executing methods for a randomly generated set of input values. Methods are considered as feature-wise similar if these produce the same output set. In order to index these methods against common and proper terms, SBMF selects the terms that are found in most of the methods. Finally, query expansion is performed before searching the index to solve the vocabulary mismatch problem. In order to evaluate SBMF, fifty open source projects implementing nine different functionalities or features were used. The results were compared with two types of techniques -Keyword Based Code Search (KBCS) and Interface Driven Code Search (IDCS). On an average, SBMF retrieves 38% and 58% more relevant methods than KBCS and IDCS, respectively. Moreover, it is successful for all the features by retrieving at least one relevant method representing each feature whereas IDCS and KBCS are successful for 3 and 7 features out of 9 respectively.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>I. INTRODUCTION</head><p>The recall of a code search engine, indicated by the number of relevant codes that is retrieved from the code repository, usually depends on the indexing mechanism and query formulation techniques. Proper indexing and query understanding help to retrieve relevant code snippets that satisfy user needs <ref type="bibr" target="#b0">[1]</ref>. Most of the code search engines employ Information Retrieval (IR) centric approaches for indexing source code <ref type="bibr" target="#b1">[2]</ref>. The working principle behind these approaches is to construct a term-based index, by extracting keywords from source codes. A common problem of these approaches is that a pair of codes -having same functionality, but written using different keywords are indexed against different terms. A traditional code search engine misses some important code fragments, because of this keyword matching policy. It results in a low recall code search engine with poor performance on benchmark datasets <ref type="bibr" target="#b2">[3]</ref>.</p><p>To improve recall of a code search engine, similar code fragments should be indexed under the same terms. However, it is challenging to automatically and efficiently determine that two code fragments are identical or similar <ref type="bibr" target="#b3">[4]</ref>. Although identical code fragments can be detected through keywords matching <ref type="bibr" target="#b4">[5]</ref>, detecting feature wise similar code blocks is difficult. The reason is that automatically perceiving the intent of a code block is still a research challenge <ref type="bibr" target="#b5">[6]</ref>. Another challenge is to select proper terms that best represent similar code fragments. For example, assume that there are two methods that perform bubble sort -"x" and "sort". Here, between two terms, "sort" is semantically more relevant name than "x". It is a challenging task to automatically determine that "sort" is the better keyword to represent these methods. Again, a code fragment may contain terms, which are not useful to express its intent (i.e., implemented feature) properly. Indexing based on these keywords reduces matching probability between user query and these keywords. It happens because, user query defines functionality but the extracted keywords do not express the feature properly. So, instead of using these keywords, more meaningful terms need to be selected that best match the query.</p><p>Researchers have proposed various techniques to improve the performance of code search engines where recall is considered as one of the performance indicators. These techniques can be broadly classified into four types like Keyword Based Code Search (KBCS), Interface Driven Code Search (IDCS), Test Driven Code Search (TDCS), and Semantic Based Code Search (SBCS). In KBCS <ref type="bibr" target="#b1">[2]</ref>, <ref type="bibr" target="#b6">[7]</ref>, <ref type="bibr" target="#b7">[8]</ref>, <ref type="bibr" target="#b8">[9]</ref>, <ref type="bibr" target="#b9">[10]</ref>, source codes are indexed based on the terms generated from the code and searching is performed on the index. As this approach does not consider similarity between source codes having different keywords, it cannot retrieve more relevant codes. In order to define required component interface as query, and find relevant components, IDCS <ref type="bibr" target="#b10">[11]</ref>, <ref type="bibr" target="#b11">[12]</ref>, <ref type="bibr" target="#b12">[13]</ref> was proposed. It is possible to have two or more code fragments that contain different interfaces but perform the same task. IDCS considers that these code fragments are different due to having different interfaces. Thus, it does not retrieve these all together. To automatically find and adapt reusable components, TDCS <ref type="bibr" target="#b13">[14]</ref>, <ref type="bibr" target="#b14">[15]</ref> and SBCS <ref type="bibr" target="#b15">[16]</ref>, <ref type="bibr" target="#b16">[17]</ref> were proposed. These are effective in terms of precision as test cases are employed on the retrieved codes. In these approaches, most of the test cases fail not only for functional requirements mismatch but also for syntactic mismatch of the interface definition <ref type="bibr" target="#b14">[15]</ref>. For this reason, semantically relevant code fragments cannot be retrieved and the recall is decreased.</p><p>In this paper a technique named Similarity Based Method Finder (SBMF) is proposed to retrieve more relevant methods from code base. The technique first parses all the methods from the source code to construct a repository of methods. It generates data dependency graph for each method and converts the method into reusable method (i.e., program slice) through resolving data dependency, and redefining parameters and return type. Later, all the methods are clustered into a number of clusters where methods in the same cluster perform the same task. To detect feature-wise similarity among a set of methods' signatures (i.e., parameters and return types) of these methods are checked. Methods having the same signature are then executed against a set of randomly generated input values. Among these methods, those which produce the same output are considered as feature-wise similar and a cluster is constructed to store these methods. To identify proper terms for a cluster, keywords are obtained from the methods in the cluster and method frequency is calculated for each term. Such terms are considered as representative terms if these are found in most of the methods of the cluster. All the methods of the cluster are then indexed against the terms so that these are retrieved all together if a query term matches one of these methods. At last, user query is expanded by adding synonyms of each query term to increase the matching probability between the query terms and index terms <ref type="bibr" target="#b6">[7]</ref>.</p><p>In order to evaluate the proposed technique, a tool was developed. Two types of code search techniques, KBCS and IDCS, were compared with SBMF to show its efficiency. An existing system named Sourcerer <ref type="bibr" target="#b7">[8]</ref> was used for the implementation of KBCS and IDCS. However, SBCS and TDCS were not considered for comparison, because these were proposed to improve precision rather than recall. For comparative result analysis, three metrics were used which are recall, number of methods retrieved and feature successfulness. Here, feature successfulness determines whether at least one relevant method is retrieved or not against user queries provided for a feature. In the context of this paper, A feature can be considered as a requirement given to a developer to implement. 50 open source projects were selected to carry out the experiment. The result analysis shows that on an average SBMF increases recall by 38% and 58% more than KBCS and IDCS, respectively against 170 queries. Besides, SBMF is successful for all the features whereas KBCS and IDCS are successful for 7 and 3 features out of 9 respectively.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>II. RELATED WORKS</head><p>Reusing existing code fragments reduces development time and effort <ref type="bibr" target="#b17">[18]</ref>. For this reason, searching for reusable code snippets has become a common task among the developers during software development <ref type="bibr" target="#b18">[19]</ref>. Various techniques have been proposed in the literature to improve the performance of code search engine in terms of recall, precision, query successfulness, etc. These techniques can be broadly classified into four categories which are Keyword Based Code Search (KBCS), Interface Driven Code Search (IDCS), Semantic Based Code Search (SBCS), and Test Driven Code Search (TDCS). Significant works related to each category are discussed in the following subsections.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Keyword based Code Search (KBCS)</head><p>In KBCS, source code is considered as plain text document where traditional IR centric approaches are employed to index the code and query over the index <ref type="bibr" target="#b19">[20]</ref>. Besides, other metadata such as comments, file name, commit message, etc. are used to retrieve relevant code fragments from a repository of source codes. One of the techniques related to KBCS is JSearch which indexes source code against the keywords extracted from the code <ref type="bibr" target="#b1">[2]</ref>. However, it cannot retrieve all the code snippets that implement the same feature but contain different keywords. This is because, it does not check featurewise similarity to detect common terms for these fragments.</p><p>Several techniques like Sourcerer <ref type="bibr" target="#b7">[8]</ref>, Codifier <ref type="bibr" target="#b8">[9]</ref>, krugle <ref type="bibr" target="#b9">[10]</ref>, etc. were proposed to provide infrastructure for large scale code search. These techniques use both structural and semantic information of source code to construct index. Structural information comprises language, source file, related documents, classes, methods, dependencies, and so on. Semantic information of a program is gathered by generating terms from method name, class name, field name, comments, etc. Although these techniques adopt both types of information to fetch more relevant code fragments, these cannot retrieve feature-wise similar code blocks simultaneously. The reason is that all these information are stored following IR based indexing mechanism, and no checking is performed to index similar code snippets under common proper terms.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. Semantic Based Code Search (SBCS)</head><p>As open source codes are increasing day by day, it is thought that a significant amount of code that is written today, has already been available in the internet. However, reusing these existing codes often does not directly meet user needs or requires modifications. In order to find existing codes that support user requirements, a technique in form of SBCS was proposed by Steven <ref type="bibr" target="#b15">[16]</ref>. It takes keywords that represent user requirements, and retrieves relevant code fragments containing these keywords. Later, it runs user provided test cases on the fetched code snippets and passed codes are delivered as final search result. It performs well in terms of precision but recall is reduced since proper terms are not determined while indexing feature-wise similar codes. So, some semantically similar code fragments cannot be fetched due to indexing these under inappropriate terms.</p><p>Sometimes, developers need to convert one type of object to another. To get example code implementing such conversion, Niyana proposed a technique named XSnippet <ref type="bibr" target="#b16">[17]</ref>. It creates graph from source code by adopting code mining algorithm. The graph represents data flow within the corresponding source code. Moreover, user query is defined by providing input type and output type. For a user query, all the generated graphs are searched to find those code fragments that convert the input type into the output type. In this technique. developers need to provide exact input type and output type for getting example code blocks. Otherwise, it cannot retrieve code fragments that may satisfy user needs. However, according to the searching behavior, developers are 4th International Workshop on Quantitative Approaches to Software Quality (QuASoQ 2016) more interested in using keywords rather than concrete data types to define their query <ref type="bibr" target="#b20">[21]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. Test Driven Code Search (TDCS)</head><p>TDCS is a special type of SBCS where test cases are used to obtain program semantics. Lemos et al. proposed a TDCS technique named CodeGenie to support method level searching <ref type="bibr" target="#b13">[14]</ref>. The technique takes method signature as query from the test cases written by developers. It uses Sourcerer infrastructure to retrieve relevant functions against the query. Next, all the test cases are executed for each retrieved method. Resultant methods are ranked based on the number of test cases successfully passed. Although the technique increases precision, it produces low recall. The reason is that it performs keyword matching to fetch methods from index without justifying the appropriateness of the keywords.</p><p>Usually retrieved methods may not pass corresponding test cases due to different order of the parameters, return type or parameter type. To resolve these issues, Janjic et al. proposed a technique that refactors the code to adapt with the program context <ref type="bibr" target="#b14">[15]</ref>. It applies every possible adaptations like reordering parameters, using super type or sub class type of a given return or parameter type, converting primitive type to reference type, etc. Thus, it improves TDCS by finding more relevant methods. However, it produces low recall because it does not index similar methods under common terms.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>D. Inreface Driven Code Search (IDCS)</head><p>IDCS helps the developers to define their queries in a more structured form rather than just a set of keywords joined by boolean expression. Signature matching was the first proposed IDCS technique to find relevant functions within a software library <ref type="bibr" target="#b12">[13]</ref>. The approach crawls all the methods in the library, and uses signature of each method for indexing. Other code search techniques such as Sourcecer, ParseWeb, and Strathcona also support IDCS to improve the performance in code search <ref type="bibr" target="#b6">[7]</ref>. Although IDCS assists to formulate user query, it does not select appropriate terms during indexing similar codes that perform the same functionality. Thus, functionally related code fragments will not be retrieved all together since these are indexed against inappropriate terms.</p><p>In order to find reusable code fragments, four types of techniques have been proposed in the literature which are KBCS, IDCS, TDCS, and SBCS. All these techniques extract keywords from source code to generate terms, and index corresponding code against the terms. However, none of the techniques checks the appropriateness of the terms with respect to implemented feature. As a result, the number of relevant codes retrieved is reduced due to indexing against improper term. Moreover, if two or more code snippets implement similar feature but contain different terms, existing techniques cannot retrieve all these code fragments simultaneously. The reason is that these are indexed against different terms. So, to improve recall in code search, feature-wise similar codes should be indexed under common appropriate terms.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>III. PROPOSED TECHNIQUE</head><p>In this paper, a technique named Similarity based Method Finder (SBMF) has been proposed to improve recall in code search. The technique comprises several steps such as Reusable Method Generation, Clustering Similar Methods, Proper Term Selection, Handling Methods Having API/Library Function call, Index Construction, and Query Expansion. Each of the steps is discussed as follows.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Reusable Method Generation</head><p>In this step, the proposed technique first parses the source code to identify all the methods in the code. For each method, it checks whether the body of that method contains any API/function call statement or not. If no such statement is found, the technique takes the method to convert it into reusable method (i.e., program slice that can execute independently without having any dependency on other methods). Later, a data dependency graph is constructed for the corresponding method to determine its input and output types. Although the signature of the method expresses the input and output types, this is not sufficient enough to convert into reusable function for several scenarios. For example, a method may have return type void but it may manipulate one or more variables that are declared outside the body of the method. A method may not have any parameter (i.e., void) but use variables that are defined outside the body of the method. Again, the signature of a method may explicitly state the input and output types but some variables may be used or manipulated by it and these are declared outside the method body. Considering all of these scenarios, the technique generates data dependency graph to redefine the signature and convert into reusable method. Each node in the graph denotes the variable and an edge from a to b (a → b) denotes variable a depends on variable b. After constructing the graph, nodes that have in degree zero and variables denoted by these nodes are declared outside the method body, are considered as input parameters. Besides, nodes that have out degree zero are considered as output variables of the method. If multiple output nodes are found, a complex data type is created where each field of the type denotes each node. The reason is that a method return type can be a single data type -either primitive or complex data type. The technique uses the variables found in the nodes containing in degree zero to generate parameters of the method. If a single node is found which out degree is zero, the type of the variable denoted by the node is used as return type of the method. Otherwise, generated composite data type as discussed earlier is used. The signature of the method is redefined by combining the return type, method name, and parameters. It is possible to have one or more variables that are declared outside the method body. In the data dependency graph, nodes representing these variables may have at least one in degree and one out degree. In this case, the technique parses the source code and checks the declaration statements of the variables to determine the types of the variables. Using this information, it adds declaration statement for each of the variables at the beginning of the function body. Thus, the technique makes the method self-executable without having any external data dependency.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. Clustering Similar Methods</head><p>To improve code search, it is required to check the similarity among methods found in the code base. Two or more methods may perform the same task in different ways. So, feature-wise similar methods needs to be detected to retrieve the similar methods all together. In Algorithm 1, the procedure named ClusterSimilarM ethods takes a list of reusable methods (M ) as input which is constructed following the previous step. A variable C is declared to store different clusters of similar methods where each cluster contains the methods that perform the same functionality (Algorithm 1 Line 2). A for loop is declared that iterates on M to construct cluster of similar methods. The procedure IsInAnyCluster is invoked to check whether each method m (belongs to M ) is added to any cluster or not previously (Algorithm 1 Lines 4-5). If m does not belong to any cluster, a variable cl is declared to contain all the methods similar to m. A set of input data is generated based on the type of parameters found in the signature of m and corresponding output is generated by executing m (Algorithm 1 Lines 9-10). Here inputset and outputset determine the intent of m. Another for loop is declared to identify other methods that are similar to m. In each iteration, the signature of each method m (in M ) is matched with the signature of m to check whether the input data set can be fed into the and return type is identical to m (Algorithm 1 Line 15). If the signatures of both methods are identical, the method m is executed for inputset and generated output is stored to outputset . If outputset and outputset are found the same, m is considered similar to m as both methods produce same output for the same input data set (Algorithm 1 . m is then added to cl to store all the methods similar to m. At last, cl is inserted to the list of all identified clusters (C).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. Proper Term Selection</head><p>In order to retrieve more relevant methods, it is required to identify proper terms for each method before indexing. When two or more methods have different names or signatures, but implement the same functionality, these methods should be indexed under common appropriate terms. As a result, all these methods will be obtained against user query. So, after getting all the clusters from the previous step, representative terms are selected for each cluster. For a cluster, terms are obtained from the methods found in the cluster through extracting, tokenizing, and stemming keywords found in the methods. Terms that are found in most of the methods are considered as final representative terms for each of these methods.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>D. Handling Methods Having API/Library Function call</head><p>As developers also search for example code to understand the usage of an API, in this step, methods that have API call statements are gathered. For each identified method, terms are generated from API call statements to index against the terms. As a result, if a query term does not match with the signature Algorithm 1 Cluster Similar Methods Require: A list of methods (M ) for which search index will be constructed 1: procedure CLUSTERSIMILARMETHODS(M ) if IsInAnyCluster(m , C) == true then return f ound 34: end procedure of a method but matches with the API invocation statements, the method is retrieved as API usage example code.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>E. Index Construction and Query Expansion</head><p>After generating appropriate terms for each method and merging similar ones, an index is built for searching desired methods. A posting list is created to construct index, which maps terms with corresponding methods. Later, user query is expanded to retrieve more relevant methods against the query.</p><p>Two procedures named ConstructIndex and Query, are presented in Algorithm 2 to build index of methods obtained from the previous steps, and refine user query, respectively. To 4th International Workshop on Quantitative Approaches to Software Quality (QuASoQ 2016) construct the index, an empty posting list is declared, which maps each term to corresponding methods (Algorithm 2 Lines 2). A nested for loop is defined, where the outer loop iterates on a list of methods (M ) given as input to the procedure (Algorithm 2 Lines 3-4). The inner loop iterates to get all the terms of each method in M . In addition, each term is checked whether the posting list contains it or not to add a new term in the list (Algorithm 2 Lines 5-7). Next, the method is added to the posting list against the term so that, when a query term will match with the term, the method will be retrieved (Algorithm 2 Lines 8). After adding all the methods, the list is returned by the procedure (Algorithm 2 Lines 11).</p><p>In procedure Query, a boolean query is given as an argument, from which terms are separated and stored in a variable named queryT erms to expand the query (Algorithm 2, Lines 13-14). A nested for loop is defined, where the outer loop iterates on these terms (Algorithm 2, Lines 15-17). In each iteration, a temporary variable (expandedT erm) initialized with the corresponding term, is used to store synonyms of the term. To expand each term, synonyms are appended to expandedT erm in the inner loop (Algorithm 2, Lines 17-19). Later, each term in queryT erms is replaced with corresponding expandedT erm for the expansion of the query (Algorithm 2, Lines 20). As a result of the expansion, the probability of matching a query string with the terms defined in the index increases. Finally, the query is executed in the index to retrieve intended methods, which are returned by the procedure (Algorithm 2, Lines 22-23).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>IV. IMPLEMENTATION AND RESULT ANALYSIS</head><p>In order to perform comparative result analysis, the proposed technique (SBMF) was implemented in form of a software tool. 50 open source projects were selected as data sources for the experimental analysis. To evaluate the proposed technique, 170 queries representing 9 different features were executed by the tool. For comparative analysis, same queries were also run on Sourcerer that supports KBCS and IDCS.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. Environmental Setup</head><p>This section outlines the softwares and frameworks required for the experimental analysis. SBMF was implemented using C# programming language. Moreover, some other tools were also used, which are addressed as follows:</p><p>• JavaParser: An open source library used to parse Java source code (https://github.com/javaparser) queryT erms=get all terms from booleanQueryStr 15:</p><p>for each qt ∈ queryT erms do return methods 24: end procedure statistically sound and representatives of open source projects <ref type="bibr" target="#b21">[22]</ref>.</p><p>A set of features were selected from the existing works in code search <ref type="bibr" target="#b6">[7]</ref>, <ref type="bibr" target="#b15">[16]</ref>, <ref type="bibr" target="#b22">[23]</ref>, <ref type="bibr" target="#b23">[24]</ref> as shown in Table <ref type="table">I</ref>. On the other hand, to evaluate the proposed technique, a set of queries is selected from <ref type="bibr" target="#b6">[7]</ref>. Here, each query is related to a particular functionality shown in Table <ref type="table">I</ref> and all the queries are created randomly. 15 subjects were employed to identify relevant methods for the functionalities. Among 15 subjects, 5 of them were senior Java developers and rest 10 were masters student. The reason of choosing students in this study is that they can play important role in software engineering experiments <ref type="bibr" target="#b24">[25]</ref>. All the experimental datasets are available in this link <ref type="foot" target="#foot_0">1</ref> .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. Comparative Result Analysis</head><p>For comparative result analysis, SBMF was run on the experimental datasets and the relevance of retrieved methods were checked for each user query. Moreover, Sourcerer which supports KBCS and IDCS, was also run on the same datasets and search results obtained by this were compared to SBMF. Three metrics were used to evaluate the performance of SBMF in comparison with KBCS and IDCS. These were recall, number of retrieved methods, and feature successfulness. Detailed result analysis with respect to each of the metrics is discussed as follows.</p><p>Recall Analysis: Recall is one of the most commonly used metrics to measure the performance of traditional IR system. As the intent of the paper is to improve recall in code search, it is considered as an important metric to evaluate the proposed technique. In this experiment, recall is defined as follows. recall = number of retrieved relevant methods number of relevant methods in the repository Fig. <ref type="figure" target="#fig_2">1</ref> depicts a comparative recall analysis among SBMF, KBCS, and IDCS where X axis denotes the feature no. as shown in TABLE I and Y axis represents the measured recall. For feature 1 (Decoding String), approximately 15% recall is shown in Fig. <ref type="figure" target="#fig_2">1</ref> for both KBCS and IDCS whereas 100% recall is found for SBMF. There are 13 methods in the repository that implement the feature. Among these, two methods are found which contain keywords decode and string in method name and parameter respectively. As a result, these methods are retrieved by both KBCS and IDCS. However, these techniques cannot retrieve other 11 methods because signatures of these methods do not contain any term related to decode. While analyzing the source code of these methods, it is seen that the bodies of these methods use third party APIs like URLDecoder.decode(String, String), Hex.decode(String), Base64.decode(base64), etc. to implement the feature. SMBF takes terms from API call statements and indexes against the terms to provide example codes regarding API usage. So, it retrieves all these 13 methods.</p><p>For feature 2 (Encrypting Password), IDCS cannot find any methods but 66.67% and 33.3% relevant methods are retrieved by SBMF and KBCS respectively as shown in Fig. <ref type="figure" target="#fig_2">1</ref>. To get the methods that implement this feature, the following query is provided to IDCS.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>name:(encrypt) AND return:(String) AND parameter:(String)</head><p>Although there is a single method found in the code base that has encrypt keyword in its name but does not have String in its parameter. So, IDCS cannot obtain this method but KBCS retrieves because query keyword matches with the method name. However, SBMF retrieves one more method having signature crypt(String strpw,String strsalt). The reason is that encrypt and crypt both express the same intent as detected by the query expansion part of SBMF (Algorithm 2). </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>. Number of Retrieved Methods</head><p>There are 3 relevant methods in the experimental projects that implement feature no. 3 (Decoding a URL). According to Fig. <ref type="figure" target="#fig_2">1</ref> only a single method is retrieved by SBMF that produces recall 33.33%. On the contrary, KBCS and IDCS cannot retrieve any method related to the feature. This is because no method contains decode and URL simultaneously in the signature. Although one of these methods named getPath does not provide any semantic information representing the feature, it invokes a library method -URLDecoder.decode(path, "UTF-8") which implements the feature. SBMF considers the invocation statement for getting more relevant terms and thus, retrieves this method. Two other methods cannot be retrieved by SBMF due to finding no structural similarity among these and no keywords representing the feature.</p><p>According to Fig. <ref type="figure" target="#fig_2">1</ref>, 100% recall is obtained for SBMF, and 33.33% for KBCS and IDCS individually with respect to feature no. 4 (Generating MD5 hash). It is clear that SBMF Fig. <ref type="figure">3</ref>. Feature Successfulness Analysis has higher recall than other two approaches. The reason is that most of the methods implementing this feature do not have proper names to represent their intent. There are 5 methods relevant to this feature and only one method is found having name consistent with the feature. KBCS and IDCS fail to retrieve all these methods because both techniques extract terms from individual method and do not consider appropriateness of the terms. However, SBMF finds that these methods are semantically similar. So, these methods are indexed under common terms. As a result, when user query matches with one of these methods, other three methods are also retrieved with this.</p><p>For feature no. 5, 6 and 7, IDCS cannot retrieve any method from the code base used in this experiment. The reason is that appropriate parameter type is not determined in the user queries used for this feature. However, KBCS shows 50%, 33.33%, and 66.67% recall for feature no. 5, 6 and 7 respectively. On the other hand, SBMF shows 100% for features no. 5 and 7, and 33.33% for feature no. 6 as illustrated in Fig. <ref type="figure" target="#fig_2">1</ref>. For feature no. 5, two relevant methods are found which names are transpose and rotate correspondingly. These two methods are feature-wise similar which is detected by SBMF and indexed under common terms (i.e., rotate and transpose). On the other hand, KBCS does not check similarity, and analyzes each method individually during indexing. So, only rotate method is retrieved by KBCS. For feature no. 7, SBMF retrieves one more method than KBCS because this method does not contain any term related to image but it uses a field of type Image. SBMF considers this usage since scaling operation is performed on this field by the method, and adds additional term Image against the method. SBMF, KBCS, and IDCS show equal performance for feature no. 8 (Encoding String to HTML) in terms of recall. However, 50% relevant methods cannot be retrieved because no HTML keyword is found in these method.</p><p>Only SBMF is able to retrieve 21 relevant methods whereas other techniques cannot fetch a single method for feature no. 9 (Joining String). Here, SBMF outperforms because it identifies many structurally similar methods which have different names but all these perform string concatenation. Among these, several methods are found which have proper keywords in their body. These keywords are attached to the term list of each similar method by SBMF. As a result, these are indexed under common appropriate terms and all these are retrieved simultaneously. However, other 26 relevant methods cannot be retrieved since no signature matching is found among these.</p><p>Number of Retrieved Methods (NRM) and Feature Successfulness Analysis: As NRM is an important measure to perceive recall of a search engine, a comparative result analysis with respect to NRM is performed here. A bar diagram is shown in Fig. <ref type="figure">2</ref> depicting feature-wise NRM by SBMF, KBCS, and IDCS. According to the diagram, SBMF retrieves more methods than KBCS and IDCS because of adding common terms to each method.</p><p>Although IDCS produces better precision than KBCS and SBMF, it cannot retrieve a single method for some features (such as feature No, 2, 3, 5, 6, 7, 9). The reason is that user queries do not have proper parameter type or return type. This scenario is common when developers have little or no knowledge about the implementation of a feature. KBCS and SBMF mitigate the problem by retrieving more relevant methods adopting free text search. In order to determine whether a feature is successful or not, a metric named feature successfulness is introduced. A feature is said to be successful if at least one relevant method is retrieved that implements the feature. Fig. <ref type="figure">3</ref> presents the number of successful features among SBMF, KBCS, and IDCS. According to this figure, SBMF is successful for all the 9 features whereas 7 and 3 successful features are found for KBCS and IDCS respectively. This measure provides a notion that having higher precision is not effective if number of successful feature is low. In addition, improving recall increases the chances of having higher number of successful feature. For this reason, SBMF performs better than KBCS and IDCS.</p><p>V. THREATS TO VALIDITY In this section, limitations of the experimental study are discussed in terms of internal, external, and construct validity.</p><p>a) Internal Validity: In the experiment, there was no control over the skills of the subjects. However, the risks of this threat are reduced by applying repetitive measurement approach because same user created queries for KBCS, IDCS, and SBMF and evaluated the search results.</p><p>b) External Validity: The set of features selected may not generalize to the population of software functions. However, these features are among the most common features used for the evaluation in code search. Another possible threat is that projects used in the experiment may not be sufficient enough. However, these projects are statistically representative of open source projects as highlighted in <ref type="bibr" target="#b6">[7]</ref>.</p><p>c) Construct Validity: Existing code clone detection technique can be used to improve recall in code search. However, SBMF differs from code clone detection in several points. SBMF can detect similar methods written in different programming languages and only the execution of method is platform dependent. Another point is that code clone detection technique may provide false positive results to feature-wise clone detection (usually known as Type IV) if values of certain parameters are not defined properly <ref type="bibr" target="#b25">[26]</ref>. As a result search engine may retrieve irrelevant methods. However, SBMF checks dynamic behavior through executing method and matches the output for corresponding input to detect feature-wise similar methods. Such mechanism ensures that methods providing the same output, are feature-wise similar and thus no irrelevant method is added to these methods. Besides recall, two other metrics are used in the study to observe the effectiveness of the technique. Although precision is not shown directly in the result analysis due to space limitation, it can be obtained by using data given in TABLE I and Fig. <ref type="figure">2</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VI. CONCLUSION</head><p>The recall of a code search engine reduces if similar code fragments are indexed under common proper terms. So, a 4th International Workshop on Quantitative Approaches to Software Quality (QuASoQ 2016) technique named SBMF is proposed in this paper which indexes both syntactically and semantically similar methods under common terms. The technique is implemented as a complete software, that constructs index and retrieves relevant methods against the user query.</p><p>SBMF first identifies all the methods in the code base by parsing the source code. It converts the methods into reusable methods by resolving data dependency and redefining method signature. Feature-wise similar methods are detected through checking signature and executing methods. Here, methods that produce the same output set for a randomly generated set of input values, are considered as similar methods and these are kept under a cluster. Thus, all the methods are distributed into a set of clusters where each cluster contains feature-wise similar methods and any two clusters differ from one another in implemented feature. All these methods are indexed against the terms that are found in more than half of the methods in the cluster. At last, query expansion is performed to increase the probability of retrieving more methods.</p><p>For experimental analysis of the technique, 50 open source projects were selected to build the code base and 9 features were chosen to generate queries. An existing technique named Sourcerer was used to compare the results to SBMF. While analyzing the results it has been seen that SBMF shows 38% improvement in recall than KBCS and 58% than IDCS. It also retrieves relevant methods for all the 9 features, whereas KBCS and IDCS retrieves for 7 and 3 features, respectively. In future, the experiment will be conducted on a large scale dataset to observe the behavior of the technique.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>9 : 10 :</head><label>910</label><figDesc>inputset = generate a set of input data randomly for m outputset = execute m and generate corresponding output for inputset 11:for each m ∈ M do 12:</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>16 :</head><label>16</label><figDesc>expandedT erm = qt 17:for each syn ∈ synonyms of qt do 18: expandedT erms+ =" OR "+syn 19: end for 20:queryT erms.replace(qt, expandedT erm)</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. Recall Analysis</figDesc><graphic coords="6,311.98,50.54,257.03,154.49" type="bitmap" /></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">http://tinyurl.com/zdqmoqz 4th International Workshop on Quantitative Approaches to Software Quality (QuASoQ</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2016" xml:id="foot_1">)</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>ACKNOWLEDGMENT</head><p>This research is supported by ICT Division, Ministry of Posts, Telecommunications and Information Technology, Bangladesh. 56.00.0000.028.33.065.16-747, 14-06-2016.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Implementing faceted classification for software reuse</title>
		<author>
			<persName><forename type="first">Ruben</forename><surname>Prieto-Diaz</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">34</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="88" to="97" />
			<date type="published" when="1991">1991</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Using an information retrieval system to retrieve source code samples</title>
		<author>
			<persName><forename type="first">Renuka</forename><surname>Sindhgatta</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 28th international conference on Software engineering</title>
				<meeting>the 28th international conference on Software engineering</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="905" to="908" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Introduction to information retrieval</title>
		<author>
			<persName><forename type="first">Hinrich</forename><surname>Schütze</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the international communication of association for computing machinery conference</title>
				<meeting>the international communication of association for computing machinery conference</meeting>
		<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Detecting and measuring similarity in code clones</title>
		<author>
			<persName><forename type="first">Randy</forename><surname>Smith</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Susan</forename><surname>Horwitz</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the International workshop on Software Clones (IWSC)</title>
				<meeting>the International workshop on Software Clones (IWSC)</meeting>
		<imprint>
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Ccfinder: a multilinguistic token-based code clone detection system for large scale source code</title>
		<author>
			<persName><forename type="first">Toshihiro</forename><surname>Kamiya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Shinji</forename><surname>Kusumoto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Katsuro</forename><surname>Inoue</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on Software Engineering</title>
		<imprint>
			<biblScope unit="volume">28</biblScope>
			<biblScope unit="issue">7</biblScope>
			<biblScope unit="page" from="654" to="670" />
			<date type="published" when="2002">2002</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Mining concepts from code with probabilistic topic models</title>
		<author>
			<persName><forename type="first">Erik</forename><surname>Linstead</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Paul</forename><surname>Rigor</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sushil</forename><surname>Bajracharya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Cristina</forename><surname>Lopes</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Pierre</forename><surname>Baldi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the twenty-second IEEE/ACM international conference on Automated software engineering</title>
				<meeting>the twenty-second IEEE/ACM international conference on Automated software engineering</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="461" to="464" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Can the use of types and query expansion help improve large-scale code search?</title>
		<author>
			<persName><forename type="first">Otávio</forename><surname>Augusto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Lazzarini</forename><surname>Lemos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Adriano</forename><surname>Carvalho De Paula</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Hitesh</forename><surname>Sajnani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Cristina</forename><forename type="middle">V</forename><surname>Lopes</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">IEEE 15th International Working Conference on</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2015">2015. 2015</date>
			<biblScope unit="page" from="41" to="50" />
		</imprint>
	</monogr>
	<note>Source Code Analysis and Manipulation (SCAM)</note>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Sourcerer: a search engine for open source code supporting structure-based search</title>
		<author>
			<persName><forename type="first">Sushil</forename><surname>Bajracharya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Trung</forename><surname>Ngo</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Erik</forename><surname>Linstead</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Yimeng</forename><surname>Dou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Paul</forename><surname>Rigor</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Pierre</forename><surname>Baldi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Cristina</forename><surname>Lopes</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications</title>
				<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="681" to="682" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Codifier: a programmer-centric search user interface</title>
		<author>
			<persName><forename type="first">Andrew</forename><surname>Begel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the workshop on human-computer interaction and information retrieval</title>
				<meeting>the workshop on human-computer interaction and information retrieval</meeting>
		<imprint>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="23" to="24" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<title level="m" type="main">Finding source code on the web for remix and reuse</title>
		<author>
			<persName><forename type="first">Susan</forename><surname>Elliott</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sim</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Rosalva</forename><forename type="middle">E</forename><surname>Gallardo-Valencia</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2013">2013</date>
			<publisher>Springer</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Parseweb: a programmer assistant for reusing open source code on the web</title>
		<author>
			<persName><forename type="first">Suresh</forename><surname>Thummalapenta</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Tao</forename><surname>Xie</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the twentysecond IEEE/ACM international conference on Automated software engineering</title>
				<meeting>the twentysecond IEEE/ACM international conference on Automated software engineering</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="204" to="213" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Strathcona example recommendation tool</title>
		<author>
			<persName><forename type="first">Reid</forename><surname>Holmes</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Robert</forename><forename type="middle">J</forename><surname>Walker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gail</forename><forename type="middle">C</forename><surname>Murphy</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM SIGSOFT Software Engineering Notes</title>
		<imprint>
			<biblScope unit="volume">30</biblScope>
			<biblScope unit="page" from="237" to="240" />
			<date type="published" when="2005">2005</date>
			<publisher>ACM</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Signature matching: a tool for using software libraries</title>
		<author>
			<persName><forename type="first">Amy</forename><surname>Moormann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Zaremski</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Jeannette</forename><forename type="middle">M</forename><surname>Wing</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Transactions on Software Engineering and Methodology (TOSEM)</title>
		<imprint>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="146" to="170" />
			<date type="published" when="1995">1995</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Codegenie:: a tool for test-driven source code search</title>
		<author>
			<persName><forename type="first">Otávio</forename><surname>Augusto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Lazzarini</forename><surname>Lemos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sushil</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Krishna</forename><surname>Bajracharya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Joel</forename><surname>Ossher</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Companion to the 22nd ACM SIGPLAN conference on Object-oriented programming systems and applications companion</title>
				<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="917" to="918" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Leveraging software search and reuse with automated software adaptation</title>
		<author>
			<persName><forename type="first">Werner</forename><surname>Janjic</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Colin</forename><surname>Atkinson</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Search-Driven Development-Users, Infrastructure, Tools and Evaluation (SUITE), 2012 ICSE Workshop on</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2012">2012</date>
			<biblScope unit="page" from="23" to="26" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Semantics-based code search</title>
		<author>
			<persName><surname>Steven P Reiss</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 31st International Conference on Software Engineering</title>
				<meeting>the 31st International Conference on Software Engineering</meeting>
		<imprint>
			<publisher>IEEE Computer Society</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="243" to="253" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Xsnippet: mining for sample code</title>
		<author>
			<persName><forename type="first">Naiyana</forename><surname>Sahavechaphan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Kajal</forename><surname>Claypool</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Sigplan Notices</title>
		<imprint>
			<biblScope unit="volume">41</biblScope>
			<biblScope unit="issue">10</biblScope>
			<biblScope unit="page" from="413" to="430" />
			<date type="published" when="2006">2006</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Effects of reuse on quality, productivity, and economics</title>
		<author>
			<persName><forename type="first">C</forename><surname>Wayne</surname></persName>
		</author>
		<author>
			<persName><surname>Lim</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE software</title>
		<imprint>
			<biblScope unit="volume">11</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="23" to="30" />
			<date type="published" when="1994">1994</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">Code reuse in open source software</title>
		<author>
			<persName><forename type="first">Stefan</forename><surname>Haefliger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Georg</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Von</forename><surname>Krogh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sebastian</forename><surname>Spaeth</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Management Science</title>
		<imprint>
			<biblScope unit="volume">54</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="180" to="193" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Software reuse through information retrieval</title>
		<author>
			<persName><forename type="first">B</forename><surname>William</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Brian</forename><forename type="middle">A</forename><surname>Frakes</surname></persName>
		</author>
		<author>
			<persName><surname>Nejmeh</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ACM SIGIR Forum</title>
				<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="1986">1986</date>
			<biblScope unit="volume">21</biblScope>
			<biblScope unit="page" from="30" to="36" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<analytic>
		<title level="a" type="main">Archetypal source code searches: A survey of software developers and maintainers</title>
		<author>
			<persName><forename type="first">Susan</forename><forename type="middle">Elliott</forename><surname>Sim</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Charles</forename><forename type="middle">La</forename><surname>Clarke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><forename type="middle">C</forename><surname>Holt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">IWPC&apos;98. Proceedings., 6th International Workshop on</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="1998">1998. 1998</date>
			<biblScope unit="page" from="180" to="187" />
		</imprint>
	</monogr>
	<note>Program Comprehension</note>
</biblStruct>

<biblStruct xml:id="b21">
	<analytic>
		<title level="a" type="main">Sound empirical evidence in software testing</title>
		<author>
			<persName><forename type="first">Gordon</forename><surname>Fraser</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Andrea</forename><surname>Arcuri</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 34th International Conference on Software Engineering</title>
				<meeting>the 34th International Conference on Software Engineering</meeting>
		<imprint>
			<publisher>IEEE Press</publisher>
			<date type="published" when="2012">2012</date>
			<biblScope unit="page" from="178" to="188" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b22">
	<analytic>
		<title level="a" type="main">A test-driven approach to code search and its application to the reuse of auxiliary functionality</title>
		<author>
			<persName><forename type="first">Otávio</forename><surname>Augusto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Lazzarini</forename><surname>Lemos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sushil</forename><surname>Bajracharya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Joel</forename><surname>Ossher</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Paulo</forename><forename type="middle">Cesar</forename><surname>Masiero</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Cristina</forename><surname>Lopes</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Information and Software Technology</title>
		<imprint>
			<biblScope unit="volume">53</biblScope>
			<biblScope unit="issue">4</biblScope>
			<biblScope unit="page" from="294" to="306" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b23">
	<analytic>
		<title level="a" type="main">Thesaurus-based automatic query expansion for interface-driven code search</title>
		<author>
			<persName><forename type="first">Adriano</forename><forename type="middle">C</forename><surname>Otávio Al Lemos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Felipe</forename><forename type="middle">C</forename><surname>De Paula</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Cristina</forename><forename type="middle">V</forename><surname>Zanichelli</surname></persName>
		</author>
		<author>
			<persName><surname>Lopes</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 11th Working Conference on Mining Software Repositories</title>
				<meeting>the 11th Working Conference on Mining Software Repositories</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2014">2014</date>
			<biblScope unit="page" from="212" to="221" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">Preliminary guidelines for empirical research in software engineering</title>
		<author>
			<persName><forename type="first">Barbara</forename><forename type="middle">A</forename><surname>Kitchenham</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Shari</forename><forename type="middle">Lawrence</forename><surname>Pfleeger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Lesley</forename><forename type="middle">M</forename><surname>Pickard</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Peter</forename><forename type="middle">W</forename><surname>Jones</surname></persName>
		</author>
		<author>
			<persName><forename type="first">David</forename><forename type="middle">C</forename><surname>Hoaglin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Khaled</forename><forename type="middle">El</forename><surname>Emam</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jarrett</forename><surname>Rosenberg</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on software engineering</title>
		<imprint>
			<biblScope unit="volume">28</biblScope>
			<biblScope unit="issue">8</biblScope>
			<biblScope unit="page" from="721" to="734" />
			<date type="published" when="2002">2002</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<analytic>
		<title level="a" type="main">Xiao: tuning code clones at hands of engineers in practice</title>
		<author>
			<persName><forename type="first">Yingnong</forename><surname>Dang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Dongmei</forename><surname>Zhang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Song</forename><surname>Ge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Chengyun</forename><surname>Chu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Yingjun</forename><surname>Qiu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Tao</forename><surname>Xie</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 28th Annual Computer Security Applications Conference</title>
				<meeting>the 28th Annual Computer Security Applications Conference</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2012">2012</date>
			<biblScope unit="page" from="369" to="378" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
