<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ssinha3</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ssinha3"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Ssinha3"/>
	<updated>2026-05-06T12:49:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68812</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68812"/>
		<updated>2012-10-27T01:46:08Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
'''Pair-Programming''':&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
''Advantage'':&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
'''Collective Ownership''':&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
'''User – Stories''':&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
'''Automated – Testing''':&lt;br /&gt;
&lt;br /&gt;
XP is highly dependent on unit testing. Testing provide the safety net enabling pairs of programmers to make changes to any piece of code with courage. In this way programmers are more responsible for the code they create. Also each class have a suite of automated unit test. So before any changes are made to the code below procedure (Test Driven Development.) is followed. &lt;br /&gt;
&lt;br /&gt;
Testing new feature:&lt;br /&gt;
XP teams write tests before each new feature is added to the system. Here is the test-driven process:&lt;br /&gt;
# Run the suite of unit tests for the entire project, ensuring that they all pass.&lt;br /&gt;
# Write a unit test for the new feature.&lt;br /&gt;
# You probably have to stub out the implementation in order to get your test to compile.&lt;br /&gt;
# Run the test and observe its failure.&lt;br /&gt;
# Implement the new feature.&lt;br /&gt;
# Run the test again and observe its success.&lt;br /&gt;
&lt;br /&gt;
Also Acceptance Testing is done to test high-level application functionality. This kind of test involves and is driven by the customer. When you need to test high-level application functionality, turn to acceptance testing. This sort of testing is driven by the customer, although they will probably need help from a programmer to implement the tests. Acceptance tests should be designed to pass or fail, and they should be as automated as possible. Unlike unit tests, however, acceptance tests do not have to pass at 100%.&lt;br /&gt;
&lt;br /&gt;
'''Small Releases''':&lt;br /&gt;
&lt;br /&gt;
Below are the activities which involve small release planning:&lt;br /&gt;
#Prioritize the work.  Arrange tasks by difficulty. Assign a low value to a simple task&lt;br /&gt;
#Make a plan.&lt;br /&gt;
#Customers, managers and developers must be involved.&lt;br /&gt;
#Define task from specification into user-stories&lt;br /&gt;
#Break down large tasks if possible &lt;br /&gt;
#Estimate how much time is needed. Can measure absolutely or relatively in terms of Hours or Story Points&lt;br /&gt;
#Important questions to ask, What should be completed first? Are tasks not necessary? Will the tasks take too long?&lt;br /&gt;
#Customer feedback important&lt;br /&gt;
#Developers can also decide what tasks are important.&lt;br /&gt;
#Decide what will be done in each iteration&lt;br /&gt;
#Velocity: Amount of work per iteration Also, if velocity is unknown estimate or do a test iteration.&lt;br /&gt;
#Each release plan has some sprints(one to two weeks long). We assign features to each sprint&lt;br /&gt;
Then we determine the velocity in terms of story points per sprint.&lt;br /&gt;
&lt;br /&gt;
'''Continuous Integration''':&lt;br /&gt;
#Code should be integrated and committed to repository every few hours. Hence holding on to changes is avoided.&lt;br /&gt;
#Everyone is made to work on the same version as everyone else in the project. And its individual programmers responsibility to integrate their own code when ever a reasonable break presents itself.&lt;br /&gt;
#Helps avoid avoids or detects compatibility problems early.&lt;br /&gt;
#There is no addition cost or time needed to integrate the system. More commonly explained by the phrase “pay me now or pay me more later”.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
5 Hand-picked Extreme Programming '''[http://www.software-pointers.com/en-extremeprogramming-tools.html XP Tools]'''&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
*[http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
*[http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
*[http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
*[http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
*[http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
*[http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
*[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results Research Article]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68805</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68805"/>
		<updated>2012-10-27T01:43:45Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
'''Pair-Programming''':&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
''Advantage'':&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
'''Collective Ownership''':&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
'''User – Stories''':&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
'''Automated – Testing''':&lt;br /&gt;
&lt;br /&gt;
XP is highly dependent on unit testing. Testing provide the safety net enabling pairs of programmers to make changes to any piece of code with courage. In this way programmers are more responsible for the code they create. Also each class have a suite of automated unit test. So before any changes are made to the code below procedure (Test Driven Development.) is followed. &lt;br /&gt;
&lt;br /&gt;
Testing new feature:&lt;br /&gt;
XP teams write tests before each new feature is added to the system. Here is the test-driven process:&lt;br /&gt;
# Run the suite of unit tests for the entire project, ensuring that they all pass.&lt;br /&gt;
# Write a unit test for the new feature.&lt;br /&gt;
# You probably have to stub out the implementation in order to get your test to compile.&lt;br /&gt;
# Run the test and observe its failure.&lt;br /&gt;
# Implement the new feature.&lt;br /&gt;
# Run the test again and observe its success.&lt;br /&gt;
&lt;br /&gt;
Also Acceptance Testing is done to test high-level application functionality. This kind of test involves and is driven by the customer. When you need to test high-level application functionality, turn to acceptance testing. This sort of testing is driven by the customer, although they will probably need help from a programmer to implement the tests. Acceptance tests should be designed to pass or fail, and they should be as automated as possible. Unlike unit tests, however, acceptance tests do not have to pass at 100%.&lt;br /&gt;
&lt;br /&gt;
'''Small Releases''':&lt;br /&gt;
&lt;br /&gt;
Below are the activities which involve small release planning:&lt;br /&gt;
#Prioritize the work.  Arrange tasks by difficulty. Assign a low value to a simple task&lt;br /&gt;
#Make a plan.&lt;br /&gt;
#Customers, managers and developers must be involved.&lt;br /&gt;
#Define task from specification into user-stories&lt;br /&gt;
#Break down large tasks if possible &lt;br /&gt;
#Estimate how much time is needed. Can measure absolutely or relatively in terms of Hours or Story Points&lt;br /&gt;
#Important questions to ask, What should be completed first? Are tasks not necessary? Will the tasks take too long?&lt;br /&gt;
#Customer feedback important&lt;br /&gt;
#Developers can also decide what tasks are important.&lt;br /&gt;
#Decide what will be done in each iteration&lt;br /&gt;
#Velocity: Amount of work per iteration Also, if velocity is unknown estimate or do a test iteration.&lt;br /&gt;
#Each release plan has some sprints(one to two weeks long). We assign features to each sprint&lt;br /&gt;
Then we determine the velocity in terms of story points per sprint.&lt;br /&gt;
&lt;br /&gt;
'''Continuous Integration''':&lt;br /&gt;
#Code should be integrated and committed to repository every few hours. Hence holding on to changes is avoided.&lt;br /&gt;
#Everyone is made to work on the same version as everyone else in the project. And its individual programmers responsibility to integrate their own code when ever a reasonable break presents itself.&lt;br /&gt;
#Helps avoid avoids or detects compatibility problems early.&lt;br /&gt;
#There is no addition cost or time needed to integrate the system. More commonly explained by the phrase “pay me now or pay me more later”.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
5 Hand-picked Extreme Programming '''[http://www.software-pointers.com/en-extremeprogramming-tools.html XP Tools]'''&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68794</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68794"/>
		<updated>2012-10-27T01:36:54Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
'''Pair-Programming''':&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
''Advantage'':&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
'''Collective Ownership''':&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
'''User – Stories''':&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
'''Automated – Testing''':&lt;br /&gt;
&lt;br /&gt;
XP is highly dependent on unit testing. Testing provide the safety net enabling pairs of programmers to make changes to any piece of code with courage. In this way programmers are more responsible for the code they create. Also each class have a suite of automated unit test. So before any changes are made to the code below procedure (Test Driven Development.) is followed. &lt;br /&gt;
&lt;br /&gt;
Testing new feature:&lt;br /&gt;
XP teams write tests before each new feature is added to the system. Here is the test-driven process:&lt;br /&gt;
# Run the suite of unit tests for the entire project, ensuring that they all pass.&lt;br /&gt;
# Write a unit test for the new feature.&lt;br /&gt;
# You probably have to stub out the implementation in order to get your test to compile.&lt;br /&gt;
# Run the test and observe its failure.&lt;br /&gt;
# Implement the new feature.&lt;br /&gt;
# Run the test again and observe its success.&lt;br /&gt;
&lt;br /&gt;
Also Acceptance Testing is done to test high-level application functionality. This kind of test involves and is driven by the customer. When you need to test high-level application functionality, turn to acceptance testing. This sort of testing is driven by the customer, although they will probably need help from a programmer to implement the tests. Acceptance tests should be designed to pass or fail, and they should be as automated as possible. Unlike unit tests, however, acceptance tests do not have to pass at 100%.&lt;br /&gt;
&lt;br /&gt;
'''Small Releases''':&lt;br /&gt;
&lt;br /&gt;
Below are the activities which involve small release planning:&lt;br /&gt;
#Prioritize the work.  Arrange tasks by difficulty. Assign a low value to a simple task&lt;br /&gt;
#Make a plan.&lt;br /&gt;
#Customers, managers and developers must be involved.&lt;br /&gt;
#Define task from specification into user-stories&lt;br /&gt;
#Break down large tasks if possible &lt;br /&gt;
#Estimate how much time is needed. Can measure absolutely or relatively in terms of Hours or Story Points&lt;br /&gt;
#Important questions to ask, What should be completed first? Are tasks not necessary? Will the tasks take too long?&lt;br /&gt;
#Customer feedback important&lt;br /&gt;
#Developers can also decide what tasks are important.&lt;br /&gt;
#Decide what will be done in each iteration&lt;br /&gt;
#Velocity: Amount of work per iteration Also, if velocity is unknown estimate or do a test iteration.&lt;br /&gt;
#Each release plan has some sprints(one to two weeks long). We assign features to each sprint&lt;br /&gt;
Then we determine the velocity in terms of story points per sprint.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
5 Hand-picked Extreme Programming '''[http://www.software-pointers.com/en-extremeprogramming-tools.html XP Tools]'''&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68704</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68704"/>
		<updated>2012-10-27T01:09:26Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
'''Pair-Programming''':&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
''Advantage'':&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
'''Collective Ownership''':&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
'''User – Stories''':&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
5 Hand-picked Extreme Programming '''[http://www.software-pointers.com/en-extremeprogramming-tools.html XP Tools]'''&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68660</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68660"/>
		<updated>2012-10-27T00:47:46Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
'''Pair-Programming''':&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
''Advantage'':&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
'''Collective Ownership''':&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
'''User – Stories''':&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68611</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68611"/>
		<updated>2012-10-27T00:26:53Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Advantages of XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the '''[http://www.versionone.com/Agile101/Agile-Development-Release-Planning/ Small Releases practice]'''&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68605</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68605"/>
		<updated>2012-10-27T00:24:49Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Four values in XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs('''[http://en.wikipedia.org/wiki/Pair_programming Pair Programming]''').There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68603</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68603"/>
		<updated>2012-10-27T00:23:46Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Four values in XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is '''[http://en.wikipedia.org/wiki/Unit_testing Unit Tests]''', Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68589</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68589"/>
		<updated>2012-10-27T00:21:17Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Four values in XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*'''Simplicity''': Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
*'''Communication''': With respect to programmers, code communicates best when it is simple else once should strive to simplify it. Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair. XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
*'''Feedback''': On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
*'''Courage''': For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68575</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68575"/>
		<updated>2012-10-27T00:13:39Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Disadvantages of XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Taylorism Tailoring]'''&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*'''[http://en.wikipedia.org/wiki/Code_refactoring Refactoring]''' – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. '''[http://en.wikipedia.org/wiki/Software_versioning Versioning]''' issues.&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68558</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68558"/>
		<updated>2012-10-27T00:10:19Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Comparison with waterfall model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall]''' approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how '''[http://en.wikipedia.org/wiki/Agile_software_development agile methodologies]''' differ from traditional '''[http://en.wikipedia.org/wiki/Waterfall_model Waterfall Model]'''.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68539</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68539"/>
		<updated>2012-10-27T00:06:30Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Research Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
'''[http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Research]''' was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68516</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68516"/>
		<updated>2012-10-27T00:02:34Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Designing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low '''[http://en.wikipedia.org/wiki/Coupling_(computer_science) Coupling]''' and high '''[http://en.wikipedia.org/wiki/Cohesion_(computer_science) Cohesion]'''. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68503</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68503"/>
		<updated>2012-10-26T23:59:03Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Listening */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what '''[http://en.wikipedia.org/wiki/Business_logic business logic]''' is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low coupling and high cohesion. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68496</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68496"/>
		<updated>2012-10-26T23:57:23Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Acceptance_testing Acceptance tests]''' verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what &amp;quot;business logic&amp;quot; is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low coupling and high cohesion. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68486</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68486"/>
		<updated>2012-10-26T23:53:27Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Goals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# Attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# Changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
Acceptance tests verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what &amp;quot;business logic&amp;quot; is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low coupling and high cohesion. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68484</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68484"/>
		<updated>2012-10-26T23:52:31Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* What is extreme programming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming]''' (XP) is a software development methodology created by '''[http://en.wikipedia.org/wiki/Kent_Beck Kent Beck]''' during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of '''[http://en.wikipedia.org/wiki/Agile_software_development agile software development processes]'''. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
&lt;br /&gt;
===Goals===&lt;br /&gt;
&lt;br /&gt;
Extreme Programming is a software-development discipline that organizes people to produce higher quality software more productively.&lt;br /&gt;
The main goals are:&lt;br /&gt;
# attempt to reduce the cost of changes in requirements by having multiple short development cycles&lt;br /&gt;
# changes are a natural and a desirable aspect of software-development projects, and should be planned for in advance.&lt;br /&gt;
&lt;br /&gt;
===Activities===&lt;br /&gt;
&lt;br /&gt;
XP describes four basic activities that are performed within the software development process: designing, coding, testing, listening as described below:&lt;br /&gt;
&lt;br /&gt;
====Coding====&lt;br /&gt;
&lt;br /&gt;
The guiding principle of XP is that without code, there is no working product. Hence, importance is given to code rather than documentation for various aspects.&lt;br /&gt;
&lt;br /&gt;
Coding can also help to communicate thoughts about problems. A programmer dealing with a complex programming problem, might prototype it in a simplified manner and use it to demonstrate what he or she means. Code is always clear and concise and makes the problem unambiguous.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
Extreme programming's approach is that a lot of testing can eliminate many flaws in the product.&lt;br /&gt;
&lt;br /&gt;
Unit tests are performed to determine whether a given unit of the product works as intended. A programmer writes as many automated tests as they can think of that might &amp;quot;break&amp;quot; the code. Only if all tests run successfully, then the coding is complete. Every piece of code that is written is tested before moving on to the next feature.&lt;br /&gt;
Acceptance tests verify that the components delivered the programmers satisfy the customer's actual requirements.&lt;br /&gt;
&lt;br /&gt;
====Listening====&lt;br /&gt;
&lt;br /&gt;
The Programmers must listen to what the customer requirements are clearly, and what &amp;quot;business logic&amp;quot; is needed and give feedback about the technical aspects of how the problem might be solved, or cannot be solved. Effective communication between the customer and the development team is essential to get the product working as intended. Hence, listening is a very important aspect of XP.&lt;br /&gt;
&lt;br /&gt;
====Designing====&lt;br /&gt;
&lt;br /&gt;
Creating a design structure organizes the components of the system. Good design will avoid lots of dependencies within a system and will focus on low coupling and high cohesion. Without a proper design the system becomes too complex and the dependencies within the system cease to be clear.&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68097</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=68097"/>
		<updated>2012-10-24T17:34:07Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. &lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Programmer picks a User Story.&lt;br /&gt;
*Programmer1 asks for help from another Programmer2.&lt;br /&gt;
*Programmer1 and Programmer2 work to implement the functionality.&lt;br /&gt;
*After the immediate task is completed, programmer1 picks another partner to complete the remaining task or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
Advantage:&amp;lt;br&amp;gt;&lt;br /&gt;
*Partners rotate frequently and hence facilitate communication.&lt;br /&gt;
*Paring with experienced programmers beginners gain valuable coding experience.&lt;br /&gt;
*While one person writes programs other gets time to think about the problem at higher level of abstraction.&lt;br /&gt;
 &lt;br /&gt;
Collective Ownership:&lt;br /&gt;
*Every team member can work on any part of code in the application. There is constant shuffling and change of roles.&lt;br /&gt;
*Collective code ownership works because any team member can ask for help when he/she works on unfamiliar classes.&lt;br /&gt;
*It’s easier to catch errors when you have a set of unit cases to rely on. If a new change introduced by a partner breaks the code, it can be easily tracked before the code is integrated.&lt;br /&gt;
*Shared ownership model avoids the problem situations where the entire team depends on the one person who understands a part of code.&lt;br /&gt;
*It encourages high design quality because every functionality is subject to continuous refactor and modification.&lt;br /&gt;
&lt;br /&gt;
User – Stories:&amp;lt;br&amp;gt;&lt;br /&gt;
*Used to estimate for the release planning meeting.&lt;br /&gt;
*Easy to comprehend as compared to large requirement documents.&lt;br /&gt;
*Very intuitive since they reflect what customers expect hence drive the creation of acceptance test.&lt;br /&gt;
*User stories provide enough detail to make a low risk estimate of the time the story will take to implement.&lt;br /&gt;
*Each story will be 1, 2 or 3 week estimate in &amp;quot;ideal development time&amp;quot; which is the time it would take to implement the story in code if there were no distractions and the programmers know what to do. If its more than 3 weeks then the stories need to be broken down into simpler stories.&lt;br /&gt;
*Avoid details of technology, data base layout, and algorithms being used.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67660</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67660"/>
		<updated>2012-10-20T23:50:37Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
&lt;br /&gt;
Pair-Programming:&amp;lt;br&amp;gt;&lt;br /&gt;
XP teams work in pairs where they share a single computer, keyboard, and mouse. Having dual monitors is a good idea because both programmers can then see the screen clearly, although this is not a requirement. Desks should be configured so that two people can sit side-by-side comfortably, and the entire team should work in the same room.&lt;br /&gt;
&lt;br /&gt;
Flow:&amp;lt;br&amp;gt;&lt;br /&gt;
*Programmer one Pick a User Story to implement.&lt;br /&gt;
*Ask help from another programmer let’s say Programmer 2.&lt;br /&gt;
*Both Programmer 1 and Programmer 2 start working on a small piece of functionality.&lt;br /&gt;
*Both work on small tasks that take a few hours.&lt;br /&gt;
*After the immediate task is complete, pick Programmer 1 choses a different partner or offers help to someone else.&lt;br /&gt;
&lt;br /&gt;
In this approach partners rotate frequently hence facilitates communication between&lt;br /&gt;
team members and spreads knowledge. Writing simple code is hard, and experienced programmers are generally better at it. Pairing people, help beginners gain valuable coding experience from the experts.&lt;br /&gt;
&lt;br /&gt;
When you are not the partner doing the typing, you have time to think about the problem at a&lt;br /&gt;
higher level of abstraction. The observer should look for ways to simplify the code, and think about&lt;br /&gt;
additional unit tests. &lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67644</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67644"/>
		<updated>2012-10-20T22:37:15Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Aspects in key practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
There are 19 key practices:&lt;br /&gt;
*Joint&lt;br /&gt;
*Common Vocabulary&lt;br /&gt;
*Iterations&lt;br /&gt;
*Open Workspace&lt;br /&gt;
*Retrospectives&lt;br /&gt;
*Development&lt;br /&gt;
*Test-First Development&lt;br /&gt;
*Pair Programming&lt;br /&gt;
*Refactoring&lt;br /&gt;
*Collective Ownership&lt;br /&gt;
*Continuous Integration&lt;br /&gt;
*Just-In-Time Design&lt;br /&gt;
*Customer&lt;br /&gt;
*Storytelling&lt;br /&gt;
*Release Planning&lt;br /&gt;
*Acceptance Tests&lt;br /&gt;
*Frequent Releases&lt;br /&gt;
*Management&lt;br /&gt;
*Accepted Responsibility&lt;br /&gt;
*Air Cover&lt;br /&gt;
*Quarterly Review&lt;br /&gt;
*Mirror&lt;br /&gt;
*Sustainable Pace&lt;br /&gt;
&lt;br /&gt;
Lets understand some of the practices in more detail.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67643</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67643"/>
		<updated>2012-10-20T22:33:13Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Four values in XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
*Simplicity:&lt;br /&gt;
Keeping code simple makes changing code easier as the requirements inevitably change. Simple solutions to today's problems minimizes the cost of change over time. For example it is ten times harder to fix a mistake of requirements when you are in the design phase, and 100 times harder to make changes late in a project during the coding phase. simple designs minimizes the risk of spending a long time designing sophisticated frameworks that the customer may not use/want.&lt;br /&gt;
[[File:simple.jpg| center]]&lt;br /&gt;
One important point to note is that XP approach recognizes that the cost of change generally increases like one would expect, but this increase is not always increasing. If the code is refactored and kept simple, we can avoid ever-increasing complexity.&lt;br /&gt;
&lt;br /&gt;
*Communication:&lt;br /&gt;
Different Types of Communication:&lt;br /&gt;
With respect to programmers, code communicates best when it is simple else once should strive to simplify it.&lt;br /&gt;
Another form of communication is Unit Tests, Unit tests exercise the classes and methods in your application,Unit tests communicate the design of a class effectively.&lt;br /&gt;
Programmers communicate to with one another because they program in pairs(Pair Programming).There is no set observer in a pair.&lt;br /&gt;
XP requires an on-site customer to convey the requirements to the team. The customer decides which features are most important, and is always available to answer questions.&lt;br /&gt;
&lt;br /&gt;
*Feedback:&lt;br /&gt;
On-site customer the means to get immediate feedback about the project status. There are short release cycles, where the customer is able to evaluate each new feature as it is developed, minimizing the necessity to rework and helping the programmers focus on what is most important to the customer. The customer always defines which features are the most important, so the most valuable features are delivered early in the project. Customers can cancel the project at any time and have a working system with the features as per the last release.&lt;br /&gt;
&lt;br /&gt;
*Courage:&lt;br /&gt;
For managers, the concept of pair programming can be hard to accept—it seems like productivity will drop by 50%, because only half of the programmers are writing code at any given time. It takes courage to trust that pair programming improves quality without slowing down progress. It takes courage to implement the feature the customer is asking for today using a simple approach, because you probably want to build in flexibility to account for tomorrow's features, as well.Everyone gives and feels the respect they deserve as a valued team member. Everyone contributes value even if it's simply enthusiasm. Developers respect the expertise of the customers and vice versa. Management respects our right to accept responsibility and receive authority over our own work.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Simple.jpg&amp;diff=67642</id>
		<title>File:Simple.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Simple.jpg&amp;diff=67642"/>
		<updated>2012-10-20T22:32:41Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67634</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67634"/>
		<updated>2012-10-20T22:12:06Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Comparison with waterfall model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| center]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67633</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67633"/>
		<updated>2012-10-20T22:10:33Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Comparison with waterfall model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]]&lt;br /&gt;
[[File:waterfall-1.png| right]]&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67629</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67629"/>
		<updated>2012-10-20T22:05:57Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Comparison with waterfall model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
 Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]] [[File:waterfall-1.png| right]]&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Waterfall-1.png&amp;diff=67628</id>
		<title>File:Waterfall-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Waterfall-1.png&amp;diff=67628"/>
		<updated>2012-10-20T22:05:35Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67627</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67627"/>
		<updated>2012-10-20T22:00:52Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Comparison with waterfall model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
 Waterfall approach emphasizes on clear definition from the beginning of project. Its strengths are ability to analyse potential changes easily, large and distributed teams are well-coordinated, predictable budgets, and only needs small involvement from subject matter experts. But there are some clear disadvantages also. For example lack of flexibility, difficulty in predicting actual needs for the software, the loss of intangible knowledge between phases, discouragement of team cohesion, and the tendency to not discover design flaws until the testing phase. In reality it is very difficult for projects to follow the sequential flow of the model. It is difficult to identify all requirements and goals at the beginning of projects as requirements tend to change all the way. A working version can only be obtained late in the process.&lt;br /&gt;
 &lt;br /&gt;
