This section describes the basic elements of Eagle’s software development process.

Here are a few things that apply to the development process as a whole, which should be kept in mind while reading about each individual element of the process.

  • Principles. Every aspect of Eagle’s development process is subject to fundamental principles and objectives discussed elsewhere. Please remember, while reading this discussion of methodology, that these principles always apply to every project and every stage of development.
  • Project management. Similarly, every step of the process is also subject to our project management discipline, which is an essential part of our overall development methodology.
  • Iterative-ness. Sometimes the development process is referred to as a “spiral”, where the spiral’s circular aspect is the repetition of the steps of the development process and its vertical aspect is progress toward completion of the software application.
  • The iterative approach is a balance between the rigidity of the “waterfall” method (where each step of development must be fully completed before moving to the next step) and the potential lack of discipline of the “evolving prototypes” method (where a prototype is created quickly with minimal design effort, revised based on observed shortcomings, and then the process is repeated until presumably the final desired result is obtained).

  • Descending order of importance. Every step in the development process is more important than the next. Because each step becomes the basis for the next, the earlier you “get it right”, the more time and money you save.
  • At the very start of a project incorrect assumptions, omissions, or insufficient understanding can be corrected at little or no cost. With each completed step, correction becomes geometrically more costly and time-consuming. Many projects have failed because of simple misunderstandings that could have been corrected easily at the start of the project.

  • Rule of necessity. One of the guidelines of the “agile” schools is “do what is necessary, not more, not less.” Because every project is different, it is appropriate to shape the prescribed practices of a methodology to the specific situation at hand.
  • For instance some projects have teams of 1 or 2 people and cost a few thousand dollars; others may have dozens of developers and cost millions. Some are quick-and-dirty temporary applications, others are in-house systems with limited users, while still others are world-class products with thousands of unrelated users. Some are simple GUI and database applications, others are components of sophisticated mission-critical industrial applications which must never fail.

    A description of a methodology is an abstraction. Its application to a specific project should use just those elements of the methodology—no more and no less—that are required by the “rule of necessity” for that project.

  • These are just the highlights. This is not a formal description of a methodology and makes no attempt to be “complete” in any way. The purpose of this section is just to share with you in a general way our view of the software development process.

This is the process of discovering the real needs which the new software must meet. The "need" is already understood at some level, of course, because that’s the force that gets the project started. But to be successful, the real needs must be understood in some detail, and implicit assumptions about these needs must be investigated.

