<!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>
      <issn pub-type="ppub">1613-0073</issn>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Modularity in JavaScript-Based Microservices from Software Architectural Perspectives</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Claudia Cahya Primadani</string-name>
          <email>cc.primadani@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Seonah Lee</string-name>
          <email>saleese@gnu.ac.kr</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Gyeongsangnam-do</string-name>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Republic of Korea</string-name>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of AI Convergence Engineering, Gyeongsang National University</institution>
          ,
          <addr-line>501 Jinjudaero, Jinju-si</addr-line>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Department of Aerospace and Software Engineering and Department of AI Convergence Engineering</institution>
          ,
          <addr-line>Gyeongsang</addr-line>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>National University</institution>
          ,
          <addr-line>501 Jinjudaero, Jinju-si, Gyeongsangnam-do, CO 52828</addr-line>
          <country>Republic of Korea</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>As businesses embrace concepts for rapid, scalable, and maintainable software systems, microservices adoption is gaining traction. Meanwhile, the current work on software architecture metrics focuses mainly on measuring modularity metrics in object-oriented programming, particularly in the Java environment. To address this gap, we propose a method for measuring fundamental quality attributes coupling and cohesion to evaluate architectural modularity specifically in the context of JavaScript-based microservices. In addition, we conduct a case study with coupling and cohesion measurement methods for evaluating architectural modularity in JavaScript-based microservices. We finally discuss future directions of refining these metrics in the dynamic context of microservices design.</p>
      </abstract>
      <kwd-group>
        <kwd>software architecture</kwd>
        <kwd>microservices architecture</kwd>
        <kwd>software architecture metric</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>CEUR
ceur-ws.org</p>
    </sec>
    <sec id="sec-2">
      <title>1. Introduction</title>
      <p>
        The introduction of microservices architecture into the industrial technological landscape of