Below is a picture of how agile methodologies differ from traditional waterfall model.&lt;br /&gt;
[[File:Agile-1.jpg| left]] [[File:waterfall-1.jpg| right]]&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Waterfall-1.jpg&amp;diff=67626</id>
		<title>File:Waterfall-1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Waterfall-1.jpg&amp;diff=67626"/>
		<updated>2012-10-20T22:00:05Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Agile-1.jpg&amp;diff=67625</id>
		<title>File:Agile-1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Agile-1.jpg&amp;diff=67625"/>
		<updated>2012-10-20T21:59:07Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67623</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67623"/>
		<updated>2012-10-20T21:49:56Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Extreme programming (XP) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
[[File:Extreme.jpg| right]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67622</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67622"/>
		<updated>2012-10-20T21:48:39Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* What is extreme programming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67621</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67621"/>
		<updated>2012-10-20T21:47:51Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* What is extreme programming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
[[File:Extreme.jpg| center]]&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Extreme.jpg&amp;diff=67620</id>
		<title>File:Extreme.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Extreme.jpg&amp;diff=67620"/>
		<updated>2012-10-20T21:46:59Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: Work Flow of Extreme Programming Methodology.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Work Flow of Extreme Programming Methodology.&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67619</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67619"/>
		<updated>2012-10-20T21:39:57Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Disadvantages of XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
*Coding Standards – Reduces the amount of time developers spend reformatting other peoples’ code. Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
*On-Site Customer - Can give quick and knowledgeable answers to real development questions. Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
*40-Hour Week – Most developers lose effectiveness past 40-Hours. Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
*Continuous Integration - Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
*Collective Ownership - Helps mitigate the loss of a team member leaving. Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
*Pair Programming – Two heads are better than one. Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may not work yet? Is there a way to simplify this?&lt;br /&gt;
*Refactoring – Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
*Testing – Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
*Simple Design – Time is not wasted adding superfluous functionality. Easier to understand what is going on. Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
*Metaphor – Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
*Small Releases – Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
*The Planning Game – Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67617</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67617"/>
		<updated>2012-10-20T21:34:10Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Disadvantages of XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
Coding Standards – Advantages:&lt;br /&gt;
 Reduces the amount of time developers spend reformatting other peoples’ code. &lt;br /&gt;
 Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
On-Site Customer - Advantages:&lt;br /&gt;
 Can give quick and knowledgeable answers to real development questions. &lt;br /&gt;
 Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
40-Hour Week – Advantage:&lt;br /&gt;
 Most developers lose effectiveness past 40-Hours &lt;br /&gt;
 Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
Continuous Integration - Advantages&lt;br /&gt;
 Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
Collective Ownership – Advantages&lt;br /&gt;
 Helps mitigate the loss of a team member leaving. &lt;br /&gt;
 Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
Pair Programming – Advantages&lt;br /&gt;
 Two heads are better than one. &lt;br /&gt;
 Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may   &lt;br /&gt;
 not work yet? Is there a way to simplify this?&lt;br /&gt;
Refactoring – Advantages&lt;br /&gt;
 Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
Testing – Advantages&lt;br /&gt;
 Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
Simple Design – Advantages&lt;br /&gt;
 Time is not wasted adding superfluous functionality. Easier to understand what is going on.  &lt;br /&gt;
 Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
Metaphor – Advantages &lt;br /&gt;
 Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
Small Releases – Advantages&lt;br /&gt;
 Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
The Planning Game – Advantages&lt;br /&gt;
 Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
*Informal, little, or no documentation&lt;br /&gt;
*Scalability&lt;br /&gt;
*Contract Issues&lt;br /&gt;
*Misconception on the cost of change&lt;br /&gt;
*Tailoring&lt;br /&gt;
*Coding Standards – Degrading the quality of inline documentation&lt;br /&gt;
*On-Site Customer – Difficult to get an On-Site Customer. The On-Site customer that is given may not be fully knowledgeable about what the company may not have authority to make many decisions. Loss of work to the customer’s company.&lt;br /&gt;
*40-Hour Week - The underlying principle is flawed. 40-Hours is a magic number. Some may like to work more than 40-Hours&lt;br /&gt;
*Continuous Integration – The one day limit is not always practical. Reduces the importance of a well-thought-out architecture&lt;br /&gt;
*Collective Ownership - Loss of accountability. Limitation to how much of a large system that an individual can practically “own”&lt;br /&gt;
*Pair Programming – Many tasks really don’t require two programmers. A hard sell to the customers. Not for everyone&lt;br /&gt;
*Refactoring – Not everyone is capable of refactoring. Refactoring may not always be appropriate. Would upfront design eliminate refactoring?&lt;br /&gt;
*Testing – Automated unit testing isn’t for everything. Reliance on unit testing isn’t a good idea. A test result is only as good as the test itself&lt;br /&gt;
*Simple Design – What is “simple?”. Simple isn’t always best&lt;br /&gt;
*Metaphor – Often the metaphor is the system. Another opportunity for miscommunication. The system is often not well understood as a metaphor&lt;br /&gt;
*Small Releases – Not easy for all projects. Not needed for all projects. Versioning issues&lt;br /&gt;
*The Planning Game – Customer availability. Is planning this often necessary?&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67615</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67615"/>
		<updated>2012-10-20T21:26:27Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Advantages of XP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
*Built-In Quality&lt;br /&gt;
*Overall Simplicity&lt;br /&gt;
*Programmer Power&lt;br /&gt;
*Customer Power&lt;br /&gt;
*Synergy Between Practices&lt;br /&gt;
Coding Standards – Advantages:&lt;br /&gt;
 Reduces the amount of time developers spend reformatting other peoples’ code. &lt;br /&gt;
 Reduces the need  for internal commenting. Call for clear, unambiguous code&lt;br /&gt;
On-Site Customer - Advantages:&lt;br /&gt;
 Can give quick and knowledgeable answers to real development questions. &lt;br /&gt;
 Makes sure that what is developed is what is needed. Functionality is prioritized correctly&lt;br /&gt;
40-Hour Week – Advantage:&lt;br /&gt;
 Most developers lose effectiveness past 40-Hours &lt;br /&gt;
 Value is placed on the developer’s well-being. Management is forced to find real solutions&lt;br /&gt;
Continuous Integration - Advantages&lt;br /&gt;
 Reduces to lengthy process. Enables the Small Releases practice&lt;br /&gt;
Collective Ownership – Advantages&lt;br /&gt;
 Helps mitigate the loss of a team member leaving. &lt;br /&gt;
 Promotes developers to take responsibility for the system as whole rather than parts of the system&lt;br /&gt;
Pair Programming – Advantages&lt;br /&gt;
 Two heads are better than one. &lt;br /&gt;
 Focus Two people are more likely to answer the following questions: Is this whole approach going to work? What are some test cases that may   &lt;br /&gt;
 not work yet? Is there a way to simplify this?&lt;br /&gt;
Refactoring – Advantages&lt;br /&gt;
 Prompts developers to proactively improve the product as a whole. Increases developer knowledge of the system&lt;br /&gt;
Testing – Advantages&lt;br /&gt;
 Unit testing promote testing completeness. Test-first gives developers a goal. Automation gives a suite of regression test&lt;br /&gt;
Simple Design – Advantages&lt;br /&gt;
 Time is not wasted adding superfluous functionality. Easier to understand what is going on.  &lt;br /&gt;
 Refactoring and collective ownership is made possible. Helps keeps programmers on track&lt;br /&gt;
Metaphor – Advantages &lt;br /&gt;
 Encourages a common set of terms for the system. Reduction of buzz words and jargon. A quick and easy way to explain the system&lt;br /&gt;
Small Releases – Advantages&lt;br /&gt;
 Frequent feedback. Tracking. Reduce chance of overall project slippage&lt;br /&gt;
The Planning Game – Advantages&lt;br /&gt;
 Reduction in time wasted on useless features. Greater customer appreciation of the cost of a feature. Less guesswork in planning&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67614</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67614"/>
		<updated>2012-10-20T21:18:27Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
#[ http://www.cutter.com/content-and-analysis/resource-centers/agile-project-management/sample-our-research/ead0002/ead0002.pdf  Cutter Agile Project Management]&lt;br /&gt;
#[ http://en.wikipedia.org/wiki/Extreme_programming Extreme Programming Wikipedia ]&lt;br /&gt;
#[ http://www.cs.usfca.edu/~parrt/course/601/lectures/xp.html USF Lectures on Extreme Programming]&lt;br /&gt;
#[ http://www.computerworld.com/s/article/66192/Extreme_Programming?taxonomyId=063 Computerworld Articles Extreme Programming]&lt;br /&gt;
#[ http://www.extremeprogramming.org ExtremeProgramming.org]&lt;br /&gt;
#[ http://www.jera.com/techinfo/xpfaq.html Jera Extreme Programming]&lt;br /&gt;
#[ http://www.softwarereality.com/lifecycle/xp/four_values.jsp Software Reality Four Values]&lt;br /&gt;
#[ http://repository.cmu.edu/cgi/viewcontent.cgi?article=1056&amp;amp;context=silicon_valley&amp;amp;sei-redir=1&amp;amp;referer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3Dcompare%2520it%2520with%2520waterfall%2520model%2520and%2520extreme%2520programming%26source%3Dweb%26cd%3D2%26ved%3D0CCQQFjAB%26url%3Dhttp%253A%252F%252Frepository.cmu.edu%252Fcgi%252Fviewcontent.cgi%253Farticle%253D1056%2526context%253Dsilicon_valley%26ei%3DG_aCUKeIFo-k8gTJzIGQAw%26usg%3DAFQjCNEmwlV8Xg6uapysO7P0RTcnlEPz3g#search=%22compare%20waterfall%20model%20extreme%20programming%22 Comparing Extreme Programming and Waterfall Project Results]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67612</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67612"/>
		<updated>2012-10-20T21:07:20Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Research Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
Research was carried out in Carnegie Mellon University where data collected was from five years of 50 teams, developing the same project each year and the affects of transitioning from Waterfall to Extreme Programming was analyzed. The characteristics between these two methods were evaluated and compared. According to the paper, waterfall teams spent more time creating high ceremony documents where as Extreme Programming teams spent more time writing code and documenting their design in their code.  Surprisingly, the amount of code and features completed were roughly the same for both methods suggesting that on a three month project with three to four developers it didn't matter the method used. Please refer the references for the research paper.&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67607</id>
		<title>CSC/ECE 517 Fall 2012/ch2a 2w8 vp</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch2a_2w8_vp&amp;diff=67607"/>
		<updated>2012-10-20T20:44:47Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: Created page with &amp;quot;=Extreme programming (XP)= This chapter focuses on explaining below points. Describe what extreme programming is.  Concepts of XP.  Four values in XP.  Aspects in key practices s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Extreme programming (XP)=&lt;br /&gt;
This chapter focuses on explaining below points.&lt;br /&gt;
Describe what extreme programming is. &lt;br /&gt;
Concepts of XP. &lt;br /&gt;
Four values in XP. &lt;br /&gt;
Aspects in key practices such as pair programming, collective code ownership, stories, automated testing, small releases and continuous integration. &lt;br /&gt;
Advantages and Disadvantages with XP.&lt;br /&gt;
Comparison with waterfall model&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is extreme programming ==&lt;br /&gt;
Extreme Programming (XP) is a software development methodology created by Kent Beck during his work on the Chrysler Comprehensive Compensation System (C3) payroll project. Extreme Programming is intended to improve software quality and responsiveness to changing customer requirements. It is a one of the several types of agile software development processes. Extreme Programming is successful because it stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future this process delivers the software you need as you need it. Extreme Programming empowers developers to confidently respond to changing customer requirements, even late in the life cycle.&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Concepts of XP ==&lt;br /&gt;
Goals&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Four values in XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Aspects in key practices ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Advantages of XP ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Disadvantages of XP==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Comparison with waterfall model ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== Research Conclusion ==&lt;br /&gt;
&lt;br /&gt;
[[#top|Back to top]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012&amp;diff=67605</id>
		<title>CSC/ECE 517 Fall 2012</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012&amp;diff=67605"/>
		<updated>2012-10-20T20:38:14Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[CSC/ECE 517 Fall 2012/ch1 n xx]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w1 rk]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w20 pp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w5 su]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w6 pp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w4 aj]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w7 am]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w8 aa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w9 av]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w10 pk]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w11 ap]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1a 1w12 mv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w14 gv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w17 ir]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w18 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w22 an]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w21 aa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w21 wi]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w31 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1a 1w16 br]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1a 1w23 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w24 nr]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w15 rt]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w3 pl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w32 cm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w5 dp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w37 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w67 ks]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w27 ms]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w29 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w33 op]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w19 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w34 vd]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w35 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1 1w30 rp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w58 am]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w47 sk]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w69 mv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w44 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w45 is]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w53 kc]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w40 ar]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w39 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w54 go]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w56 ms]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w64 nn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w66 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w40 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w42 js]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w46 sm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w71 gs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w63 dv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w55 ms]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w57 mp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w52 an]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2012/ch1b 1w38 nm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w60 ac]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch1b 1w62 rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w29 st]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch 2w30 an]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w17 pt]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w31 up]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w9 ms]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w19 is]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w5 dp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w16 dp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2012/ch2a 2w8 vp]]&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch1b_1w47_sk&amp;diff=65939</id>
		<title>CSC/ECE 517 Fall 2012/ch1b 1w47 sk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch1b_1w47_sk&amp;diff=65939"/>
		<updated>2012-09-30T03:47:05Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Generic Methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Generic Programming is a programming paradigm for developing efficient, reusable software libraries. The Generic Programming process focuses on finding commonality among similar implementations of the same algorithm, then providing suitable abstractions so that a single, generic algorithm can cover many concrete implementations. This process is repeated until the generic algorithm has reached a suitable level of abstraction, where it provides maximal re-usability while still yielding efficient, concrete implementations. The abstractions themselves are expressed as requirements on the parameters to the generic algorithm.&lt;br /&gt;
