2024-03-20

What vs. How - Functional vs. Non-Functional - Any Benefit?


Edsger W. Dijkstra, a pioneering figure in computer science, introduced many influential concepts and philosophies that have shaped the field. Among his contributions is the insightful perspective on the distinction between "what" a system or program is supposed to do (its specifications) and "how" it accomplishes those tasks (its implementations). Dijkstra argued that the difference between "what" and "how" is not absolute but relative, depending on the level of abstraction or perspective from which a system is viewed. This idea challenges the traditional binary separation of concerns in software engineering, particularly the division between functional (what) and non-functional (how) requirements.

Dijkstra's Perspective on "What" vs. "How"

Levels of Abstraction

Dijkstra suggested that any aspect of a system could be viewed either as a "what" or a "how," depending on the level of abstraction. At a higher level of abstraction, the focus is on "what" the system is supposed to achieve—its goals, functionalities, and the problems it aims to solve. When viewed from this perspective, the specific algorithms, data structures, or technologies used to realize these functionalities are not of concern; these are the "hows" relegated to lower levels of abstraction.

As one delves deeper into the system, moving to lower levels of abstraction, the "hows" of the higher level become the "whats" of the current level. For example, a high-level requirement (what) might be to securely authenticate users. At a lower level, the "how" to achieve this might involve implementing specific cryptographic algorithms. Yet, at an even lower level, the focus shifts to the specifics of the algorithm implementation, making the algorithm the "what" and its coding and optimization the "how."

Implications for Software Engineering

Dijkstra's viewpoint implies that the rigid categorization of software requirements into functional ("what") and non-functional ("how") is somewhat artificial. It depends largely on the current focus and the level of detail being considered. This perspective encourages a more fluid approach to thinking about system design and requirements specification, where the distinctions between functional and non-functional requirements are recognized as gradients rather than binaries.

This approach aligns well with modern software development practices, which often emphasize adaptability, user-centric design, and continuous refinement. By acknowledging that the "what" and "how" are relative, software engineers can better adapt their strategies and designs to meet evolving user needs and technological capabilities.

Integrating Dijkstra's Perspective

Understanding and integrating Dijkstra's perspective into the process of defining and categorizing requirements can lead to a more holistic and adaptable approach in software engineering:

  • Refinement and Decomposition: Requirements can be continuously refined and decomposed from higher-level "whats" to lower-level "hows," facilitating a more detailed understanding and implementation strategy.

  • Adaptive Planning: Recognizing the fluidity between "what" and "how" allows for more flexible and adaptive planning, accommodating changes in user needs or technological advances without being constrained by rigid categorization.

  • Cross-Level Communication: Encouraging a mindset that understands the relativity of "what" and "how" can improve communication across different levels of system design and implementation, ensuring that all stakeholders have a clear understanding of the system's objectives and the means of achieving them.

Conclusion on Dijkstra's Perspective

Dijkstra's perspective on the relativity of "what" and "how" offers valuable insights for reconsidering the traditional distinction between functional and non-functional requirements. By viewing these distinctions as dependent on the level of abstraction, software engineers and architects can adopt a more flexible, nuanced approach to requirement specification and system design. This approach not only aligns with the evolving nature of software development but also enhances the ability to create systems that are more responsive to user needs and technological possibilities.

An Alternative Approach: Focusing on Mandatory Levels

Evaluation of Existing Categorizations

The existing frameworks for categorizing software requirements, including the traditional division into functional and non-functional requirements, as well as the alternative categorizations discussed, aim to provide structured ways to understand and manage the complex set of needs a software system must fulfill. However, these categorizations often fall short due to several intrinsic limitations:

  • Lack of Flexibility: Many categorization frameworks impose a rigid structure on the inherently fluid and evolving nature of software requirements. This rigidity can limit the ability to adapt to changes in project scope, user needs, or technological advancements.

  • Overemphasis on Classification Over Practicality: Focusing on how to classify a requirement often detracts from the more critical task of understanding its impact on the system's overall purpose and the user experience. The effort spent on categorization can sometimes overshadow efforts on implementation and innovation.

  • Complexity and Confusion: For teams, especially in cross-disciplinary projects, the multitude of categorizations can lead to confusion and miscommunication. Different frameworks might use similar terms for different concepts or, conversely, different terms for similar concepts, complicating collaboration and decision-making.

  • Potential Neglect of Interdependencies: By categorizing requirements into discrete buckets, there's a risk of overlooking the interdependencies between them. This oversight can lead to suboptimal designs where the fulfillment of one type of requirement negatively impacts another, diminishing the overall system quality.

Given these challenges, an alternative approach that moves away from traditional categorizations and focuses on the degree to which a requirement is mandatory for achieving the system's purpose and fulfilling user expectations might be more beneficial. This approach can be termed the "Mandatory Level Categorization" and is centered on evaluating the criticality of each requirement in the context of the system's objectives and user needs.

Mandatory Level Categorization

  • Core Requirements: At the top level are core requirements, without which the system cannot fulfill its basic purpose. These are absolutely mandatory and often tied directly to the primary functionality the system is being developed to provide.

  • Conditional Requirements: These are requirements that become necessary under certain conditions or contexts, such as specific user scenarios, regulatory environments, or integration with other systems. Their mandatory nature is contextual rather than universal.

  • Enhancement Requirements: At this level are requirements that, while not essential for the basic functioning of the system, significantly enhance its value, usability, or performance. These are important for meeting or exceeding user expectations and can be critical for the system's competitiveness and success.

Benefits of Mandatory Level Categorization

  • Simplification: This approach simplifies requirement analysis by focusing on the necessity rather than trying to fit each requirement into predefined categories. It aids in prioritizing development efforts based on what is absolutely essential versus what can enhance or conditionally affect the system.

  • Flexibility and Adaptability: By categorizing requirements based on their level of necessity, the framework allows for more flexible and adaptive planning. Requirements can shift between categories as project dynamics, user needs, or technological capabilities evolve.

  • Enhanced Focus on User Needs and System Objectives: Concentrating on how mandatory a requirement is for achieving the system's purpose and satisfying user expectations ensures that development efforts are aligned with delivering value and meeting critical needs.

  • Facilitation of Clearer Communication: This approach can facilitate clearer communication among stakeholders by focusing discussions on the importance and impact of requirements rather than on their classification. It makes it easier for all stakeholders to understand what needs to be prioritized and why.

Conclusion on the Alternative Approach

While existing categorizations of software requirements offer structured ways to manage and understand system needs, their limitations suggest the need for alternative approaches. The Mandatory Level Categorization provides a simplified, flexible, and user-focused framework that prioritizes requirements based on their essentiality to the system's purpose and user expectations. By adopting this approach, software development teams can better navigate the complexities of requirement management, ensuring that critical needs are addressed efficiently and effectively, ultimately leading to the creation of more purposeful and user-aligned software solutions.

No comments: