This wiki is locked. Future workgroup activity and specification development must take place at our new wiki. For more information, see this blog post about the new governance model and this post about changes to the website.

EMS 1.0 Primer - Monitoring and Controlling a Project - Act 2. Estimation

Introduction

In this act, Priyanka meets with her development team and they decide to monitor defect arrival rate as a KPI for the project. The team wants to ensure that their defect prevention and quality assurance processes are working well and want to know as early as possible when the defect arrival rate gets too high or too low. If the rate is too high then their defect prevention processes may not working well. Similarly, if the rate is too low, then their quality assurance processess may not be working well.

Requesting the Estimate


Priyanka now needs to contact Syd Ethan, the software estimator, and ask him to estimate the defect arrival rate over the lifecycle of the project. The mechanism by which Priyanka contacts Syd is not specified by EMS 1.0. The following describes one possible mechanism. Other simple mechanisms, such as email or Atom feeds may also be used.

Let's assume that Priyanka's development organization uses TaskPhocus to manage all work related to project execution. TaskPhocus is based on a change management system that allows managers and developers to create work items of various types. TaskPhocus includes a work item type, Estimate Request, for requesting estimates. Priyanka assigns Syd to the software estimator role for the Tsunami 1.0 project and then creates a new Estimate Request for defect arrival rate. TaskPhocus notifies Syd that he has an Estimate Request that requires his action. The Estimate Request work item includes a link to the ems:Project resource for the Tsunami 1.0 project in MetricServer.

Opening the Project

Syd reviews the Estimate Request work item in TaskPhocus and copies the ems:Project URI (recall that we have been assuming no direct integration between TaskPhocus and Guestimator 101 so Syd has to manually copy and paste URIs between these tools):

http://braintwistors.example.com/ems10/Project/4201 

Syd then launches Guestimator 101, his software estimation tool, invokes its Open Project command, and pastes in the ems:Project URI.

Guestimator 101 retrieves the relevant information associated with the Tsunami 1.0 project from MetricServer as part of its process of opening an ems:Project. This information includes the description of the project and its current baseline scenario and estimates. Syd needs to know which scenario the project has adopted in order to create an estimate for the defect arrival rate. The adopted scenario is part of the current baseline for the project. Guestimator 101 therefore needs to get the ems:Project resource in order to determine its current baseline, then get the current ems:Baseline to determine the adopted scenario, and then finally get the ems:Scenario resource to determine the assumptions under which the project is being executed. Syd will then be able to estimate additional metrics such as defect arrival rate.

First Guestimator 101 GETs the ems:Project resource. The following listing shows an additional property, ems:currentBaseline, of this resource:

Listing of Project 4201 Resource with ems:currentBaseline Property
<?xml version="1.0"?>
<ems:Project xmlns:dc="http://purl.org/dc/terms/"
   xmlns:ems="http://open-services.net/software-metrics/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   rdf:about="http://braintwistors.example.com/ems10/Project/4201">
   <dc:title>Tsunami 1.0</dc:title>
   <dc:description>
      The goal of this project is to create a web version of
      Tsunami, a Japanese logic puzzle, in order to drive traffic to the
      BrainTwistors Corp. website and increase advertising revenue. Future
      plans include developing free iPhone, BlackBerry, and Nintendo DS
      versions, and charging for puzzle downloads.
      </dc:description>
   <dc:identifier>4201</dc:identifier>
   <ems:projectList rdf:resource="http://braintwistors.example.com/ems10/Project" />
   <ems:currentBaseline
      rdf:resource="http://braintwistors.example.com/ems10/Baseline/7347" />
   <!--
      Other properties of this resource have been omitted for brevity.
   -->
</ems:Project>

The ems:Project resource now contains the property ems:currentBaseline which links the project to its current baseline, an ems:Baseline resource. Whenever a new ems:Baseline resource is created, an EMS 1.0 service provider automatically updates the ems:currentBaseline of the corresponding ems:Project resource so that its ems:currentBaseline property always refers to the most recently created ems:Baseline resource for the project. In this example, the URI of the current ems:Baseline resource for the Tsunami 1.0 project is:

http://braintwistors.example.com/ems10/Baseline/7347

Guestimator 101 GETs the current ems:Baseline resource:

