CSCI 265 notes:

Project planning notes

Small project planning and organization

There are two common approaches to small projects:

In the first case, there is an exact goal for the software capabilities, and we work on the software until that target is met.

In the second case, we have a set of goals and qualities, but a fixed time frame. We attain as many of the goals and as high quality as possible in the allotted time.

A rough breakdown of the time spent on small projects is likely to look something like this:

Throughout the course we will be studying ways to effectively identify and record product requirements, carry out design and implementation, conduct appropriate verification and validation, and adequately plan and document software.

Many of the techniques discussed will be "overkill" for small projects. In this opening section, we will discuss some of the common design ideas that should be followed even on the smallest of programs.

Hopefully the reader can extract other appropriate ideas from the balance of the notes. One of the key requirements in software engineering is the ability to judge what is appropriate and effective for the task at hand, and this is particularly true for small individual projects - where what is "appropriate and effective" depends very much upon the skills, abilities, and traits of the individual.

Perhaps the most important rule of thumb is to write down everything. Keep a written record of

It is probably also worth keeping multiple versions of the source code: often you will introduce bugs or other problems into the code, and having a copy of a previous version to back up to can save a great deal of time and effort "rediscovering" the right way to do things.


Project metrics, planning, and estimation

Planning software development projects often involves finding answers to questions such as: Or, for planning a specific project, the questions might look like:
  • How much effort is required to complete activity x?
  • How much calendar time is required to complete activity x?
  • How much can we compress the schedule by adding more staff?
  • What is the total cost of activity x?
  • What are the hardware and software costs of a project? (i.e. for the tools you need during development)
  • What are the travel and training costs of a project?
  • What are the overhead costs? (including development and support staff salary, pension plans, health insurance, heating, lighting, office space costs, etc etc)

    In this section there are three main topics we'll consider:

    Measuring software projects

    When describing progress to upper management or to clients, or when trying to decide how effective your chosen software development process is, it is usually desirable to have some facts on which to base your analysis.

    In this section we look at some of the information you can gather about a project, specifically

    Each of these topics is considered in more detail below.

    WHATEVER YOU ARE MEASURING, BE SURE YOU HAVE A SOUND REASON FOR GATHERING THE DATA AND FOR ANALYZING THE DATA ONCE YOU HAVE IT

    Don't force your team to spend hours every week supplying you with all sorts of detailed numbers that you have no real use for.

    A good guideline is that your team members shouldn't need to spend more than 15 minutes a week supplying you with the data you need to monitor the project.

    1. Estimate project elements (cost, schedules, etc) early in a project
    2. Track the actual levels as the project progresses
    3. Refine your estimates and your estimation techniques based on the results you observe

    When you do decide to gather data, make sure it is clearly specified who is to gather/supply the data, when and to whom the data is to be provided, and precisely what data is to be gathered (possibly providing a very clear form to be filled in?)

    Some of the useful metrics include:

    When looking at your development organization as a whole, across multiple projects, here are some typical questions and the data that might help answer them:

    You might find some interesting results: for instance, it might well be the case that coding takes a significantly higher percentage of the project's total measured effort (by hours) than it takes in calendar time, simply because other stages require a higher degree of interaction with other groups (clients etc), and hence encounter delays and conflicts.

    Preparing work schedules

    In preparing work schedules, the manager must choose a life cycle model, populate it with an appropriate set of specific activities, add the training and other support activities necessary for the project, and then consider which activities depend upon which other activities.

    Once the dependencies between activities have been considered, the manager can begin to plan the order in which activities will be carried out, and which activities can be carried out in parallel.

    Estimates are then needed for the resources required by each activity, and the time required for the activity. Once all this information has been formulated, the estimated schedule can be laid out and tentative milestone dates can be established.

    Cost estimation

    There are several common methods for up-front estimation of the cost of a project: We'll consider one of the algorithmic estimation techniques in detail: COCOMO:

    Software design processes

    Typical stages of design:

    1. Problem understanding: look at the problem (as stated in the requirements/specifications) from different angles to discover the design requirements.
    2. Identify one or more solutions: evaluate the possible solutions and choose the most appropriate (appropriateness depends on many factors, including the designer's experience and available resources)
    3. Describe solution abstractions: use graphical, formal or other descriptive notations to describe the components of the design.

    Design quality

    Cohesion

    Coupling

    Understandability

    Adaptability

    Architectural design

    Architectural styles, and attribute-based styles
    An architectural "style" for a software design reflects

    The key assumption: there are small number (say 15-20) of general styles that, in practical experience, describe the majority of successful software designs.

    Here we discuss work at the Software Engineering Institute of CMU - attempts to categorize

    The goal is to have an experience-based (tried and true) set of guidelines that suggest the class of design to use. E.g. (oversimplified) "Use the pipe and filter style when reuse is desired and performance is not a top priority".

    See the SEI website on Attribute-based architecture styles.

    Even ignoring the SEI work, however, the notion of architectural design styles is important for software engineers:

    In any of these cases, the most appropriate software architectural styles are likely to be the same across many of the different specific systems implemented

    Architectural design decisions are generally finalized very early in the design (or even analysis) process, so we need as much help as possible in making those decisions safely.

    Key goal:

    Developing a "handbook" of architectural styles is necessarily an anecdotal exercise: the quality of styles is based on the experience and judgement of the design community

    SEI's attempts are to produce a generic set, for the software community as a whole, similar efforts might be more effective on a domain-specific (or company-specific) basis

    As an example, an SEI ABAS is defined to include the following (see "Attribute-based Architecture Styles", by Klein et al)

    The SEI effort is further attempting to allow prediction and analysis of design effectiveness based on the relevant attributes/parameters

    Quality attribute models and parameters

    As an example we'll consider the information relevant to a performance attribute:

    Performance

    The ABAS approach is very much a work-in-progress, but may well represent the future of early-stage software design

    Design methodology

    The two main forms of design are function-oriented (structural) design and object-oriented design.

    Many large organizations (e.g. see the NASA website) are finding that, in general, systems designed under function-oriented approaches are less reusable and less maintainable than those designed under object-oriented approaches.

    However, function-oriented methods may be more applicable where the product is one-of-a-kind (hence reuse is not a major factor) and is expected to have a relatively short life span (hence long term maintenance is not a major factor)

    Historically the major drawback with object-oriented approaches has been a lack of OO experience on the part of many designers, and a lack of OO support tools.

    Function-oriented design
    Object-oriented design

    Design documentation example

    Just for the sake of example, let's say the sections of the complete design document are as follows: