












Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
It allows designers to add new features and capabilities to the system correctly; it greatly enhances the in- ternal quality and robustness of the system.
Typology: Slides
1 / 20
This page cannot be seen from the preview
Don't miss anything!













nswers: What do we have to manage?
Good habits are a wonderful thing. They allow the team to carry out the basic steps, focusing on content and results, rather than process steps. This is best achieved when process steps are logical and their worth immediately obvious to each team member. Coad, LeFebvre, De Luca [Coad 99]
Like all good software development processes, Feature-Driven Develop- ment (FDD) is built around a core set of “best practices.” The chosen practices are not new but this particular blend of the ingredients is new. Each practice complements and reinforces the others. The result is a whole greater than the sum of its parts; there is no single practice that underpins the entire process. A team could choose to implement just one or two of the practices but would not get the full benefit that occurs by using the whole FDD process.
Consider inspections, for example. They are decades old and have a mountain of evidence showing them to be a great tool. However, on their own, they are far from enough. No, it is the right mix of the ingredients in the right amounts at the right times that makes the FDD cake taste so good!
Mac: Steve, are the processes within FDD rigid, or can we adapt them to fit the project, the team, and the organization?
Steve: FDD can certainly be adapted to a particular toolset and to teams of people with various levels of experience. It is this level of flexibility that makes FDD relatively easy to adopt within an organization.
Mac: So, you are telling me that for our project, we can pick and choose what we will implement and that’s FDD?
Steve: Absolutely not! FDD is flexible and adaptable, but there are some best practices that need to be included in order for it to be an FDD process. I’ll list the best practices that make up FDD. Take a look at it, and then we’ll go over each one in detail.
The best practices that make up FDD are:
Steve: You could choose to implement a few of the practices and claim you are follow- ing a feature-centric process but I reserve the FDD name to mean that you are follow- ing all of the practices I’ve listed. Mac: Okay, I can understand that distinction. Let’s look at each practice in turn....
Domain object modeling consists of building class diagrams depict- ing the significant types of objects within a problem domain and the re- lationships between them. Class diagrams are structural in nature and look a little like the more traditional entity-relationship diagrams of the relational database world. Two big differences are the inclusion of inheri- tance or generalization/specialization relationships and operations that specify how the objects behave. To support this behavioral view, it is usual to complement the class diagrams with a set of high-level se- quence diagrams depicting explicitly how objects interact with each other to fulfill their responsibilities. The emphasis is on what questions objects of a particular class can answer and what calculations or services they can perform; there is less emphasis placed on determining exactly what attributes objects of a particular class might manage. As analysts and developers learn of requirements from Domain Ex- perts, they start forming mental images of the desired system. Unless they are very careful, they make assumptions about this imaginary de- sign. These hidden assumptions can cause inconsistencies between dif- ferent people’s work, ambiguities in requirements documentation, and the omission of important details. Developing an overall domain object model (Figure 3–1) forces those assumptions out into the open—misun- derstandings are resolved, holes in understanding are filled, and a much more complete, common understanding of the problem domain is formed. In Extreme Programming Explained , Kent Beck offers the analogy that software construction is like driving a car [Beck 00]. Driving requires con-
A Practical Guide to Feature-Driven Development
types that interact in defined ways. The use of color adds a layer of “visu- ally detectable” information to the model. Using this technique, a team or individual can very rapidly build a resilient, flexible, and extensible object model for a problem domain that communicates clearly and con- cisely. FDD does not mandate the use of modeling in color and modeling in color does not require FDD. However, they do complement each other exceptionally well.
Mac: I understand the analogy you used, but why is that so important to a software project? We have several very experienced programmers who will be working on our project. Some of them are used to listing the initial requirements, then going directly to coding. Sometimes they will prototype the system, but that’s about as much of a model as they use. Steve: For a very simple problem, that may be all right. However, the more complex the problem, the more imperative it is that the problem be adequately explored and explained. Source code is far too detailed a mechanism with which to do that. The information needs to be accessible to and understandable by all of those involved with specifying the requirements, as well as to those responsible for implementing them. A domain object model is a concise, relatively accessible, reuseable way of storing and communicating that information to everyone involved in the project. The old “building a house” analogy really fits here. I wouldn’t mind building a kennel without plans and blueprints, but would I want a builder to build my home that way? Or would you want to live in a 30-story high-rise that was built without blueprints? The domain object model provides a solid framework that can be built within when changes in the business environment require the system to change. It allows designers to add new features and capabilities to the system correctly; it greatly enhances the in- ternal quality and robustness of the system.
Once we have identified the classes in our domain object model, we can design and implement each one in turn. Then, once we have com- pleted a set of classes, we integrate them and hey, presto! We have part of our system. Easy!...Well, it’s a nice dream! Nontrivial projects that are run in this way have found that they end up delivering a system that does not do what the client requires. Also, classes in these systems are often overly complicated, containing meth- ods and attributes that are never used while missing methods and attrib- ute that are needed. We can produce the most elegant domain object model possible, but if it does not help us to provide the system’s clients with the functionality for which they have asked, we have failed. It would be like building a fantastic office skyscraper but either leaving each floor unfurnished, uncarpeted, and without staff, or furnishing it with orna- mental but impractical furniture and untrained staff.
A Practical Guide to Feature-Driven Development
In the “Process and People” section at the beginning of Chapter 2, we said that a key element in any project is some statement of purpose, problem statement, or list of goals or very high-level requirements de- scribing what the system needs to do. Without this, there is no reason for the project to exist. This is the functionality that the system must provide for the project to be considered a success.
Every popular method or process contains some form of functional decomposition activity that breaks down this high-level statement into more manageable problems. Functional specification documents, use case models and use case descriptions, and user stories and features all represent functional requirements, and each representation has its own advantages and disadvantages.
Traditionally, we have taken the statement of purpose and broken it down into a number of smaller problems and defined a set of subsys- tems (or modules) to solve those smaller problems. Then, for each sub- system, we have broken its problem into a hierarchical list of functional requirements. When we have requirements granular enough that we know how to design and implement each of them, we can stop decom- posing the problem. We then start designing and implementing each of our functional requirements. The project is driven and tracked by func- tion; sets of functional requirements are given to developers to imple- ment, and their progress is measured.
A major problem is that the functional requirements tend to mix user interface, data storage, and network communication functions with business functions. The result is that developers often spend large amounts of time working on the technical features at the expense of the business features. A project that delivers a system with the greatest per- sistence mechanism but no business features is a failure.
A good solution to this problem is to restrict our lists of functional requirements to those of value to a user or client and to ensure that re- quirements are phrased in language that the user or client can under- stand. We call these client-valued functions , or features. Once the features for a system have been identified, they are used to drive and track develop- ment in FDD. Delivering a piece of infrastructure may be important— even critical—to the project but it is of no significance to the client be- cause it has no intrinsic business value. Showing progress in terms of features completed is something that the client can understand and as- sign value to. Clients can also prioritize features in terms of significance to the business.
Interestingly, Extreme Programming records functional requirements as user stories on index cards. In Extreme Programming Explained , a user story was described as “a name and a short paragraph describing the pur- pose of the story ” [Beck 00]. A year later, in Planning Extreme Programming Explained, a user story is “nothing more than an agreement that the cus- tomer and developers will talk together about a feature,” and a user story is “a chunk of functionality that is of value to the customer” [Beck 01].
Feature-Driven Development— Practices
work with someone who knows what they are doing or at least to buy a book such as Advanced Use Case Modeling [Miller] and agree as a team to follow it.
Mac: So how do we avoid exactly the same problems with features? You’ve defined them as client-valued functions but there must be more to it than that, surely.
Steve: Yes...
The term feature in FDD is very specific. A feature is a small, client- valued function expressed in the form:
with the appropriate prepositions between the action, result, and object.
They are small enough to be implemented within two weeks. Two weeks is the upper limit. Most features are small enough to be imple- mented in a few hours or days. However, features are more than just ac- cessor methods that simply return or set the value of an attribute. Any function that is too complex to be implemented within two weeks is fur- ther decomposed into smaller functions until each sub-problem is small enough to be called a feature. Specifying the level of granularity helps to avoid one of the problems frequently associated with use cases. Keeping features small also means clients see measurable progress on a frequent basis. This improves their confidence in the project and enables them to give valuable feedback early.
In a business system, a feature maps to a step in some activity within a business process. In other systems, a feature equates to some step or option within a task being performed by a user.
Examples of features are:
As mentioned earlier, features are expressed in the form
Feature-Driven Development— Practices
The use of a natural language, such as English, means that the tech- nique is far from foolproof. However, after a little practice, it becomes a powerful source of clues to use in discovering or verifying operations and classes.
Mac: So if I use the template to name my use cases and keep them to the two-week im- plementation limit, I would have the benefits of features and use cases? Use cases usu- ally have preconditions, postconditions, and a description of what needs to happen. I could leave these empty to start with and fill them as development proceeds. That would avoid the analysis paralysis you warn of. Steve: I suppose you could. I’m not sure what it buys you. One problem you might encounter by calling your features use cases is that you are going to confuse others who associate a different level of granularity, format, and application with the name use case_. Another problem is that, although nearly every expert I have spoken to recently advo- cates writing use cases in parallel with building a domain object model, most people still try to write them before doing any modeling or prototyping. In fact, many people advo- cate using use cases or functional requirements to drive the building of a domain object model._ Mac: Yes, I know, and I have seen the results many times! Function-heavy classes con- stantly accessing data-heavy classes, high coupling, low cohesion, and poor encapsula- tion. Yuck! I definitely prefer building the object model with Domain Experts first or at the same time as writing use cases. The functional decomposition and object-oriented decomposition are orthogonal approaches. Doing both helps to ensure that we deliver the function required within a structure that is robust and extensible.
Class (code) ownership in a development process denotes who (per- son or role) is ultimately responsible for the contents of a class (piece of code). There are two general schools of thought on the subject of code ownership. One view is that of individual ownership, where distinct pieces or groupings of code are assigned to a single owner. Every cur- rently popular object-oriented programming language uses the concept of a class to provide encapsulation; each class defines a single concept or type of entity. Therefore, it makes sense to make classes the smallest
A Practical Guide to Feature-Driven Development
At the opposite end of the code ownership spectrum is the view pro- moted by Extreme Programming proponents, among others. In this world, all the developers in the team are responsible for all of the code. In other words, the team has collective ownership of the source code. Collective ownership solves the problem of having to wait for some- one else to modify code and can ease the risk of someone leaving be- cause, at least in a small system, more than one person has worked on the code. The main issue with collective ownership, however, is that in prac- tice, it can quickly degenerate into nonownership or an ownership dic- tated by few dominant individuals on the team. Either nobody ends up being responsible for anything in the system or the dominant few try to do all the work because, in their opinion, they are the only competent members of the team. If nobody takes responsibility for ensuring the quality of a piece of code, it is highly unlikely that the resulting code will be of high quality. If a few dominant developers try to do everything, they may start off well but will soon find themselves overloaded and suffering from burnout. Obviously, teams that encounter these problems struggle to continue to deliver frequent, tangible, working results.
Mac: Hey, Steve. It appears that there is a swelling of opinion in the industry that says any team member should be allowed to change any piece of code. Many of our develop- ers seem to like this idea, but FDD promotes individual class ownership. Is collective ownership an option? Steve: Supporters of collective ownership claim that it works when combined with other complementary practices (see [Beck]):
- Pair programming —two developers working together at one personal computer or terminal to reduce the likelihood of introducing errors into the code and to shorten the time it takes a developer to learn and understand the system. - Extensive unit testing to verify that new code functions as required and that refactored or updated code still functions as required. - Coding standards compliance to improve the readability of code and to minimize errors due to misunderstanding of existing code. - Continual integration of changes into the code base to reduce the likeli- hood that multiple programmer pairs need to access the same piece of code at the same time. However, if we assume collective ownership, look at what could happen as developers work on features. For any given feature, the developer (or pair of developers) can add or modify operations and attributes of the classes that participate in the feature. A differ- ent pair, working on a different feature, can add or modify another operation in some of those same classes (Figure 3–2). In a large team, each method of a class could theoret- ically end up being written by a different developer. Mac: My alarm bells are ringing at this point! With small classes and small teams, we might get away with this but on larger, more significant classes with a larger team,
A Practical Guide to Feature-Driven Development
consistency and conceptual integrity, not to mention robustness, could become a major problem.
Steve: Exactly! The more minds working on a piece of work over time, the harder it is to maintain the conceptual integrity of that work [Brooks]. I believe the chances of the class evolving a consistent, elegant, efficient set of methods are greatly reduced if anyone and everyone can write a piece of it. I also think the need for rework and refactoring is going to be greatly increased.
Also, to modify a class correctly, the modifiers have to understand how its internals work. This can take time if those developers have not seen the class before or have not worked with it for a while. This is obviously going to take longer than if someone famil- iar with the code did the modification.
Mac: It sounds like individual class ownership is more likely to scale to our size of project and team. However, I can see that, in some cases within a project, collective own- ership of parts of the model could be advantageous. Can we use combinations of indi- vidual and collective ownership and still call it FDD? Does FDD allow me to tailor the class ownership practice to the needs and structure of my team and organization?
Steve: You’re not going to get arrested by the thought police, if that’s what you mean. Also, let’s not get hung up over a name of a process. We need to do what works for us and our organization. Having said that, I think as we cover the other practices in FDD, you’ll find less and less of a reason to need collective ownership. The only areas where I personally might consider collective ownership is when building proof of concept proto- types for the technical architecture and user interface. When it comes to production code, I want to know that there is a single responsible person I can go to when there are issues with a particular class.
Feature-Driven Development— Practices
Sender
Object ClassA
Object ClassB
Object ClassC
Object ClassD
2.1.1: OperationD
1.1.1: operationD
2.2: operationA
2.1: OperationC
1.2: OperationA
1.1: operationC
2: feature
1: feature
Figure 3– Features adding and enhancing operations in the same classes.
[Astels] and anyway, we know that collective ownership does not scale easily.
4. We can change the team memberships whenever this situa- tion occurs so that a team leader always has the Class Owners he or she needs to build a feature. This is the only realistic option that will allow us both to develop by feature and to have Class Owners.
Actually, there is nothing that requires us to stick to a statically de- fined team structure. We can change to a more dynamic model. If we allow team leaders to form a new team for each feature they start to de- velop, they can pick the Class Owners they need for that feature. Once the feature is fully developed, the team is disbanded, and the team leader picks the Class Owners needed to form the team for the next fea- ture. This can be repeated indefinitely until all the features required are developed.
This is a form of dynamic matrix management. Team leaders owning features pick developers based on their expertise (in this case, class own- ership) to work in the feature team developing those features involving their classes (Figure 3–3).
Feature-Driven Development— Practices
Feature teams are formed from class owners as needed.
Figure 3– Feature teams.
Mac: So are feature teams new? I remember that Harlan Mills suggested the idea of Chief Programmer teams back in 1971 [Brooks]. His idea is based on surgical teams, where a surgeon is supported by a number of talented and qualified people, each performing a specific role. In a Chief Programmer team, developers each have their own specific responsibility and support a lead developer.
Steve: Feature teams are similar but differ in two important aspects:
- The team leader acts as more of a coach for the team than some superpro- _grammer in charge of a bunch of junior or trainee programmers.
Every member of a feature team is responsible for playing their part in the success of the team. However, feature team leaders, as all good coaches know, are ultimately re-
sponsible for producing results. They own the features, and they are accountable for their successful delivery. Playing this team leader role well normally requires both abil- ity and experience, so we call our feature team leaders Chief Programmers in recog- nition of this and Mills’ [Brooks] work. Mac: Steve, this sounds incredibly flexible and may be the answer to a lot of the prob- lems we have experienced in the past on our software projects, but what happens when a Chief Programmer guesses incorrectly about which classes are involved in the develop- ment of a feature? For example: What if a Chief Programmer thought three classes were needed to implement a given feature, and it turns out that two more are involved? Steve: Easy! All the Chief Programmer needs to do is contact the appropriate Class Owner if they are not already in the team, verify their availability to work on the fea- ture, and include them on the feature team. The Chief Programmer may have to dis- cuss the availability of the extra developers with other Chief Programmers, if those developers are heavily loaded. Mac: What happens if the Class Owners are working in too many teams and cannot take on another feature team for a few days? Does the feature team block? Steve: Well, that feature team may block. However, remember that each Chief Pro- grammer has this inbox of features assigned to him or her. If the Class Owners are not available to develop one feature, the Chief Programmer can pick a different feature to develop next, instead. Mac: Even more flexible! I like this idea a lot! I guess, though, that there are some re- strictions about which features a Chief Programmer can develop next. Steve: Yes, there will be some dependencies between features to watch for, and some features will be higher priority than others and will need to be developed sooner rather than later, but that is about it. Mac: Is there anything else interesting about feature teams? Steve: A couple more points...
Some things to note about feature teams:
A Practical Guide to Feature-Driven Development
IBM’s 500,000-line Orbit project used 11 levels of inspections. It was deliv- ered early and had only about 1% of the errors that would normally be ex- pected. T. Gilb [Gilb 88]
The average defect detection rate is only 24% for unit testing, 35% for func- tion testing, and 45% for integration testing. In contrast, the average effec- tiveness of design and code inspections is 55 and 60% respectively. C.L. Jones [Jones]
One client found that each downstream software error cost on average 5 hours. Others have found 9 hours (Thorn EMI, Reeve), 20 to 82 hours (IBM, Remus), and 30 hours (Shell) to fix downstream. This is compared to the cost of only one hour to find and fix using inspection. T. Gilb and D. Graham [Gilb 93]
Need we say more? Actually, there is a little more to say. The primary purpose of inspec- tions is the detection of defects. When done well, there are also two very helpful secondary benefits of inspections:
1. Knowledge transfer. Inspections are a means to disseminate development culture and experience. By examining the code of experienced, knowledgeable developers and having them walk through their code, explaining the techniques they use, less experienced developers rapidly learn better coding prac- tices. 2. Standards conformance. Once developers know that their code will not pass code inspection unless it conforms to the agreed design and coding standards, they are much more likely to conform.
Even though coding standards can be written (presumably by experienced developers) and distributed, they will not be followed (or maybe not even read) without the sort of encouragement provided by inspections. Steve McConnell [McConnell 98]
We can make inspections even more useful by collecting various metrics and using them to improve our processes and techniques. For in- stance, as metrics on the type and number of defects found are captured and examined, common problem areas will be revealed. Once these problem areas are known, this can be fed back to the developers, and the development process can be tweaked to reduce the problem. Of course, the catch is that little qualifying phrase that we have used a couple of times in the last few paragraphs—“when done well.” Chap-
A Practical Guide to Feature-Driven Development
ter 10, section titled “Verification: Design Inspection , ” and Chapter 11, section titled “Conduct a Code Inspection,” provide hints and tips for achieving exactly this. We make a couple more general points here.
Inspections have to be done in a way that removes the fear of embar- rassment or humiliation from the developer whose work is being in- spected. Few developers like to be told that something they have sweated over for hours is wrong or could have been done better. Setting the inspection culture is key. Everyone needs to see inspections primarily as a great debugging tool and secondly as a great opportunity to learn from each other. Developers also need to understand that inspections are not a personal performance review[McConnell 93].
Inspections complement the small team and Chief Programmer– oriented structure of FDD beautifully. The mix of feature teams and in- spections adds a new dimension. An entire feature team is on the hot seat, not just one individual. This removes much of the intensity and fear from the situation. The Chief Programmer controls the level of formality of each inspection, depending on the complexity and impact of the fea- tures being developed. Where design and code have no impact outside the feature team, an inspection will usually involve only the feature team members inspecting each other’s work. Where there is significant impact, the Chief Programmer pulls in other Chief Programmers and developers both to verify the design and code and to communicate the impact of that design and code.
At regular intervals, we take all of the source code for the features that we have completed and the libraries and components on which it depends, and we build the complete system.
Some teams build weekly, others daily, and still others continuously. It really depends on the size of the project and the time it takes to build the system. If a system takes eight hours to build, a daily build is proba- bly more than frequent enough.
A regular build helps to highlight integration errors early. This is es- pecially true if the tests built by the feature teams to test individual fea- tures can be grouped together and run against the completed build to smoke out any inconsistencies that have managed to find their way into the build.
A regular build also ensures that there is always an up-to-date sys- tem that can be demonstrated to the client, even if that system does only a few simple tasks from a command line interface. Developing by feature, of course, also means that those simple tasks are of discernible value to the client. Feature-Driven Development— Practices
Any artifact that is used and maintained during the development of the system is a candidate for version control. Even contract documents with clients of the system that document the legal agreement for what is being built are candidates for versioning. The version of the process you are using and any changes and adjustments that may be made during the construction and maintenance of the system may need to be versioned and variances documented and signed by Project Managers or Chief Pro- grammers. This is especially true for systems that fall under regulation of such governmental bodies as the U.S. Food and Drug Administration.
Closely related to project control is the concept of “visibility,” which refers to the ability to determine a project’s true status....If the project team can’t answer such questions, it doesn’t have enough visibility to control its project.
The working software is a more accurate status report than any paper report could ever be. Steve McConnell [McConnell 98]
It is far easier to steer a vehicle in the right direction if we can see precisely where we are and how fast we are moving. Knowing clearly where we are trying to go also helps enormously.
A similar situation exists for the managers and team leaders of a software project. Having an accurate picture of the current status of a project and knowing how quickly the development team is adding new functionality and the overall desired outcome provides team leads or managers with the information they need to steer a project correctly.
FDD is particularly strong in this area. FDD provides a simple, low- overhead method of collecting accurate and reliable status information and suggests a number of straightforward, intuitive report formats for re- porting progress to all roles within and outside a project.
Chapter 5, “Progress,” is dedicated to the subject of tracking and re- porting progress on an FDD project, so we postpone any further discus- sion on the subject until then.
FDD blends a number of industry-recognized best practices into a cohe- sive whole. The best practices used in FDD are:
In the next chapter, we look at exactly how these practices blend to- gether to form the five FDD processes.
A Practical Guide to Feature-Driven Development