&lt;br /&gt;
In the simplest definition, generic programming is a style of computer programming in which algorithms are written in terms of to-be-specified-later types that are then instantiated when needed for specific types provided as parameters. This approach, pioneered by Ada in 1983, permits writing common functions or types that differ only in the set of types on which they operate when used, thus reducing duplication. Such software entities are known as generics in Ada, Eiffel, Java, C#, F#, and Visual Basic .NET; parametric polymorphism in ML, Scala and Haskell (the Haskell community also uses the term &amp;quot;generic&amp;quot; for a related but somewhat different concept); templates in C++ and D; and parameterized types in the influential 1994 book Design Patterns. &lt;br /&gt;
&lt;br /&gt;
The term generic programming was originally coined by David Musser and Alexander Stepanov in a more specific sense than the above, to describe an approach to software decomposition whereby fundamental requirements on types are abstracted from across concrete examples of algorithms and data structures and formalized as concepts, analogously to the abstraction of algebraic theories in abstract algebra. Early examples of this programming approach were implemented in Scheme and Ada, although the best known example is the Standard Template Library (STL) in which is developed a theory of iterators which is used to decouple sequence data structures and the algorithms operating on them.&lt;br /&gt;
&lt;br /&gt;
==Generics in Object Oriented Languages==&lt;br /&gt;
&lt;br /&gt;
=== .NET framework ===&lt;br /&gt;
&lt;br /&gt;
Generics are classes, structures, interfaces, and methods that have placeholders (type parameters) for one or more of the types that they store or use. A generic collection class might use a type parameter as a placeholder for the type of objects that it stores; the type parameters appear as the types of its fields and the parameter types of its methods. A generic method might use its type parameter as the type of its return value or as the type of one of its formal parameters. The following code illustrates a simple generic class definition.&lt;br /&gt;
&lt;br /&gt;
C#&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Generic&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    public T Field;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Public Shared Sub Main()&lt;br /&gt;
    Dim g As New Generic(Of String)&lt;br /&gt;
    g.Field = &amp;quot;A string&amp;quot; &lt;br /&gt;
    '...&lt;br /&gt;
    Console.WriteLine(&amp;quot;Generic.Field           = &amp;quot;&amp;quot;{0}&amp;quot;&amp;quot;&amp;quot;, g.Field)&lt;br /&gt;
    Console.WriteLine(&amp;quot;Generic.Field.GetType() = {0}&amp;quot;, g.Field.GetType().FullName)&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generics Terminology in .NET ====&lt;br /&gt;