A requirements document usually includes the following kinds of information:

  • Who are the users? What are their roles and responsibilities? What information or functionality must the system provide in support of the users’ fulfilling their responsibilities?
  • What specific usage scenarios (use cases) are envisioned? In support of each scenario what information must be supplied to the software? How does the information and functionality produced by the system relate to each of these scenarios?
  • Is the above related to existing business practices? Are we seeking to streamline or improve existing business practices?
  • Temporarily setting aside all practical issues, what would be the purely “ideal” picture of business practices, usage scenarios, system behavior and outputs you can envision?
  • How much of the “ideal” can be put into practice? What are the approximate ratios of cost and benefit?
  • What specific levels of performance are required?
  • How will the software be maintained after it is completed? Will business conditions dictate frequent changes and enhancements or will the system remain relatively static? Will future responsibility for the system be in-house or contracted out?
  • What types of user support will be needed? Is extensive context-sensitive online help required? Should there be a user manual? What is the expected complexity of user support? Does the system need to provide extensive information about what a user is doing in order for them to be supported?
  • How are cost and benefit to be evaluated? What are the guidelines to be used for exploring the benefits of various elements of the “ideal” in relation to their expected cost?
  • What kinds of extra flexibility or “over-generalization”—not needed now—should be built-in so future enhancements will be more economical?
  • List the specific outputs (reports, screen-based information, exported data, data feeds to other systems) which must be produced.
  • List the specific sources of information need to support the creation of the outputs mentioned above (imports, data feeds from other systems, user-inputs, etc.

Definition of the problem domain is a key early step in the development process. As in every other part of the development process there is ample opportunity for unwarranted assumptions, inconsistent interpretations of terms and concepts, and insufficient detail in descriptions of business entities.

It is especially easy to miss the boat here, because most stakeholders are likely to assume they have a good understanding of the problem domain and feel that developers are strangely thick-headed as they insist on detailed and precise definitions of domain terminology and concepts.

Anyone who has been through this process knows, however, that human communication and manual practices successfully and almost invisibly tolerate inconsistencies and all sorts of “special” circumstances. These subtleties in the problem domain must be seen and understood before one attempts to create software in support of these business practices.

The following elements of the description of the problem domain are maintained throughout the development process. It is especially important, however, to take them as far as possible at the very beginning of a project.

  • Domain vocabulary. This is essentially a glossary of all terms and concepts relevant to the project. All definitions should be precise and complete. They should include a reference to the source(s) of the information and the date on which they information was obtained. Modifications, clarifications, questions and answers should also be separately noted, along with source and date information.
  • This document serves a number of purposes.

    First, the very act of creating precise, agreed-upon definitions brings into the open many subtleties of the problem domain, leading stakeholders and team members to a deeper understanding of both the requirements and the opportunities inherent in the project.

    Second, it creates stability and reliability in project communication. A business vocabulary consists of many interrelated, dependent terms. A common understanding of the nuances of one concept usually has implications for related concepts. Without clear, time-referenced documentation of each term, a dependable understanding of the problem domain will not exist. It’s worth mentioning that stakeholders and team members are often not aware that a common understanding has not been achieved.

    Finally, the domain vocabulary serves as a kind of intellectual contract between stakeholders and developers throughout the entire project. As database entities, the object model, and outputs of the system become more distinct, the domain vocabulary remains a point of reference by which the validity of each system element can be judged.

  • Object model. A side effect of creating the problem domain vocabulary is the ease with which an initial set of business objects can be identified. Our documentation of the object model initially describes these objects at a fairly high level, indicating their purpose and a preliminary list of services which each object will perform. It also shows the relationship of these objects in terms of usage and hierarchy. Later, during the design phase, this document is supplemented with a more detailed description of object properties, behaviors and relationships.
  • Database definition. Closely related to the domain vocabulary and object model is the specification of the database. This document, too, begins at a fairly high level, simply identifying database entities, and their relationship to domain concepts and business objects. As the project unfolds, especially during the external and functional design phases, the database definition becomes extremely precise, with exact definitions for each data element, specification of data types, permitted values and ranges and other constraints, entity relationships, and initial recommendations regarding indexing.

In software development, “risks” are unknowns which could significantly affect the success of a project.

The goal of risk-analysis is to eliminate as many of these unknown factors as early in the development process as possible in order to avoid the waste of time and resources on efforts that are ultimately unsuccessful or ineffective.

By making an explicit effort to evaluate risks early in the project, we can shape the remainder of the project to use technologies, concepts, or tools which have been shown to be appropriate and effective for this project, greatly minimizing the chance of a failed project or one which costs substantially more than originally planned.

The following is a sampling of some of the risks a software project may face. Every project is different, with its own profile of risks—not all of these risks apply to every project.

  • Performance. Minimum performance levels are required for specific functions. Need to know whether those levels can be met.
  • Reliability. The application requires essentially 100% uptime, no runtime errors, and completely accurate outputs. What needs to be in place in order to insure this level of reliability?
  • Fitness for purpose. What is the likelihood that the finished application will not serve the intended purpose? At what points in the project are specific measures needed to guarantee this does not happen?
  • Will users like it? Is there a possibility that users will not like the application and will not want to use it?
  • Will customers buy it? This risk is not primarily the responsibility of the software developer, but it is one the developer should be concerned with. With respect to what the developers and stakeholders know or should know, are we creating a product that customers will buy? Has the requirements analysis phase adequately addressed this question? What are the attributes of the application that will affect the customer’s desire for the product and their decision to buy (and recommend) the product?
  • Will people use it? What are the reasons people may not use the application? What is the ratio of user-effort to user-benefit? How does this affect the requirements and design of the application?
  • Reliability of development tools. Are there any doubts about performance or reliability of the development tools for the project? About the database to be used, or third-party software components? Are any new technologies being used whose reliability is unknown? Are we using any data structures or communication protocols that are new or non-standard and may not be compatible with external resources? If the application is reliant on third-party components, what is our fall-back position if the third-party vendor goes out of business or ends support for the product we are using?
  • Validity of time and cost estimates. What is our level of confidence in time and cost estimates? How much of a buffer does the budget allow for contingencies? To what extent do the time and cost estimates allow for changes of scope during the project? How do we measure the cost-effectiveness threshold in relation to “go / no-go” decisions on the project?
  • Valid closure on requirements. What is our confidence regarding the validity of the application’s requirements document? How do we verify that all stakeholders understand the requirements and agree with them? How do we avoid the problem of stakeholders as a group being wrong about some of the stated requirements? Where are the areas in this project where that might happen?
  • Dependence on peer-systems. Does this application depend on any peer-systems for its operation? For example, does it communicate with any third-party systems via web services? Does it interact with in-house systems whose correct operation is essential to this application? What is a justifiable level of confidence in the correct and timely operation of these peer-systems? Do we have fall-back options if and when these systems fail?
  • Dependence on infrastructure. What are the critical elements of infrastructure—such as networks, servers, switching, desk top computers, storage systems, etc.—that have unknown or unpredictable reliability? Does this application require any of these elements to have an exceptionally high level of reliability? If so, what is our fall-back position, or what can be done to guarantee the required reliability?
  • Functionality of third-party components. Do all third-party hardware or software components required for this application have the required functionality? For example, if a large database is required for the application, and low-latency replication is essential, do we know for a fact that the candidate DBMS actually delivers the functionality and performance levels we expect?
  • Validity of algorithms / heuristics. If the success of this application is dependent on proprietary algorithms or heuristic methods, do we know for a fact that these methods are valid and effective? Do we need to objectively test the validity and effectiveness of these methods before proceeding further into the project?
  • Conformance to corporate standards and procedures. Are there corporate or organization standards which affect the time, cost and/or approach to development of this application? Are there standards regarding development language, design methodologies, documentation standards, approved third-party tools and components, testing methods?

The third prerequisite for design—after requirements analysis and problem domain definition—is to specify the overall architecture of the application. In this phase we are emphasizing structure of the application from the point of view of high-level responsibilities, and the disposition and dependence of these components in relation to each other and to the hardware / software infrastructure.

The form of the architecture specification will vary greatly depending on, among other things, whether the application is large or small, web-based, database intensive, etc.

In any case, a typical architecture document will address the following areas, as appropriate for the application:

  • Physical infrastructure. Description of the network / communications environment in which the application is designed to operate. Specification of security-related issues, including the use of VPN’s, SSL, firewalls.
  • Middleware and servers. Specification of required application servers, web servers, database servers, and related components, and server hardware.
  • Implementation languages / framework. Specifies, for example, whether application is implemented using .NET, Java or other languages, plus related details such as whether EJB’s are used, and how they be deployed.
  • Structure of User-interface, database access. Description of how the application will organize and separate responsibilities for UI, database access, and business logic.
  • General structure of application components. High-level diagram showing the disposition of the main functional components of the application in relationship to hardware and middleware components.
  • Application-specific development policies. Specification of design and implementation policies for this application with respect to such things as scalability, exception-handling, security, multi-user access, fault tolerance, availability, performance, data types, report implementation, use of database triggers, stored procedures, etc.

The goal of external design is to create a description of all elements of the application which interact with users or external systems.

The documentation and UI prototype which constitute this deliverable make it possible for stakeholders to manually “execute” usage scenarios and to confirm for themselves that the design, to this point, is compatible with their requirements and expectations.

The deliverables for external design normally consist of the following:

  • User-interface. Documentation for the entire user interface. This includes menus, all screens and dialogs (or web pages), and any significant warning or error message windows. If the UI is at all complex, a UI navigational diagram is also provided which shows all possible routes through the user-interface and the conditions under which they would be taken.
  • A UI prototype is also created, which allows users to explore the user-interface, seeing exactly how it will look in the finished application. At this point the prototype consists solely of UI; no functionality or database access is enabled.

  • Reports. In business systems, the key importance of reporting is often undervalued. Perhaps we should say: “If this system could endow you with perfect, effortless insight into a specific area of your business, what would you see? What would you know?”
  • That should be the starting point for report design. Yes, of course there are reports in any system that are utilitarian or mandated by legacy procedures. But all reporting, utilitarian or not, should aim to present exactly the needed information, in the simplest, clearest way possible, and should allow the user maximum flexibility in controlling how the information is selected, sorted and organized for physical presentation.

    In other words, all your reports should look great, should be exceptionally informative and easy to understand, and you should be able to easily obtain from the system almost any information ever needed.

  • Data imports / exports. Data imports and exports usually exist for one of two reasons. One, to communicate with other systems, either in-house or controlled by business partners. The other, to create data files you can easily manipulate with office tools such as word processors and spreadsheets.
  • The external specifications should identify each import and export, indicate its purpose, list the information to be exported or imported, and describe user options for selection and sorting.

  • Web services interactions. If the system will interact with other systems via web services, the external design documents should describe the nature of the interaction, including its purpose, functional requests, and information exchange.

Once the external design is accepted by stakeholders, the next step is to specify how functionality is to be implemented and how the external elements and business logic relate to each other, to databases, and to external systems.

Here it is important to remember the “rule of necessity”, and to provide sufficient specification, but not more than is needed. It’s crucial to realize that “sufficient” in this case refers to “which information” is provided, not “how much.”

A good example of this distinction is often seen when designing reports. Many reports provide users with interpretations of data. These interpretations transform “raw” data into meaningful values corresponding to domain terminology. It is essential to specify this transformation with complete precision—not in terms of how it is done, but in terms of what is done. This is “sufficient.” It may also be appropriate to state how the transformation is to occur, but the designer must distinguish between the necessity of “what” and the possible convenience of “how.”

Although implementation strategy can vary considerably depending on whether the project is large or small, is an in-house system or a commercial product, and so on, here are a few key points that apply to all projects.

  • Plan implementation strategy. There’s no formula for the “best” implementation strategy, but here are some factors to consider. It’s usually a good idea to attack difficult tasks and risks first so any impact on cost, duration or architecture can be known as soon as possible. The approach of creating a small, operational version of the application and then building on that will affect the order in which components are implemented. Other obvious factors are the need to assign tasks based on the skills of team members and the need to level resources in order to minimize elapsed implementation time.
  • Create small core application; build on it. Whenever possible, we create a small, operational “core” version of the application, to which additional components can be added as they are completed. By choosing the components for the core application appropriately, we can insure that underlying technologies, architecture, third-party components, development platform and frameworks, middleware, hardware infrastructure, and so on, operate correctly and with expected performance and reliability—and if problems are encountered, we can address them early, minimizing the amount of implemented code that might have to be changed.
  • Unit testing. Each developer is responsible for effective unit-testing of his/her components and for initial integrated testing of the component when it is added to the running core application.

The function of the QA specialist is to insure that the gradually developing application satisfies the original project requirements in terms of functionality, reliability, performance. On the basis of the system design specifications, the specialist creates test plans which will reveal any failure to meet requirements.

Copyright (c) 2005 by Eagle Research, Inc.
"Software for the Internet age" is a registered trademark of Eagle Research, Inc.

Home    |    About Eagle    |    Services    |    Experience    |    Methodology    |    Something Different    |    Site Map    |   Contact Us