software development has altered the way applications are developed and deployed. Microservices
provide outstanding flexibility and scalability, allowing businesses to construct sophisticated
systems built of loosely connected, independently deployable services [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Within this paradigm,
JavaScript has become a common language for both frontend web development and backend
development, and its role has expanded to include microservices implementation. As the
implementation of microservices in JavaScript environments grows, it becomes increasingly
important to evaluate the architectural quality of these systems.
      </p>
      <p>
        However, previous research on software architecture metrics primarily focused on
objectoriented programming (OOP) languages such as Java. For example, Panichella et al. (2021)
investigated structural coupling in 17 Java-based open-source projects that used docker in their
implementation [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Milić et al. (2022) assessed the quality of software architecture in Java-based
Jakarta EE monolithic and microservice software architectures for architecture optimization
CEUR
Workshop
Proceedings
[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Zhong et al. (2023) measured coupling in 15 Java-based open-source projects with a little
business function that used Spring Cloud and used the most recent version of each project [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
Abadeh et al. (2023) introduced modularity vulnerability to assess the impact of module failure
on the modularity factor on 8 C# project designed as an object-oriented programming language
[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        To narrow down the gap between the practices (e.g., implementation by Javascript) and the
metrics (e.g., metrics for Java), we propose a method for measuring coupling and cohesion
to evaluate architectural modularity, specifically in the context of JavaScript-based
microservices. Modularity is regarded as a property that influences software robustness [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Coupling
and cohesion indicate the modularity or independence of services or modules, as well as the
maintenance efort [
        <xref ref-type="bibr" rid="ref2 ref4 ref6">2, 4, 6</xref>
        ]. Measuring those factors will assist developers in determining
whether changes in specific modules will have an impact on other modules [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. For cohesion,
we adopt the Chidamber and Kemerer Lack of Cohesion in Methods (LCOM). For coupling,
we measure abstractness and instability values. We then visualize the balance between those
values to understand whether the system is well-designed. We apply our metrics to an exampled
micro-service system, a so-called ticketing system, as a case study.
      </p>
      <p>The rest of this paper is organized as follows: Section 2 introduces the background of
architectural styles and technology used. Section 3 describes the implementation of architecture
and the metric used to evaluate it. Section 4 reports the results. Finally, Section 5 concludes the
ifndings and discusses future work.</p>
    </sec>
    <sec id="sec-3">
      <title>2. Background</title>
      <p>In this section, we brief the architectural styles and technologies employed in this research.</p>
      <sec id="sec-3-1">
        <title>2.1. Microservices</title>
        <p>
          Microservices are an architectural concept that divides complicated software systems into
smaller, self-contained parts that can be deployed independently without impacting the rest of
the system, allowing for more flexibility and agility. Furthermore, because of the small size of
the units and the independence of the services, they can be deployed frequently and quickly to
gather input and make adjustments to create a better system [
          <xref ref-type="bibr" rid="ref2 ref7 ref8">7, 8, 2</xref>
          ]
        </p>
        <p>
          The main characteristics of the Microservices Architecture (MSA) are:
1. Decomposition: A complicated system can be divided into more manageable
components, which facilitates development, maintenance, and scalability build based on business
capabilities [
          <xref ref-type="bibr" rid="ref7 ref8 ref9">7, 8, 9</xref>
          ].
2. Independence: Each microservice is self-contained, having its own code, data storage,
and, in certain cases, a database. The services may be replaced, upgraded, and scaled
without interfering with other services. This autonomy enables independent development,
deployment, and scalability [
          <xref ref-type="bibr" rid="ref7 ref8 ref9">7, 8, 9</xref>
          ].
        </p>
        <p>These characteristics make microservices architecture appropriate for software systems with
complexity, dynamic requirements, and rapid scalability.</p>
        <p>
          Microservices provide advantages but often create obstacles. As the system expands, it
becomes increasingly important to strike a balance between coupling and cohesiveness. Because
microservices are supposed to be loosely coupled, the complexities of maintaining low coupling
while retaining strong cohesion become increasingly apparent [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
        <p>
          Microservices architecture also poses a cost management problem owing to higher
infrastructure, operational, and development expenses. It is dificult to allocate expenses to services and
teams. Limiting expenditures while preserving system performance is a delicate balance [
          <xref ref-type="bibr" rid="ref10 ref7">7, 10</xref>
          ].
        </p>
        <sec id="sec-3-1-1">
          <title>2.1.1. JavaScript</title>
          <p>Because of its adaptability and widespread acceptance, JavaScript has become a popular choice
for deploying microservices in modern software development. JavaScript is an essential
programming language for modern software applications due to its flexibility in implementing
object-oriented or functional programming paradigms, a rich ecosystem of libraries, frameworks,
and tools, and widespread use in software development, including microservices and serverless
applications.</p>
          <p>Object-Oriented Programming (OOP) and Functional Programming (FP) are two separate
paradigms in JavaScript. OOP is all about constructing objects that contain data and functionality,
and it frequently involves inheritance via prototypes. This method provides structure but can
result in complicated inheritance hierarchies. In contrast, functional programming stresses
pure functions and immutable data, increasing predictability and modularity. Because of the
adaptability of JavaScript, developers may combine various paradigms, selecting the optimal
technique for their project’s goals and coding tastes.</p>
          <p>
            Versatility of JavaScript as an object-oriented or functional programming language makes
it perfect for implementing microservices. Developers can tailor their approach to meet the
demands of their services, ranging from standard object-oriented structures to data-driven
paradigms. This flexibility, however, can lead to compatibility concerns and complicated
communication across services, demanding well-defined interfaces and communication protocols
in order to preserve architecture integrity and cohesiveness. Therefore, measuring the
coupling and cohesion is really important to asses the adaptation of microservices and get insight
about maintenance efort, and warn the developer whether changes in service will harm the
other services. Furthermore, JavaScript processes incoming requests asynchronously, with a
single-thread processing model. For parallelized performance, many processes are required.
Microservices frequently employ many Docker containers for scaling up or scaling out, putting
additional strain on computers [
            <xref ref-type="bibr" rid="ref11 ref8">11, 8</xref>
            ]. Furthermore, the developer often orchestrates the
containers using kubernetes which enables dynamic load balancing, self-healing, eficient resource
allocation, and resilience, facilitates application scalability, and lets developers work with diverse
programming languages and technology stacks [
            <xref ref-type="bibr" rid="ref12">12</xref>
            ].
          </p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>3. Experimental Setup</title>
      <sec id="sec-4-1">
        <title>3.1. Microservices Implementation</title>
        <p>We employed a microservices architecture in our trial setup, with JavaScript as the major
programming language. Docker containers were used to encapsulate each microservice, providing
consistent and isolated settings. Kubernetes, a container orchestration technology, played a
critical role in managing, growing, and orchestrating these microservices.</p>
        <sec id="sec-4-1-1">
          <title>3.1.1. Ticketing System</title>
          <p>In our studies, we used a ticketing system1 as a case study to demonstrate the fundamentals
of microservices architecture. Figure 1 illustrates the architectural design, illustrating a clear
and comprehensive picture of the structure and component interactions of the ticketing system.
The system has five distinct services, and each service has its own set of functionality, as shown
in Table 1</p>
          <p>JavaScript was used to develop the systems. We utilize express.js as the backend framework.
The system is built as a Docker container and is orchestrated using Kubernetes.</p>
          <p>In this study, we manually analyze the code for each function or class to assess the additional
library use as well as the inter- and intra-service dependencies that will be counted as eferent
coupling. The sample of intra-service and inter-service dependencies from the ticketing system
is shown in Figure 2. As shown in Figure 2, the listener class or function from the services
is dependent on the publisher class or function from other services considering inter-service
dependency. The listener will be triggered to carry out their function if the publisher has an
execution function. The listener class will be impacted by modifications to the publisher’s
code or design. This coupling should be noticed by the developer. Consequently, even though
inter-services are not directly imported from the same class or function, they are nevertheless
computed as eferent couplings.</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>3.2. Modularity Metric</title>
        <p>
          We evaluated the microservices architecture using the modularity measure of the software
architecture. This metric was a critical indicator of the system design. By evaluating the
modularity of our microservices, we received significant insights into the architecture capability
to improve maintainability, reusability, and scalability. This metric also ensured that the system
components were properly separate and were capable of operating independently [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
        </p>
        <sec id="sec-4-2-1">
          <title>3.2.1. Software Architecture Metrics</title>
          <p>
            Software architecture metrics are critical elements of assessing and measuring the design
quality and performance of a software system. These metrics give objective assessments of
architectural characteristics like modularity, complexity, and connection. Developers and
architects may make knowledgeable judgments, uncover possible dificulties, and optimize
the design to fulfill particular goals and needs by examining these data. In essence, software
architectural metrics are critical for guaranteeing software system dependability, maintainability,
and scalability. Our primary focus in this study is on the modularity measure in the context of
software architecture. We carefully studied how efectively the system’s components could be
divided into self-contained modules and evaluated the degree of independence these modules
demonstrated. Modularity describes a logical grouping of similar code, such as classes in an
object-oriented language or functions in a structured or functional language. Most programming
languages have techniques for modularity [
            <xref ref-type="bibr" rid="ref13 ref14">13, 14</xref>
            ].
          </p>
          <p>This study will specifically assess modularity by assessing the amount of coupling and
cohesion within the software architecture. Measuring coupling allows us to examine the
interdependence of distinct modules, whereas measuring cohesion determines the strength of
logical linkages inside specific modules.</p>
        </sec>
        <sec id="sec-4-2-2">
          <title>3.2.2. Cohesion</title>
          <p>
            Cohesion defines the degree to which a module’s elements are contained inside it, demonstrating
their relative connection. A coherent module should be packed together since splitting it up
would necessitate coupling it through calls across modules [
            <xref ref-type="bibr" rid="ref14">14</xref>
            ].
          </p>
          <p>
            We assess cohesion using the LCOM metric. The Chidamber and Kemerer Lack of Cohesion
in Methods (LCOM) metric assesses the structural cohesiveness of a module, which is typically
a component [
            <xref ref-type="bibr" rid="ref14">14</xref>
            ]. The metric determines if a class breaches the single-responsibility principle
by constructing a dependency network between all methods and fields. It counts the number
of components that are not linked. In an ideal environment, this value would be 1, but if it
is greater, the class can be divided into smaller ones [
            <xref ref-type="bibr" rid="ref15">15</xref>
            ]. The LCOM is calculated using an
equation that is described in equation 1
 =
          </p>
          <p>| | − ||,  | | &gt; ||
{0 otherwise
(1)</p>
          <p>P is the number of methods that do not access shared variables while Q is the number of
shared variables.</p>
        </sec>
        <sec id="sec-4-2-3">
          <title>3.2.3. Coupling</title>
          <p>Coupling in software design refers to the degree of interdependence or connection between
distinct components or modules inside a system. It measures how tightly these components
rely on one another. Strong coupling indicates considerable dependency, while weak coupling
shows greater independence. Coupling can be measured by calculating abstractness, instability,
and distance from the main sequence.</p>
          <p>
            Abstractness is defined as the ratio of abstract artifacts (classes, interfaces) to concrete objects
(implementation). It compares abstraction to implementation. No abstractions resulting in a
single function, while too many abstractions make it dificult for developers to comprehend
how things work together [
            <xref ref-type="bibr" rid="ref14">14</xref>
            ]. Abstractness is calculated by equation 2. In equation 2,   is
the number of abstract element while   is the number of concrete objects.
          </p>
          <p>=
∑  
∑</p>
          <p>
            The instability metric assesses the volatility of a code base. High instability suggests a higher
likelihood of breaking pieces of code as a result of intense coupling, such as when a functionality
is distributed to numerous classes [
            <xref ref-type="bibr" rid="ref8">8</xref>
            ]. Instability measured by aferent coupling and eferent
coupling. Eferent coupling is the number of outside modules used by the current module, or it is
simply the number of outside modules or libraries imported by the current module. Meanwhile,
aferent coupling is the number of outside modules that use current module [
            <xref ref-type="bibr" rid="ref10 ref14">10, 14</xref>
            ]. Instability
scores are measured using equation 3.
          </p>
          <p>=
    +</p>
          <p />
          <p>The distance metric expects an ideal balance of abstractness and instability, allowing
developers to measure the distance from the main sequence metric for classes that are close to this
idealized line illustrated in Figure 3</p>
          <p>
            In an ideal scenario, a well-structured module or service should indeed exist in the ”green
area” , which represents a state of optimal balance of abstractness and instability [
            <xref ref-type="bibr" rid="ref14">14</xref>
            ]. This
zone signifies that the module maintains just the right level of interconnection with other
components, neither overly entangled nor excessively isolated.
(2)
(3)
          </p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>4. Experiment Result</title>
      <sec id="sec-5-1">
        <title>4.1. Cohesion</title>
        <p>As for cohesion metric, Figure 4 illustrates the result of cohesion evaluation by LCOM. Figure 4
shows a remarkable pattern in which all services earn an LCOM score of 1. This assessment
demonstrates that the services portrayed have a consistent and unified design. Services with
an LCOM score of 1 are frequently easier to understand, manage, and alter since they have a
concentrated and self-contained structure.</p>
        <p>The framework utilized in this ticketing system emphasizes the Single Responsibility Principle
(SRP) while creating routing APIs to guarantee that each route handler function inside the
system is focused on a single, well-defined responsibility. This not only improves cohesiveness
but also simplifies maintenance and encourages reusability.</p>
      </sec>
      <sec id="sec-5-2">
        <title>4.2. Coupling</title>
        <p>We discovered that the eferent coupling exceeded the aferent coupling in our coupling measure
evaluation illustrated in Figure 5 (a), suggesting that there were more dependencies outside the
system components than within. The integration of external libraries into the codebase, which
naturally produced stronger eferent coupling by generating dependency on other resources,
was the fundamental cause of this diference. Despite the external dependencies, the overall
system instability remained substantial, emphasizing the importance of careful control of these
external dependencies.</p>
        <p>However, in our coupling metric assessment, we received a 0 score in abstractness, according
to Express.js default design philosophy of simplifying web routing. This score indicates that
Express.js reduces the need for complicated abstraction layers, as its fundamental design handles
HTTP routing complexity eficiently. Rather than adding levels of abstraction, Express.js
encourages developers to create routes and associated handlers directly.</p>
        <p>The overall performance of the ticketing system in coupling is remarkable, with a balanced
ratio between abstractness and instability shown in Figure 5 (a). Among all services, Orders
and Auth services are visually closest to the green area.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>5. Conclusion</title>
      <p>Our studies employed the ticketing system as a real-world case study to evaluate the modularity
metric inside a JavaScript-based microservices architecture. We examined the subtle balance
of coupling and cohesion, evaluating the interdependencies among system components while
ensuring that each module remained self-contained and focused on specific tasks. This study
reinforces the relevance of modularity and coherent design in microservices, demonstrating
their potential to improve maintainability and flexibility in software systems.</p>
      <p>In future studies, we plan to deepen our understanding of software architecture metrics and
investigate other assessment methodologies to improve decision-making abilities for
maintaining software architecture. We want to broaden our knowledge base by looking at other metrics
that might give more information about software architecture. Furthermore, we intend to
conduct research that will lead to the creation of practical and user-friendly tools for assessing
these metrics.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>D. R.</given-names>
            <surname>Apolinário</surname>
          </string-name>
          ,
          <string-name>
            <surname>B. B. de França</surname>
          </string-name>
          ,
          <article-title>A method for monitoring the coupling evolution of microservice-based architectures</article-title>
          ,
          <source>Journal of the Brazilian Computer Society</source>
          <volume>27</volume>
          (
          <year>2021</year>
          )
          <fpage>17</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>S.</given-names>
            <surname>Panichella</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. I.</given-names>
            <surname>Rahman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Taibi</surname>
          </string-name>
          ,
          <article-title>Structural coupling for microservices</article-title>
          ,
          <source>arXiv preprint arXiv:2103.04674</source>
          (
          <year>2021</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>M.</given-names>
            <surname>Milić</surname>
          </string-name>
          ,
          <string-name>
            <surname>D.</surname>
          </string-name>
          Makajić-Nikolić,
          <article-title>Development of a quality-based model for software architecture optimization: A case study of monolith and microservice architectures</article-title>
          ,
          <source>Symmetry</source>
          <volume>14</volume>
          (
          <year>2022</year>
          ). URL: https://www.mdpi.com/2073-8994/14/9/1824. doi:
          <volume>10</volume>
          .3390/sym14091824.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>C.</given-names>
            <surname>Zhong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Zhang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Feitosa</surname>
          </string-name>
          ,
          <article-title>On measuring coupling between microservices</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>200</volume>
          (
          <year>2023</year>
          )
          <fpage>111670</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>M. N.</given-names>
            <surname>Abadeh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mirzaie</surname>
          </string-name>
          ,
          <article-title>An empirical analysis for software robustness vulnerability in terms of modularity quality, Systems Engineering (</article-title>
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Silva</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Tuyishime</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Santilli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Pelliccione</surname>
          </string-name>
          , L. Iovino,
          <article-title>Quality metrics in software architecture</article-title>
          ,
          <source>in: 2023 IEEE 20th International Conference on Software Architecture (ICSA)</source>
          , IEEE,
          <year>2023</year>
          , pp.
          <fpage>58</fpage>
          -
          <lpage>69</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>D.</given-names>
            <surname>Shadija</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Rezai</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Hill</surname>
          </string-name>
          ,
          <article-title>Towards an understanding of microservices</article-title>
          ,
          <source>in: 2017 23rd International Conference on Automation and Computing (ICAC)</source>
          , IEEE,
          <year>2017</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>K.</given-names>
            <surname>Bakshi</surname>
          </string-name>
          ,
          <article-title>Microservices-based software architecture and approaches</article-title>
          , in: 2017 IEEE aerospace conference, IEEE,
          <year>2017</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>8</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Waseem</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Liang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Shahin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. Di</given-names>
            <surname>Salle</surname>
          </string-name>
          , G. Márquez, Design, monitoring, and
          <article-title>testing of microservices systems: The practitioners' perspective</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>182</volume>
          (
          <year>2021</year>
          )
          <fpage>111061</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>H.</given-names>
            <surname>Vural</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Koyuncu</surname>
          </string-name>
          ,
          <article-title>Does domain-driven design lead to finding the optimal modularity of a microservice?</article-title>
          ,
          <source>IEEE Access 9</source>
          (
          <year>2021</year>
          )
          <fpage>32721</fpage>
          -
          <lpage>32733</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>T.</given-names>
            <surname>Ueda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Nakaike</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ohara</surname>
          </string-name>
          ,
          <article-title>Workload characterization for microservices, in: 2016 IEEE international symposium on workload characterization (IISWC)</article-title>
          , IEEE,
          <year>2016</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>K.</given-names>
            <surname>Sethi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Cai</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Wong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Garcia</surname>
          </string-name>
          ,
          <string-name>
            <surname>C.</surname>
          </string-name>
          <article-title>Sant'Anna, From retrospect to prospect: Assessing modularity and stability from software architecture</article-title>
          ,
          <source>in: 2009 Joint Working IEEE/IFIP Conference on Software Architecture &amp; European Conference on Software Architecture</source>
          , IEEE,
          <year>2009</year>
          , pp.
          <fpage>269</fpage>
          -
          <lpage>272</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>N.</given-names>
            <surname>Ford</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Parsons</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Kua</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Sadalage</surname>
          </string-name>
          ,
          <article-title>Building evolutionary architectures, ”</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          , Inc.”,
          <year>2022</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>M.</given-names>
            <surname>Richards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Ford</surname>
          </string-name>
          ,
          <article-title>Fundamentals of software architecture: an engineering approach,</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          ,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>C.</given-names>
            <surname>Ciceri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Farley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Ford</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Harmel-Law</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Keeling</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Lilienthal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Rosa</surname>
          </string-name>
          ,
          <string-name>
            <surname>A. von Zitsewitz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Weiss</surname>
          </string-name>
          , E. Woods,
          <article-title>Software Architecture Metrics: Case Studies to Improve the Quality of Your Architecture</article-title>
          ,
          <source>O'Reilly</source>
          ,
          <year>2022</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>