Saheed. A. Busari and Emmanuel Letier
RADAR is a lightweight modelling language and tool for analysing software requirements and architecture decisions (Busari and Letier, 2016). This report presents an application of RADAR to the analysis of the NASA's Earth Observing System Data Information (EOSDIS) Core System, also known as the ECS Project.
Our analysis is motivated by and based on previous study in the 2002 SEI report on "Making Architecture Design Decisions: An Economic Approach" (Kazman et al., 2002). Our model objectives, decisions and data were obtained from 2002 SEI report.
The ECS is a large scale distributed data information system used in managing and distributing huge volumes of climate related data in different forms around the world, 24 hours each day. This system collects and manages more than 1000 gigabytes of data, every day, from several satellites using various sensors (Kazman et al., 2001,Kazman et al., 2002 ).
As reported by Kazman et al., 2002, the ECS went through a maintenance phase and a planning process of boosting its capabilities. However, the ECS project manager had limited annual budget to maintain and enhance the functionality of the system. In a bid to achieve this goal, proir analysis, using the ATAM methodology, was performed to identify a set of architectural strategies, which we call decisions in our model (as shown in figure 1), to be made in enhancing the system. The manager is faced with selecting among the set of decisions that give maximum utilty in the project and also minimise the project cost.
Note: The Cost Benefit Analysis Method (CBAM) (Kazman et al., 2001,Kazman et al., 2002) was used in the 2002 SEI report, and it estimates individual impact of architectural strategies on utility, but not their combined impacts. However, our model analyses the interaction between architectural strategies ( i.e the combined impact of architectural strategies), and allows the selection of more than one architectural strategy.
Objective Max ExpectedUtility = EV(Utility);
Objective Min Cost;
Utility = HungRequestsRatio_weight * HungRequestsRatio_Utility +
LostRequestsRatio_weight * LostRequestsRatio_Utility +
FailedOrderRatio_weight * FailedOrderRatio_Utility +
HungOrdersRatio_weight * HungOrdersRatio_Utility +
LostOrdersRatio_weight * LostOrdersRatio_Utility +
HelpNeededByUsers_weight * HelpNeededByUsers_Utility +
FailureInfoGivenToUsers_weight * FailureInfoGivenToUsers_Utility +
LimitOnOrders_weight * LimitOnOrders_Utility +
NotificationsFrequency_weight * NotificationsFrequency_Utility +
Performance_weight * Performance_Utility
HungRequestsRatio_weight = deterministic(10);
LostRequestsRatio_weight = deterministic(15);
FailedOrderRatio_weight = deterministic(15);
HungOrdersRatio_weight = deterministic(10);
LostOrdersRatio_weight = deterministic(15);
HelpNeededByUsers_weight = deterministic(10);
FailureInfoGivenToUsers_weight = deterministic(5);
LimitOnOrders_weight = deterministic(5);
NotificationsFrequency_weight = deterministic(10);
Performance_weight = deterministic(5);
HungRequestRatio_Utility = (HungRequestRatio - HungRequestRatio_worst)/(HungRequestRatio_best - HungRequestRatio_worst)
HungRequestRatio_best =deterministic(0);
HungRequestRatio_worst = deterministic(10%);
LostRequestsRatio_Utility = (LostRequestsRatio - LostRequestsRatio_worst)/(LostRequestsRatio_best - LostRequestsRatio_worst)
LostRequestsRatio_best = deterministic(0);
LostRequestsRatio_worst = deterministic(5%);
FailedOrderRatio_Utility = (FailedOrderRatio - FailedOrderRatio_worst)/(FailedOrderRatio_best - FailedOrderRatio_worst)
FailedOrderRatio_best =deterministic(0);
FailedOrderRatio_worst = deterministic(10%);
HungOrdersRatio_Utility = (HungOrdersRatio - HungOrdersRatio_worst)/(HungOrdersRatio_best - HungOrdersRatio_worst)
HungOrdersRatio_best = deterministic(0);
HungOrdersRatio_worst = deterministic(10%);
LostOrdersRatio_Utility = (LostOrdersRatio - LostOrdersRatio_worst)/(LostOrdersRatio_best - LostOrdersRatio_worst)
LostOrdersRatio_best =deterministic(0);
LostOrdersRatio_worst = deterministic(10%);
HelpNeededByUsers_Utility = (HelpNeededByUsers - HelpNeededByUsers_worst)/(HelpNeededByUsers_best - HelpNeededByUsers_worst)
HelpNeededByUsers_best = deterministic(0);
HelpNeededByUsers_worst = deterministic(50%);
FailureInfoGivenToUsers_Utility = (FailureInfoGivenToUsers - FailureInfoGivenToUsers_worst)/(FailureInfoGivenToUsers_best - FailureInfoGivenToUsers_worst)
FailureInfoGivenToUsers_best = deterministic(100%);
FailureInfoGivenToUsers_worst = deterministic(10%);
LimitOnOrders_Utility = (LimitOnOrders - LimitOnOrders_worst)/(LimitOnOrders_best - LimitOnOrders_worst)
LimitOnOrders_best = deterministic(0%);
LimitOnOrders_worst = deterministic(50%);
NotificationsFrequency_Utility = (NotificationsFrequency - NotificationsFrequency_worst)/(NotificationsFrequency_best - NotificationsFrequency_worst)
NotificationsFrequency_best = deterministic(1);
NotificationsFrequency_worst = deterministic(1/1000);
Performance_Utility = (Performance - Performance_worst)/(Performance_best - Performance_worst)
Performance_best = deterministic(90%);
Performance_worst = deterministic(50%);
HungRequestRatio = HungRequestRatio_current
* (1 - ReassignedHungRequestRatio)
* (1 - ForcedHungRequestRatio)
HungRequestRatio_current = deterministic(5%);
ReassignedHungRequestRatio = decision("Order Reassignment"){
"Current: not possible to reassign order" : deterministic(0);
"Allow Order Reassignment": deterministic(60%);
}
ForcedHungRequestRatio = decision("Forced Order Completion"){
"Current: not possible to force order completion" : deterministic(0);
"Allow Forced Order Completion": deterministic(40%);
}
LostRequestRatio = triangular(0, 0.5, 1);
FailedOrderRatio = decision("Order Persistence Strategy"){
"Current: store when processed" : deterministic(5%);
"Store as soon as received" : deterministic(2%);
}
HungOrdersRatio = HungOrdersRatio_current *
(1 - SkippedHungOrderRatio) *
(1 - RetriedHungOrderRatio)
HungOrdersRatio_current = deterministic(10%);
SkippedHungOrderRatio = decision("Order Segmentation"){
"Current: no order segmentation" : deterministic(0);
"Orders are segmented" : deterministic(60%);
}
RetriedHungOrderRatio = decision("Hung Order Recovery"){
"Current: no order retry" : deterministic(0);
"Allow Order Retry" : deterministic(40%);
}
LostOrdersRatio = decision("Order Persistence Strategy"){
"Current: store when processed" : deterministic(1%);
"Store as soon as received" : deterministic(0%);
}
HelpNeededByUsers = LostOrdersRatio * HelpNeededPerLostOrder * HelpNeededForTrackingGranularity
HelpNeededPerLostOrder = decision("Failed Order Notification"){
"Current: no notification":deterministic(25%);
"User notified of failed order":deterministic(20%);
}
HelpNeededForTrackingGranularity = decision(Order Tracking){
"Current: order level" : deterministic(1);
"Granule-level order tracking" : deterministic(40%)
}
FailureInfoGivenToUsers = 1- RatioUsersNotGettingInfo
RatioUsersNotGettingInfo = RatioUsersNotGettingInfo_current *
(1 - NotificationOrderEffect) *
(1 - OrderTrackingGranularityEffect) *
(1 - UserInformationEffect)
RatioUsersNotGettingInfo_current = deterministic(50%);
NotificationOrderEffect = decision("Failed Order Notification"){
"Current: no notification": deterministic(0);
"User notified of failed order": deterministic(80%);
}
OrderTrackingGranularityEffect = decision(Order Tracking){
"Current: order level" : deterministic(0);
"Granule-level order tracking" : deterministic(90%);
}
UserInformationEffect = decision("Available User Information"){
"Current: no link to user info" : deterministic(0);
"Link to user information" : deterministic(20%);
}
LimitOnOrders = decision("Order Chunking"){
"Current: no oder chunking": deterministic(30%);
"Order Chunking" : deterministic(15%);
}
NotificationFrequency = decision("Order Bundling"){
"No Order Bundling" : deterministic(1);
"Order Bundling" : deterministic(0.01);
}
Performance = decision("Order Bundling"){
"No Order Bundling" : deterministic(60%);
"Order Bundling" : deterministic(55%);
}
Cost = Cost_OrderReassignment +
Cost_ForcedOrderCompletion +
Cost_OrderPersistenceStrategy +
Cost_OrderSegmentation +
Cost_HungOrderRecovery +
Cost_FailedOrderNotification +
Cost_OrderTracking +
Cost_AvailableUserInformation +
Cost_OrderReassignment = decision("Order Reassignment"){
"Current: not possible to reassign order" : deterministic(0);
"Allow Order Reassignment": triangular(360, 400, 440);
}
Cost_ForcedOrderCompletion = decision("Forced Order Completion"){
"Current: not possible to force order completion" : deterministic(0);
"Allow Forced Order Completion": triangular(180, 200, 220);
}
Cost_OrderPersistenceStrategy = decision("Order Persistence Strategy"){
"Current: store when processed" : deterministic(0);
"Store as soon as received" : triangular(1200, 1200, 7150);
}
Cost_OrderSegmentation = decision("Order Segmentation"){
"Current: no order segmentation" : deterministic(0);
"Orders are segmented" : triangular(180, 200, 220);
}
Cost_HungOrderRecovery = decision("Hung Order Recovery"){
"Current: no order retry" : deterministic(0);
"Allow Order Retry" :triangular(180, 200, 220);
}
Cost_FailedOrderNotification = decision("Failed Order Notification"){
"Current: no notification": deterministic(0);
"User notified of failed order": triangular(270, 300, 330);
}
Cost_OrderTracking = decision(Order Tracking){
"Current: order level" : deterministic(0);
"Granule-level order tracking" : triangular(900, 1000, 1650);
}
Cost_AvailableUserInformation = decision("Available User Information"){
"Current: no link to user info" : deterministic(0);
"Link to user information" : triangular(90, 100, 440);
}
Cost_OrderChunking = decision("Order Chunking"){
"Current: no oder chunking" : 0
"Order Chunking" : triangular(360, 400, 440);
}
Cost_OrderBundling = decision("Order Bundling"){
"No Order Bundling" : deterministic(0);
"Order Bundling" :triangular(360, 400, 440);
}
Here is a summary of the modelling and analysis information:
Objective | HMaxExpectedUtility | |||||||||||
Objective | MinCost | |||||||||||
SolutionSpace | 1024 | |||||||||||
Minimal SolutionSet | 1024 | |||||||||||
Shortlisted | 33 | |||||||||||
Nbr. Variables | 75 | |||||||||||
Nbr. Parameters | 11 | |||||||||||
Nbr. Decisions | 10 | |||||||||||
Runtime(s) | 2 |
The model analysis generates the following shortlist of Pareto-optimal solutions:
ID | Order Reassignment | Forced Order Completion | Order Persistence Strategy | Order Segmentation | Hung Order Recovery | Failed Order Notification | Order Tracking | Available User Information | Order Chunking | Order Bundling | ExpectedUtility | Cost |
1 | Current: not possible to reassign order | Current: not possible to force order completion | Store as soon as received | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -67.35429264 | 3687.114892 |
2 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | Current: no notification | Granule-level order tracking | Current: no link to user info | Order Chunking | No Order Bundling | -67.69651487 | 2186.319942 |
3 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Link to user information | Order Chunking | No Order Bundling | -67.88318153 | 1510.418841 |
4 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -61.95429264 | 4487.265338 |
5 | Current: not possible to reassign order | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -65.97651487 | 3787.318577 |
6 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Granule-level order tracking | Current: no link to user info | Order Chunking | No Order Bundling | -67.47029264 | 2486.276777 |
7 | Current: not possible to reassign order | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -72.02651487 | 600.1639298 |
8 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -63.55429264 | 4287.128492 |
9 | Current: not possible to reassign order | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -73.39429264 | 499.9602443 |
10 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -67.99429264 | 1300.110691 |
11 | Current: not possible to reassign order | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -63.75429264 | 4087.275413 |
12 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | Current: no notification | Granule-level order tracking | Link to user information | Order Chunking | No Order Bundling | -67.64095931 | 2396.628092 |
13 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Granule-level order tracking | Current: no link to user info | Order Chunking | No Order Bundling | -61.45429264 | 5673.431425 |
14 | Current: not possible to reassign order | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -71.39429264 | 699.9839196 |
15 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Link to user information | Order Chunking | No Order Bundling | -61.84318153 | 4697.573489 |
16 | Allow Order Reassignment | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -70.39429264 | 899.9501696 |
17 | Current: not possible to reassign order | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Current: no order retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -75.62651487 | 200.0034088 |
18 | Current: not possible to reassign order | Current: not possible to force order completion | Current: store when processed | Current: no order segmentation | Current: no order retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -81.62651487 | 0 |
19 | Allow Order Reassignment | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Current: no order retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -72.62651487 | 599.9933341 |
20 | Allow Order Reassignment | Current: not possible to force order completion | Store as soon as received | Orders are segmented | Allow Order Retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -64.97651487 | 3987.284827 |
21 | Allow Order Reassignment | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Allow Order Retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -71.02651487 | 800.1301799 |
22 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Granule-level order tracking | Link to user information | Order Chunking | No Order Bundling | -61.44318153 | 5883.739575 |
23 | Allow Order Reassignment | Current: not possible to force order completion | Store as soon as received | Orders are segmented | Current: no order retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -66.57651487 | 3787.147982 |
24 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Granule-level order tracking | Link to user information | Order Chunking | No Order Bundling | -67.45918153 | 2696.584928 |
25 | Allow Order Reassignment | Current: not possible to force order completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -68.79429264 | 1100.087015 |
26 | Current: not possible to reassign order | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -65.35429264 | 3887.138567 |
27 | Allow Order Reassignment | Current: not possible to force order completion | Store as soon as received | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -64.35429264 | 4087.104817 |
28 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | Current: no notification | Granule-level order tracking | Link to user information | Order Chunking | No Order Bundling | -61.62095931 | 5583.78274 |
29 | Allow Order Reassignment | Current: not possible to force order completion | Store as soon as received | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -62.75429264 | 4287.241663 |
30 | Allow Order Reassignment | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Current: no order retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -69.59429264 | 1099.973845 |
31 | Allow Order Reassignment | Allow Forced Order Completion | Store as soon as received | Orders are segmented | Allow Order Retry | Current: no notification | Granule-level order tracking | Current: no link to user info | Order Chunking | No Order Bundling | -61.67651487 | 5373.474589 |
32 | Current: not possible to reassign order | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Allow Order Retry | User notified of failed order | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -69.79429264 | 900.1207654 |
33 | Current: not possible to reassign order | Allow Forced Order Completion | Current: store when processed | Orders are segmented | Current: no order retry | Current: no notification | Current: order level | Current: no link to user info | Order Chunking | No Order Bundling | -73.62651487 | 400.0270841 |
These results show that all shortlisted solutions include the options Order Chunking
, Orders are segmented
and No order Bundling
. This means that, in our model, these three options, respectively, outperform the options Current: No Order Chunking
, Current: No Order Segmentation
and No Order Bundling
on both objectives.
But once these three options are selected, the shortlist includes different combinations of Order Reassignment
, Forced Order Completion
, Order Persisitence Strategy
, Hung Order recovery
, Failed Order Notification
, Order Tracking
, Available User Information
; each combination representing a different tradeoffs between maximising ExpectedUtility
and minimising Cost
.
To visualise such tradeoffs, RADAR generates the graph in Fig. 4 plotting the objective values for the shortlised solutions (shown squares at the top of the graph) and all other non shortlisted ones (shown as circles).
Analysing information value gives the following results that show that the information value for all model parameters is very low:
EVTPI = 0
Parameter | EVPPI |
---|---|
LostRequestsRatio | 0 |
Cost_OrderReassignment[Allow Order Reassignment] | 0 |
Cost_ForcedOrderCompletion[Allow Forced Order Completion] | 0 |
Cost_OrderPersistenceStrategy[Store as soon as received] | 0 |
Cost_OrderSegmentation[Orders are segmented] | 0 |
Cost_HungOrderRecovery[Allow Order Retry] | 0 |
Cost_FailedOrderNotification[User notified of failed order] | 0 |
Cost_OrderTracking[Granule-level order tracking] | 0 |
Cost_AvailableUserInformation[Link to user information] | 0 |
Cost_OrderChunking[Order Chunking] | 0 |
Cost_OrderBundling[Order Bundling] | 0 |
Saheed A. Busari and Emmanuel Letier, "RADAR: A lightweight tool for requirements and architecture decision analysis," in submission, August 2016
Kazman, Rick, Jai Asundi, and Mark Klein. "Quantifying the costs and benefits of architectural decisions." Proceedings of the 23rd international conference on Software engineering. IEEE Computer Society, 2001.
Moore, Mike, et al. "Quantifying the value of architecture design decisions: lessons from the field." Proceedings of the 25th International Conference on Software Engineering. IEEE Computer Society, 2003.
Kazman, Rick, Jai Asundi, and Mark Klien. Making architecture design decisions: An economic approach. No. CMU/SEI-2002-TR-035. CARNEGIE-MELLON UNIV PITTSBURGH PA SOFTWARE ENGINEERING INST, 2002.