<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Arquitecto Software</title>
    <description>The latest articles on Forem by Arquitecto Software (@arquitectosoft1).</description>
    <link>https://forem.com/arquitectosoft1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F108975%2F28adf1f5-e502-4915-8c4a-a8ee1e0e3193.jpg</url>
      <title>Forem: Arquitecto Software</title>
      <link>https://forem.com/arquitectosoft1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/arquitectosoft1"/>
    <language>en</language>
    <item>
      <title>Non functional requirements: the pillars of a solid software architecture</title>
      <dc:creator>Arquitecto Software</dc:creator>
      <pubDate>Fri, 16 Nov 2018 21:25:23 +0000</pubDate>
      <link>https://forem.com/arquitectosoft1/non-functional-requirements-the-pillars-of-a-solid-software-architecture-2mbg</link>
      <guid>https://forem.com/arquitectosoft1/non-functional-requirements-the-pillars-of-a-solid-software-architecture-2mbg</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frl099ybsi3zorkvpgyo0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Frl099ybsi3zorkvpgyo0.jpg" alt="Non Functional Requirements"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;   &lt;/p&gt;

&lt;h2&gt;
  
  
  What are Non Functional Requirements in software architecture
&lt;/h2&gt;

&lt;p&gt;Previous to know about &lt;strong&gt;non functional requirements&lt;/strong&gt; it is important to know what is a requirement in software engineering.&lt;/p&gt;

&lt;p&gt;Requirements are the description of a services provided by a system and their operative restrictions.&lt;/p&gt;

&lt;p&gt;Discover, analyse, document and verify requirements is the process known as &lt;strong&gt;Requirement Engineering&lt;/strong&gt;. Requirements can be the base of a &lt;strong&gt;contract&lt;/strong&gt; offer or the base contract itself in software projects.&lt;/p&gt;

&lt;p&gt;There are several types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functional&lt;/strong&gt; requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Non functional&lt;/strong&gt; requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI&lt;/strong&gt; Requirements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain or &lt;strong&gt;Business&lt;/strong&gt; requirements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non functional requirements are directly related with &lt;strong&gt;emergent properties&lt;/strong&gt; of a software system and specify or restrict them. Examples of these properties are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reliability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Response time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Availability&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They can be much more &lt;strong&gt;critic&lt;/strong&gt; than any other requirement. As a result, a flight control system that does not meet reliability requirements will be insecure and therefore unusable.&lt;/p&gt;

&lt;p&gt;Non functional requirements arise, also known as &lt;strong&gt;Quality Attributes&lt;/strong&gt;, from the needs of users, budget restrictions, company politics, interoperability with other software or hardware, external factors like security regulations or privacy legislation.&lt;/p&gt;

&lt;p&gt;   &lt;/p&gt;

&lt;h2&gt;
  
  
  Why you should know about Non Functional Requirements
&lt;/h2&gt;

&lt;p&gt;Even if you are not a software architect, and you are a developer, taking care about non functional requirements it's crucial. It allows to deliver great features without compromising the whole system and add &lt;strong&gt;complexity&lt;/strong&gt; and &lt;strong&gt;technical debt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In order to &lt;strong&gt;evaluate&lt;/strong&gt; which software architecture is the best for a digital project, it is necessary to know first which are the non functional requirements for the same.&lt;/p&gt;

&lt;p&gt;Each software architecture style has different &lt;strong&gt;impact&lt;/strong&gt; on each Non functional requirement. E.g. &lt;a href="https://www.arquitectosoftware.com/docs/batch-sequential/" rel="noopener noreferrer"&gt;Batch Sequential&lt;/a&gt; architecture can have a negative impact in usability while a &lt;a href="https://www.arquitectosoftware.com/docs/mvc/" rel="noopener noreferrer"&gt;MVC architecture&lt;/a&gt; has a great perform in this area.&lt;/p&gt;

&lt;p&gt;   &lt;/p&gt;

&lt;h2&gt;
  
  
  Main Non Functional Requirements types
&lt;/h2&gt;

&lt;p&gt;In this section are described different types of Non Functional Requirements in the same order shown in &lt;a href="https://www.app.arquitectosoftware.com" rel="noopener noreferrer"&gt;Arquitecto Software&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Supportability
&lt;/h3&gt;

