<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Actionable Measurements - Improving The Actionability of Architecture Level Software Quality Violations</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Wojciech Czaban´ ski</string-name>
          <email>wojciech.czabanski@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Paul Martin</string-name>
          <email>p.w.martin@uva.nl</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute for Informatics, University of Amsterdam</institution>
          ,
          <addr-line>Amsterdam</addr-line>
          ,
          <country country="NL">the Netherlands</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-When system components become more coupled over time, more effort must be dedicated to software architecture refactoring. Tightly coupled components present higher riskthey make the system more difficult to understand, test and modify. In order to allocate the refactoring effort effectively, it is crucial to identify how severely components are coupled and which areas of the system involve the most risk to modify. In this paper we apply the concept of architecture hotspots together with the Software Improvement Group Maintainability Model to identify violations in architecture design. We propose a prototype tool that can identify and present architecture smells to developers as refactoring recommendations. We then apply the tool to open-source projects, validating our approach through interviews with developers. Developers found the hotspots comprehensible and relevant, but there is room for improvement with regards to actionability.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        Software maintainability is an internal quality of a
software product that describes the effort required to maintain a
software system. Low maintainability is connected with low
comprehensibility. Glass argues that the most challenging part
of maintaining software is understanding the existing
product [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. What follows is that code which is hard to understand
is also difficult to modify in a controlled manner and test for
defects. If changes are difficult to introduce and code hard
to understand, the probability of bugs being introduced is
very high, which raises the cost of further developing and
maintaining the system.
      </p>
      <p>
        We focus on the Maintainability Model developed by the
Software Improvement Group (SIG) [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. From this model,
10 guidelines have been derived to help developers quickly
evaluate the maintainability of their code and provide
actionable suggestions to increase its quality, such as keeping
complexity of units low and interfaces small. The guidelines
are implemented in the Better Code Hub tool [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], which
applies them to provide feedback to developers. In particular
we look at component independence, because it is considered
the most challenging to improve, based on user feedback. Our
goal is to provide developers with more actionable feedback
in addition to the diagnosis provided by Better Code Hub, so
that they can improve the maintainability of the code.
      </p>
      <p>
        Currently, Better Code Hub provides an overview of
components and the interactions between them, such as incoming
and outgoing calls to and from modules in other
components. It does not however provide specific guidance as to
how the developer can reduce the component coupling and
improve their independence. Attempts have been made to
generate suggestions for improving modularity by suggesting
move module refactoring operations, framing the problem
as a multi-objective search [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Such refactoring operations
however may either not improve modularity or make the
codebase less semantically consistent. Identifying patterns in
poorly modularized code can be a starting point for devising
better recommendations as to how the components can be
decoupled better. Thus we apply the architecture hotspot
patterns described by Mo et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] to conduct a study on open
source projects in order to evaluate whether hotspots can be
found in open source projects and used to provide refactoring
recommendations. Furthermore we investigate whether
presenting quality violations based on hotspots helps developers
decrease coupling between components. In order to validate
our approach, we construct a hotspot detector, integrate it with
the Better Code Hub analysis tool and visualise the hotspots.
Based on initial feedback from developers, indicating that
the suggestions are comprehensible and relevant we finally
consider how to build upon our work in future. We look to
improve the tool by adding more detailed information which
triggers the hotspot detection.
      </p>
    </sec>
    <sec id="sec-2">
      <title>II. BACKGROUND</title>
      <p>
        Program analysis is the process of analysing the behaviour
of a software program with regards to a certain properties such
as correctness, robustness or maintainability [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. There exist
a number of means of program analysis already defined in
research literature, including both static and dynamic analysis,
maintainability guidelines and detection of ‘code smells’. We
survey a few of these approaches below.
      </p>
      <sec id="sec-2-1">
        <title>A. Static and dynamic program analysis</title>
        <p>
          Source code is commonly used as input for static analysis
tools. In certain cases other inputs are used as well such
as revision history. Syntactic analysis and software metrics
computation involves analysing the source code of a system,
often represented as a graph. Examples of tools for obtaining
the source code graph and metrics include Understand1, the
Software Analysis Toolkit from SIG2 and SonarQube [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. Our
intention was to improve the actionability of measurements.
In this respect, SonarQube was aimed at integration within a
CI/CD pipeline, making it difficult to use in a research setting,
because of the existing pipeline and the time limitations
of the project make it unfeasible to modify it. Understand
exported the dependency graph to a commonly used format
and supported a variety of programming languages, but was
challenging to integrate with the SIG infrastructure, which
left us choosing the Software Analysis Toolkit to pre-process
source code for further analysis.
        </p>
        <p>
          We also investigated dynamic analysis methods
reviewing tools such as Valgrind [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ], Google Sanitizers [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ] and
Daikon [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. We chose to focus however on analysing source
code only—to use dynamic analysis, the executable for every
project would need to be built locally. In addition to that, the
reviewed tools detect possible faults in the code as opposed
to analysing maintainability.
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>B. SIG Maintainability Model</title>
        <p>
          SIG developed a maintainability model for software based
on empirical software engineering research [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. They use a
in-house tool, the Software Analysis Toolkit, to conduct static
analyses of software systems. The Maintainability Model is
also accessible for GitHub developers through the Better Code
Hub tool, which conducts an analysis of a repository and
evaluates it against the ten SIG guidelines [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. In our paper
we focus on the ‘Couple Architecture Components Loosely’
guideline, which advises minimising the number of throughput
components. These have a high fan-in/fan-out values [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
Similarly to modules, components that act as intermediaries
are more tightly coupled and more difficult to maintain in
isolation.
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>C. Software design defect classifications</title>
        <p>
          Low maintainability can manifest itself by the presence
of certain antipatterns, called ‘code smells’. The concept of
‘code smells’ as software design defects was popularised by
Fowler [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. We looked into both architecture and design
smells. Suranarayana and Sharma proposed that architecture
smells represent design violations impacting both component
and system levels [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ]. Sharma provided the definition of a
design smell [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ]; Fontana et al. investigated Java projects
for recurring patterns of architecturally relevant code
anomalies [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. Architecture hotspot smells are code anomalies
introduced in the paper from Mo et al. which are related
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>1https://scitools.com/</title>
      <p>2https://www.sig.eu/</p>
      <p>Table I
HOTSPOT INSTANCES OVERVIEW IN SELECTED SYSTEMS
Bitcoin
Jenkins
jME
JustDecompileEngine
nunit
openHistorian
OpenRA
pdfbox
Pinta
ShareX
e
g
a
u
g
n
a</p>
      <p>
        L
C++
Java
Java
C#
C#
C#
C#
Java
C#
C#
to an increased software defect density [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Macia et al.
designed a DSL for describing architectural concerns and code
anomalies [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. In addition to the source code and metrics,
they use the metadata defined using a DSL to detect code
anomalies in a tool (SCOOP). Martin focused on framing
component design guidelines using 3 principles; violating
those principles constitutes an architectural smell. [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] Garcia
et al. define four architecture smells [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ].
      </p>
      <p>
        We believe that connecting maintainability measurements
with architecture smells will allow us to provide more
actionable and relevant refactoring recommendations for developers
using Better Code Hub compared with relying on metrics
alone. It will also make it possible to offer advice on how
to deal with the detected type of smell. Only the classification
from Mo et al. draws a clear connection between the
architectural smells and maintainability, which is why we chose to
use it to enhance the refactoring recommendations generated
by Better Code Hub [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
    </sec>
    <sec id="sec-4">
      <title>III. EXPERIMENTS</title>
      <sec id="sec-4-1">
        <title>A. Data sources</title>
        <p>We selected a number of GitHub repositories that are both
available as open source projects and contain the majority of
code in languages that are supported by Better Code Hub as
data sources to validate our approach. The projects we targeted
needed to have between 50k and 200k lines of code, be at least
three years old and be written in a strongly and statically typed
language supporting inheritance (e.g. Java, C# or C++).</p>
      </sec>
      <sec id="sec-4-2">
        <title>B. Hotspot distribution</title>
        <p>
          We used the Understand code analyser to generate source
graphs which we then fed into an existing tool called Titan
tool [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ], which identifies architecture hotspots. We
aggregated the hotspot quantities and types per analysed system
in Table I. The file count indicates how many distinct files
contain hotspots. A file can be a part of multiple hotspots, but
we count the files only once.
        </p>
        <p>
          In order to reason about the impact of hotspots on the
overall maintainability of projects, we compare the number
of files affected by hotspots with the number of code files in
the project. Kazman et al. show that files containing hotspots
are more bug-prone and exhibit maintenance problems, from
which we infer that higher percentage of files affected by
hotspots makes a codebase less maintainable [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. The
percentage of file affected by hotspots is then juxtaposed with the
component independence metric (CI - percentage of source
lines of code which are interface code or code which is called
from outside of the component in which it resides in and also
calls code outside of the component) measured by Better Code
Hub (BCH) in Table II.
        </p>
        <p>Discussion: We expected the percentage of files affected
by hotspots to be negatively correlated with component
independence (CI) (see table II). The correlation coefficient
is -0.0162, indicating no correlation. Based on the above
analysis, this indicates that the overall impact of hotspots on
the codebase may not be measurable using the Better Code
Hub’s Component Independence metric.</p>
      </sec>
      <sec id="sec-4-3">
        <title>C. Prototype</title>
        <p>
          The research environment defined limitations on our inputs
and tools that we could use, therefore we decided to implement
a detector for Better Code Hub based on the
state-of-theart hotspot approach described in [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. However, we used the
source code graph created by the Software Analysis Toolkit
as opposed to the Understand source code analyser.
        </p>
        <p>Overview: The prototype consists of detector and
visualisation parts. The visualisation is a part of the Edge
front-end component and only consumes the hotspot data
produced by the detector. The detector itself is a part of the
GuidelineChecker component. In addition, the Scheduler is
an orchestrating component which starts a Jenkins task and
notifies the Edge component that the analysis is finished. The
Jenkins component clones the source code repository, invokes
the Software Analysis Toolkit which outputs a source code
graph generated from the repository and the GuidelineChecker
checks the source graph against the guidelines. Our detector
is invoked as a part of the guideline check. Finally, the
analysis result is stored in a MongoDB database, where it
can be reached by the Edge component and presented by the
visualisation part of the prototype.</p>
        <p>Detector: The control flow of the detector is as follows:
first, the class hierarchies are extracted from the source code
graph as separate subgraphs; second, each hierarchy is checked
for presence of two types of the Unhealthy Inheritance hotspot:
internal and external. Internal Unhealthy Inheritance hotspot
is a class hierarchy in which at least one base class depends
on or refers to a derived class. External Unhealthy Inheritance
hotspot is a class hierarchy which has client classes that refer
to both based derived classes of the hierarchy at the same time.
While detecting internal hotspots we investigate the classes
and edges that belong to the hierarchy. For external hotspots
we also check the neighbourhood of the class—clients of the
class hierarchy, being classes which have a dependency on any
of the classes in the analysed hierarchy.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>IV. PROTOTYPE EVALUATION</title>
      <p>
        The prototype evaluation involved integration with Better
Code Hub and the gathering of feedback via structured
interviews with developers who used the prototype. We intended
evaluating the comprehensibility, relevance and actionability of
the refactoring recommendations by asking scaled questions
with a Likert scale [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. Furthermore we asked developers
what would they need to make the feedback more actionable
and how would they address the problem. The integration of
the hotspot detection into the existing system involved two
steps: generating refactoring recommendations and
visualisation.
      </p>
      <p>Refactoring recommendations are generated in two stages.
First, the detector part identifies hotspots and generates a
recommendation for every source node that is a part of a
hotspot. Secondly, recommendations are filtered and ordered.</p>
      <p>The visualisation for the user contains three additions to
Better Code Hub: information about the number of hotspots
in the refactoring candidate, a visualisation of the hotspot in
the refactoring candidate and contextual information about a
specific hotspot: what causes it, what its consequences are
and suggested resolution strategies. We chose to visualize the
hotspot as edges and vertices. It allows the user to manipulate
the graph, by rearranging the nodes. Edges and vertices make
it easier to convey more information visually such as type of
dependency (inheritance, dependency, violating dependency)
or type of source node (parent, child, client). Thus the user
process is as follows:
1) As the user logs into the Better Code Hub, a list of
repositories is revealed.
2) Once the user enters the repository analysis screen, a list
of guidelines is shown with a tick or cross beside each
indicating if the code in the repository is compliant.
3) As the user reviews the details of a specific guideline, a
list of refactoring guidelines is provided for review.
4) In the hotspot visualisation screen the user can see the
graph representing the hotspot visualised as a dynamic
force simulation3 which can then be manipulated.</p>
    </sec>
    <sec id="sec-6">
      <title>3https://github.com/d3/d3-force</title>
      <p>To improve the actionability of architecture level code
quality violations we created a prototype tool that identifies
structural problems in the codebase which impact modularity.</p>
      <p>We then provided refactoring recommendations based on the
identified problems and interviewed developers to gather their
feedback on comprehensibility, actionability and relevance of
the presented recommendations. The prototype refactoring tool
provides the following contributions:</p>
      <p>Detection of architecture smells in source code graphs.</p>
      <p>Refactoring recommendations to the user based on the
presence of hotspots.</p>
      <p>Visualisation of hotspots, emphasising those
dependencies negatively impacting modularity.</p>
      <p>Guidance for the users regarding the impact and structure
of hotspots occurring in the analysed codebase.</p>
      <p>As part of our analysis of repositories, we performed:</p>
      <p>A study of the reliability of hotspot detection on statically
5) Finally, we present the hotspot description which our typed languages (Java, C# and C++).
prototype provides upon the user pressing the question An analysis of the overall impact of code containing
mark button in the upper left corner of the visualisation. hotspots on the system’s modularity.</p>
      <p>
        In Figure 1 we present an example of an external Unhealthy A number of areas of future work have been identified:
Inheritance hotspot, a violation where a client class of the a) More structural problems: We limited our detector to
hierarchy refers to the base class and all of its children. In this one kind of hotspot. We also chose to use our own detector as
case the client class is UriConsoleAnnotator, the base class is opposed to Titan, with a different source code analyzer, which
AbstractMarkupText and the child classes are MarkupText and means that there may be a mismatch between the results [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ].
SubText. The violations in this case are references from the b) More detailed information about the violation: We
UriConsoleAnnotator to all the classes in the hierarchy. only outline violating classes and dependencies. Using the
same data the feedback can be improved by providing the exact
calls along with the code snippets that trigger the violation.
      </p>
      <p>V. DISCUSSION c) Co-evolutionary coupling reasons: Co-evolutionary
coupling is a term used to refer to classes which change</p>
      <p>For the evaluation we interviewed experienced developers. together in time. It is much more difficult to address
coThey had no prior experience with Better Code Hub and the evolutionary hotspots. Firstly, co-evolutionary relationship
codebase that they were assigned to evaluate the prototype on. data contains more noise. For example, a copyright header
Our aim was to devise recommendations which can be useful update will create a coupling between all the files in the
to a user who does not yet have intimate knowledge of the project. Also, co-evolutionary relationships stay in history of
system architecture and implementation. the project. Secondly, it is more challenging to reason about</p>
      <p>We only had time to evaluate the approach on a few systems. the intention of the developer for changing files without a
We made an attempt to choose systems representing different structural coupling together. Nevertheless, it would be
interdomains, architectures and languages; a broader test would be esting identify whether there are common reasons for
conecessary to make sure that the conclusions do not stem from evolutionary hotspot pattern occurrences.
the selection bias. We hypothesise that the findings should d) Hotspot prioritization: We did not explicitly prioritise
be applicable to any strongly typed language that supports hotspots. However, it could be useful as the budget to address
packages, modules and inheritance. technical debt (e.g. architecture smells) is usually limited and</p>
      <p>
        Even though before applying the method we found a decisions need to be made as to which issues should be
strong correlation between hotspot density and the number addressed. A prioritisation could be used to suggest fixing
of interface lines of code in a component, we did not find those hotspots first, which exhibit a balance between effort
a causal link between removing hotspots and a decreased needed to fix them and the impact on the maintainability.
value of the component interface code as measured by the Based on a preliminary evaluation we conducted through
Software Analysis Toolkit. However, Mo et al. did show that interviews with a panel of experts and the analysis of open
the presence of hotspots indicates areas of code which are source repositories we can say that users see the
compliespecially prone to introducing bugs, therefore, even if the mentary information as a promising starting point for further
removal of hotspots will not be reflected in the measurement, investigations, but will need additional work to make the
it would still improve the maintainability of the system [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. recommendations actionable.
      </p>
    </sec>
    <sec id="sec-7">
      <title>VI. CONCLUSION REFERENCES</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Robert</surname>
            <given-names>L</given-names>
          </string-name>
          <string-name>
            <surname>Glass</surname>
          </string-name>
          .
          <article-title>Facts and fallacies of software engineering</article-title>
          .
          <source>AddisonWesley Professional</source>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Ilja</given-names>
            <surname>Heitlager</surname>
          </string-name>
          , Tobias Kuipers, and
          <string-name>
            <given-names>Joost</given-names>
            <surname>Visser</surname>
          </string-name>
          .
          <article-title>A practical model for measuring maintainability</article-title>
          .
          <source>In Quality of Information and Communications Technology</source>
          ,
          <year>2007</year>
          .
          <source>QUATIC</source>
          <year>2007</year>
          . 6th International Conference on the, pages
          <fpage>30</fpage>
          -
          <lpage>39</lpage>
          . IEEE,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Joost</given-names>
            <surname>Visser</surname>
          </string-name>
          , Sylvan Rigal, Rob van der Leek, Pascal van Eck,
          <string-name>
            <given-names>and Gijs</given-names>
            <surname>Wijnholds</surname>
          </string-name>
          .
          <article-title>Building Maintainable Software, Java Edition: Ten Guidelines for Future-Proof Code. "</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          ,
          <source>Inc."</source>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Teodor</given-names>
            <surname>Kurtev</surname>
          </string-name>
          .
          <article-title>Extending actionability in better code hub, suggesting move module refactorings</article-title>
          .
          <source>Master's thesis</source>
          , University of Amsterdam,
          <year>July 2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Ran</given-names>
            <surname>Mo</surname>
          </string-name>
          , Yuanfang Cai, Rick Kazman, and
          <string-name>
            <given-names>Lu</given-names>
            <surname>Xiao</surname>
          </string-name>
          .
          <article-title>Hotspot patterns: The formal definition and automatic detection of architecture smells</article-title>
          .
          <source>In Software Architecture (WICSA)</source>
          ,
          <year>2015</year>
          12th Working IEEE/IFIP Conference on, pages
          <fpage>51</fpage>
          -
          <lpage>60</lpage>
          . IEEE,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Flemming</given-names>
            <surname>Nielson</surname>
          </string-name>
          ,
          <string-name>
            <surname>Hanne R Nielson</surname>
            , and
            <given-names>Chris</given-names>
          </string-name>
          <string-name>
            <surname>Hankin</surname>
          </string-name>
          .
          <source>Principles of program analysis</source>
          . Springer,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Daniel</given-names>
            <surname>Guaman</surname>
          </string-name>
          , PA Sarmiento,
          <string-name>
            <given-names>L</given-names>
            <surname>Barba-Guamán</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P</given-names>
            <surname>Cabrera</surname>
          </string-name>
          , and
          <string-name>
            <given-names>L</given-names>
            <surname>Enciso</surname>
          </string-name>
          .
          <article-title>Sonarqube as a tool to identify software metrics and technical debt in the source code through static analysis</article-title>
          .
          <source>In 7th International Workshop on Computer Science and Engineering</source>
          , WCSE, pages
          <fpage>171</fpage>
          -
          <lpage>175</lpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Nicholas</given-names>
            <surname>Nethercote</surname>
          </string-name>
          and
          <string-name>
            <given-names>Julian</given-names>
            <surname>Seward</surname>
          </string-name>
          .
          <article-title>Valgrind: a framework for heavyweight dynamic binary instrumentation</article-title>
          .
          <source>In ACM Sigplan notices</source>
          , volume
          <volume>42</volume>
          , pages
          <fpage>89</fpage>
          -
          <lpage>100</lpage>
          . ACM,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Konstantin</given-names>
            <surname>Serebryany</surname>
          </string-name>
          , Derek Bruening, Alexander Potapenko, and
          <string-name>
            <given-names>Dmitriy</given-names>
            <surname>Vyukov</surname>
          </string-name>
          .
          <article-title>Addresssanitizer: A fast address sanity checker</article-title>
          .
          <source>In USENIX Annual Technical Conference</source>
          , pages
          <fpage>309</fpage>
          -
          <lpage>318</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Michael</surname>
            <given-names>D</given-names>
          </string-name>
          <string-name>
            <surname>Ernst</surname>
          </string-name>
          , Jeff H Perkins, Philip J Guo,
          <string-name>
            <surname>Stephen</surname>
            <given-names>McCamant</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Carlos</given-names>
            <surname>Pacheco</surname>
          </string-name>
          , Matthew S Tschantz, and
          <string-name>
            <given-names>Chen</given-names>
            <surname>Xiao</surname>
          </string-name>
          .
          <article-title>The daikon system for dynamic detection of likely invariants</article-title>
          .
          <source>Science of Computer Programming</source>
          ,
          <volume>69</volume>
          (
          <issue>1-3</issue>
          ):
          <fpage>35</fpage>
          -
          <lpage>45</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kuipers</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Heitlager</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Visser</surname>
          </string-name>
          .
          <article-title>A practical model for measuring maintainability</article-title>
          .
          <source>In 6th International Conference on the Quality of Information and Communications Technology (QUATIC</source>
          <year>2007</year>
          )
          <article-title>(QUATIC)</article-title>
          , volume
          <volume>00</volume>
          , pages
          <fpage>30</fpage>
          -
          <lpage>39</lpage>
          ,
          <year>09 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Eric</surname>
            <given-names>Bouwers</given-names>
          </string-name>
          , Arie van Deursen,
          <string-name>
            <given-names>and Joost</given-names>
            <surname>Visser</surname>
          </string-name>
          .
          <article-title>Quantifying the encapsulation of implemented software architectures</article-title>
          .
          <source>In Software Maintenance and Evolution (ICSME)</source>
          ,
          <year>2014</year>
          IEEE International Conference on, pages
          <fpage>211</fpage>
          -
          <lpage>220</lpage>
          . IEEE,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Martin</given-names>
            <surname>Fowler</surname>
          </string-name>
          and
          <string-name>
            <given-names>Kent</given-names>
            <surname>Beck</surname>
          </string-name>
          .
          <article-title>Refactoring: improving the design of existing code</article-title>
          .
          <source>Addison-Wesley Professional</source>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Tushar</given-names>
            <surname>Sharma</surname>
          </string-name>
          .
          <source>Does your architecture smell?</source>
          ,
          <year>2017</year>
          . Last accessed:
          <fpage>2018</fpage>
          -06-03.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Tushar</given-names>
            <surname>Sharma</surname>
          </string-name>
          .
          <article-title>Designite: A customizable tool for smell mining in c# repositories</article-title>
          .
          <source>In 10th Seminar on Advanced Techniques and Tools for Software Evolution</source>
          , Madrid, Spain,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>Francesca</given-names>
            <surname>Arcelli</surname>
          </string-name>
          <string-name>
            <surname>Fontana</surname>
          </string-name>
          , Ilaria Pigazzini, Riccardo Roveda, and
          <string-name>
            <given-names>Marco</given-names>
            <surname>Zanoni</surname>
          </string-name>
          .
          <article-title>Automatic detection of instability architectural smells</article-title>
          .
          <source>In Software Maintenance and Evolution (ICSME)</source>
          ,
          <year>2016</year>
          IEEE International Conference on, pages
          <fpage>433</fpage>
          -
          <lpage>437</lpage>
          . IEEE,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>Isela</surname>
            <given-names>Macia</given-names>
          </string-name>
          , Roberta Arcoverde, Elder Cirilo, Alessandro Garcia, and
          <article-title>Arndt von Staa. Supporting the identification of architecturally-relevant code anomalies</article-title>
          .
          <source>In Software Maintenance (ICSM)</source>
          ,
          <year>2012</year>
          28th IEEE International Conference on, pages
          <fpage>662</fpage>
          -
          <lpage>665</lpage>
          . IEEE,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Robert</surname>
            <given-names>C</given-names>
          </string-name>
          <string-name>
            <surname>Martin</surname>
          </string-name>
          .
          <article-title>Clean architecture: a craftsman's guide to software structure and design</article-title>
          . Prentice Hall Press,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Joshua</surname>
            <given-names>Garcia</given-names>
          </string-name>
          , Daniel Popescu, George Edwards, and
          <string-name>
            <given-names>Nenad</given-names>
            <surname>Medvidovic</surname>
          </string-name>
          .
          <article-title>Toward a catalogue of architectural bad smells</article-title>
          .
          <source>In International Conference on the Quality of Software Architectures</source>
          , pages
          <fpage>146</fpage>
          -
          <lpage>162</lpage>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Lu</surname>
            <given-names>Xiao</given-names>
          </string-name>
          , Yuanfang Cai, and
          <string-name>
            <given-names>Rick</given-names>
            <surname>Kazman</surname>
          </string-name>
          .
          <article-title>Titan: A toolset that connects software architecture with quality analysis</article-title>
          .
          <source>In Proceedings of the 22Nd ACM SIGSOFT International Symposium on Foundations of Software Engineering</source>
          , pages
          <fpage>763</fpage>
          -
          <lpage>766</lpage>
          . ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>Rensis</given-names>
            <surname>Likert</surname>
          </string-name>
          .
          <article-title>A technique for the measurement of attitudes</article-title>
          .
          <source>Archives of psychology</source>
          ,
          <year>1932</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>