Listing of Baseline 7347 Resource
<?xml version="1.0"?>
<ems:Baseline xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/terms/" xmlns:ems="http://open-services.net/software-metrics/"
   rdf:about="http://braintwistors.example.com/ems10/Baseline/7347">
   <dc:title>Initial Baseline for Tsunami 1.0</dc:title>
   <dc:description>
      Deliver ASAP. Duration 6 months. Guestimator 101
      predicts 25 person-months.
   </dc:description>
   <dc:identifier>7347</dc:identifier>
   <ems:project rdf:resource="http://braintwistors.example.com/ems10/Project/4201" />
   <ems:scenario rdf:resource="http://braintwistors.example.com/ems10/Scenario/5721" />
   <ems:estimate rdf:resource="http://braintwistors.example.com/ems10/Estimate/6648" />
   <!--
      Other properties of this resource have been omitted for brevity.
   -->
</ems:Baseline>

Guestimator 101 gets the URI of the baselined scenario from the ems:scenario property of the current ems:Baseline resource:

 http://braintwistors.example.com/ems10/Scenario/5721

Guestimator 101 GETs the baselined ems:Scenario resource (see Listing of Scenario 5721 Resource). Similarly, Guestimator 101 gets the URIs of the baselined estimates from the ems:estimate properties of the current ems:Baseline resource and GETs them.

Finally, Guestimator 101 presents all the retrieved information about the Tsunami 1.0 project to Syd. Syd can now proceed to develop the requested estimate.

Creating the Estimate

Syd invokes Guestimator 101's Create Estimate command and develops the estimate for defect arrival rate (see How Guestimator 101 Estimates Defect Arrival Rates for more detail).

The following table summarizes this estimate:

Table of Estimated Total Defects Per Month

Month Low Most
Likely
High
1 27 31 38
2 69 79 98
3 84 96 120
4 73 83 104
5 50 57 71
6 28 32 40
7 13 15 18
8 5 6 7
9 2 2 2

When Syd is satisfied with the result, he invokes the Save Estimate command. Recall that all of the details of the Guestimator 101 user interface are outside the scope of EMS 1.0. However, when Syd invokes the Save Estimate command, Guestimator 101 uses EMS 1.0 as a service consumer to create a new ems:Estimate resource in MetricServer. Guestimator 101 creates the following ems:Estimate resource representation and POSTs it to the ems:EstimateList URI:

Listing of Estimate Resource for Defect Arrivals by Month
<?xml version="1.0"?>
<ems:Estimate xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/terms/" xmlns:ems="http://open-services.net/software-metrics/">
   <dc:title>Tsunami 1.0 Monthly Defect Arrival Rate Estimate by
      Guestimator 101
   </dc:title>
   <dc:description>
      Guestimator 101 uses Rayleigh distribution with arrival
      rate peak at 2.5 months and triangular distribution for defect density
      with a low of 7 defects/KLOC, a most likely of 8 defects/KLOC, and a
      high of 10 defects/KLOC.
   </dc:description>
   <ems:scenario rdf:resource="http://braintwistors.example.com/ems10/Scenario/5721" />
   <ems:predictsTable>
      <ems:FactDistributionTable>
         <dc:title>Defect Arrival Count by Elapsed Month</dc:title>
         <ems:head>
            <ems:Head>
               <ems:dimensionColumn>
                  <ems:DimensionColumn rdf:nodeID="d1">
                     <dc:title>Month</dc:title>
                     <ems:dimension
                        rdf:resource="http://open-services.net/software-metrics/schedule#elapsedTime" />
                     <ems:grain
                        rdf:resource="http://open-services.net/software-metrics/grains#month" />
                  </ems:DimensionColumn>
               </ems:dimensionColumn>
               <ems:measureColumn>
                  <ems:MeasureColumn rdf:nodeID="m1">
                     <dc:title>Found Defects</dc:title>
                     <ems:metric
                        rdf:resource="http://open-services.net/software-metrics/quality#defectArrivalCount" />
                     <ems:unitOfMeasure
                        rdf:resource="http://open-services.net/software-metrics/units#defect" />
                  </ems:MeasureColumn>
               </ems:measureColumn>
            </ems:Head>
         </ems:head>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>1</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>27</ems:low>
                           <ems:mostLikely>31</ems:mostLikely>
                           <ems:high>38</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>2</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>69</ems:low>
                           <ems:mostLikely>79</ems:mostLikely>
                           <ems:high>98</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>3</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>84</ems:low>
                           <ems:mostLikely>96</ems:mostLikely>
                           <ems:high>120</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>4</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>73</ems:low>
                           <ems:mostLikely>83</ems:mostLikely>
                           <ems:high>104</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>5</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>50</ems:low>
                           <ems:mostLikely>57</ems:mostLikely>
                           <ems:high>71</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>6</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>28</ems:low>
                           <ems:mostLikely>32</ems:mostLikely>
                           <ems:high>40</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>7</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>13</ems:low>
                           <ems:mostLikely>15</ems:mostLikely>
                           <ems:high>18</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>8</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>5</ems:low>
                           <ems:mostLikely>6</ems:mostLikely>
                           <ems:high>7</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
         <ems:factDistribution>
            <ems:FactDistribution>
               <ems:dimensionCell>
                  <ems:DimensionCell>
                     <ems:inColumn rdf:nodeID="d1" />
                     <ems:value>9</ems:value>
                  </ems:DimensionCell>
               </ems:dimensionCell>
               <ems:measureDistributionCell>
                  <ems:MeasureDistributionCell>
                     <ems:inColumn rdf:nodeID="m1" />
                     <ems:distribution>
                        <ems:TriangularDistribution>
                           <ems:low>2</ems:low>
                           <ems:mostLikely>2</ems:mostLikely>
                           <ems:high>2</ems:high>
                        </ems:TriangularDistribution>
                     </ems:distribution>
                  </ems:MeasureDistributionCell>
               </ems:measureDistributionCell>
            </ems:FactDistribution>
         </ems:factDistribution>
      </ems:FactDistributionTable>
   </ems:predictsTable>
   <!--
      Other properties of this resource have been omitted for brevity.
   -->