&lt;p&gt;Also known as a &lt;strong&gt;serviceability&lt;/strong&gt;, it refers to the ability of a software system to ease &lt;strong&gt;technical support&lt;/strong&gt; in some areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt; and configuration of the system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide information that is useful for identify exceptions, debug and isolate the root of problems. Also known as &lt;strong&gt;logging&lt;/strong&gt; or &lt;strong&gt;tracing&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor&lt;/strong&gt; health metrics of the system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good supportability results in more efficient maintenance and reduces operational costs.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Usability
&lt;/h3&gt;

&lt;p&gt;The usability is about how easy it's for a user to use the platform and achieve the expected results with &lt;strong&gt;effectiveness&lt;/strong&gt;, &lt;strong&gt;efficiency&lt;/strong&gt; and &lt;strong&gt;satisfaction&lt;/strong&gt;. These properties are addressed in &lt;a href="http://usabilitynet.org/trump/documents/Usability_standards.ppt.pdf" rel="noopener noreferrer"&gt;ISO/IEC 9126-4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usability includes the ability of being accessible to all people, even those with &lt;strong&gt;disabilities&lt;/strong&gt;. This can be accomplished implementing assistive technology in the UI, and providing text for all images and multimedia resources.&lt;/p&gt;

&lt;p&gt;Good usability results in better &lt;strong&gt;customer satisfaction&lt;/strong&gt;, more recommendations, and definitely can boost the organic growth of a company.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Life Time
&lt;/h3&gt;

&lt;p&gt;This requirement is related to &lt;strong&gt;System Development Life Cycle&lt;/strong&gt; (SDLC) in which a software system go through a series of &lt;strong&gt;Life-Cycle&lt;/strong&gt; phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Planning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requirement analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration and testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment and maintenance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disposal&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to &lt;strong&gt;discontinue&lt;/strong&gt; a software system, there is a process of transition to a new system. Design architectures that take this into account will facilitate &lt;strong&gt;migrations&lt;/strong&gt; in the future.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

&lt;p&gt;Cost can be the &lt;strong&gt;achilles heel&lt;/strong&gt; of a software project. There are a lot of elements to consider in the overall cost of a software architecture. The most outstanding examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt; cost: a more complexity architecture requires more qualified engineers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Costs associated to &lt;strong&gt;failure management&lt;/strong&gt; and recovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Backup&lt;/strong&gt; strategy costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt; needed to run the system: hardware, electricity, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Costs associated to system &lt;strong&gt;maintenance&lt;/strong&gt; and support.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clear costs example is the one that can be seen in &lt;strong&gt;monolithic vs. microservice costs&lt;/strong&gt; at the beginning of a project. A monoholitic app will be less expensive in resources and complexity management than a microservice architecture with orchestration.&lt;/p&gt;

&lt;p&gt;To highlight the importance of costs in software architectures there is a book with the title: "&lt;strong&gt;RCDA&lt;/strong&gt;: Architecting as a risk and cost management discipline"&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability
&lt;/h3&gt;

&lt;p&gt;Scalability refers to the capacity of maintain effective performance during a steep increase in workload without the need to be &lt;strong&gt;redesigned&lt;/strong&gt;. An example of this can be a peak of users using the software simultaneously.&lt;/p&gt;

&lt;p&gt;There are many different methods to scale an application and is largely subject to the architecture and behavior of the application. For &lt;strong&gt;microservices&lt;/strong&gt;, &lt;a href="http://theartofscalability.com/" rel="noopener noreferrer"&gt;Scale Cube&lt;/a&gt; defines primarily three approaches for scalability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Scale the x axis by horizontally cloning the application&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scaling the y axis by splitting different functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scaling the z axis by partitioning or sharding the data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more general approach for software architectures can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Horizontal&lt;/strong&gt; scalability (scale out): add or remove nodes to a system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vertical&lt;/strong&gt; scalability (scale up): add or remove resources to a node in a system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Reliability
&lt;/h3&gt;

&lt;p&gt;Also known as Mean Time Between/To Failures or &lt;strong&gt;MTBF/MTTF&lt;/strong&gt;. This requirement refers to the consistency in the anticipation of software operations. Therefore &lt;strong&gt;unreliability&lt;/strong&gt; is the result of unanticipated results of software operations.&lt;/p&gt;

