achieved in a more substantial way with careful
analysis and design, contrasting with the "quick code
and test" premises of the Agile methodologies. Let’s
examine the criteria.
1. Runs all the tests
This is a Basic Requirement that a system must
verify its intended functionality. This is minimal and
required for most methodologies so we will not
analyze this any further.
2. Reveals all the intention
This is an Adequacy Requirement and should be
required for most methodologies as well. Fulfillment
of this requirement is often intuitive and is
ultimately defined by customer satisfaction. But for
a system to reveal all the intention, it must at least
have a complete model (i.e. it must cover the
functionality) that can lead to accurate enough and
precise enough results (i.e. the results must be
acceptable). In terms of coding, the underlying
model must be intuitive and clean so that
communication and collaboration can happen. In
terms of usability, careful interaction and graphical
design must also be realized. As we can see, this
criterion is not obvious to achieve and we find it
difficult to be realized without careful analysis and
design.
3. No duplication
This is an Optimization Requirement desirable in
other methodologies as well. No Duplication
requires the creation of modular code so that it can
be reused. The idea is to have more fundamental
building blocks that are used to build the system.
If we interpret this criterion as not duplicating
code in its most strict definition, i.e. not repeating
code that is exactly the same, then the criterion is
relatively easy to understand and follow. However, a
more powerful and interesting interpretation of the
criterion is the creation of more generic and abstract
code that can be used to replace similar (and more
numerous) pieces of code.
If we perform Cognitive Task Analysis
(Chandrasekaran, 1986), (Chandrasekaran, 1990),
(Pirolli & Card, 2005), we see that the design of
modular code that is generic and abstract to be
reused, involves the following mental tasks: (1)
decomposition of the problem into smaller
functional or structural parts, (2) pattern matching to
identify sets of similar parts, (3) creativity to create
generic and abstract modular code to cope with sets
of similar problem parts, (4) synthesis for combining
and integrating the modular code, (5) analysis for
critiquing the modular code and its integration, and
(6) modification capability for adjusting the modular
code and its integration whenever necessary.
No duplication, in its more extensive
interpretation, is underlying the construction of
frameworks and is at the core of software
architecture. Except for simpler software, it is
difficult to imagine the achievement of this criterion
without careful analysis and design.
4. Fewest number of classes or methods
The most basic interpretation of this criterion is that
classes and methods that are not necessary should
not be developed in advance. Classes and methods
that might be needed in the future should not be
implemented until they are definitely needed. This
criterion accords to the fundamental principles of the
Agile methodologies and is not too difficult to
interpret and follow.
However, a different interpretation of this
criterion has a fundamental impact when dealing
with complex software. In order to cope with the
complexity associated with the large number of
classes, their relationships and their complex
methods, it is important to design fewer but more
powerful classes and methods. It is necessary to
define classes and methods that are generic and
often abstract. Fewer generic and abstract classes
can replace multiple and more numerous specific
and concrete classes, simplifying the overall
representation. Fewer modular generic and abstract
methods can replace multiple and more numerous
specific and concrete methods as well, once again,
simplifying a complex problem. Design patterns, for
example, although more complex constructs
themselves, are powerful mechanisms that simplify
the overall design.
The examples above are just a few examples of
interpreting the criterion as creating fewer but more
powerful concepts. We claim that the design of these
fewer but more powerful concepts is crucial to deal
with complexity. But this task, once again, requires
significant effort. Cognitive Task Analysis
(Chandrasekaran, 1986), (Chandrasekaran, 1990),
(Pirolli & Card, 2005), indicates that such design
involves (1) pattern matching to identify sets of
similar classes or methods, (2) creativity to create
generic and abstract classes and methods, (3) search
on the space of possible design alternatives, (4)
definition of criteria for evaluating the design
alternatives, (5) synthesis and integration of classes
and methods and (6) critique and modification of
classes and methods. This is among the hardest tasks
in complex software development and requires
ROBUSTIFYING THE SCRUM AGILE METHODOLOGY FOR THE DEVELOPMENT OF COMPLEX, CRITICAL
AND FAST-CHANGING ENTERPRISE SOFTWARE
73