Skip to main content

NFRs and how to tackle them?

1. Decision Framework for NFRs

Here’s a step-by-step process you can follow:

  1. Elicit and quantify the quality attributes / NFRs

    • Gather from stakeholders (business, operations, security, compliance) what qualities they need: e.g., “system must respond within 2 seconds 95% of time”, “uptime 99.9%”, “must support 1000 concurrent users”, “must be maintainable by small team for 10+ years”, etc.

    • For each NFR, aim for a measurable target (so you can trade-off).

    • Use a structured taxonomy: e.g., from ISO/IEC 25010:2011: reliability, performance efficiency, security, maintainability, portability etc. jageshwartripathi.blogspot.com

  2. Assess constraints and context

    • What is the environment? (Bare-metal, K8s on OpenStack, VMware Cloud) — you know your deployment scenarios.

    • What is legacy/obsolescence risk? What existing systems are you integrating with?

    • What is the budget/time-to-market? What organisational capabilities (DevOps, SRE, monitoring) are in place?

    • What regulatory/compliance requirements apply?

  3. Prioritise NFRs

    • You cannot optimise for everything; trade-offs are inevitable.

    • Use stakeholder priorities: for you you said cost-saving, simplification, risk-management are key.

    • Map NFRs to those priorities (for instance: maintainability and simplicity support cost-saving; reliability and security support risk-management).

    • Decide: which NFRs are must haves (non-negotiable), which are nice to have, which are optional.

  4. Analyse architectural implications

    • For each NFR / quality attribute, what architectural patterns/tactics support it? E.g., for high availability you might choose active-active deployment, fault-tolerance, microservices; for performance you might choose caching, asynchronous processing, etc. The blog mentions “tactics” as specific design decisions. jageshwartripathi.blogspot.com

    • Evaluate cost, risk, complexity of each design option.

  5. Make trade-offs and document decisions

    • Use a decision matrix: list NFRs, target metrics, architectural options, cost/benefit, risk, dependencies.

    • Document why you made the choices (so future architects & maintainers understand).

    • Revisit decisions as system and business context evolve (especially relevant in your modernization roadmap).

  6. Validate & monitor

    • Once built, validate that the system meets the NFR targets (via testing, monitoring, KPIs).

    • Monitor drift (e.g., new features may degrade performance, or tech debt may erode maintainability).

    • Use the metrics to feed back into the architecture.

 

2. Key Deciding Factors or Criteria

When deciding which NFRs to emphasise, use these criteria:

Criterion What to Ask Why it matters
Business impact What happens if this attribute fails (e.g., slow performance, outage, security breach)? Helps prioritise based on risk & value.
Cost/effort What is the cost (development, infrastructure, operational) of achieving a given target? Ensures you choose feasible goals.
Operational capability Do we have people/processes/monitoring to sustain this attribute? A tall target without ops capability may fail.
Time-to-market Does achieving this attribute delay delivery significantly? Sometimes you must sacrifice or phase in quality.
Technical debt/legacy burden Are there legacy constraints that make achieving this attribute hard? You may need to plan for modernization or some “good enough” trade-off.
Scalability/future growth Will the system need to grow in load/users/features? Ensures you aren’t building for today only.
Compliance/regulatory risk Does meeting/regulating this attribute avoid legal/regulatory risk? Sometimes non-negotiable (e.g., security, audit logging).
Maintainability/obsolescence What is the expected lifecycle, how easy will it be to change/extend? Over your modernization roadmap (2025+), maintainability becomes critical.


3. Choices and Architectural Implications

Here’s how some common NFRs map to architectural decisions, especially in your very landscape:

  • Performance / Efficiency

    • How many concurrent users, what response times, what throughput?

    • Choices: caching layers (in-memory, CDN), asynchronous messaging, microservices to split hot paths, vertical/horizontal scaling, denial of “single large monolith” if that impedes performance.

    • For your stack: e.g., front-end Angular + back-end SpringBoot — might choose reactive/non-blocking APIs, use a caching tier (Redis/Memcached), use asynchronous queues (Kafka, RabbitMQ).

  • Reliability / Availability / Fault Tolerance

    • What is the acceptable downtime? What happens on failure of component?

    • Choices: multi-region deployment, active-active vs active-passive, microservices to isolate failure, circuit breakers, graceful degradation.

    • For your deployment: if using K8s on OpenStack/VMware, choose cluster failover, node pools, automated self-healing.

  • Security

    • What threats exist (data breach, insider threat, regulatory compliance)? What level of risk is acceptable?

    • Choices: encryption at rest/in transit, zero-trust architecture, least-privilege access, identity & access management, security testing.

    • Given your portfolio: multiple systems (Java, PHP, legacy), you might emphasise a centralized identity service, API gateway, secure data flows.

  • Maintainability / Modifiability

    • How easy is it to change/extend the system? What is expected lifespan?

    • Choices: modular architecture, clear separation of concerns, use of domain-driven design, decoupling, clean code, automated tests, microservices vs monolith trade-off.

    • Because you mentioned portfolio simplification and cost-saving, invest in maintainability reduces long-term cost.

  • Portability / Deployability

    • How easy is the system to deploy in different environments (bare-metal, cloud, hybrid)?

    • Choices: containerization (Docker/K8s), infrastructure as code (Terraform/Ansible), standardize deployment pipelines, avoid heavy vendor lock-in.

    • Given your stack: you already have bare-metal, K8s, VMware — portability/consistency in deployment matters.

  • Scalability / Capacity

    • How will load increase? What is expected growth?

    • Choices: design for horizontal scaling, stateless services, sharding, partitioning, elasticity.

    • For your large document-archive scenario (183k docs, 8k new each year) the knowledge graph/content-management system needs to scale gracefully.

  • Usability / Operability / Supportability

    • How easy is it for users/operators to use/support the system?

    • Choices: good UI/UX, logging/monitoring, dashboards, self-service, automation of operations.

    • Considering your aim: delivering more efficient publishing workflow (single-source publishing) means usability and operability are key.

  • Cost / Resource Efficiency

    • What is the acceptable cost (capital & operational)? What is the resource footprint (CPU, memory, licences)?

    • Choices: serverless vs dedicated, cloud vs on-prem, rightsizing infrastructure, shared services.

    • Since cost-saving is a priority, you might emphasise resource efficiency and reuse.