&lt;p&gt;A common metric to measure reliability is the number of &lt;strong&gt;software faults&lt;/strong&gt; (known as &lt;strong&gt;bugs&lt;/strong&gt;), expressed as faults per thousand lines of code.&lt;/p&gt;

&lt;p&gt;The best way to mitigate bugs in software is to do good &lt;strong&gt;testing strategy&lt;/strong&gt;, therefore a software architecture easy to test could be more reliable than other architecture harder to test.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Concurrency
&lt;/h3&gt;

&lt;p&gt;Concurrency refers to the capacity of handle &lt;strong&gt;multiple computations&lt;/strong&gt; executing simultaneously, and potentially interacting with each other.&lt;/p&gt;

&lt;p&gt;A software architecture with high concurrency have clearly identified parts that can execute concurrently. E.g. a &lt;a href="https://www.arquitectosoftware.com/docs/pipe-and-filter/" rel="noopener noreferrer"&gt;Pipe and Filter software architecture&lt;/a&gt; with multiple &lt;strong&gt;pipelines&lt;/strong&gt; at the same time will be more concurrent than a &lt;a href="https://www.arquitectosoftware.com/docs/batch-sequential/" rel="noopener noreferrer"&gt;Batch Sequential software architecture&lt;/a&gt; that execute tasks in &lt;strong&gt;batches&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Concurrency also refers to the minimum, average and maximum number of &lt;strong&gt;simultaneous users&lt;/strong&gt; using the software.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;Performance refers to the &lt;strong&gt;amount of work&lt;/strong&gt; accomplished by a system and means the limiting factor in the end usability of the system.&lt;/p&gt;

&lt;p&gt;Is totally dependent of the needs of the project, but good performance involves &lt;strong&gt;different means&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For UI refers to a &lt;strong&gt;low latency&lt;/strong&gt;, less execution time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At server code refers to &lt;strong&gt;high throughput&lt;/strong&gt;, that is the rate of processing of work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In embedded architectures refers to low utilization of &lt;strong&gt;computing resources&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;a href="https://www.arquitectosoftware.com/docs/blackboard/" rel="noopener noreferrer"&gt;Blackboard software architecture&lt;/a&gt; has a good performance because all listeners and subscribers in this architecture can work in parallel.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;Security is a process of risk management that balances likely &lt;strong&gt;security risks&lt;/strong&gt; against the &lt;strong&gt;cost&lt;/strong&gt; of guarding against them.&lt;/p&gt;

&lt;p&gt;This requirement allows the owners of resources in the system to &lt;strong&gt;reliably control&lt;/strong&gt; who can perform what actions on particular resources. It implies many actions, some of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sensitive &lt;strong&gt;resources&lt;/strong&gt; identification and protection: permission evaluation over every action over every resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identification and &lt;strong&gt;authorization&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt; protection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Secure &lt;strong&gt;libraries&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security &lt;strong&gt;administration&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Information &lt;strong&gt;integrity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous &lt;strong&gt;monitorization&lt;/strong&gt; of vulnerabilities and threats.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;a href="https://www.arquitectosoftware.com/docs/broker/" rel="noopener noreferrer"&gt;Broker software architecture&lt;/a&gt; implies more security challenges than a &lt;a href="https://www.arquitectosoftware.com/docs/client-server/" rel="noopener noreferrer"&gt;Client Server architecture&lt;/a&gt; because the inherent networking complexities.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Availability
&lt;/h3&gt;

&lt;p&gt;Availability is the capacity of a software architecture to be &lt;strong&gt;fully or partially operational&lt;/strong&gt; when is required, and to effectively handle failures that could affect it.&lt;/p&gt;

&lt;p&gt;Some tactics and actions related to availability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;High-Availability hardware and load balancing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fault-tolerant software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Component replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zero downtime deployments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Design for failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backup and disaster recovery solutions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A service oriented architecture like microservices can use &lt;strong&gt;load balancing&lt;/strong&gt; between instances and ensure more availability than a client server architecture with server as a &lt;strong&gt;single point of failure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Simplicity
&lt;/h3&gt;

&lt;p&gt;Simplicity implies reduce responsibilities through &lt;strong&gt;software decomposition&lt;/strong&gt; and separation of concerns using clear &lt;strong&gt;interfaces&lt;/strong&gt;. The main goal of simplicity is to reduce complexity, this contributes to more maintainable and less costly systems.&lt;/p&gt;

