 
 <html>

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="element_type" content="other">  <meta name="filetype" content="description"> 
<title>White Papers</title>
<link rel="StyleSheet" href="../rop.css" type="text/css">

<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
</head>

<body>

 
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top">

<script language="JavaScript">
<!--

//Tell the TreePath to update itself
var thePath = "";
var type = typeof parent.ory_button;
if (type != "undefined") {
	 type = typeof parent.ory_button.getTreePath();
	 if (type != "undefined") {
	 	 thePath = parent.ory_button.getTreePath();
	 }
}
document.write(thePath);
-->
</script>

 



<h1 class="banner"><b>Rational Unified Process:&nbsp;White Papers</b></h1>
<p class="banner">The RUP includes a number of white papers, listed below.</p>
<ul>
<li><a href="../components/pc_disciplines.htm">Disciplines</a><ul>
<li><a href="apprmuc.htm">Applying Requirements Management with Use Cases</a></li>
<li><a href="traceability.htm">Traceability Strategies for Managing Requirements with Use Cases</a></li>
</ul>
</li>
<li><a href="../components/pc_requirements.htm">Requirements</a><ul>
<li><a href="apprmuc.htm">Applying Requirements Management with Use Cases</a></li>
<li><a href="usecase.htm">The Estimation of Effort Based on Use Cases</a></li>
<li><a href="traceability.htm">Traceability Strategies for Managing Requirements with Use Cases</a></li>
<li><a href="teness.htm">The Ten Essentials of RUP</a></li>
</ul>
</li>
<li><a href="../components/pc_architecture.htm">Architecture</a><ul>
<li><a href="layering_strategies.htm">Layering Strategies</a></li>
</ul>
</li>
<li><a href="../components/pc_design.htm">Design</a><ul>
<li><a href="xprefact.htm">RUP/XP Guidelines: Test-first Design and Refactoring</a></li>
<li><a href="sis.htm">Developing Large-Scale Systems with the Rational Unified Process</a></li>
</ul>
</li>
<li><a href="../components/pc_implementation.htm">Implementation</a><ul>
<li><a href="xprefact.htm">RUP/XP Guidelines: Test-first Design and Refactoring</a></li>
<li><a href="xppair.htm">RUP/XP Guidelines: Pair Programming</a></li>
</ul>
</li>
<li><a href="../components/pc_assessment.htm">Assessment</a><ul>
<li><a href="../components/assessment/pc_test.htm">Test</a><ul>
<li><a href="rt_test.htm">Testing Embedded Systems</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="../components/pc_management.htm">Management</a><ul>
<li><a href="../components/management/pc_ccm.htm">Configuration & Change Management</a><ul>
<li><a href="contentmgmt.htm">Content Management Using the Rational Unified Process</a></li>
<li><a href="teness.htm">The Ten Essentials of RUP</a></li>
</ul>
</li>
<li><a href="teness.htm">The Ten Essentials of RUP</a></li>
<li><a href="transwfall.htm">From Waterfall to Iterative Lifecycle</a></li>
<li><a href="usecase.htm">The Estimation of Effort Based on Use Cases</a></li>
<li><a href="rupxp.htm">A Comparison of RUP and XP</a></li>
<li><a href="smproj.htm">Using the RUP for Small Projects: Expanding upon eXtreme Programming</a></li>
<li><a href="rupcmm.htm">Reaching CMM Levels 2 and 3</a></li>
<li><a href="process_maturity.htm">An Enabler for Higher Process Maturity</a></li>
<li><a href="sis.htm">Developing Large-Scale Systems with the Rational Unified Process</a></li>
<li><a href="variants.htm">System Variants</a></li>
</ul>
</li>
<li><a href="../components/pc_tools.htm">Tools</a><ul>
<li><a href="../toolment/xde_eclipse/model_structure_guidelines.htm">Model Structure Guidelines for Rational XDE Developer - Java Platform Edition</a></li>
<li><a href="../toolment/xde_vsnet/model_structure_guidelines.htm">Model Structure Guidelines for Rational XDE Developer - .NET Edition</a></li>
</ul>
</li>
</ul>

<p>If you have Internet access,&nbsp; some of the RUP white papers can be downloaded 
  from&nbsp;the <a href="http://www-306.ibm.com/software/rational/info/literature/whitepapers.jsp" target="_blank">IBM Web site.</a></p>
<br><br>

 
<div class="margins20">
<p>
 <a href="../copyrite/copyrite.htm">
 <font size="-2">&copy; Copyright IBM Corp. 1987, 2004. All Rights Reserved.</font>
 </a>
</p>
</div>


</td><td valign="top" width="24"></td><td valign="top" width="1%">
<p>
<a href="../index.htm"></a>
</p>

<script language="JavaScript">
<!--

function loadTop()
{
  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
  {
	 var msg = "The Rational Unified Process is already displayed using frames";
     alert(msg);
  }
  else
  {
    var expires = new Date();
    expires.setTime (expires.getTime() + (1000 * 20));
    document.cookie = "rup_ory_doc=" + escape (document.URL) +
    "; expires=" + expires.toUTCString() +  "; path=/";

    var new_ory_doc_loc = null;

    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href;
         break;
       }
    }

    if(new_ory_doc_loc!=null)
    {
	if( self.name == "ory_doc" )
	{
		window.close();
		window.open( new_ory_doc_loc );		
	}
	else
	{
	       	top.location = new_ory_doc_loc;
	}
    }
   }
}
// -->
</script>
<script language="JavaScript">
<!--
  function getImageUrl(image)
  {
    var new_ory_doc_loc=null;
    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href.substring(0,document.links[i].href.lastIndexOf("/"));
         new_ory_doc_loc = new_ory_doc_loc + "" + image;
         return new_ory_doc_loc;
       }
    }
    return null;
  }
// -->
</script>
<script
language="JavaScript">
<!--
MSFPhover =
(((navigator.appName == "Netscape") &&
  (parseInt(navigator.appVersion) >= 3 )) ||
  ((navigator.appName == "Microsoft Internet Explorer") &&
  (parseInt(navigator.appVersion) >= 4 )));

  function MSFPpreload(img)
  {
     var a=new Image();
     a.src=img;
     return a;
  }
// -->
</script>
<script language="JavaScript">
<!--
    if(MSFPhover)
    {
        RupGray=MSFPpreload(getImageUrl('/images/rup1.gif'));
        RupBlue=MSFPpreload(getImageUrl('/images/rup1_a.gif'));
    }
// -->

//display the load button or not
var ory_toc_exist = typeof parent.ory_toc;
if (ory_toc_exist == "undefined") {
	// split alt text out to allow translation
	var altText = "Display Rational Unified Process using frames";
	document.write("<a href=\"JavaScript:loadTop();\" onmouseover=\"if(MSFPhover) document['Home'].src=RupBlue.src; self.status=' '; return true\" onmouseout=\"if(MSFPhover) document['Home'].src=RupGray.src; self.status= ' ';return true\"> <br> <img src=\"../images/rup1.gif");
	document.write("\"  border=\"0\" alt=\"");
        document.write(altText);
        document.write("\" name=\"Home\" width=\"26\" height=\"167\"></a>");

}
else {
	var nbsp = "&nbsp;";
	document.write(nbsp);
}
</script>

</td></tr></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
<p align="right"><small><small>Rational Unified Process&nbsp;&nbsp; 
<img border="0" alt="2003.06.15" src="../images/rupversion.gif">
</small></small>
</td></tr></table>

 

</body>

</html>