4. Putting It All Together – Example Decision Table

Here’s a simplified example of how you might build a table to guide architecture decisions:


NFRTarget MetricBusiness PriorityArchitectural Option(s)Cost / ComplexityDecision / Comments
Availability≥99.9% uptimeHighMulti-AZ deployment, health probes, auto-healing, DB failoverMediumDefault baseline; consider multi-region only for critical services
ReliabilityMTTR <30 min; no data lossHighReplication, retries/idempotency, circuit breaker, backupsMediumRequired for transactional domains
Performancep95 <2 s; throughput ≥X rpsMediumCaching, async processing, read replicas, optimized queriesMediumOptimize hotspots based on telemetry
Scalability10× load in 2 yrsMediumStateless services, autoscaling, sharding, event-drivenMediumDesign elastic; scale components independently
SecurityZero critical vulns; audit passHighIAM, encryption, secrets mgmt, API gateway, DevSecOpsHighNon-negotiable baseline
MaintainabilityDeploy <1 week; low MTTRHighCI/CD, observability, standard frameworks, IaCMediumKey modernization driver
ModifiabilityFeature change <2 weeksMediumModular services, clean interfaces, feature flagsMediumEnables roadmap agility
InteroperabilityStd APIs; versioned contractsMediumAPI-first, canonical model, adapters/eventsMediumRequired for ecosystem integration
Testability≥80% auto tests; env parityMediumDI, contract tests, service virtualization, CIMediumNeeded for safe delivery
Cost EfficiencyUnit cost ↓ YoYHighAutoscale, right-size, serverless where fit, tiered storageMediumGovern via FinOps metrics
PortabilityCloud & on-prem deployMediumContainers, Kubernetes, IaCMediumConstrain to justified workloads

Comments

Popular posts from this blog

Example 1: ArchiMate relationship in PlantUML code to demonstrate 15 relationship types

 Following section presents 15 types of relationships in ArchiMate and PlantUML to generate the diagram. Since this code is generated by GEN-AI it may require precision on aspects other than PlantUML syntax: Diagram Plant UML Code:  @startuml '!includeurl https://raw.githubusercontent.com/plantuml-stdlib/Archimate-PlantUML/master/Archimate.puml ' Another way of including Archimate Library (above is commented for following) !include <archimate/Archimate> !theme archimate-standard from https://raw.githubusercontent.com/plantuml-stdlib/Archimate-PlantUML/master/themes title ArchiMate Relationships Overview <style> element{     HorizontalAlignment: left;     MinimumWidth : 180;     Padding: 25; } </style> left to right direction rectangle Other {     Business_Role(Role_SeniorManager, "Senior Manager")     Business_Role(Role_Manager, "Manager") } rectangle Dynamic {     Business_Event(Event_CustomerReques...

Examples 7: ArchiMate flow relationship between elements in layers

Diagram Code @startuml !include < archimate / Archimate > < style > element {     HorizontalAlignment : left ;     MinimumWidth : 180 ;     Padding : 20 ; } note {     BackgroundColor : #FFFFCC ;     RoundCorner : 5 ;     MaximumWidth : 250 ; } </ style > title "ArchiMate 3.2 Valid Flow Relationships" left to right direction ' Business Layer Flow Relationships rectangle "Business Layer Flows" {     Business_Process ( bp1 , "Order Process" )     Business_Process ( bp2 , "Payment Process" )     Rel_Flow ( bp1 , bp2 , "Order data" )     note on link         Flow between Business Processes     end note         Business_Function ( bf1 , "Sales Function" )     Business_Function ( bf2 , "Delivery Function" )     Rel_Flow ( bf1 , bf2 , "Sales information" )     note on link     ...

Mastering Trade-Off Analysis in System Architecture: A Strategic Guide for Architects

 In system architecture and design, balancing conflicting system qualities is both an art and a science. Trade-off analysis is a strategic evaluation process that enables architects to make informed decisions that align with business goals and technical constraints. By prioritizing essential system attributes while acknowledging inevitable compromises, architects can craft resilient and efficient solutions. This enhanced guide provides actionable insights and recommendations for architects aiming to master trade-off analysis for impactful architectural decisions. 1. Understanding Trade-Off Analysis Trade-off analysis involves identifying and evaluating the conflicting requirements and design decisions within a system. Architects must balance critical aspects like performance, scalability, cost, security, and maintainability. Since no system can be optimized for every quality simultaneously, prioritization based on project goals is essential. Actionable Insights: Define key quality ...