&lt;p&gt;A well-known rule is &lt;strong&gt;KISS (Keep It Simple, Stupid)&lt;/strong&gt;, that states that most systems work best if they are kept simple rather than made complicated. Designing simple solutions is often a foundation to providing all other system qualities.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;centralized architecture&lt;/strong&gt; will be more simpler than a &lt;strong&gt;distributed architecture&lt;/strong&gt; because the inherent communications that distributed environment requires.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Reusability
&lt;/h3&gt;

&lt;p&gt;Reusability in software architecture refers to the degree in which parts of the architecture can be used in other software systems. It brings &lt;strong&gt;cost reduction&lt;/strong&gt; due to the reuse of known and tested software components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/docs/service-oriented/" rel="noopener noreferrer"&gt;Service Oriented architecture&lt;/a&gt; is a good candidate for reusability, e.g. a &lt;strong&gt;microservice&lt;/strong&gt; can be reusable in different systems.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt; refers the ability for the software architecture to adapt to possible or future changes in its requirements. A software architecture is flexible when its parts have &lt;strong&gt;low coupling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a system can evolve with only adding things, it says that system is &lt;strong&gt;very flexible&lt;/strong&gt;. Conversely, if it is needed to change architecture parts in order to evolve it, then it's not flexible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/docs/layered/" rel="noopener noreferrer"&gt;Layered architecture&lt;/a&gt; brings a lot of flexibility because parts of architecture are &lt;strong&gt;clear separated&lt;/strong&gt; and can be evolved.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Portability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Portability&lt;/strong&gt; in software architecture refers to degree in which the same architecture can be usable in different environments.&lt;/p&gt;

&lt;p&gt;One key factor element of portability is a clear abstraction between &lt;strong&gt;business logic&lt;/strong&gt; and system &lt;strong&gt;interfaces&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/docs/layered/" rel="noopener noreferrer"&gt;Layered architecture&lt;/a&gt; is very portable because parts of it architecture are &lt;strong&gt;clear separated&lt;/strong&gt; and can be separated to another environment. Conversely, &lt;a href="https://www.arquitectosoftware.com/docs/blackboard/" rel="noopener noreferrer"&gt;Blackboard architecture&lt;/a&gt; is less portable because of dependency between data store and its agents.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Testability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Testability&lt;/strong&gt; refers to the degree to which a software part of architecture supports testing in a given test context. High testability implies more facility to find software faults or bugs, that improves reliability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/docs/batch-sequential/" rel="noopener noreferrer"&gt;Batch Sequential&lt;/a&gt; is a very good candidate for testability because provides simpler divisions on subsystems that can be &lt;strong&gt;tested separately&lt;/strong&gt;, using mock data between them.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Maintainability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Maintainability&lt;/strong&gt; is about how easy the software system can be modified to correct faults, improve performance, or other attributes, or adapt to a changed environment.&lt;/p&gt;

