Appendix D. Milestones Tutorial

With the introduction of project milestones, a series of goals for specific metrics at certain dates in the life of your project, Squore offers new ways to measure your objectives and detect deviations from your goals early:

  • You are alerted early if your current performance shows that you will not meet your goals and can react before it is too late

  • You keep track of your various goals and communicate any change to the rest of your team

  • You can reflect on a project's history and learn from it

This example focuses on a project that is slipping, then over-performing and how the team reacts along the course of the development process. Our team is tracking a basic task completion metric over the lifetime of the project, which includes milestones for Requirements Review, Infrastructure Complete, Code Complete, Beta Release and Final Release.

Here is where they stand on the day of the Final Release and look back at how the project went:

The chart shows the following information:

  • Vertical dotted lines (markers) on the x-axis for each milestone in the project at the predefined date

  • A solid light-blue line showing the task completion metric for each version of the project

  • A dotted green line showing the goal for the task completion metric at each milestone

  • A solid red line showing the goals actually used for the task completion metric during the lifetime of the project.

  • Deviations from the goals around the REQ and BETA milestones

In order to understand why changes were made to the goals, let's go back to the January 27th analysis and look at the Task Completion chart again. Because we are using milestones and have a defined goal for the task completion metric, we can get a projection of what our metric will be by the time we hit the milestone dates.

So instead of just showing results from previous analyses, the Progress line continues past January 27th to show what results we can expect based on the performance so far. Our chart is configured to show the projected value for the next 3 milestones, and all 3 projections are below the goal line for the metric.

The team knows this: a Pessimistic Projection action item was already opened on January 15th to inform them that the current performance could cause problems in milestones 2 and 3. But today, an Objective Not Met action item informs them that they will not meet their goal even for the upcoming milestone.

After a team meeting, it is decided that the best course of action is to keep the goal for the Requirements Review milestone, but move its date by two weeks. The analysis run the next morning confirms this on the Task Completion chart, where you see the first deviation between the planned goal (green) and the actual goal (red). The progress objective will be met for the first milestone, but there are still doubts for the next two:

Let's fast forward to the end of May after the Code Complete milestone and before the Beta Release to find our team performing better than expected: progress is already over the goal for the beta, and it makes sense to raise the goal for the beta. In a final review after the release, we can use this information to revise our default goals for other projects of the same type. As before, this information can be highlighted in Squore using an action item similar to the one opened on May 27th:

After revising their goal, the team can share the new standards for the project to their collaborators in the Task Completion chart from June 13th, where the actual goal line (red) moves up compared to the planned goal line (green) for the Beta Release milestone:

How it works

In order to add support for milestones to your model, configure your wizard to allow users to create milestones and goals:

<Bundle xmlns:xi="http://www.w3.org/2001/XInclude">
  <wizard wizardId="DOC" versionPattern="v#N1#" img="../../Shared/Images/icons/faded.png">
    <tools all="FALSE">
      <tool name="project_data" optional="FALSE" checkedInUI="TRUE" />
      <tool name="Squore" optional="TRUE" checkedInUI="TRUE">
      	<param name="scnode" value="TRUE" />
      	<param name="scnode_name" value="Code" />
      </tool>
    </tools>
    <milestones canCreateMilestone="TRUE" canCreateGoal="TRUE">
      <goals displayableFamilies="GOALS" />
    </milestones>
  </wizard>
</Bundle>

The milestones element allows users to create milestones in the project wizard (canCreateMilestone="TRUE") and also set goals (canCreateGoal="TRUE"). The goals can be set for metrics of the GOALS family only in this example (displayableFamilies="GOALS").

The result in the web UI is the following:

A project wizard allowing users to create milestones freely during an analysis

When creating a new project, a user decides to create a Specification Freeze milestone with one objective of 100 for the Requirement Status indicator. Other goals can be set, for the other metrics in the project that belong to the GOALS family: Risk Index, Task Progress, Test Result.

If you have company-wide milestones and objectives that need to be set for every project created with the wizard, you can specify the goals directly. Milestones can also be marked as mandatory or optional:

<Bundle xmlns:xi="http://www.w3.org/2001/XInclude">
  <wizard wizardId="DOC_WITH_MILESTONES" versionPattern="v#N1#" img="../../Shared/Images/icons/faded.png">
    <tools all="FALSE">
      <tool name="project_data" optional="FALSE" checkedInUI="TRUE" />
      <tool name="Squore" optional="TRUE" checkedInUI="TRUE">
      	<param name="scnode" value="TRUE" />
      	<param name="scnode_name" value="Code" />
      </tool>
    </tools>
	<milestones canCreateMilestone="TRUE" canCreateGoal="TRUE">
	   <goals displayableFamilies="GOALS">
		  <goal measureId="RESULT" mandatory="TRUE" highestIsBest="FALSE" />
		  <goal measureId="STATUS" mandatory="TRUE" highestIsBest="TRUE" />
		  <goal measureId="PROGRESS" mandatory="TRUE" highestIsBest="TRUE" />
		  <goal measureId="RISK_INDEX" mandatory="TRUE" highestIsBest="FALSE" />
	   </goals>
	   <milestone id="REQUIREMENT_FREEZE" mandatory="TRUE">
	   		<defaultGoal measureId="RESULT" value="0" />
	   		<defaultGoal measureId="STATUS" value="1" />
	   		<defaultGoal measureId="PROGRESS" value="30" />
	   		<defaultGoal measureId="RISK_INDEX" value="1" />
	   </milestone>
	   <milestone id="INFRASTRUCTURE_FREEZE" mandatory="TRUE">
	   		<defaultGoal measureId="RESULT" value="0" />
	   		<defaultGoal measureId="STATUS" value="1" />
	   		<defaultGoal measureId="PROGRESS" value="50" />
	   		<defaultGoal measureId="RISK_INDEX" value="1" />
	   </milestone>
	   <milestone id="CODE_FREEZE" mandatory="TRUE">
	   		<defaultGoal measureId="RESULT" value="0" />
	   		<defaultGoal measureId="STATUS" value="1" />
	   		<defaultGoal measureId="PROGRESS" value="90" />
	   		<defaultGoal measureId="RISK_INDEX" value="0.5" />
	   </milestone>
	   <milestone id="BETA_RELEASE" mandatory="FALSE">
	   		<defaultGoal measureId="RESULT" value="1" />
	   		<defaultGoal measureId="STATUS" value="1" />
	   		<defaultGoal measureId="PROGRESS" value="95" />
	   		<defaultGoal measureId="RISK_INDEX" value="0.3" />
	   </milestone>
	   <milestone id="RELEASE" mandatory="TRUE">
	   		<defaultGoal measureId="RESULT" value="1" />
	   		<defaultGoal measureId="STATUS" value="1" />
	   		<defaultGoal measureId="PROGRESS" value="100" />
	   		<defaultGoal measureId="RISK_INDEX" value="0" />
	   </milestone>
	</milestones>
  </wizard>
</Bundle>

When creating a new project, the predefined goals are filled in in the web interface, and you can still add a Beta Release milestone (using the default values specified in the wizard bundle) if needed by using the + icon:

A project wizard with preconfigured milestones and goals

If you create projects using the command line interface, you can specify settings for your milestones with the -M parameter:

-M "id=BETA_RELEASE,date=2015/05/31,PROGRESS=95"

or with a project config file:

<SquoreProjectSettings>
  <Wizard>
	<Milestones>
	   <Milestone id="BETA_RELEASE" date="2015-05-31">
	   		<Goal id="PROGRESS" value="95" />
	   </Milestone>
	</Milestones>
  </Wizard>
</SquoreProjectSettings>

In your analysis model, new functions are available to work with milestones and projections:

  • HAS_MILESTONE([milestoneId or keyword] [, date]) checks if a milestone with the specified milestoneId exists in the project.

    The function returns 0 if no milestone is found, 1 if a milestone is found.

  • DATE_MILESTONE([milestoneId or keyword] [, date]) returns the date associated to a milestone.

  • GOAL(measureId [, milestoneId or keyword] [, date]) returns the goal for a metric at a milestone.

Tip

You can use keywords instead of using a milestone ID. You can retrieve information about the next, previous, first or last milestones in the project by using:

  • NEXT

  • NEXT+STEP where STEP is a number indicating how many milestones to jump ahead

  • PREVIOUS

  • PREVIOUS-STEP where STEP is a number indicating how many milestones to jump backward

  • FIRST

  • LAST

Consut the Configuration Guide for more details.

On your charts, you are now able to:

  • Display the goals defined for each milestone in your project

  • Display the changes made to the goals defined for each milestone

  • Display the date changes for your milestones

  • Show markers for milestone dates and goals

You can also compute metrics with functions like LEAST_SQUARE_FIT(), which lets you calculate projections. This is how the Task Completion chart used in this example was created. You can find its full definition below:

<chart type="TE" id="TASK_PROJECTION" byTime="TRUE" width="700" height="400" displayOnlyIf="MILESTONES_ARE_ENABLED">
 
	<dataset renderer="STEP" >
		<goal dataBounds="[0;100]" color="GREEN" stroke="DOTTED" shape="CIRCLE" alpha="200" label="Planned" versionDate="FIRST_BUILD_DATE">PROGRESS</goal>
		<goal dataBounds="[0;100]" color="RED" stroke="SOLID" shape="DIAMOND" alpha="200" label="Revised">PROGRESS</goal>
	</dataset>
 
	<dataset renderer="LINE">
		<measure stroke="SOLID" color="#ADD8E6" alpha="200">PROGRESS</measure>
	</dataset>
		<dataset renderer="LINE">
		<goal dataBounds="[0;100]" color="#ADD8E6" stroke="DOTTED" shape="DIAMOND" alpha="200" label="Projected">
			<forecast>
				<version value="PROGRESS" timeValue="CUR_BUILD_DATE" />
				<version value="PROGRESS_NEXT" timeValue="NEXT_MILESTONE" />
				<version value="PROGRESS_NEXT_1" timeValue="NEXT_1_MILESTONE" />
				<version value="PROGRESS_NEXT_2" timeValue="NEXT_2_MILESTONE" />
			</forecast>
		</goal>
		</dataset>
	<markers>
		<marker fromMilestones="true" alpha="150" isVertical="TRUE" stroke="DOTTED" />
	</markers>
</chart>

The action items monitoring the project's progress also make use of the new GOAL() function and were defined as follows:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Bundle>
	<DecisionCriteria>
		(...)
		<DecisionCriterion dcId="PROGRESS_WARNING" categories="SCALE_PRIORITY.CRITICAL" targetArtefactTypes="APPLICATION">
			<Triggers>
				<Trigger>
					<Test expr="MILESTONES_ARE_ENABLED" bounds="[1;1]" />
					<Test expr="IF(PROGRESS_NEXT=-1, 0, PROGRESS_NEXT < GOAL(PROGRESS, NEXT))" bounds="[1;1]" 
						p2="#{MEASURE.DAYS_TO_NEXT}" p0="#{MEASURE.PROGRESS_GOAL_NEXT}" p1="#{MEASURE.PROGRESS_NEXT}" descrId="PROGRESS_WARNING_NEXT_ACTION" />
				</Trigger>
			</Triggers>
		</DecisionCriterion>
		(...)
		<DecisionCriterion dcId="OVERPERFORMANCE" categories="SCALE_PRIORITY.NONE" targetArtefactTypes="APPLICATION">
			<Triggers>
				<Trigger>
					<Test expr="MILESTONES_ARE_ENABLED" bounds="[1;1]" descrId="MILESTONES_ARE_ENABLED" />
					<Test expr="IF(PROGRESS_NEXT=-1, 0, IF(PROGRESS / GOAL(PROGRESS, NEXT) > 1.1, 0, 1))" bounds="[1;1]" 
						p2="#{MEASURE.PROGRESS}" p1="#{MEASURE.DAYS_TO_NEXT}" p0="#{MEASURE.PROGRESS_GOAL_NEXT}" descrId="OVERPERFORMANCE" />
				</Trigger>
			</Triggers>
		</DecisionCriterion>
	</DecisionCriteria>
</Bundle>

Check out the Getting Started Guide and the Configuration Guide to learn more about milestones, and if you would like to try out the demo described in this article on your own installation or review the entire model, download the configuration folder from our wiki and launch the demo from Tools > Feature Spotlight: Milestones.