**1. Introduction**

Software is omnipresent. From personal computers and laptops, it has extended its presence to tablets, smartphones, smart watches, and wristbands. From software packages delivered on CDs, it has moved to apps and services which run uninterruptedly on remote servers. From our professional workplace, it has conquered our personal lives, relationships, and leisure activities.

We could see this as proof of the success of the software industry, the technology revolution. But is it? What does success represent exactly, in societal terms? Are we solving people's problems, or rather are we creating new ones? In order to make this argument more objective, we need to define success. We can argue that success of the software industry is proved by its constant innovation. But innovation is not necessarily equal to progress, which should be the key indicator in terms of societal benefit.

According to Wikipedia, "progress is the movement towards a refined, improved, or otherwise desired state (...), the idea that advancements in technology, science, and social organization can result in an improved human condition" [1]. Arguably, we seem to be constantly producing advancements in technology, but it has also become evident that the technology advancements we are producing are not improving the condition of all humans equally. Mass media is regularly hit by news where "algorithms" are revealed as biased, showing behaviors which are sexist, racist, LGBTI-phobic, etc. Software leaves minorities out, and apps discriminate on bases of age or socioeconomic status [2]. Be it in recruiting [3], evaluating risk for a financial product, assigning probability of crime involvement [4, 5], targeting adds [3], or classifying our pictures [6], the direct consequence of these errors is blatant failure.

Of course, there are many angles to this systemic problem. In this chapter, we will analyze how we can contribute to progress, ensuring the success of our software product, from the perspective of software architecture.

Software architecture is the part of software development which defines the high-level decomposition of a system into a set of functional components and describes its responsibilities and interactions. A software architect is thus responsible for selecting those components, defining said interactions, and describing the constraints that operate over both of them. These decisions are grounded on both functional and non-functional requirements of the software and will serve as basis for the design, implementation, and testing stages (no matter which development cycle is used).

Consequently, one of the most important skills of a software architect is asking the relevant questions which answers can make the difference between product success and failure. The said questions need to provide confidence in that both functional and non-functional requirements are correctly elicited, understood, and quantified, as a mandatory previous step to allow their correct development and validation. In particular, failure to properly define non-functional requirements (also referred to as "system requirements") is the third cause of software project failure [7].

In the remainder of this chapter we will go over the definition of non-functional requirement and provide a taxonomy for practical use. We will identify the nonfunctional requirements that are more closely related to software success in terms of societal progress. We will discuss them and provide insights on how to extract and test them.

The aim we pursue by doing this is to hand in a handbook of rules, an enhanced checklist, that would be useful for practitioners and future professionals that want to specialize in the area of software architecture. We trust the contents that follow will spark their interest in and concern about really successful software, as well as be a useful guide in building it. However, by keeping our technical level purposely abstract, we aim to make this chapter readable for the general public as well, a general public who, as massive consumer of software products, can also benefit from awareness about what kind of successful products they can and should be demanding from the software industry.
