Greg Pearman and James Goodwill Pro .NET 2.0 Extreme Programming 4800FM.qrk 5/23/06 8:18 PM Page i Pro .NET 2.0 Extreme Programming Copyright © 2006 by Greg Pearman and James Goodwill All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-480-3 ISBN-10 (pbk): 1-59059-480-0 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Dominic Shakeshaft Technical Reviewer: Jason Lefebvre Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick, Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser, Keir Thomas, Matt Wade Project Manager: Sofia Marchant Copy Edit Manager: Nicole LeClerc Copy Editor: Marilyn Smith Assistant Production Director: Kari Brooks-Copony Production Editor: Kelly Winquist Compositor: Lynn L’Heureux Proofreaders: April Eddy, Lori Bring Indexer: Carol Burbo Artist: Kinetic Publishing Services, LLC Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precau- tion has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com in the Source Code section. 4800FM.qrk 5/23/06 8:18 PM Page ii To my wife, Simone, my soul mate; to my daughter, Ashley, and my son, Austin. Thank you for making my life complete. I love you with all my heart. —Greg Pearman To my girls Christy, Abby, and Emma. —James Goodwill 4800FM.qrk 5/23/06 8:18 PM Page iii 4800FM.qrk 5/23/06 8:18 PM Page iv Contents at a Glance About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix PART 1 ■ ■ ■ XP Introduction ■CHAPTER 1 Introducing XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ■CHAPTER 2 Assembling the Team . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 ■CHAPTER 3 Release Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 ■CHAPTER 4 Iteration Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 ■CHAPTER 5 The Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 PART 2 ■ ■ ■ XP Tools ■CHAPTER 6 Build Environment Tool: NAnt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 ■CHAPTER 7 Test Environment Tool: NUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 ■CHAPTER 8 Simulation Environment Tool: NMock . . . . . . . . . . . . . . . . . . . . . . . . . . 69 ■CHAPTER 9 Automation Environment Tool: CruiseControl.NET . . . . . . . . . . . . . . . 83 ■CHAPTER 10 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 PART 3 ■ ■ ■ XP in Action ■CHAPTER 11 Release Planning—The Journey Begins . . . . . . . . . . . . . . . . . . . . . . 111 ■CHAPTER 12 Iteration Planning for the First Iteration . . . . . . . . . . . . . . . . . . . . . . . 133 ■CHAPTER 13 First Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 ■CHAPTER 14 Iteration Planning for the Second Iteration . . . . . . . . . . . . . . . . . . . . 201 ■CHAPTER 15 Second Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 ■APPENDIX A Preparing Your Development Environment . . . . . . . . . . . . . . . . . . . . 279 ■APPENDIX B .NET C# Coding Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 ■APPENDIX C XP Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 ■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 v 4800FM.qrk 5/23/06 8:18 PM Page v 4800FM.qrk 5/23/06 8:18 PM Page vi Contents About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix PART 1 ■ ■ ■ XP Introduction ■CHAPTER 1 Introducing XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 The Waterfall Methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 The Agile Methodologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 What Is XP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Four XP Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Fifteen XP Principles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Fourteen XP Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Other Agile Methodologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Lean Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Dynamic Systems Development Method . . . . . . . . . . . . . . . . . . . . . . 15 Adaptive Software Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Crystal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Scrum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Feature Driven Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Is XP the Best Agile Method? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 When Shouldn’t You Use XP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 vii 4800FM.qrk 5/23/06 8:18 PM Page vii ■CHAPTER 2 Assembling the Team . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 XP Roles and Responsibilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 The Customer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 The Development Coach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 The Business Coach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 The Developer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 The System Engineer/Business Analyst . . . . . . . . . . . . . . . . . . . . . . . 23 The Tracker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 The Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 The Big Boss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Team Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Your XP Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 ■CHAPTER 3 Release Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 The Exploration Phase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 User Story Writing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 User Story Estimating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 The Planning Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Story Prioritization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Velocity Determination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 User Story Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 The Release Plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 ■CHAPTER 4 Iteration Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Iteration Velocity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Story Subselection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Task Determination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Task Assignment and Estimation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Task Points and Task Point Velocity . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Task Sign-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Iteration Balancing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 The Iteration Plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 ■CONTENTSviii 4800FM.qrk 5/23/06 8:18 PM Page viii ■CHAPTER 5 The Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 What Is an Iteration? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Design Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Stand-Up Meetings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Paired Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Test, Code, and Refactor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Building Tests and Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Keeping the Customer Involved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Acceptance Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Coaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 PART 2 ■ ■ ■ XP Tools ■CHAPTER 6 Build Environment Tool: NAnt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 What Is NAnt? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Installing NAnt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Creating a Build File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Understanding the Build File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Saving the Build File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Testing the Build File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ■CHAPTER 7 Test Environment Tool: NUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 What Is NUnit? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Installing NUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Building a Unit Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Creating the Test Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Creating the Application Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Integrating with NAnt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Running the Build File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 ■CONTENTS ix 4800FM.qrk 5/23/06 8:18 PM Page ix ■CHAPTER 8 Simulation Environment Tool: NMock . . . . . . . . . . . . . . . . . . . . . 69 What Is NMock? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Installing NMock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Creating a Mock Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Defining an Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Creating the Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Incorporating NMock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Running the Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 ■CHAPTER 9 Automation Environment Tool: CruiseControl.NET . . . . . . . 83 What Is CCNet? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Installing CCNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Setting Up the CCNet Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Creating the CCNet Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . 84 Starting the CCNet Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Setting Up CCTray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Starting CCTray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Configuring CCTray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Using CCTray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Setting Up the Web Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Installing the Web Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Running the Web Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 ■CHAPTER 10 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Visual Studio 2005 and Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Extract Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Rename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Encapsulate Field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Extract Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Promote Local Variable to Parameter . . . . . . . . . . . . . . . . . . . . . . . . 105 Remove Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Reorder Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 ■CONTENTSx 4800FM.qrk 5/23/06 8:18 PM Page x [...]... Each phase of a waterfall project must be complete prior to moving to the next phase This approach makes it difficult for you to learn and adjust to changes in the project requirements • The waterfall methodology is very heavily focused on process This approach often causes the team to concentrate more on managing the waterfall processes, as opposed to fulfilling the goals of the project • The waterfall... maintaining the plan throughout the project, and often the plan is out of date with the current status of the project The end result is the project plan tends to be more of a historical document than a working guide to the development team Planning is not the problem; the problem is trying to predict and plan for the future While the waterfall approach does have problems, it did start with the best... changes will help you identify new problems This approach will also build confidence when making changes XP Principle 4: Embrace Change Kent Beck’s initial XP book is titled Extreme Programming Explained: Embrace Change (Addison-Wesley, 1999) This is a key aspect of all the Agile methodologies If you can develop applications and systems that preserve options and solve only the problem or need at hand, you... perceived distractions will quickly disappear XP Practice 3: Paired Programming Code reviews are a good thing They provide a learning experience for all individuals involved and create consistency throughout the project The issue with code reviews is that they take a significant amount of time and are often skipped in order to meet deadlines Paired programming makes code reviews an everyday activity In addition,... different kinds of projects require different kinds of methodologies Crystal has a graph with two axes On one axis is the number of individuals on the project On the other axis is the degree of consequence of error Based on these two values, you can plot which Crystal family is appropriate for your project Scrum Scrum was introduced at OOPSLA 1996 (the annual conference on object-oriented programming systems,... is a software development process that is broken up into a series of distinct phases, with each phase existing as an autonomous phase with respect to all subsequent phases In a waterfall project, all phases of the process have a distinct beginning and end When a phase is over, the subsequent phase begins This stepped approach continues throughout the remaining phases of a project until it reaches completion... beginning of the project, you will increase the productivity and communications of the team XP Practice 6: Refactoring XP doesn’t favor large up-front design phases, as waterfall methodologies do, but it does promote design, through the practice of constant refactoring In Refactoring: Improving the Design of Existing Code (Addison Wesley, 1999), Martin Fowler defines refactoring as “the process of changing... software developers and the project stakeholders This requires the project stakeholders to know exactly what they want and to have those needs and wants remain constant throughout the development life cycle This is rarely the case • The waterfall methodology assumes that a project can be managed by a predefined project plan Months are spent perfecting the plan before any work on the project really begins... courage to expose your weaknesses That is what developers are doing when they pair-program ■ Note Paired programming is when two developers work on a task together It is one of the XP practices, as described in the “XP Practice 3” section of this chapter It takes courage for the development team members to tell the project stakeholders that they are not going to complete all of the user stories in... feedback in seconds and minutes This is all accomplished by selecting XP practices that provide this type of feedback For example, acceptance tests are written during an iteration starting with the first iteration In a waterfall approach, these tests would not be available until the end of the project Acceptance tests provide the business with rapid feedback in days and weeks, instead of months or years . Greg Pearman and James Goodwill Pro .NET 2. 0 Extreme Programming 4 800 FM.qrk 5 /23 /06 8:18 PM Page i Pro .NET 2. 0 Extreme Programming Copyright © 20 06 by Greg Pearman and James Goodwill All. Struts (John Wiley and Sons, 20 02 ) , Apache Jakarta-Tomcat (Apress, 20 01), and Apache Axis Live (SourceBeat, 20 04). xv 4 800 FM.qrk 5 /23 /06 8:18 PM Page xv 4 800 FM.qrk 5 /23 /06 8:18 PM Page xvi About. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6 ■CONTENTSxii 4 800 FM.qrk 5 /23 /06 8:18 PM Page xii fa938d55a4ad 02 8 892b 226 aef3fbf3dd The Database Setup . . . . . . . . . . . . . .