&lt;br /&gt;
A generic type definition is a class, structure, or interface declaration that functions as a template, with placeholders for the types that it can contain or use. For example, the Dictionary class can contain two types: keys and values. Because a generic type definition is only a template, you cannot create instances of a class, structure, or interface that is a generic type definition.&lt;br /&gt;
&lt;br /&gt;
Generic type parameters, or type parameters, are the placeholders in a generic type or method definition. The Dictionary generic type has two type parameters, TKey and TValue, that represent the types of its keys and values.&lt;br /&gt;
&lt;br /&gt;
A constructed generic type, or constructed type, is the result of specifying types for the generic type parameters of a generic type definition.&lt;br /&gt;
&lt;br /&gt;
A generic type argument is any type that is substituted for a generic type parameter.&lt;br /&gt;
&lt;br /&gt;
The general term generic type includes both constructed types and generic type definitions.&lt;br /&gt;
&lt;br /&gt;
Covariance and contravariance of generic type parameters enable you to use constructed generic types whose type arguments are more derived (covariance) or less derived (contravariance) than a target constructed type. Covariance and contravariance are collectively referred to as variance. For more information, see Covariance and Contravariance in Generics.&lt;br /&gt;
&lt;br /&gt;
Constraints are limits placed on generic type parameters. For example, you might limit a type parameter to types that implement the IComparer generic interface, to ensure that instances of the type can be ordered. You can also constrain type parameters to types that have a particular base class, that have a default constructor, or that are reference types or value types. Users of the generic type cannot substitute type arguments that do not satisfy the constraints.&lt;br /&gt;
&lt;br /&gt;
A generic method definition is a method with two parameter lists: a list of generic type parameters and a list of formal parameters. Type parameters can appear as the return type or as the types of the formal parameters, as the following code shows.&lt;br /&gt;
&lt;br /&gt;
C#:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
T Generic&amp;lt;T&amp;gt;(T arg)&lt;br /&gt;
{&lt;br /&gt;
    T temp = arg;&lt;br /&gt;
    //... &lt;br /&gt;
    return temp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
VB:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function Generic(Of T)(ByVal arg As T) As T&lt;br /&gt;
    Dim temp As T = arg&lt;br /&gt;
    '... &lt;br /&gt;
    Return temp&lt;br /&gt;
End Function&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generic methods can appear on generic or nongeneric types. It is important to note that a method is not generic just because it belongs to a generic type, or even because it has formal parameters whose types are the generic parameters of the enclosing type. A method is generic only if it has its own list of type parameters. In the following code, only method G is generic.&lt;br /&gt;
&lt;br /&gt;
C#&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
{&lt;br /&gt;
    T G&amp;lt;T&amp;gt;(T arg)&lt;br /&gt;
    {&lt;br /&gt;
        T temp = arg;&lt;br /&gt;
        //... &lt;br /&gt;
        return temp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Generic&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    T M(T arg)&lt;br /&gt;
    {&lt;br /&gt;
        T temp = arg;&lt;br /&gt;
        //... &lt;br /&gt;
        return temp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class A&lt;br /&gt;
    Function G(Of T)(ByVal arg As T) As T&lt;br /&gt;
        Dim temp As T = arg&lt;br /&gt;
        '... &lt;br /&gt;
        Return temp&lt;br /&gt;
    End Function &lt;br /&gt;
End Class &lt;br /&gt;
Class Generic(Of T)&lt;br /&gt;
    Function M(ByVal arg As T) As T&lt;br /&gt;
        Dim temp As T = arg&lt;br /&gt;
        '... &lt;br /&gt;
        Return temp&lt;br /&gt;
    End Function &lt;br /&gt;
End Class&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nested Types and Generics ====&lt;br /&gt;
&lt;br /&gt;
A type that is nested in a generic type can depend on the type parameters of the enclosing generic type. The common language runtime considers nested types to be generic, even if they do not have generic type parameters of their own. When you create an instance of a nested type, you must specify type arguments for all enclosing generic types.&lt;br /&gt;
&lt;br /&gt;
==== Language Support ====&lt;br /&gt;
The .NET Framework provides a number of generic collection classes in the following namespaces:&lt;br /&gt;
&lt;br /&gt;
The System.Collections.Generic namespace catalogs most of the generic collection types provided by the .NET Framework, such as the List and Dictionary generic classes.&lt;br /&gt;
&lt;br /&gt;
The System.Collections.ObjectModel namespace catalogs additional generic collection types, such as the ReadOnlyCollection generic class, that are useful for exposing object models to users of your classes.&lt;br /&gt;
&lt;br /&gt;
Generic interfaces for implementing sort and equality comparisons are provided in the System namespace, along with generic delegate types for event handlers, conversions, and search predicates.&lt;br /&gt;
&lt;br /&gt;
Support for generics has been added to the System.Reflection namespace for examining generic types and generic methods, to System.Reflection.Emit for emitting dynamic assemblies that contain generic types and methods, and to System.CodeDom for generating source graphs that include generics.&lt;br /&gt;
&lt;br /&gt;
The common language runtime provides new opcodes and prefixes to support generic types in Microsoft intermediate language (MSIL), including Stelem, Ldelem, Unbox_Any, Constrained, and Readonly.&lt;br /&gt;
&lt;br /&gt;
Visual C++, C#, and Visual Basic all provide full support for defining and using generics. For more information about language support, see Generic Types in Visual Basic (Visual Basic), Introduction to Generics (C# Programming Guide), and Overview of Generics in Visual C++.&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
&lt;br /&gt;
Generics were introduced in Java from JDK 1.5. Generics allows the abstraction over types. The most common examples are container&lt;br /&gt;
types, such as those in the Collection hierarchy. So, if you could say that the code works with &amp;quot;some unspecified type,&amp;quot; rather than a specific interface or class, then the code uses Generics. Here is a typical usage of that sort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List myIntList = new LinkedList(); // 1&lt;br /&gt;
myIntList.add(new Integer(0)); // 2&lt;br /&gt;
Integer x = (Integer) myIntList.iterator().next(); // 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typically, the programmer knows what kind of data has been placed into a particular list. However, the cast is essential. The compiler can only guarantee that an Object will be returned by the iterator. To ensure the assignment to a variable of type Integer is type safe, the cast is required. Of course, the cast not only introduces clutter. It also introduces the possibility of a run time error, since the programmer might be mistaken. It would be better if programmers could actually express their intent, and mark a list as being restricted to contain a particular data type. This is the core idea behind generics. But why we need Generics in the first place when we have polymorphism. For example a method that takes a base class object as an argument, and then use that method with any class derived from that base class or use a method argument that is an interface instead of a class. Its because a General code works with &amp;quot;some unspecified type,&amp;quot; rather than a specific interface or class. Also being constrained to a single hierarchy is too limiting. Did Java Really Implement Generics In Its True Sense? Not at all! Working with C++ makes us realize that you can’t do everything when using Java generics.&lt;br /&gt;
&lt;br /&gt;
Here is a version of the program fragment given above using generics:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;Integer&amp;gt; myIntList = new LinkedList&amp;lt;Integer&amp;gt;(); // 1’&lt;br /&gt;
myIntList.add(new Integer(0)); //2’&lt;br /&gt;
Integer x = myIntList.iterator().next(); // 3’&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the type declaration for the variable myIntList. It specifies that this is not just an arbitrary List, but a List of Integer, written List&amp;lt;Integer&amp;gt;. We say that List is a generic interface that takes a type parameter - in this case, Integer. We also specify&lt;br /&gt;
a type parameter when creating the list object. The other thing to pay attention to is that the cast is gone on line 3’. Now, you might think that all we’ve accomplished is to move the clutter around. Instead of a cast to Integer on line 3, we have Integer as a type parameter on line 1’. However, there is a very big difference here. The compiler can now check the type correctness of the program at compile-time. When we say that myIntList is declared with type List&amp;lt;Integer&amp;gt;, this tells us something about the variable myIntList, which holds true wherever and whenever it is used, and the compiler will guarantee it. In contrast, the cast tells us something the programmer thinks is true at a single point in the code. The net effect, especially in large programs, is improved readability and robustness.&lt;br /&gt;
&lt;br /&gt;
Here is a small excerpt from the definitions of the interfaces List and Iterator in package java.util:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface List&amp;lt;E&amp;gt; {&lt;br /&gt;
void add(E x);&lt;br /&gt;
Iterator&amp;lt;E&amp;gt; iterator();&lt;br /&gt;
}&lt;br /&gt;
public interface Iterator&amp;lt;E&amp;gt; {&lt;br /&gt;
E next();&lt;br /&gt;
boolean hasNext();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should all be familiar, except for the stuff in angle brackets. Those are the declarations of the formal type parameters of the interfaces List and Iterator. Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types.&lt;br /&gt;
&lt;br /&gt;
A generic type declaration is compiled once and for all, and turned into a single class file, just like an ordinary class or interface declaration. Type parameters are analogous to the ordinary parameters used in methods or constructors. Much like a method has formal value parameters that describe the kinds of values it operates on, a generic declaration has formal type parameters. When a method is invoked, actual arguments are substituted for the formal parameters, and the method body is evaluated. When a generic declaration is invoked, the actual type arguments are substituted for the formal type parameters. When you create a Holder, you must specify the type you want to put into it using angle-bracket syntax. Also you are only allowed to put objects of that type (or a subtype, since the substitution principle still works with generics) into the holder. And when you get a value out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class A {}&lt;br /&gt;
public class H3&amp;lt;T&amp;gt; {&lt;br /&gt;
private T a;&lt;br /&gt;
public H3(T a) { this.a = a; }&lt;br /&gt;
public void set(T a) { this.a = a; }&lt;br /&gt;
public T get() { return a; }&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
H3&amp;lt;A&amp;gt; h3 = new H3&amp;lt;A&amp;gt;(new A ());&lt;br /&gt;
A a = h3.get(); // No cast needed&lt;br /&gt;
// h3.set(&amp;quot;Not an Automobile&amp;quot;); // Error&lt;br /&gt;
// h3.set(1); // Error&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lets see how we can use generics to return multiple values. Tuple is simply a group of objects wrapped together into a single object. The recipient of the object is allowed to read the elements but not put new ones in. We can also create longer tuples with inheritance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Tuple_Grp&amp;lt;A,B&amp;gt; {&lt;br /&gt;
public final A first;&lt;br /&gt;
public final B second;&lt;br /&gt;
public Tuple_Grp(A a, B b) { first = a; second = b; }&lt;br /&gt;
public String toString() {&lt;br /&gt;
return &amp;quot;(&amp;quot; + first + &amp;quot;, &amp;quot; + second + &amp;quot;)&amp;quot;;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generics and Subtyping ====&lt;br /&gt;
&lt;br /&gt;
Let’s test our understanding of generics. Is the following code snippet legal?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;String&amp;gt; ls = new ArrayList&amp;lt;String&amp;gt;(); //1&lt;br /&gt;
List&amp;lt;Object&amp;gt; lo = ls; //2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Line 1 is certainly legal. The trickier part of the question is line 2. This boils down to the question: is a List of String a List of Object. Most people’s instinct is to answer: “sure!”.&lt;br /&gt;
Well, take a look at the next few lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lo.add(new Object()); // 3&lt;br /&gt;
String s = ls.get(0); // 4: attempts to assign an Object to a String!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we’ve aliased ls and lo. Accessing ls, a list of String, through the alias lo, we can insert arbitrary objects into it. As a result ls does not hold just Strings anymore, and when we try and get something out of it, we get a rude surprise. The Java compiler will prevent this from happening of course. Line 2 will cause a compile time error.&lt;br /&gt;
&lt;br /&gt;
In general, if Foo is a subtype (subclass or subinterface) of Bar, and G is some generic type declaration, it is not the case that G&amp;lt;Foo&amp;gt; is a subtype of G&amp;lt;Bar&amp;gt;. This is probably the hardest thing you need to learn about generics, because it goes against our deeply held intuitions. The problem with that intuition is that it assumes that collections don’t change. Our instinct takes these things to be immutable.&lt;br /&gt;
For example, if the department of motor vehicles supplies a list of drivers to the census bureau, this seems reasonable. We think that a List&amp;lt;Driver&amp;gt; is a List&amp;lt;Person&amp;gt;, assuming that Driver is a subtype of Person. In fact, what is being passed is a copy of the registry of drivers. Otherwise, the census bureau could add new people who are not drivers into the list, corrupting the DMV’s records. In order to cope with this sort of situation, it’s useful to consider more flexible generic types. The rules we’ve seen so far are quite restrictive.&lt;br /&gt;
&lt;br /&gt;
==== Wildcards ====&lt;br /&gt;
Consider the problem of writing a routine that prints out all the elements in a collection.&lt;br /&gt;
Here’s how you might write it in an older version of the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void printCollection(Collection c) {&lt;br /&gt;
Iterator i = c.iterator();&lt;br /&gt;
for (k = 0; k &amp;lt; c.size(); k++) {&lt;br /&gt;
System.out.println(i.next());&lt;br /&gt;
}}&lt;br /&gt;
And here is a naive attempt at writing it using generics (and the new for loop syntax):&lt;br /&gt;
void printCollection(Collection&amp;lt;Object&amp;gt; c) {&lt;br /&gt;
for (Object e : c) {&lt;br /&gt;
System.out.println(e);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The problem is that this new version is much less useful than the old one. Whereas the old code could be called with any kind of collection as a parameter, the new code only takes Collection&amp;lt;Object&amp;gt;, which, as we’ve just demonstrated, is not a supertype of all kinds of collections!&lt;br /&gt;
So what is the supertype of all kinds of collections? It’s written Collection&amp;lt;?&amp;gt; (pronounced “collection of unknown”) , that is, a collection whose element type matches anything. It’s called a wildcard type for obvious reasons. We can write:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void printCollection(Collection&amp;lt;?&amp;gt; c) {&lt;br /&gt;
for (Object e : c) {&lt;br /&gt;
System.out.println(e);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now, we can call it with any type of collection. Notice that inside printCollection(), we can still read elements from c and give them type Object. This is always safe, since whatever the actual type of the collection, it does contain objects. It isn’t&lt;br /&gt;
safe to add arbitrary objects to it however:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Collection&amp;lt;?&amp;gt; c = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
c.add(new Object()); // compile time error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since we don’t know what the element type of c stands for, we cannot add objects to it. The add() method takes arguments of type E, the element type of the collection. When the actual type parameter is ?, it stands for some unknown type. Any parameter we pass to add would have to be a subtype of this unknown type. Since we don’t know what type that is, we cannot pass anything in. The sole exception is null, which is a member of every type. On the other hand, given a List&amp;lt;?&amp;gt;, we can call get() and make use of the result. The result type is an unknown type, but we always know that it is an object. It is therefore safe to assign the result of get() to a variable of type Object or pass it as a&lt;br /&gt;
parameter where the type Object is expected.&lt;br /&gt;
&lt;br /&gt;
==== Advantages and Disadvantages ====&lt;br /&gt;
&lt;br /&gt;
These are there pretty much for syntactic sugar. They are implemented through a controversial decision called type erasure. All they really do is prevent you from having to cast a whole lot, which makes them safer to use. Performance is identical to making specialized classes, except in cases where you are using what would have been a raw data type (int, float, double, char, bool, short). In these cases, the value types must be boxed to their corresponding reference types (Integer, Float, Double, Char, Bool, Short), which has some overhead. Memory usage is identical, since the JRE is just performing the casting in the background (which is essentially free). Java also has some nice type covariance and contravariance, which makes things look much cleaner than not using them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generic Interfaces ====&lt;br /&gt;
&lt;br /&gt;
Generic also work with interfaces. In Java generator is a class that instantiates objects for us. So when you ask a generator for new object, you don't need to pass any arguments. Generator just defines one method, the method that produces new objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Cola {&lt;br /&gt;
private static long counter = 0;&lt;br /&gt;
private final long id = counter++;&lt;br /&gt;
public String toString() {&lt;br /&gt;
return getClass().getSimpleName() + &amp;quot; &amp;quot; + id;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
public class A extends Cola {}&lt;br /&gt;
public class B extends Cola {} &lt;br /&gt;
public class C extends Cola {} &lt;br /&gt;
&lt;br /&gt;
public class ColaGenerator implements Generator&amp;lt;Cola&amp;gt;, Iterable&amp;lt;Cola&amp;gt; {&lt;br /&gt;
private Class[] types = { A.class, B.class, C.class };&lt;br /&gt;
private static Random rand = new Random(47);&lt;br /&gt;
&lt;br /&gt;
public ColaGenerator() {}&lt;br /&gt;
	private int size = 0;&lt;br /&gt;
	public ColaGenerator(int sz) { size = sz; }&lt;br /&gt;
	public Cola next() {&lt;br /&gt;
		try {&lt;br /&gt;
		return (Cola)&lt;br /&gt;
		types[rand.nextInt(types.length)].newInstance();&lt;br /&gt;
		} catch(Exception e) {&lt;br /&gt;
		throw new RuntimeException(e);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class ColaIterator implements Iterator&amp;lt;Cola&amp;gt; {&lt;br /&gt;
int count = size;&lt;br /&gt;
public boolean hasNext() { return count &amp;gt; 0; }&lt;br /&gt;
public Cola next() {&lt;br /&gt;
count--;&lt;br /&gt;
return ColaGenerator.this.next();}&lt;br /&gt;
}&lt;br /&gt;
public Iterator&amp;lt;Cola&amp;gt; iterator() {&lt;br /&gt;
return new ColaIterator();&lt;br /&gt;
}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
ColaGenerator gen = new ColaGenerator();&lt;br /&gt;
for(int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
System.out.println(gen.next());&lt;br /&gt;
for(Cola c : new ColaGenerator(3))&lt;br /&gt;
System.out.println(c);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java SE5 conveniently added autoboxing and autounboxing to convert from primitive types to wrapper types and back. So the below example works without any problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Fib implements Generator&amp;lt;Integer&amp;gt; {&lt;br /&gt;
public int count = 0;&lt;br /&gt;
public Integer next() { return fib(count++); }&lt;br /&gt;
public int fib(int i) {&lt;br /&gt;
if(i &amp;lt; 2) return 1;&lt;br /&gt;
return fib(i-2) + fib(i-1);}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
Fib gen = new Fib();&lt;br /&gt;
for(int i = 0; i &amp;lt; 15; i++)&lt;br /&gt;
System.out.print(gen.next() + &amp;quot; &amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generic Methods ====&lt;br /&gt;
Generic methods are used more often than generic classes. Note a generic class is independent of whether you have a generic method.if a method is static, it has no access to the generic type parameters of the class, so if it needs to use genericity it must be a generic method. Unlike generic class you don’t usually have to specify the parameter types, because the compiler can figure that out for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class GenMeth {&lt;br /&gt;
public &amp;lt;T&amp;gt; void f(T x) {&lt;br /&gt;
System.out.println(x.getClass().getName());&lt;br /&gt;
}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
GenMeth a = new GenMeth();&lt;br /&gt;
a.f(&amp;quot;&amp;quot;);&lt;br /&gt;
a.f(‘c’);}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type argument inference in a generic method can be used to make simple utilities. For example we can make a utility which returns commonly used collection containers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class MyCollection {&lt;br /&gt;
public static &amp;lt;K,V&amp;gt; Map&amp;lt;K,V&amp;gt; map() {&lt;br /&gt;
return new HashMap&amp;lt;K,V&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; list() {&lt;br /&gt;
return new ArrayList&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; LinkedList&amp;lt;T&amp;gt; lList() {&lt;br /&gt;
return new LinkedList&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; Set&amp;lt;T&amp;gt; set() {&lt;br /&gt;
return new HashSet&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; Queue&amp;lt;T&amp;gt; queue() {&lt;br /&gt;
return new LinkedList&amp;lt;T&amp;gt;();}&lt;br /&gt;
&lt;br /&gt;
And we can use whichever method we want like:&lt;br /&gt;
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; obj = MyCollection.map();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Erasure ====&lt;br /&gt;
&lt;br /&gt;
Weird case I&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
System.out.println(new ArrayList&amp;lt;String&amp;gt;().getClass() == new ArrayList&amp;lt;Integer&amp;gt;().getClass());&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here Array List &amp;lt; String &amp;gt; and Array List &amp;lt; Integer &amp;gt; seem to be of different types and so we can expect them to behave differently. But the execution of the above program returns true which suggests they are of the same type.&lt;br /&gt;
&lt;br /&gt;
Weird case II&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Fn {}&lt;br /&gt;
class Foo&amp;lt;Q&amp;gt; {}&lt;br /&gt;
class Boo&amp;lt;X,Y&amp;gt; {}&lt;br /&gt;
&lt;br /&gt;
public class AbsentInformation {&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
Foo&amp;lt;Fn&amp;gt; foo = new Foo&amp;lt;Fn&amp;gt;();&lt;br /&gt;
Boo&amp;lt;Long,Double&amp;gt; b = new Boo&amp;lt;Long,Double&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
System.out.println(Arrays.toString(foo.getClass().getTypeParameters()));&lt;br /&gt;
System.out.println(Arrays.toString(b.getClass().getTypeParameters()));&lt;br /&gt;
&lt;br /&gt;
}} /* Output:&lt;br /&gt;
[Q]&lt;br /&gt;
[X,Y]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Class.getTypeParameters( ) suggest that you might be able to find out what the parameter types are. But here you find the identifiers that are used as the parameter placeholders. This is one important feature where Java differs from C++. Java generics are implemented using erasure.&lt;br /&gt;
So when we use generics, the specific information is erased. The only thing you know is that you are using an object. So both List&amp;lt;String&amp;gt; and List&amp;lt; Integer&amp;gt;  have the same type at runtime.&lt;br /&gt;
&lt;br /&gt;
The C++ approach&lt;br /&gt;
//Compiles&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template&amp;lt;class T&amp;gt; class Rem{&lt;br /&gt;
T obj;&lt;br /&gt;
public:&lt;br /&gt;
Rem (T a) { obj = a; }&lt;br /&gt;
void manipulate() { obj.foo(); }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Rem_A {&lt;br /&gt;
public:&lt;br /&gt;
void foo() { cout &amp;lt;&amp;lt; &amp;quot;ola&amp;quot; &amp;lt;&amp;lt; endl; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
Rem_A hf;&lt;br /&gt;
Rem&amp;lt;Rem_A&amp;gt; rem(hf);&lt;br /&gt;
rem.foo();&lt;br /&gt;
} &lt;br /&gt;
ola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The same code when written in Java fails. The java compiler is unable to map the two methods, to make this work in Java we have to assist the generic class by giving it a bound that tells the compiler to only accept types that conform to that bound. This reuses the extends keyword. Below is the snippet which makes it work. Notice how we added T extends Rem_A. Note Generic types cannot be used in operations that explicitly refer to runtime types, such as casts, instanceof operations, and new expressions. You can compensate for erasure by introducing a type tag i.e. explicitly pass in the Class object for your type so that you can use it in type expressions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Rem&amp;lt;T extends Rem_A&amp;gt; {&lt;br /&gt;
private T obj;&lt;br /&gt;
public Rem(T x) { obj = x; }&lt;br /&gt;
public void rem() { obj.foo(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Arrays of Generics ====&lt;br /&gt;
&lt;br /&gt;
Its a good idea to use ArrayList when you need to create an array of generics. This behaves as an array so its a nice way to go around this problem.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Array_Of_Generics&amp;lt;T&amp;gt; {&lt;br /&gt;
private List&amp;lt;T&amp;gt; arr = new ArrayList&amp;lt;T&amp;gt;();&lt;br /&gt;
public void add(T item) { arr.add(item); }&lt;br /&gt;
public T get(int index) { return arr.get(index); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you still want to create an array of generics.  You can use the below snippet but still you cannot create array of the exact type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Generic&amp;lt;T&amp;gt; {}&lt;br /&gt;
public class Array_Of_Generics_B {&lt;br /&gt;
static Generic&amp;lt;Integer&amp;gt;[] a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===C++===&lt;br /&gt;
&lt;br /&gt;
In C++ generics are called templates.Function templates are special functions that can operate with generic types. This allows us to create a function template whose functionality can be adapted to more than one type or class without repeating the entire code for each type.&lt;br /&gt;
&lt;br /&gt;
In C++ this can be achieved using template parameters. A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function. These function templates can use these parameters as if they were any other regular type.&lt;br /&gt;
&lt;br /&gt;
The format for declaring function templates with type parameters is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class identifier&amp;gt; function_declaration;&lt;br /&gt;
template &amp;lt;typename identifier&amp;gt; function_declaration;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The only difference between both prototypes is the use of either the keyword class or the keyword typename. Its use is indistinct, since both expressions have exactly the same meaning and behave exactly the same way.&lt;br /&gt;
For example, to create a template function that returns the greater one of two objects we could use: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class myType&amp;gt;&lt;br /&gt;
myType GetMax (myType a, myType b) {&lt;br /&gt;
 return (a&amp;gt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we have created a template function with myType as its template parameter. This template parameter represents a type that has not yet been specified, but that can be used in the template function as if it were a regular type. As you can see, the function template GetMax returns the greater of two parameters of this still-undefined type.&lt;br /&gt;
&lt;br /&gt;
To use this function template we use the following format for the function call:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function_name &amp;lt;type&amp;gt; (parameters);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to call GetMax to compare two integer values of type int we can write: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int x,y;&lt;br /&gt;
GetMax &amp;lt;int&amp;gt; (x,y);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the compiler encounters this call to a template function, it uses the template to automatically generate a function replacing each appearance of myType by the type passed as the actual template parameter (int in this case) and then calls it. This process is automatically performed by the compiler and is invisible to the programmer.&lt;br /&gt;
&lt;br /&gt;
Here is the entire example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// function template&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T GetMax (T a, T b) {&lt;br /&gt;
  T result;&lt;br /&gt;
  result = (a&amp;gt;b)? a : b;&lt;br /&gt;
  return (result);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  int i=5, j=6, k;&lt;br /&gt;
  long l=10, m=5, n;&lt;br /&gt;
  k=GetMax&amp;lt;int&amp;gt;(i,j);&lt;br /&gt;
  n=GetMax&amp;lt;long&amp;gt;(l,m);&lt;br /&gt;
  cout &amp;lt;&amp;lt; k &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, we have used T as the template parameter name instead of myType because it is shorter and in fact is a very common template parameter name. But you can use any identifier you like. In the example above we used the function template GetMax() twice. The first time with arguments of type int and the second one with arguments of type long. The compiler has instantiated and then called each time the appropriate version of the function.&lt;br /&gt;
&lt;br /&gt;
As you can see, the type T is used within the GetMax() template function even to declare new objects of that type: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
T result;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore, result will be an object of the same type as the parameters a and b when the function template is instantiated with a specific type.&lt;br /&gt;
&lt;br /&gt;
In this specific case where the generic type T is used as a parameter for GetMax the compiler can find out automatically which data type has to instantiate without having to explicitly specify it within angle brackets (like we have done before specifying &amp;lt;int&amp;gt; and &amp;lt;long&amp;gt;). So we could have written instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i,j;&lt;br /&gt;
GetMax (i,j);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since both i and j are of type int, and the compiler can automatically find out that the template parameter can only be int. This implicit method produces exactly the same result:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// function template II&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T GetMax (T a, T b) {&lt;br /&gt;
  return (a&amp;gt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  int i=5, j=6, k;&lt;br /&gt;
  long l=10, m=5, n;&lt;br /&gt;
  k=GetMax(i,j);&lt;br /&gt;
  n=GetMax(l,m);&lt;br /&gt;
  cout &amp;lt;&amp;lt; k &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how in this case, we called our function template GetMax() without explicitly specifying the type between angle-brackets &amp;lt;&amp;gt;. The compiler automatically determines what type is needed on each call.&lt;br /&gt;
&lt;br /&gt;
Because our template function includes only one template parameter (class T) and the function template itself accepts two parameters, both of this T type, we cannot call our function template with two objects of different types as arguments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i;&lt;br /&gt;
long l;&lt;br /&gt;
k = GetMax (i,l); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would not be correct, since our GetMax function template expects two arguments of the same type, and in this call to it we use objects of two different types.&lt;br /&gt;
&lt;br /&gt;
We can also define function templates that accept more than one type parameter, simply by specifying more template parameters between the angle brackets. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T, class U&amp;gt;&lt;br /&gt;
T GetMin (T a, U b) {&lt;br /&gt;
  return (a&amp;lt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, our function template GetMin() accepts two parameters of different types and returns an object of the same type as the first parameter (T) that is passed. For example, after that declaration we could call GetMin() with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i,j;&lt;br /&gt;
long l;&lt;br /&gt;
i = GetMin&amp;lt;int,long&amp;gt; (j,l);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or simply:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
i = GetMin (j,l);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
even though j and l have different types, since the compiler can determine the appropriate instantiation anyway.&lt;br /&gt;
&lt;br /&gt;
Class templates&lt;br /&gt;
We also have the possibility to write class templates, so that a class can have members that use template parameters as types. For example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mypair {&lt;br /&gt;
    T values [2];&lt;br /&gt;
  public:&lt;br /&gt;
    mypair (T first, T second)&lt;br /&gt;
    {&lt;br /&gt;
      values[0]=first; values[1]=second;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class that we have just defined serves to store two elements of any valid type. For example, if we wanted to declare an object of this class to store two integer values of type int with the values 115 and 36 we would write:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mypair&amp;lt;int&amp;gt; myobject (115, 36); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this same class would also be used to create an object to store any other type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mypair&amp;lt;double&amp;gt; myfloats (3.0, 2.18); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only member function in the previous class template has been defined inline within the class declaration itself. In case that we define a function member outside the declaration of the class template, we must always precede that definition with the template &amp;lt;...&amp;gt; prefix:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// class templates&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mypair {&lt;br /&gt;
    T a, b;&lt;br /&gt;
  public:&lt;br /&gt;
    mypair (T first, T second)&lt;br /&gt;
      {a=first; b=second;}&lt;br /&gt;
    T getmax ();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T mypair&amp;lt;T&amp;gt;::getmax ()&lt;br /&gt;
{&lt;br /&gt;
  T retval;&lt;br /&gt;
  retval = a&amp;gt;b? a : b;&lt;br /&gt;
  return retval;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mypair &amp;lt;int&amp;gt; myobject (100, 75);&lt;br /&gt;
  cout &amp;lt;&amp;lt; myobject.getmax();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the syntax of the definition of member function getmax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T mypair&amp;lt;T&amp;gt;::getmax () &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confused by so many T's? There are three T's in this declaration: The first one is the template parameter. The second T refers to the type returned by the function. And the third T (the one between angle brackets) is also a requirement: It specifies that this function's template parameter is also the class template parameter.&lt;br /&gt;
&lt;br /&gt;
Template specialization&lt;br /&gt;
If we want to define a different implementation for a template when a specific type is passed as template parameter, we can declare a specialization of that template.&lt;br /&gt;
&lt;br /&gt;
For example, let's suppose that we have a very simple class called mycontainer that can store one element of any type and that it has just one member function called increase, which increases its value. But we find that when it stores an element of type char it would be more convenient to have a completely different implementation with a function member uppercase, so we decide to declare a class template specialization for that type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// template specialization&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
// class template:&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mycontainer {&lt;br /&gt;
    T element;&lt;br /&gt;
  public:&lt;br /&gt;
    mycontainer (T arg) {element=arg;}&lt;br /&gt;
    T increase () {return ++element;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// class template specialization:&lt;br /&gt;
template &amp;lt;&amp;gt;&lt;br /&gt;
class mycontainer &amp;lt;char&amp;gt; {&lt;br /&gt;
    char element;&lt;br /&gt;
  public:&lt;br /&gt;
    mycontainer (char arg) {element=arg;}&lt;br /&gt;
    char uppercase ()&lt;br /&gt;
    {&lt;br /&gt;
      if ((element&amp;gt;='a')&amp;amp;&amp;amp;(element&amp;lt;='z'))&lt;br /&gt;
      element+='A'-'a';&lt;br /&gt;
      return element;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mycontainer&amp;lt;int&amp;gt; myint (7);&lt;br /&gt;
  mycontainer&amp;lt;char&amp;gt; mychar ('j');&lt;br /&gt;
  cout &amp;lt;&amp;lt; myint.increase() &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; mychar.uppercase() &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the syntax used in the class template specialization:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
template &amp;lt;&amp;gt; class mycontainer &amp;lt;char&amp;gt; { ... };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First of all, notice that we precede the class template name with an empty template&amp;lt;&amp;gt; parameter list. This is to explicitly declare it as a template specialization.&lt;br /&gt;
&lt;br /&gt;
But more important than this prefix, is the &amp;lt;char&amp;gt; specialization parameter after the class template name. This specialization parameter itself identifies the type for which we are going to declare a template class specialization (char). Notice the differences between the generic class template and the specialization:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt; class mycontainer { ... };&lt;br /&gt;
template &amp;lt;&amp;gt; class mycontainer &amp;lt;char&amp;gt; { ... };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line is the generic template, and the second one is the specialization.&lt;br /&gt;
&lt;br /&gt;
When we declare specializations for a template class, we must also define all its members, even those exactly equal to the generic template class, because there is no &amp;quot;inheritance&amp;quot; of members from the generic template to the specialization.&lt;br /&gt;
&lt;br /&gt;
Non-type parameters for templates&lt;br /&gt;
Besides the template arguments that are preceded by the class or typename keywords , which represent types, templates can also have regular typed parameters, similar to those found in functions. As an example, have a look at this class template that is used to contain sequences of elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// sequence template&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
class mysequence {&lt;br /&gt;
    T memblock [N];&lt;br /&gt;
  public:&lt;br /&gt;
    void setmember (int x, T value);&lt;br /&gt;
    T getmember (int x);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
void mysequence&amp;lt;T,N&amp;gt;::setmember (int x, T value) {&lt;br /&gt;
  memblock[x]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
T mysequence&amp;lt;T,N&amp;gt;::getmember (int x) {&lt;br /&gt;
  return memblock[x];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mysequence &amp;lt;int,5&amp;gt; myints;&lt;br /&gt;
  mysequence &amp;lt;double,5&amp;gt; myfloats;&lt;br /&gt;
  myints.setmember (0,100);&lt;br /&gt;
  myfloats.setmember (3,3.1416);&lt;br /&gt;
  cout &amp;lt;&amp;lt; myints.getmember(0) &amp;lt;&amp;lt; '\n';&lt;br /&gt;
  cout &amp;lt;&amp;lt; myfloats.getmember(3) &amp;lt;&amp;lt; '\n';&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
100&lt;br /&gt;
3.1416 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to set default values or types for class template parameters. For example, if the previous class template definition had been:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T=char, int N=10&amp;gt; class mysequence {..};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We could create objects using the default template parameters by declaring:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mysequence&amp;lt;&amp;gt; myseq;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which would be equivalent to:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mysequence&amp;lt;char,10&amp;gt; myseq;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Advantages and Disadvantages ====&lt;br /&gt;
&lt;br /&gt;
These actually generate different classes based on the input type. An std::vector&amp;lt;int&amp;gt; is a completely different class than an std::vector&amp;lt;float&amp;gt;. There is no support for covariance or contravariance, but there is support for passing non-types to templates, partial template specialization. They basically allow you to do whatever you want.&lt;br /&gt;
&lt;br /&gt;
However, since C++ templates create different classes for every variation of their template parameters, the size of the compiled executable is larger. Beyond that, compilation time increases greatly, since all template code must be included with each compilation unit and much more code must be generated. However, actual runtime memory footprint is typically smaller than the alternative (frees an extra void*) and performance is better, since the compiler can perform more aggressive optimizations with the known type.&lt;br /&gt;
&lt;br /&gt;
While a generic Java class compiles it's entire self, when using a C++ template, you only compile what you use. So, if you create an std::vector&amp;lt;int&amp;gt; and only use push_back and size, only those functions will be compiled into the object file. This eases the size of executable problem.&lt;br /&gt;
&lt;br /&gt;
==  Comparing C# and Java Generics ==&lt;br /&gt;
&lt;br /&gt;
Java's generics implementation was based on a project originally called Pizza, which was done by Martin Odersky and others. Pizza was renamed GJ, then it turned into a JSR and ended up being adopted into the Java language. And this particular generics proposal had as a key design goal that it could run on an unmodified VM [Virtual Machine]. It is, of course, great that you don't have to modify your VM, but it also brings about a whole bunch of odd limitations. The limitations are not necessarily directly apparent, but you very quickly go, &amp;quot;Hmm, that's strange.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For example, with Java generics, you don't actually get any of the execution efficiency that I talked about, because when you compile a generic class in Java, the compiler takes away the type parameter and substitutes Object everywhere. So the compiled image for List&amp;lt;T&amp;gt; is like a List where you use the type Object everywhere. Of course, if you now try to make a List&amp;lt;int&amp;gt;, you get boxing of all the ints. So there's a bunch of overhead there. Furthermore, to keep the VM happy, the compiler actually has to insert all of the type casts you didn't write. If it's a List of Object and you're trying to treat those Objects as Customers, at some point the Objects must be cast to Customers to keep the verifier happy. And really all they're doing in their implementation is automatically inserting those type casts for you. So you get the syntactic sugar, or some of it at least, but you don't get any of the execution efficiency. So that's issue number one I have with Java's solution.&lt;br /&gt;
&lt;br /&gt;
Issue number two, and I think this is probably an even bigger issue, is that because Java's generics implementation relies on erasure of the type parameter, when you get to runtime, you don't actually have a faithful representation of what you had at compile time. When you apply reflection to a generic List in Java, you can't tell what the List is a List of. It's just a List. Because you've lost the type information, any type of dynamic code-generation scenario, or reflection-based scenario, simply doesn't work. If there's one trend that's pretty clear to me, it's that there's more and more of that. And it just doesn't work, because you've lost the type information. Whereas in our implementation, all of that information is available. You can use reflection to get the System.Type for object List&amp;lt;T&amp;gt;. You cannot actually create an instance of it yet, because you don't know what T is. But then you can use reflection to get the System.Type for int. You can then ask reflection to please put these two together and create a List&amp;lt;int&amp;gt;, and you get another System.Type for List&amp;lt;int&amp;gt;. So representationally, anything you can do at compile time you can also do at runtime.&lt;br /&gt;
&lt;br /&gt;
== Comparing C# Generics to C++ Templates ==&lt;br /&gt;
&lt;br /&gt;
To me the best way to understand the distinction between C# generics and C++ templates is this: C# generics are really just like classes, except they have a type parameter. C++ templates are really just like macros, except they look like classes.&lt;br /&gt;
&lt;br /&gt;
The big difference between C# generics and C++ templates shows up in when the type checking occurs and how the instantiation occurs. First of all, C# does the instantiation at runtime. C++ does it at compile time, or perhaps at link time. But regardless, the instantiation happens in C++ before the program runs. That's difference number one. Difference number two is C# does strong type checking when you compile the generic type. For an unconstrained type parameter, like List&amp;lt;T&amp;gt;, the only methods available on values of type T are those that are found on type Object, because those are the only methods we can generally guarantee will exist. So in C# generics, we guarantee that any operation you do on a type parameter will succeed.&lt;br /&gt;
&lt;br /&gt;
C++ is the opposite. In C++, you can do anything you damn well please on a variable of a type parameter type. But then once you instantiate it, it may not work, and you'll get some cryptic error messages. For example, if you have a type parameter T, and variables x and y of type T, and you say x + y, well you had better have an operator+ defined for + of two Ts, or you'll get some cryptic error message. So in a sense, C++ templates are actually untyped, or loosely typed. Whereas C# generics are strongly typed.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
1. http://www.artima.com/intv/genericsP.html &amp;lt;br&amp;gt;&lt;br /&gt;
2. http://www.generic-programming.org &amp;lt;br&amp;gt;&lt;br /&gt;
3. [http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf Generics in the Java Programming Language] &amp;lt;br&amp;gt;&lt;br /&gt;
4. http://www.cplusplus.com/doc/tutorial/templates &amp;lt;br&amp;gt;&lt;br /&gt;
5. http://osl.iu.edu/publications/prints/2003/comparing_generic_programming03.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
6. http://msdn.microsoft.com/en-us/library/ms172192.aspx#Y1524&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch1b_1w47_sk&amp;diff=65932</id>
		<title>CSC/ECE 517 Fall 2012/ch1b 1w47 sk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2012/ch1b_1w47_sk&amp;diff=65932"/>
		<updated>2012-09-30T01:10:07Z</updated>

		<summary type="html">&lt;p&gt;Ssinha3: /* Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Generic Programming is a programming paradigm for developing efficient, reusable software libraries. The Generic Programming process focuses on finding commonality among similar implementations of the same algorithm, then providing suitable abstractions so that a single, generic algorithm can cover many concrete implementations. This process is repeated until the generic algorithm has reached a suitable level of abstraction, where it provides maximal re-usability while still yielding efficient, concrete implementations. The abstractions themselves are expressed as requirements on the parameters to the generic algorithm.&lt;br /&gt;
&lt;br /&gt;
In the simplest definition, generic programming is a style of computer programming in which algorithms are written in terms of to-be-specified-later types that are then instantiated when needed for specific types provided as parameters. This approach, pioneered by Ada in 1983, permits writing common functions or types that differ only in the set of types on which they operate when used, thus reducing duplication. Such software entities are known as generics in Ada, Eiffel, Java, C#, F#, and Visual Basic .NET; parametric polymorphism in ML, Scala and Haskell (the Haskell community also uses the term &amp;quot;generic&amp;quot; for a related but somewhat different concept); templates in C++ and D; and parameterized types in the influential 1994 book Design Patterns. &lt;br /&gt;
&lt;br /&gt;
The term generic programming was originally coined by David Musser and Alexander Stepanov in a more specific sense than the above, to describe an approach to software decomposition whereby fundamental requirements on types are abstracted from across concrete examples of algorithms and data structures and formalized as concepts, analogously to the abstraction of algebraic theories in abstract algebra. Early examples of this programming approach were implemented in Scheme and Ada, although the best known example is the Standard Template Library (STL) in which is developed a theory of iterators which is used to decouple sequence data structures and the algorithms operating on them.&lt;br /&gt;
&lt;br /&gt;
==Generics in Object Oriented Languages==&lt;br /&gt;
&lt;br /&gt;
=== .NET framework ===&lt;br /&gt;
&lt;br /&gt;
Generics are classes, structures, interfaces, and methods that have placeholders (type parameters) for one or more of the types that they store or use. A generic collection class might use a type parameter as a placeholder for the type of objects that it stores; the type parameters appear as the types of its fields and the parameter types of its methods. A generic method might use its type parameter as the type of its return value or as the type of one of its formal parameters. The following code illustrates a simple generic class definition.&lt;br /&gt;
&lt;br /&gt;
C#&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Generic&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    public T Field;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Public Shared Sub Main()&lt;br /&gt;
    Dim g As New Generic(Of String)&lt;br /&gt;
    g.Field = &amp;quot;A string&amp;quot; &lt;br /&gt;
    '...&lt;br /&gt;
    Console.WriteLine(&amp;quot;Generic.Field           = &amp;quot;&amp;quot;{0}&amp;quot;&amp;quot;&amp;quot;, g.Field)&lt;br /&gt;
    Console.WriteLine(&amp;quot;Generic.Field.GetType() = {0}&amp;quot;, g.Field.GetType().FullName)&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generics Terminology in .NET ====&lt;br /&gt;
&lt;br /&gt;
A generic type definition is a class, structure, or interface declaration that functions as a template, with placeholders for the types that it can contain or use. For example, the Dictionary class can contain two types: keys and values. Because a generic type definition is only a template, you cannot create instances of a class, structure, or interface that is a generic type definition.&lt;br /&gt;
&lt;br /&gt;
Generic type parameters, or type parameters, are the placeholders in a generic type or method definition. The Dictionary generic type has two type parameters, TKey and TValue, that represent the types of its keys and values.&lt;br /&gt;
&lt;br /&gt;
A constructed generic type, or constructed type, is the result of specifying types for the generic type parameters of a generic type definition.&lt;br /&gt;
&lt;br /&gt;
A generic type argument is any type that is substituted for a generic type parameter.&lt;br /&gt;
&lt;br /&gt;
The general term generic type includes both constructed types and generic type definitions.&lt;br /&gt;
&lt;br /&gt;
Covariance and contravariance of generic type parameters enable you to use constructed generic types whose type arguments are more derived (covariance) or less derived (contravariance) than a target constructed type. Covariance and contravariance are collectively referred to as variance. For more information, see Covariance and Contravariance in Generics.&lt;br /&gt;
&lt;br /&gt;
Constraints are limits placed on generic type parameters. For example, you might limit a type parameter to types that implement the IComparer generic interface, to ensure that instances of the type can be ordered. You can also constrain type parameters to types that have a particular base class, that have a default constructor, or that are reference types or value types. Users of the generic type cannot substitute type arguments that do not satisfy the constraints.&lt;br /&gt;
&lt;br /&gt;
A generic method definition is a method with two parameter lists: a list of generic type parameters and a list of formal parameters. Type parameters can appear as the return type or as the types of the formal parameters, as the following code shows.&lt;br /&gt;
&lt;br /&gt;
C#:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
T Generic&amp;lt;T&amp;gt;(T arg)&lt;br /&gt;
{&lt;br /&gt;
    T temp = arg;&lt;br /&gt;
    //... &lt;br /&gt;
    return temp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
VB:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function Generic(Of T)(ByVal arg As T) As T&lt;br /&gt;
    Dim temp As T = arg&lt;br /&gt;
    '... &lt;br /&gt;
    Return temp&lt;br /&gt;
End Function&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generic methods can appear on generic or nongeneric types. It is important to note that a method is not generic just because it belongs to a generic type, or even because it has formal parameters whose types are the generic parameters of the enclosing type. A method is generic only if it has its own list of type parameters. In the following code, only method G is generic.&lt;br /&gt;
&lt;br /&gt;
C#&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
{&lt;br /&gt;
    T G&amp;lt;T&amp;gt;(T arg)&lt;br /&gt;
    {&lt;br /&gt;
        T temp = arg;&lt;br /&gt;
        //... &lt;br /&gt;
        return temp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Generic&amp;lt;T&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    T M(T arg)&lt;br /&gt;
    {&lt;br /&gt;
        T temp = arg;&lt;br /&gt;
        //... &lt;br /&gt;
        return temp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
VB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Class A&lt;br /&gt;
    Function G(Of T)(ByVal arg As T) As T&lt;br /&gt;
        Dim temp As T = arg&lt;br /&gt;
        '... &lt;br /&gt;
        Return temp&lt;br /&gt;
    End Function &lt;br /&gt;
End Class &lt;br /&gt;
Class Generic(Of T)&lt;br /&gt;
    Function M(ByVal arg As T) As T&lt;br /&gt;
        Dim temp As T = arg&lt;br /&gt;
        '... &lt;br /&gt;
        Return temp&lt;br /&gt;
    End Function &lt;br /&gt;
End Class&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nested Types and Generics ====&lt;br /&gt;
&lt;br /&gt;
A type that is nested in a generic type can depend on the type parameters of the enclosing generic type. The common language runtime considers nested types to be generic, even if they do not have generic type parameters of their own. When you create an instance of a nested type, you must specify type arguments for all enclosing generic types.&lt;br /&gt;
&lt;br /&gt;
==== Language Support ====&lt;br /&gt;
The .NET Framework provides a number of generic collection classes in the following namespaces:&lt;br /&gt;
&lt;br /&gt;
The System.Collections.Generic namespace catalogs most of the generic collection types provided by the .NET Framework, such as the List and Dictionary generic classes.&lt;br /&gt;
&lt;br /&gt;
The System.Collections.ObjectModel namespace catalogs additional generic collection types, such as the ReadOnlyCollection generic class, that are useful for exposing object models to users of your classes.&lt;br /&gt;
&lt;br /&gt;
Generic interfaces for implementing sort and equality comparisons are provided in the System namespace, along with generic delegate types for event handlers, conversions, and search predicates.&lt;br /&gt;
&lt;br /&gt;
Support for generics has been added to the System.Reflection namespace for examining generic types and generic methods, to System.Reflection.Emit for emitting dynamic assemblies that contain generic types and methods, and to System.CodeDom for generating source graphs that include generics.&lt;br /&gt;
&lt;br /&gt;
The common language runtime provides new opcodes and prefixes to support generic types in Microsoft intermediate language (MSIL), including Stelem, Ldelem, Unbox_Any, Constrained, and Readonly.&lt;br /&gt;
&lt;br /&gt;
Visual C++, C#, and Visual Basic all provide full support for defining and using generics. For more information about language support, see Generic Types in Visual Basic (Visual Basic), Introduction to Generics (C# Programming Guide), and Overview of Generics in Visual C++.&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
&lt;br /&gt;
Generics were introduced in Java from JDK 1.5. Generics allows the abstraction over types. The most common examples are container&lt;br /&gt;
types, such as those in the Collection hierarchy. So, if you could say that the code works with &amp;quot;some unspecified type,&amp;quot; rather than a specific interface or class, then the code uses Generics. Here is a typical usage of that sort:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List myIntList = new LinkedList(); // 1&lt;br /&gt;
myIntList.add(new Integer(0)); // 2&lt;br /&gt;
Integer x = (Integer) myIntList.iterator().next(); // 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typically, the programmer knows what kind of data has been placed into a particular list. However, the cast is essential. The compiler can only guarantee that an Object will be returned by the iterator. To ensure the assignment to a variable of type Integer is type safe, the cast is required. Of course, the cast not only introduces clutter. It also introduces the possibility of a run time error, since the programmer might be mistaken. It would be better if programmers could actually express their intent, and mark a list as being restricted to contain a particular data type. This is the core idea behind generics. But why we need Generics in the first place when we have polymorphism. For example a method that takes a base class object as an argument, and then use that method with any class derived from that base class or use a method argument that is an interface instead of a class. Its because a General code works with &amp;quot;some unspecified type,&amp;quot; rather than a specific interface or class. Also being constrained to a single hierarchy is too limiting. Did Java Really Implement Generics In Its True Sense? Not at all! Working with C++ makes us realize that you can’t do everything when using Java generics.&lt;br /&gt;
&lt;br /&gt;
Here is a version of the program fragment given above using generics:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;Integer&amp;gt; myIntList = new LinkedList&amp;lt;Integer&amp;gt;(); // 1’&lt;br /&gt;
myIntList.add(new Integer(0)); //2’&lt;br /&gt;
Integer x = myIntList.iterator().next(); // 3’&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the type declaration for the variable myIntList. It specifies that this is not just an arbitrary List, but a List of Integer, written List&amp;lt;Integer&amp;gt;. We say that List is a generic interface that takes a type parameter - in this case, Integer. We also specify&lt;br /&gt;
a type parameter when creating the list object. The other thing to pay attention to is that the cast is gone on line 3’. Now, you might think that all we’ve accomplished is to move the clutter around. Instead of a cast to Integer on line 3, we have Integer as a type parameter on line 1’. However, there is a very big difference here. The compiler can now check the type correctness of the program at compile-time. When we say that myIntList is declared with type List&amp;lt;Integer&amp;gt;, this tells us something about the variable myIntList, which holds true wherever and whenever it is used, and the compiler will guarantee it. In contrast, the cast tells us something the programmer thinks is true at a single point in the code. The net effect, especially in large programs, is improved readability and robustness.&lt;br /&gt;
&lt;br /&gt;
Here is a small excerpt from the definitions of the interfaces List and Iterator in package java.util:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface List&amp;lt;E&amp;gt; {&lt;br /&gt;
void add(E x);&lt;br /&gt;
Iterator&amp;lt;E&amp;gt; iterator();&lt;br /&gt;
}&lt;br /&gt;
public interface Iterator&amp;lt;E&amp;gt; {&lt;br /&gt;
E next();&lt;br /&gt;
boolean hasNext();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should all be familiar, except for the stuff in angle brackets. Those are the declarations of the formal type parameters of the interfaces List and Iterator. Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types.&lt;br /&gt;
&lt;br /&gt;
A generic type declaration is compiled once and for all, and turned into a single class file, just like an ordinary class or interface declaration. Type parameters are analogous to the ordinary parameters used in methods or constructors. Much like a method has formal value parameters that describe the kinds of values it operates on, a generic declaration has formal type parameters. When a method is invoked, actual arguments are substituted for the formal parameters, and the method body is evaluated. When a generic declaration is invoked, the actual type arguments are substituted for the formal type parameters. When you create a Holder, you must specify the type you want to put into it using angle-bracket syntax. Also you are only allowed to put objects of that type (or a subtype, since the substitution principle still works with generics) into the holder. And when you get a value out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class A {}&lt;br /&gt;
public class H3&amp;lt;T&amp;gt; {&lt;br /&gt;
private T a;&lt;br /&gt;
public H3(T a) { this.a = a; }&lt;br /&gt;
public void set(T a) { this.a = a; }&lt;br /&gt;
public T get() { return a; }&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
H3&amp;lt;A&amp;gt; h3 = new H3&amp;lt;A&amp;gt;(new A ());&lt;br /&gt;
A a = h3.get(); // No cast needed&lt;br /&gt;
// h3.set(&amp;quot;Not an Automobile&amp;quot;); // Error&lt;br /&gt;
// h3.set(1); // Error&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lets see how we can use generics to return multiple values. Tuple is simply a group of objects wrapped together into a single object. The recipient of the object is allowed to read the elements but not put new ones in. We can also create longer tuples with inheritance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Tuple_Grp&amp;lt;A,B&amp;gt; {&lt;br /&gt;
public final A first;&lt;br /&gt;
public final B second;&lt;br /&gt;
public Tuple_Grp(A a, B b) { first = a; second = b; }&lt;br /&gt;
public String toString() {&lt;br /&gt;
return &amp;quot;(&amp;quot; + first + &amp;quot;, &amp;quot; + second + &amp;quot;)&amp;quot;;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generics and Subtyping ====&lt;br /&gt;
&lt;br /&gt;
Let’s test our understanding of generics. Is the following code snippet legal?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;String&amp;gt; ls = new ArrayList&amp;lt;String&amp;gt;(); //1&lt;br /&gt;
List&amp;lt;Object&amp;gt; lo = ls; //2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Line 1 is certainly legal. The trickier part of the question is line 2. This boils down to the question: is a List of String a List of Object. Most people’s instinct is to answer: “sure!”.&lt;br /&gt;
Well, take a look at the next few lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lo.add(new Object()); // 3&lt;br /&gt;
String s = ls.get(0); // 4: attempts to assign an Object to a String!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we’ve aliased ls and lo. Accessing ls, a list of String, through the alias lo, we can insert arbitrary objects into it. As a result ls does not hold just Strings anymore, and when we try and get something out of it, we get a rude surprise. The Java compiler will prevent this from happening of course. Line 2 will cause a compile time error.&lt;br /&gt;
&lt;br /&gt;
In general, if Foo is a subtype (subclass or subinterface) of Bar, and G is some generic type declaration, it is not the case that G&amp;lt;Foo&amp;gt; is a subtype of G&amp;lt;Bar&amp;gt;. This is probably the hardest thing you need to learn about generics, because it goes against our deeply held intuitions. The problem with that intuition is that it assumes that collections don’t change. Our instinct takes these things to be immutable.&lt;br /&gt;
For example, if the department of motor vehicles supplies a list of drivers to the census bureau, this seems reasonable. We think that a List&amp;lt;Driver&amp;gt; is a List&amp;lt;Person&amp;gt;, assuming that Driver is a subtype of Person. In fact, what is being passed is a copy of the registry of drivers. Otherwise, the census bureau could add new people who are not drivers into the list, corrupting the DMV’s records. In order to cope with this sort of situation, it’s useful to consider more flexible generic types. The rules we’ve seen so far are quite restrictive.&lt;br /&gt;
&lt;br /&gt;
==== Wildcards ====&lt;br /&gt;
Consider the problem of writing a routine that prints out all the elements in a collection.&lt;br /&gt;
Here’s how you might write it in an older version of the language:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void printCollection(Collection c) {&lt;br /&gt;
Iterator i = c.iterator();&lt;br /&gt;
for (k = 0; k &amp;lt; c.size(); k++) {&lt;br /&gt;
System.out.println(i.next());&lt;br /&gt;
}}&lt;br /&gt;
And here is a naive attempt at writing it using generics (and the new for loop syntax):&lt;br /&gt;
void printCollection(Collection&amp;lt;Object&amp;gt; c) {&lt;br /&gt;
for (Object e : c) {&lt;br /&gt;
System.out.println(e);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The problem is that this new version is much less useful than the old one. Whereas the old code could be called with any kind of collection as a parameter, the new code only takes Collection&amp;lt;Object&amp;gt;, which, as we’ve just demonstrated, is not a supertype of all kinds of collections!&lt;br /&gt;
So what is the supertype of all kinds of collections? It’s written Collection&amp;lt;?&amp;gt; (pronounced “collection of unknown”) , that is, a collection whose element type matches anything. It’s called a wildcard type for obvious reasons. We can write:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void printCollection(Collection&amp;lt;?&amp;gt; c) {&lt;br /&gt;
for (Object e : c) {&lt;br /&gt;
System.out.println(e);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now, we can call it with any type of collection. Notice that inside printCollection(), we can still read elements from c and give them type Object. This is always safe, since whatever the actual type of the collection, it does contain objects. It isn’t&lt;br /&gt;
safe to add arbitrary objects to it however:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Collection&amp;lt;?&amp;gt; c = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
c.add(new Object()); // compile time error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since we don’t know what the element type of c stands for, we cannot add objects to it. The add() method takes arguments of type E, the element type of the collection. When the actual type parameter is ?, it stands for some unknown type. Any parameter we pass to add would have to be a subtype of this unknown type. Since we don’t know what type that is, we cannot pass anything in. The sole exception is null, which is a member of every type. On the other hand, given a List&amp;lt;?&amp;gt;, we can call get() and make use of the result. The result type is an unknown type, but we always know that it is an object. It is therefore safe to assign the result of get() to a variable of type Object or pass it as a&lt;br /&gt;
parameter where the type Object is expected.&lt;br /&gt;
&lt;br /&gt;
==== Advantages and Disadvantages ====&lt;br /&gt;
&lt;br /&gt;
These are there pretty much for syntactic sugar. They are implemented through a controversial decision called type erasure. All they really do is prevent you from having to cast a whole lot, which makes them safer to use. Performance is identical to making specialized classes, except in cases where you are using what would have been a raw data type (int, float, double, char, bool, short). In these cases, the value types must be boxed to their corresponding reference types (Integer, Float, Double, Char, Bool, Short), which has some overhead. Memory usage is identical, since the JRE is just performing the casting in the background (which is essentially free). Java also has some nice type covariance and contravariance, which makes things look much cleaner than not using them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generic Interfaces ====&lt;br /&gt;
&lt;br /&gt;
Generic also work with interfaces. In Java generator is a class that instantiates objects for us. So when you ask a generator for new object, you don't need to pass any arguments. Generator just defines one method, the method that produces new objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Cola {&lt;br /&gt;
private static long counter = 0;&lt;br /&gt;
private final long id = counter++;&lt;br /&gt;
public String toString() {&lt;br /&gt;
return getClass().getSimpleName() + &amp;quot; &amp;quot; + id;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
public class A extends Cola {}&lt;br /&gt;
public class B extends Cola {} &lt;br /&gt;
public class C extends Cola {} &lt;br /&gt;
&lt;br /&gt;
public class ColaGenerator implements Generator&amp;lt;Cola&amp;gt;, Iterable&amp;lt;Cola&amp;gt; {&lt;br /&gt;
private Class[] types = { A.class, B.class, C.class };&lt;br /&gt;
private static Random rand = new Random(47);&lt;br /&gt;
&lt;br /&gt;
public ColaGenerator() {}&lt;br /&gt;
	private int size = 0;&lt;br /&gt;
	public ColaGenerator(int sz) { size = sz; }&lt;br /&gt;
	public Cola next() {&lt;br /&gt;
		try {&lt;br /&gt;
		return (Cola)&lt;br /&gt;
		types[rand.nextInt(types.length)].newInstance();&lt;br /&gt;
		} catch(Exception e) {&lt;br /&gt;
		throw new RuntimeException(e);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class ColaIterator implements Iterator&amp;lt;Cola&amp;gt; {&lt;br /&gt;
int count = size;&lt;br /&gt;
public boolean hasNext() { return count &amp;gt; 0; }&lt;br /&gt;
public Cola next() {&lt;br /&gt;
count--;&lt;br /&gt;
return ColaGenerator.this.next();}&lt;br /&gt;
}&lt;br /&gt;
public Iterator&amp;lt;Cola&amp;gt; iterator() {&lt;br /&gt;
return new ColaIterator();&lt;br /&gt;
}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
ColaGenerator gen = new ColaGenerator();&lt;br /&gt;
for(int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
System.out.println(gen.next());&lt;br /&gt;
for(Cola c : new ColaGenerator(3))&lt;br /&gt;
System.out.println(c);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java SE5 conveniently added autoboxing and autounboxing to convert from primitive types to wrapper types and back. So the below example works without any problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Fib implements Generator&amp;lt;Integer&amp;gt; {&lt;br /&gt;
public int count = 0;&lt;br /&gt;
public Integer next() { return fib(count++); }&lt;br /&gt;
public int fib(int i) {&lt;br /&gt;
if(i &amp;lt; 2) return 1;&lt;br /&gt;
return fib(i-2) + fib(i-1);}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
Fib gen = new Fib();&lt;br /&gt;
for(int i = 0; i &amp;lt; 15; i++)&lt;br /&gt;
System.out.print(gen.next() + &amp;quot; &amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Generic Methods ====&lt;br /&gt;
Generic methods are used more often than generic classes. Note a generic class is independent of whether you have a generic method.if a method is static, it has no access to the generic type parameters of the class, so if it needs to use genericity it must be a generic method. Unlike generic class you don’t usually have to specify the parameter types, because the compiler can figure that out for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class GenMeth {&lt;br /&gt;
public &amp;lt;T&amp;gt; void f(T x) {&lt;br /&gt;
System.out.println(x.getClass().getName());&lt;br /&gt;
}&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
GenMeth a = new GenMeth();&lt;br /&gt;
a.f(&amp;quot;&amp;quot;);&lt;br /&gt;
a.f(‘c’);}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type argument inference in a generic method can be used to make simple utilities. For example we can make a utility which returns commonly used collection containers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class MyCollection {&lt;br /&gt;
public static &amp;lt;K,V&amp;gt; Map&amp;lt;K,V&amp;gt; map() {&lt;br /&gt;
return new HashMap&amp;lt;K,V&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; list() {&lt;br /&gt;
return new ArrayList&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; LinkedList&amp;lt;T&amp;gt; lList() {&lt;br /&gt;
return new LinkedList&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; Set&amp;lt;T&amp;gt; set() {&lt;br /&gt;
return new HashSet&amp;lt;T&amp;gt;();}&lt;br /&gt;
public static &amp;lt;T&amp;gt; Queue&amp;lt;T&amp;gt; queue() {&lt;br /&gt;
return new LinkedList&amp;lt;T&amp;gt;();}&lt;br /&gt;
&lt;br /&gt;
And we can use whichever method we want like:&lt;br /&gt;
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; obj = New.map();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===C++===&lt;br /&gt;
&lt;br /&gt;
In C++ generics are called templates.Function templates are special functions that can operate with generic types. This allows us to create a function template whose functionality can be adapted to more than one type or class without repeating the entire code for each type.&lt;br /&gt;
&lt;br /&gt;
In C++ this can be achieved using template parameters. A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function. These function templates can use these parameters as if they were any other regular type.&lt;br /&gt;
&lt;br /&gt;
The format for declaring function templates with type parameters is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class identifier&amp;gt; function_declaration;&lt;br /&gt;
template &amp;lt;typename identifier&amp;gt; function_declaration;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The only difference between both prototypes is the use of either the keyword class or the keyword typename. Its use is indistinct, since both expressions have exactly the same meaning and behave exactly the same way.&lt;br /&gt;
For example, to create a template function that returns the greater one of two objects we could use: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class myType&amp;gt;&lt;br /&gt;
myType GetMax (myType a, myType b) {&lt;br /&gt;
 return (a&amp;gt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we have created a template function with myType as its template parameter. This template parameter represents a type that has not yet been specified, but that can be used in the template function as if it were a regular type. As you can see, the function template GetMax returns the greater of two parameters of this still-undefined type.&lt;br /&gt;
&lt;br /&gt;
To use this function template we use the following format for the function call:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function_name &amp;lt;type&amp;gt; (parameters);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to call GetMax to compare two integer values of type int we can write: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int x,y;&lt;br /&gt;
GetMax &amp;lt;int&amp;gt; (x,y);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the compiler encounters this call to a template function, it uses the template to automatically generate a function replacing each appearance of myType by the type passed as the actual template parameter (int in this case) and then calls it. This process is automatically performed by the compiler and is invisible to the programmer.&lt;br /&gt;
&lt;br /&gt;
Here is the entire example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// function template&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T GetMax (T a, T b) {&lt;br /&gt;
  T result;&lt;br /&gt;
  result = (a&amp;gt;b)? a : b;&lt;br /&gt;
  return (result);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  int i=5, j=6, k;&lt;br /&gt;
  long l=10, m=5, n;&lt;br /&gt;
  k=GetMax&amp;lt;int&amp;gt;(i,j);&lt;br /&gt;
  n=GetMax&amp;lt;long&amp;gt;(l,m);&lt;br /&gt;
  cout &amp;lt;&amp;lt; k &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, we have used T as the template parameter name instead of myType because it is shorter and in fact is a very common template parameter name. But you can use any identifier you like. In the example above we used the function template GetMax() twice. The first time with arguments of type int and the second one with arguments of type long. The compiler has instantiated and then called each time the appropriate version of the function.&lt;br /&gt;
&lt;br /&gt;
As you can see, the type T is used within the GetMax() template function even to declare new objects of that type: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
T result;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore, result will be an object of the same type as the parameters a and b when the function template is instantiated with a specific type.&lt;br /&gt;
&lt;br /&gt;
In this specific case where the generic type T is used as a parameter for GetMax the compiler can find out automatically which data type has to instantiate without having to explicitly specify it within angle brackets (like we have done before specifying &amp;lt;int&amp;gt; and &amp;lt;long&amp;gt;). So we could have written instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i,j;&lt;br /&gt;
GetMax (i,j);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since both i and j are of type int, and the compiler can automatically find out that the template parameter can only be int. This implicit method produces exactly the same result:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// function template II&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T GetMax (T a, T b) {&lt;br /&gt;
  return (a&amp;gt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  int i=5, j=6, k;&lt;br /&gt;
  long l=10, m=5, n;&lt;br /&gt;
  k=GetMax(i,j);&lt;br /&gt;
  n=GetMax(l,m);&lt;br /&gt;
  cout &amp;lt;&amp;lt; k &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how in this case, we called our function template GetMax() without explicitly specifying the type between angle-brackets &amp;lt;&amp;gt;. The compiler automatically determines what type is needed on each call.&lt;br /&gt;
&lt;br /&gt;
Because our template function includes only one template parameter (class T) and the function template itself accepts two parameters, both of this T type, we cannot call our function template with two objects of different types as arguments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i;&lt;br /&gt;
long l;&lt;br /&gt;
k = GetMax (i,l); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would not be correct, since our GetMax function template expects two arguments of the same type, and in this call to it we use objects of two different types.&lt;br /&gt;
&lt;br /&gt;
We can also define function templates that accept more than one type parameter, simply by specifying more template parameters between the angle brackets. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T, class U&amp;gt;&lt;br /&gt;
T GetMin (T a, U b) {&lt;br /&gt;
  return (a&amp;lt;b?a:b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, our function template GetMin() accepts two parameters of different types and returns an object of the same type as the first parameter (T) that is passed. For example, after that declaration we could call GetMin() with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i,j;&lt;br /&gt;
long l;&lt;br /&gt;
i = GetMin&amp;lt;int,long&amp;gt; (j,l);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or simply:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
i = GetMin (j,l);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
even though j and l have different types, since the compiler can determine the appropriate instantiation anyway.&lt;br /&gt;
&lt;br /&gt;
Class templates&lt;br /&gt;
We also have the possibility to write class templates, so that a class can have members that use template parameters as types. For example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mypair {&lt;br /&gt;
    T values [2];&lt;br /&gt;
  public:&lt;br /&gt;
    mypair (T first, T second)&lt;br /&gt;
    {&lt;br /&gt;
      values[0]=first; values[1]=second;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class that we have just defined serves to store two elements of any valid type. For example, if we wanted to declare an object of this class to store two integer values of type int with the values 115 and 36 we would write:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mypair&amp;lt;int&amp;gt; myobject (115, 36); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this same class would also be used to create an object to store any other type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mypair&amp;lt;double&amp;gt; myfloats (3.0, 2.18); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only member function in the previous class template has been defined inline within the class declaration itself. In case that we define a function member outside the declaration of the class template, we must always precede that definition with the template &amp;lt;...&amp;gt; prefix:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// class templates&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mypair {&lt;br /&gt;
    T a, b;&lt;br /&gt;
  public:&lt;br /&gt;
    mypair (T first, T second)&lt;br /&gt;
      {a=first; b=second;}&lt;br /&gt;
    T getmax ();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T mypair&amp;lt;T&amp;gt;::getmax ()&lt;br /&gt;
{&lt;br /&gt;
  T retval;&lt;br /&gt;
  retval = a&amp;gt;b? a : b;&lt;br /&gt;
  return retval;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mypair &amp;lt;int&amp;gt; myobject (100, 75);&lt;br /&gt;
  cout &amp;lt;&amp;lt; myobject.getmax();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the syntax of the definition of member function getmax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T mypair&amp;lt;T&amp;gt;::getmax () &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confused by so many T's? There are three T's in this declaration: The first one is the template parameter. The second T refers to the type returned by the function. And the third T (the one between angle brackets) is also a requirement: It specifies that this function's template parameter is also the class template parameter.&lt;br /&gt;
&lt;br /&gt;
Template specialization&lt;br /&gt;
If we want to define a different implementation for a template when a specific type is passed as template parameter, we can declare a specialization of that template.&lt;br /&gt;
&lt;br /&gt;
For example, let's suppose that we have a very simple class called mycontainer that can store one element of any type and that it has just one member function called increase, which increases its value. But we find that when it stores an element of type char it would be more convenient to have a completely different implementation with a function member uppercase, so we decide to declare a class template specialization for that type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// template specialization&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
// class template:&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class mycontainer {&lt;br /&gt;
    T element;&lt;br /&gt;
  public:&lt;br /&gt;
    mycontainer (T arg) {element=arg;}&lt;br /&gt;
    T increase () {return ++element;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// class template specialization:&lt;br /&gt;
template &amp;lt;&amp;gt;&lt;br /&gt;
class mycontainer &amp;lt;char&amp;gt; {&lt;br /&gt;
    char element;&lt;br /&gt;
  public:&lt;br /&gt;
    mycontainer (char arg) {element=arg;}&lt;br /&gt;
    char uppercase ()&lt;br /&gt;
    {&lt;br /&gt;
      if ((element&amp;gt;='a')&amp;amp;&amp;amp;(element&amp;lt;='z'))&lt;br /&gt;
      element+='A'-'a';&lt;br /&gt;
      return element;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mycontainer&amp;lt;int&amp;gt; myint (7);&lt;br /&gt;
  mycontainer&amp;lt;char&amp;gt; mychar ('j');&lt;br /&gt;
  cout &amp;lt;&amp;lt; myint.increase() &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cout &amp;lt;&amp;lt; mychar.uppercase() &amp;lt;&amp;lt; endl;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the syntax used in the class template specialization:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
template &amp;lt;&amp;gt; class mycontainer &amp;lt;char&amp;gt; { ... };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First of all, notice that we precede the class template name with an empty template&amp;lt;&amp;gt; parameter list. This is to explicitly declare it as a template specialization.&lt;br /&gt;
&lt;br /&gt;
But more important than this prefix, is the &amp;lt;char&amp;gt; specialization parameter after the class template name. This specialization parameter itself identifies the type for which we are going to declare a template class specialization (char). Notice the differences between the generic class template and the specialization:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt; class mycontainer { ... };&lt;br /&gt;
template &amp;lt;&amp;gt; class mycontainer &amp;lt;char&amp;gt; { ... };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line is the generic template, and the second one is the specialization.&lt;br /&gt;
&lt;br /&gt;
When we declare specializations for a template class, we must also define all its members, even those exactly equal to the generic template class, because there is no &amp;quot;inheritance&amp;quot; of members from the generic template to the specialization.&lt;br /&gt;
&lt;br /&gt;
Non-type parameters for templates&lt;br /&gt;
Besides the template arguments that are preceded by the class or typename keywords , which represent types, templates can also have regular typed parameters, similar to those found in functions. As an example, have a look at this class template that is used to contain sequences of elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// sequence template&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
class mysequence {&lt;br /&gt;
    T memblock [N];&lt;br /&gt;
  public:&lt;br /&gt;
    void setmember (int x, T value);&lt;br /&gt;
    T getmember (int x);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
void mysequence&amp;lt;T,N&amp;gt;::setmember (int x, T value) {&lt;br /&gt;
  memblock[x]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T, int N&amp;gt;&lt;br /&gt;
T mysequence&amp;lt;T,N&amp;gt;::getmember (int x) {&lt;br /&gt;
  return memblock[x];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
  mysequence &amp;lt;int,5&amp;gt; myints;&lt;br /&gt;
  mysequence &amp;lt;double,5&amp;gt; myfloats;&lt;br /&gt;
  myints.setmember (0,100);&lt;br /&gt;
  myfloats.setmember (3,3.1416);&lt;br /&gt;
  cout &amp;lt;&amp;lt; myints.getmember(0) &amp;lt;&amp;lt; '\n';&lt;br /&gt;
  cout &amp;lt;&amp;lt; myfloats.getmember(3) &amp;lt;&amp;lt; '\n';&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
100&lt;br /&gt;
3.1416 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to set default values or types for class template parameters. For example, if the previous class template definition had been:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template &amp;lt;class T=char, int N=10&amp;gt; class mysequence {..};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We could create objects using the default template parameters by declaring:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mysequence&amp;lt;&amp;gt; myseq;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which would be equivalent to:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mysequence&amp;lt;char,10&amp;gt; myseq;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Advantages and Disadvantages ====&lt;br /&gt;
&lt;br /&gt;
These actually generate different classes based on the input type. An std::vector&amp;lt;int&amp;gt; is a completely different class than an std::vector&amp;lt;float&amp;gt;. There is no support for covariance or contravariance, but there is support for passing non-types to templates, partial template specialization. They basically allow you to do whatever you want.&lt;br /&gt;
&lt;br /&gt;
However, since C++ templates create different classes for every variation of their template parameters, the size of the compiled executable is larger. Beyond that, compilation time increases greatly, since all template code must be included with each compilation unit and much more code must be generated. However, actual runtime memory footprint is typically smaller than the alternative (frees an extra void*) and performance is better, since the compiler can perform more aggressive optimizations with the known type.&lt;br /&gt;
&lt;br /&gt;
While a generic Java class compiles it's entire self, when using a C++ template, you only compile what you use. So, if you create an std::vector&amp;lt;int&amp;gt; and only use push_back and size, only those functions will be compiled into the object file. This eases the size of executable problem.&lt;br /&gt;
&lt;br /&gt;
==  Comparing C# and Java Generics ==&lt;br /&gt;
&lt;br /&gt;
Java's generics implementation was based on a project originally called Pizza, which was done by Martin Odersky and others. Pizza was renamed GJ, then it turned into a JSR and ended up being adopted into the Java language. And this particular generics proposal had as a key design goal that it could run on an unmodified VM [Virtual Machine]. It is, of course, great that you don't have to modify your VM, but it also brings about a whole bunch of odd limitations. The limitations are not necessarily directly apparent, but you very quickly go, &amp;quot;Hmm, that's strange.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For example, with Java generics, you don't actually get any of the execution efficiency that I talked about, because when you compile a generic class in Java, the compiler takes away the type parameter and substitutes Object everywhere. So the compiled image for List&amp;lt;T&amp;gt; is like a List where you use the type Object everywhere. Of course, if you now try to make a List&amp;lt;int&amp;gt;, you get boxing of all the ints. So there's a bunch of overhead there. Furthermore, to keep the VM happy, the compiler actually has to insert all of the type casts you didn't write. If it's a List of Object and you're trying to treat those Objects as Customers, at some point the Objects must be cast to Customers to keep the verifier happy. And really all they're doing in their implementation is automatically inserting those type casts for you. So you get the syntactic sugar, or some of it at least, but you don't get any of the execution efficiency. So that's issue number one I have with Java's solution.&lt;br /&gt;
&lt;br /&gt;
Issue number two, and I think this is probably an even bigger issue, is that because Java's generics implementation relies on erasure of the type parameter, when you get to runtime, you don't actually have a faithful representation of what you had at compile time. When you apply reflection to a generic List in Java, you can't tell what the List is a List of. It's just a List. Because you've lost the type information, any type of dynamic code-generation scenario, or reflection-based scenario, simply doesn't work. If there's one trend that's pretty clear to me, it's that there's more and more of that. And it just doesn't work, because you've lost the type information. Whereas in our implementation, all of that information is available. You can use reflection to get the System.Type for object List&amp;lt;T&amp;gt;. You cannot actually create an instance of it yet, because you don't know what T is. But then you can use reflection to get the System.Type for int. You can then ask reflection to please put these two together and create a List&amp;lt;int&amp;gt;, and you get another System.Type for List&amp;lt;int&amp;gt;. So representationally, anything you can do at compile time you can also do at runtime.&lt;br /&gt;
&lt;br /&gt;
== Comparing C# Generics to C++ Templates ==&lt;br /&gt;
&lt;br /&gt;
To me the best way to understand the distinction between C# generics and C++ templates is this: C# generics are really just like classes, except they have a type parameter. C++ templates are really just like macros, except they look like classes.&lt;br /&gt;
&lt;br /&gt;
The big difference between C# generics and C++ templates shows up in when the type checking occurs and how the instantiation occurs. First of all, C# does the instantiation at runtime. C++ does it at compile time, or perhaps at link time. But regardless, the instantiation happens in C++ before the program runs. That's difference number one. Difference number two is C# does strong type checking when you compile the generic type. For an unconstrained type parameter, like List&amp;lt;T&amp;gt;, the only methods available on values of type T are those that are found on type Object, because those are the only methods we can generally guarantee will exist. So in C# generics, we guarantee that any operation you do on a type parameter will succeed.&lt;br /&gt;
&lt;br /&gt;
C++ is the opposite. In C++, you can do anything you damn well please on a variable of a type parameter type. But then once you instantiate it, it may not work, and you'll get some cryptic error messages. For example, if you have a type parameter T, and variables x and y of type T, and you say x + y, well you had better have an operator+ defined for + of two Ts, or you'll get some cryptic error message. So in a sense, C++ templates are actually untyped, or loosely typed. Whereas C# generics are strongly typed.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
1. http://www.artima.com/intv/genericsP.html &amp;lt;br&amp;gt;&lt;br /&gt;
2. http://www.generic-programming.org &amp;lt;br&amp;gt;&lt;br /&gt;
3. [http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf Generics in the Java Programming Language] &amp;lt;br&amp;gt;&lt;br /&gt;
4. http://www.cplusplus.com/doc/tutorial/templates &amp;lt;br&amp;gt;&lt;br /&gt;
5. http://osl.iu.edu/publications/prints/2003/comparing_generic_programming03.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
6. http://msdn.microsoft.com/en-us/library/ms172192.aspx#Y1524&lt;/div&gt;</summary>
		<author><name>Ssinha3</name></author>
	</entry>
</feed>