|
|
xi | |
|
|
xv | |
Preface |
|
xvii | |
Acknowledgments |
|
xxv | |
Author |
|
xxvii | |
|
1 Overview and Motivation |
|
|
1 | (26) |
|
|
1 | (10) |
|
|
2 | (3) |
|
1.1.2 The Changing Landscape |
|
|
5 | (2) |
|
1.1.3 Who Are the Developers? |
|
|
7 | (1) |
|
|
8 | (3) |
|
1.2 Free and Open Source Software (FOSS) |
|
|
11 | (9) |
|
|
12 | (4) |
|
|
16 | (2) |
|
|
18 | (1) |
|
|
19 | (1) |
|
|
20 | (2) |
|
|
20 | (1) |
|
|
20 | (2) |
|
|
22 | (5) |
|
|
23 | (4) |
|
2 Working with a Project Team |
|
|
27 | (36) |
|
|
27 | (10) |
|
|
27 | (2) |
|
|
29 | (2) |
|
2.1.3 Reading and Writing Code |
|
|
31 | (3) |
|
|
34 | (3) |
|
|
37 | (1) |
|
2.2 Client-Oriented vs Community-Oriented Projects |
|
|
37 | (7) |
|
|
40 | (2) |
|
2.2.2 Similarities and Differences |
|
|
42 | (2) |
|
2.3 Working on a Client-Oriented Project |
|
|
44 | (6) |
|
2.3.1 Members, Roles, and Tasks |
|
|
44 | (3) |
|
|
47 | (1) |
|
2.3.3 Scheduling, Milestones, and To-Do Lists |
|
|
48 | (2) |
|
2.4 Joining a Community-Oriented Project |
|
|
50 | (10) |
|
|
52 | (1) |
|
2.4.2 First Contact with the Project |
|
|
53 | (3) |
|
2.4.3 Norms for Good Citizenship |
|
|
56 | (2) |
|
2.4.4 Becoming a User First |
|
|
58 | (2) |
|
|
60 | (3) |
|
|
60 | (3) |
|
|
63 | (24) |
|
|
63 | (4) |
|
3.1.1 Asynchronous Communication |
|
|
64 | (1) |
|
3.1.2 Synchronous Communication |
|
|
65 | (1) |
|
|
66 | (1) |
|
3.2 Code Management Tools |
|
|
67 | (15) |
|
|
68 | (2) |
|
|
70 | (2) |
|
3.2.3 The Version Control System |
|
|
72 | (5) |
|
|
77 | (5) |
|
3.3 Run-Time System Constraints |
|
|
82 | (2) |
|
|
82 | (1) |
|
|
83 | (1) |
|
|
83 | (1) |
|
|
84 | (1) |
|
|
84 | (3) |
|
|
85 | (2) |
|
|
87 | (20) |
|
4.1 Architectural Patterns |
|
|
87 | (2) |
|
4.2 Layers, Cohesion, and Coupling |
|
|
89 | (6) |
|
4.2.1 Using Metrics to Evaluate Cohesion and Coupling |
|
|
93 | (2) |
|
|
95 | (5) |
|
4.3.1 Architectural Vulnerabilities |
|
|
96 | (1) |
|
4.3.2 User-Level Security |
|
|
97 | (3) |
|
4.4 Concurrency, Race Conditions, and Deadlocks |
|
|
100 | (5) |
|
|
105 | (2) |
|
|
105 | (2) |
|
|
107 | (36) |
|
5.1 Bad Smells and Metrics |
|
|
108 | (3) |
|
5.1.1 Identifying Bad Smells |
|
|
108 | (2) |
|
|
110 | (1) |
|
|
111 | (6) |
|
5.2.1 Example 1: Removing Useless Functions |
|
|
114 | (1) |
|
5.2.2 Example 2: Removing a Layering Violation |
|
|
114 | (3) |
|
|
117 | (12) |
|
|
119 | (1) |
|
|
120 | (8) |
|
5.3.3 A Strategy for Sequencing Unit Tests |
|
|
128 | (1) |
|
|
129 | (5) |
|
5.4.1 Tool Use vs Developer Skill |
|
|
130 | (1) |
|
5.4.2 Example 1: A User Interface Bug |
|
|
131 | (2) |
|
5.4.3 Example 2: A Multi-Level Bug |
|
|
133 | (1) |
|
5.5 Extending the Software for a New Project |
|
|
134 | (6) |
|
|
135 | (1) |
|
5.5.2 Impact on the Code Base |
|
|
136 | (3) |
|
|
139 | (1) |
|
|
140 | (3) |
|
|
140 | (3) |
|
6 Developing the Domain Classes |
|
|
143 | (30) |
|
6.1 Understanding the Current System |
|
|
143 | (8) |
|
6.1.1 Reading a Design Document |
|
|
144 | (3) |
|
|
147 | (3) |
|
6.1.3 Examining the Domain Classes |
|
|
150 | (1) |
|
|
151 | (11) |
|
6.2.1 Top-Down Analysis/Bottom-Up Development |
|
|
154 | (1) |
|
6.2.2 Modifying the Domain Classes |
|
|
155 | (3) |
|
6.2.3 Documentation and Bulletproofing |
|
|
158 | (4) |
|
6.3 Class Design Principles and Practice |
|
|
162 | (4) |
|
6.3.1 Using What's Already There |
|
|
163 | (1) |
|
6.3.2 Adding a New Domain Class |
|
|
164 | (2) |
|
6.4 Managing the Ripple Effect |
|
|
166 | (5) |
|
6.4.1 Unit Testing the New Code |
|
|
166 | (3) |
|
6.4.2 Refactoring the New Code Base |
|
|
169 | (2) |
|
|
171 | (2) |
|
|
171 | (2) |
|
7 Developing the Database Modules |
|
|
173 | (32) |
|
7.1 Design Principles and Practice |
|
|
174 | (8) |
|
|
175 | (1) |
|
7.1.2 Connecting the Program to the Database |
|
|
176 | (2) |
|
|
178 | (2) |
|
7.1.4 Normalization and Keys |
|
|
180 | (1) |
|
7.1.5 Backup and Recovery |
|
|
181 | (1) |
|
7.2 Working with a Database |
|
|
182 | (6) |
|
|
184 | (1) |
|
|
185 | (2) |
|
7.2.3 Table Insertion, Deletion, and Updating |
|
|
187 | (1) |
|
7.3 Database Security and Integrity |
|
|
188 | (5) |
|
7.3.1 Database-Level Permissions |
|
|
189 | (1) |
|
7.3.2 User-Level Permissions |
|
|
189 | (3) |
|
7.3.3 Controlling Concurrency |
|
|
192 | (1) |
|
7.4 Adding New Software Features: Database Impact |
|
|
193 | (8) |
|
7.4.1 Items 1 and 9d: Volunteer Status and Application |
|
|
195 | (3) |
|
7.4.2 Item 3: Calendar View |
|
|
198 | (3) |
|
|
201 | (4) |
|
|
202 | (3) |
|
8 Developing the User Interface |
|
|
205 | (38) |
|
8.1 Design Principles and Practice |
|
|
205 | (13) |
|
8.1.1 The Model-View-Controller Pattern |
|
|
207 | (3) |
|
8.1.2 Sessions, Query Strings, and Global Variables |
|
|
210 | (3) |
|
8.1.3 Ensuring Security at the User Interface |
|
|
213 | (5) |
|
|
218 | (12) |
|
|
219 | (5) |
|
8.2.2 Debugging as a Community Activity |
|
|
224 | (6) |
|
8.3 Adding New Features: User Interface Impact |
|
|
230 | (9) |
|
8.3.1 Item 1: Volunteer Status |
|
|
230 | (5) |
|
8.3.2 Item 2: Make Active/Inactive |
|
|
235 | (2) |
|
8.3.3 Item 3: Calendar View |
|
|
237 | (2) |
|
|
239 | (4) |
|
|
240 | (3) |
|
|
243 | (22) |
|
|
243 | (6) |
|
9.1.1 Knowing Your Audience |
|
|
244 | (2) |
|
9.1.2 Principles of Good Writing |
|
|
246 | (3) |
|
9.2 Types of User Support |
|
|
249 | (9) |
|
|
249 | (2) |
|
|
251 | (2) |
|
9.2.3 Open Discussion Forums |
|
|
253 | (4) |
|
9.2.4 User Training and Feedback |
|
|
257 | (1) |
|
9.3 Example: RMH Homebase On-Line Help |
|
|
258 | (5) |
|
9.3.1 Help and the Code Base |
|
|
258 | (5) |
|
|
263 | (2) |
|
|
263 | (2) |
|
|
265 | (26) |
|
10.1 Origins and Evolution |
|
|
265 | (8) |
|
10.1.1 Starting a Client-Oriented Project |
|
|
267 | (4) |
|
10.1.2 Quality Assessment |
|
|
271 | (2) |
|
10.2 Evolving into a Democratic Meritocracy |
|
|
273 | (11) |
|
|
274 | (3) |
|
|
277 | (4) |
|
10.2.3 Decision Making and Conflict Resolution |
|
|
281 | (1) |
|
10.2.4 Domain Constraints |
|
|
282 | (2) |
|
|
284 | (5) |
|
|
284 | (1) |
|
10.3.2 Finding a Project Host |
|
|
285 | (2) |
|
10.3.3 Release Strategies |
|
|
287 | (2) |
|
|
289 | (2) |
|
|
290 | (1) |
|
11 New Project Conception |
|
|
291 | (20) |
|
11.1 Requirements Gathering |
|
|
292 | (11) |
|
|
292 | (3) |
|
|
295 | (2) |
|
|
297 | (6) |
|
|
303 | (6) |
|
|
303 | (1) |
|
|
304 | (1) |
|
11.2.3 Performance and Platform |
|
|
305 | (2) |
|
11.2.4 System Architecture |
|
|
307 | (1) |
|
11.2.5 Design Alternatives |
|
|
308 | (1) |
|
|
308 | (1) |
|
|
309 | (2) |
|
|
309 | (2) |
|
|
311 | (40) |
|
A Details of the Case Study |
|
|
311 | (30) |
|
|
311 | (1) |
|
|
312 | (5) |
|
|
317 | (10) |
|
A.1.3 System Requirements |
|
|
327 | (1) |
|
|
328 | (1) |
|
|
329 | (1) |
|
A.2.2 Software Architecture |
|
|
329 | (1) |
|
|
330 | (1) |
|
|
330 | (3) |
|
|
333 | (3) |
|
A.2.6 Implementation Schedule |
|
|
336 | (1) |
|
A.2.7 User-System Interaction |
|
|
336 | (5) |
|
B New Features for an Existing Code Base |
|
|
341 | (10) |
|
B.1 Starting with a Request from the Client |
|
|
341 | (2) |
|
B.2 Impact on the Design and the Code Base |
|
|
343 | (7) |
|
B.3 Defining a Project that Implements these Features |
|
|
350 | (1) |
References |
|
351 | (4) |
Index |
|
355 | |