&lt;p&gt;These are some &lt;strong&gt;metrics&lt;/strong&gt; used to measure maintainability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Technical debt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code smells.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cyclomatic Complexity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Source Lines Of Code (&lt;strong&gt;SLOC&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Besides that, a key factor to ensure maintainability is &lt;strong&gt;Mean Time To Repair&lt;/strong&gt; (MTTR), the average time required to repair a specific item or component from notification of a failure until to return it to working status.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Continuous Integration&lt;/strong&gt; cycles &lt;strong&gt;static code analysis&lt;/strong&gt; are executed in order to measure previous metrics, &lt;a href="https://www.sonarqube.org/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt; is a good option to do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/docs/layered/" rel="noopener noreferrer"&gt;Layered architecture&lt;/a&gt; is a good candidate for maintainability due to separation of concerns.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this post is explained what are requirements in software engineering, and &lt;strong&gt;Non Functional Requirements&lt;/strong&gt; at a deep level.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;software architecture styles&lt;/strong&gt; that performs better than others for a specific non functional requirements, therefore its crucial to evaluate a style for all of them before to select the best style for a project.&lt;/p&gt;

&lt;p&gt;There are a lot of &lt;strong&gt;Non Functional Requirements&lt;/strong&gt; to take in account, but the most important are: supportability, usability, lifetime, cost, scalability, reliability, concurrency, performance, security, availability, simplicity, reusability, flexibility, portability, testability and maintainability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.app.arquitectosoftware.com" rel="noopener noreferrer"&gt;Arquitecto Software&lt;/a&gt; makes this process automatically, evaluating Non Functional Requirements against architecture styles and showing which one is the best option.&lt;/p&gt;

&lt;p&gt;Post also published on &lt;a href="https://medium.com/@arquitectosoftware/non-functional-requirements-the-pillars-of-a-solid-software-architecture-98657e2c0f2e" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>softwarearchitecture</category>
      <category>software</category>
      <category>development</category>
    </item>
    <item>
      <title>Arquitecto Software Beta Launch</title>
      <dc:creator>Arquitecto Software</dc:creator>
      <pubDate>Sat, 20 Oct 2018 17:18:11 +0000</pubDate>
      <link>https://forem.com/arquitectosoft1/arquitecto-software-beta-launch-3aea</link>
      <guid>https://forem.com/arquitectosoft1/arquitecto-software-beta-launch-3aea</guid>
      <description>

&lt;p&gt;Today 20 Oct. is the launch of first beta version of &lt;a href="https://www.arquitectosoftware.com/"&gt;Arquitecto Software&lt;/a&gt;, a Saas platform that aims to help all software makers to improve their processes in product building. But how it borns ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q_z7cqmN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/enwej9r409z7t2mlll0g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q_z7cqmN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/enwej9r409z7t2mlll0g.jpg" alt="Arquitecto Software Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;The problem&lt;/h2&gt;

&lt;p&gt;Different software projects requires different software architecture styles and different tech stacks / frameworks based on the requirements.&lt;/p&gt;

&lt;p&gt;The problem is the waste of time researching what is the best architecture to use in each case and looking for frameworks to implement it. This is why many software projects can end in failure, software projects need very qualified CTOs / software architects in order to decide the best technology for projects.&lt;/p&gt;

&lt;p&gt;In many situations you choose some frameworks, and days or weeks later you discover there is better frameworks to do what you are trying to do, but it’s too late to change your stack, you have already invested time / money.&lt;/p&gt;

&lt;h2&gt;The solution&lt;/h2&gt;

&lt;p&gt;To solve the previous problem, i’m building a software platform to help in the process of software architecture selection and frameworks discovery. This is how Arquitecto Software born.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.arquitectosoftware.com/"&gt;Arquitecto Software&lt;/a&gt; allows users to select the thematic and non functional requirements (Quality Attributes) of their projects, and finds what are the best software architecture styles and related open-source frameworks to implement them.&lt;/p&gt;

&lt;h2&gt;The launch&lt;/h2&gt;

&lt;p&gt;Today 20 Oct. i launched the &lt;a href="https://www.arquitectosoftware.com/"&gt;Arquitecto Software&lt;/a&gt; on &lt;a href="https://www.indiehackers.com/forum/show-ih-arquitecto-software-the-software-architect-that-never-sleeps-beta-c1172884bf"&gt;IndieHackers&lt;/a&gt;, &lt;a href="http://hn.premii.com/#/article/18262590"&gt;HackerNews&lt;/a&gt;, &lt;a href="https://getmakerlog.com/tasks/10604"&gt;MakerLog&lt;/a&gt; and &lt;a href="https://medium.com/@arquitectosoftware/arquitecto-software-beta-launch-913a6b194a68"&gt;Medium&lt;/a&gt;. The main goal is to measure the impact in developer communities, get feedback and plan next features and improvements in order to get a great and consistent first version, to be able to launch it in Product Hunt and BetaList.&lt;/p&gt;

&lt;h2&gt;Feedback&lt;/h2&gt;

&lt;p&gt;I would really appreciate all feedback of &lt;a href="https://www.arquitectosoftware.com/"&gt;Arquitecto Software&lt;/a&gt;, i invite you to try it and report me your thoughts, this can take you seconds, and are a great source of value for me, because behind this there is a lot of work, struggle, and many hours. You can send me your feedback by email, twitter or in the contact forms of platform &lt;a href="https://www.app.arquitectosoftware.com/#/contacto"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks in advance&lt;/p&gt;


</description>
      <category>devtools</category>
      <category>softwarearchitecture</category>
      <category>softwareproductivity</category>
    </item>
  </channel>
</rss>
