Implementation and Testing

Prioritizing feature implementation

This is a difficult planning problem

Fixing an onion building process

For the course projects we take the following simple approach

Design vs implement

Question: keep refining the design, or start coding?

Here are some rough guides on whether the design is far enough along:

Note that prototyping can happen as the design is still being refined.

Iteration / Release Planning

Software iterations and releases

An iteration of a project is a planned global step in the development of a piece of software.

Releases

A release is a stable iteration released to some users.

Terminology (there is no common standard for naming releases, just common patterns):

  1. Alpha release, e.g. 3.1alpha: Some features of eventual version 3.1 haven't been implemented yet and there are quite a few bugs. More for in-house testing.
  2. Beta release: the feature set is frozen and all features more or less work, but there are still bugs. Outside advanced users can use it.
  3. Pre-release: a generic term for alpha or beta
  4. Unstable release: any release with less testing; similar to alpha
  5. Release candidate (RC): better than beta; on deck for shipment, infintesimal bugs only
  6. RTM (release to marketing) and GA (general availability): an "official" product release for customers
  7. Version number less than 1: an application that has yet to get beyond alpha/beta/pre in any release.

Iteration Planning

Iteration plans

For iterations 3-6 of your projects you will need to supply an iteration plan. See Iteration 3 for the specific requirements. The previous project examples show some example iteration plans.

Implementation Principles

Here are some random good principles for implementation, many of which are from the XP and Agile schools of thought.

Practice Collective Code Ownership

Continuous Integration

Build the whole system on a regular basis, don't work in a sandbox for long

Have a coding standard

This is a standard intro programming topic you probably know well.

See the Information page Style section for guidelines for this course; here are a couple more:

Pair Programming

Pair programming is two people programming on one terminal.

Is it good? Bad? Ugly?

Refactoring

Refactoring is an independent future lecture topic. At the root its very simple: sometimes its better to stop adding features and instead redo existing code to be more elegant and more aligned to they way you (now) see you are going.

Testing

Testing is a major component of commercial software development.

Testing Hierarchies

We use the simple XP testing hierarchy

Unit Testing

Write small tests for each nontrivial operation

Unit testing in Java with JUnit

Test Coverage

Degrees of importance of thorough testing

The degree of commitment varies by the size, complexity, and need for correctness of the project. Here are some points on the spectrum.

Acceptance testing

Things that are harder to test automatically

You need to work harder to get some features automatically tested.