The raw materials of real engineering: steel, concrete, water, air, soil, electomagnetic waves, electricity, obey the laws of physics.
Software of course, does not.
Engineering is primarily about meeting trivial functional requirements and complex technical requirements using materials that obey the laws of physics.
I was asked recently whether the definitions – Functional and Non-Functional – are useful.
My conclusion was – at the least, they aren’t helpful. At worst debilitating. There’s probably half a dozen other themes in the initial statement but I’ll stick to this one.
There is a simple way of looking at F v NF requirements. FRs define what the system must do. NFRs define HOW that system delivers that functionality. e.g. is it secure, responsive, usable, etc.
To call anything ‘not something else’ can never be intuitively correct I would suggest if you need that definition to understand the nature of the concept in hand. Its a different dimension, perhaps. Non-functional means – not working doesn’t it?
Imagine calling something long, “not heavy”. It’s the same idea and it’s not helpful. It’s not heavy because you are describing a different attribute.
So, to understand the nature of Non-Functional Requirements, it’s generally easier to call them technical requirements and have done with it.
Some TRs, are functional of course, and that’s another confusion. Access control to data and function is a what, not a how. Security vulnerabilities are, in effect functional defects. The system does something we would rather it didn’t. Pen testing is functional testing. Security invulnerability is a functional requirement – it’s just that most folk are overcome by the potential variety of threats. Pen tests use a lot of automation using specialised tools. But they are specialised, non non functional.
These are functional requirements just like the stuff the users actually want. Installability, documentation, procedure, maintainability are ALL functional requirements and functional tested.
The other confusion is that functional behaviour is Boolean. It works or it doesn’t work. Of course, you can count the number of trues and falses. But that is meaningless. 875 out of 1000 test conditions pass. It could be expressed as a percentage, what exactly does that mean? Not much, until you look into the detail of the requirements themselves. One single condition could be several orders of magnitude more important than another. Apples and oranges? Forget it. Grapes and vineyards!
Technical behaviour is usually measurable on a linear scale. Performance and reliability for example (if you have enough empirical data to be significant) are measured numerically. (OK you can say meets v doesn’t meet requrements is a Boolean but you know what I mean).
Which brings me to the point.
In proper engineering, say civil/structural… (And betraying a prejudice, structural is engineering, civil includes all sorts of stuff that isn’t…)
In structural engineering, for example, the Functional requirements are very straight forward. With a bridge – say the Forth Bridge or the Golden Gate – built a long long time ago – the Functional requirements are trivial. “Support two railway lines/four lanes of traffic with travelling in both directions. (And a foot bridge for maintenance)”.
The Technical requirements are much more complex. 100% of the engineering discipline is focused on techical requirements. Masses of steel, cross sections, moments, stresses and strains. Everything is underpinned by the science of materials (which are extensively tested in laboratories, with safety factors applied), and tabulated in blue or green books full of tabulated cross sectional areas, beam lengths, cement/water ratios and so on. All these properties are calculated based on thousands of laboratory experiements, with statistical technques applied to come up with factors of safety. Most dams, for example, are not 100% safe for all time. they are typically designed to withstand 1 in 200 year floods. And they fail safely, because one guy in the design office is asked to explore the consequences of failure – which in the main are predictable.
Software does not obey the laws of physics.
Software development is primarily about meeting immensely complex functional requirements and relatively simple technical requirements using some ethereal stuff called software that very definitely does not obey laws at all. (Name one? Please?)
Functional testing is easy, meeting functional requirements is not. Technical testing is also easy, meeting technical requirements is (comparatively) easy.
This post isn’t about “non-functional requirements versus functional rerqurements.” It’s an argument saying ALL requirements are hard to articulate and meet. So there.