</ems:Estimate>

MetricServer returns the following URI for this new ems:Estimate resource:

 http://braintwistors.example.com/ems10/Estimate/7349

Syd then launches TaskPhocus, opens his Estimate Request work item, pastes in the URI for the newly created ems:Estimate 7349 resource, and marks the work item as Resolved. TaskPhocus then notifies Priyanka that the estimate is ready for review and approval.

Reviewing and Accepting the Estimate

Priyanka receives the notification from TaskPhocus that the estimate is ready for review. Priyanka opens the work item and invokes the TaskPhocus command to Review Estimate. TaskPhocus gets the ems:Estimate 7349 URI from the work item and GETs the resource. MetricServer returns a representation of the resource to TaskPhocus which displays it to Priyanka.

Since this is a very important estimate, Priyanka decides that the development team needs to review it so she calls a team meeting and invites Syd. Syd then reviews the estimate with Priyanka and the development team. They agree it is reasonable as an initial estimate.

Priyanka opens the work item in TaskPhocus and invokes the Accept Estimate command. When an estimate is accepted, it becomes part of the project baseline. TaskPhocus creates a new ems:Baseline resource representation that adds ems:Estimate 7349 to the set of estimates. The following listing shows the new ems:Baseline resource representation:

Listing of Baseline Resource with Estimate 7349 Added
<?xml version="1.0"?>
<ems:Baseline xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/terms/" xmlns:ems="http://open-services.net/software-metrics/">
   <dc:title>Initial Baseline for Tsunami 1.0</dc:title>
   <dc:description>
      Deliver ASAP. Duration 6 months. Guestimator 101
      predicts 25 person-months.
      An estimate for the defect arrival rate over time has been included
      in the baseline.
   </dc:description>
   <ems:project rdf:resource="http://braintwistors.example.com/ems10/Project/4201" />
   <ems:scenario rdf:resource="http://braintwistors.example.com/ems10/Scenario/5721" />
   <ems:estimate rdf:resource="http://braintwistors.example.com/ems10/Estimate/6648" />
   <ems:estimate rdf:resource="http://braintwistors.example.com/ems10/Estimate/7349" />
   <!--
      Other properties of this resource have been omitted for brevity.
   -->
</ems:Baseline>

Creating the Measurement

