
 
 
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