Listen to Dave Farley’s video below:

When I saw his tweet and the title of the video, “Non-Functional Requirements” are STUDID I smiled, favorited his tweet and pinned it in my mind to return to the ideas. I was in a discussion recently about developing regional standards around the role of a Software Engineer.

My colleague and I were reviewing a proposal and the term “Non-Functional Requirements” came up. My role was to validate terminology, principles, ideas and philosophies expressed in the proposal for the Trinidad and Tobago context. The note I shared to my colleague was close to “No… we don’t call it that, and don’t think about those things in that way”.

Really, the things called Non-Functional are often critical quality attributes of the system. I don’t know how come it’s taken so long for more noise to be made, but those things should definitely not be thought of as Non-Functional. It creates such a dissonance.

Often, it teaches engineers to see those requirements as afterthoughts, consider them some time after you’ve done the “Functional Requirements”. In my experience, things considered “NFR” have led to whole rewrites, either due to security, scalability, reliability or other concerns.

My team and I settled on a borrowed term to give the consideration its appropriate prominence - Quality of Service Attributes. The list varies in size based on specific context, but it feels much more apropos to what we’re trying to do, which is build with those attributes in mind, and drive the entire software engineering activity in the right direction from the start.

When writing software, considering quality of service (QoS) attributes is crucial to ensure that the software meets user expectations and performs reliably.

I’m listing a few here for reference:

These QoS attributes should be considered throughout the software development lifecycle, from initial design and architecture to testing, deployment, and ongoing maintenance. Balancing these attributes appropriately is essential to delivering high-quality software that meets user expectations.