The development team uses TaskPhocus for defect tracking. TaskPhocus has built-in reporting capability and display defect data in reports, charts, and dashboards. Priyanka customizes her dashboard by adding a report that shows the current measured defect arrival rate and compares it to the estimate. TaskPhocus gets the defect measurements from its own defect tracking system and the estimate from MetricServer.

However, it is also useful to make the defect information available to other applications. The TaskPhocus report definitions tools are also EMS 1.0 service consumers and have the ability to create ems:Measurement resources. When Priyanka customized her dashboard to show the defect measurements and estimates, she also invoked the Publish Measurement command which did the following.

TaskPhocus navigated links from the ems:Estimate 7349 URI up to the ems:Service resource URI, and from that obtained the URI to its ems:MeasurementList URI. TaskPhocus then created the following ems:Measurement resource representation and POSTed it to the ems:MeasurementList URI:

Listing of Measurement Resource for Defect Arrivals by Month
<?xml version="1.0"?>
<ems:Measurement xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/terms/" xmlns:ems="http://open-services.net/software-metrics/">
   <dc:title>Tsunami 1.0 Monthly Defect Arrival Rate Measurement from
      TaskPhocus
   </dc:title>
   <dc:description>
      A live TaskPhocus query is the source of this
      measurement.
   </dc:description>
   <ems:project rdf:resource="http://braintwistors.example.com/ems10/Project/4201" />
   <ems:observesTable>
      <ems:FactTable>
         <dc:title>Defect Arrival Rate by Elapsed Month</dc:title>
         <ems:head>
            <ems:Head>
               <ems:dimensionColumn>
                  <ems:DimensionColumn>
                     <dc:title>Month</dc:title>
                     <ems:dimension
                        rdf:resource="http://open-services.net/software-metrics/schedule#elapsedTime" />
                     <ems:grain
                        rdf:resource="http://open-services.net/software-metrics/grains#month" />
                  </ems:DimensionColumn>
               </ems:dimensionColumn>
               <ems:measureColumn>
                  <ems:MeasureColumn>
                     <dc:title>Found Defects</dc:title>
                     <ems:metric
                        rdf:resource="http://open-services.net/software-metrics/quality#defectArrivalCount" />
                     <ems:unitOfMeasure
                        rdf:resource="http://open-services.net/software-metrics/units#defect" />
                  </ems:MeasureColumn>
               </ems:measureColumn>
            </ems:Head>
         </ems:head>
         <ems:tableSource
            rdf:resource="http://braintwistors.example.com/taskphocus/Query/3365" />
      </ems:FactTable>
   </ems:observesTable>
   <!--
      Other properties of this resource have been omitted for brevity.
   -->
</ems:Measurement>

MetricServer returns the following URI for this resource:

http://braintwistors.example.com/ems10/Measurement/6109

An ems:Measurement resource is like an ems:Estimation resource except that it provides actual observations of the project instead of probability distributions that predict the observations. An ems:Measurement resource may contain the observations directly, provide a URI to the observations, or both. In this case, the ems:Measurement resource provides only a URI to the observerations in the ems:observationSource property. Its value is a URI that TaskPhocus provided to GET the live defect arrival rate data:

http://braintwistors.example.com/taskphocus/Query/3365

In general, providing a URI to the observation data is useful for frequently changing data. If the observation data is directly included in the ems:Measurement resource, the ems:observationSource URI may also be provided as a link to the authoritative source of the data.

This completes Act 2. Estimation. In the next act, Act 3. Execution, the team starts development and defects begin to arrive. Priyanka will use the estimate to monitor progress.

Summary Sequence Diagram

The following sequence diagram summarizes the interactions in this act: estimation-act2.png

Next: Act 3. Execution

Previous: Act 1. Setup

Comments

Enter your comments here:

 
Topic attachments
I Attachment Action Size Date Who Comment
pngpng estimation-act2.png manage 47.4 K 11 Dec 2009 - 16:26 ArthurRyman Summary Sequence Diagram for Estimation
Edit | Attach | Print version | History: r17 < r16 < r15 < r14 < r13 | Backlinks | Raw View | Raw edit | More topic actions...
Topic revision: r14 - 06 Apr 2010 - 20:45:32 - ArthurRyman
 
This site is powered by the TWiki collaboration platform Copyright � by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Contributions are governed by our Terms of Use
Ideas, requests, problems regarding this site? Send feedback