Best Practices | commercially proven approaches to software development
Software development best practices

Software development best practices are proven methods for developing software in a commercial environment, and are used throughout the industry by successful organizations.

Manage software requirements

Software requirements are dynamic entities; they will change throughout the life of a software project. Defining requirements is a continuous process and it is unrealistic to expect to completely define all the requirements at the start of a project. Indeed, as a system is developed, the understanding of the requirements will change.

An active approach to managing software requirements involves the continuing elicitation, organization, prioritization, and documentation of the required functionality and constraints. Discipline can be aided by suitable tool support, effectively providing a version-controlled repository that stores all documents centrally, and records an audit trail of all changes and trade-offs.

Visually model software

Software modeling helps break down the complexity of a large system into smaller sub-systems or modules that are easier to understand, and the models produced unambiguously capture software design, revealing inconsistencies more readily, e.g. poor abstraction or brittle architectures. Using the UML (Unified modeling Language) enables the structure and behavior of a system's architecture to be visualized and specified, and provides a common medium for the unambiguous communication of designs across a multi-disciplined team.

Tools facilitate the management of models, helping to control complexity, and maintaining consistency among the system's artifacts.

Use component-based architectures

Software architecture is concerned with the characteristics of structure, behavior, extensibility, performance, and resilience given economic and technology constraints. Component-based design enables the continuous evolution of a system's architecture, with modularity providing a clear separation of functionality, and extensibility and re-use facilitated by leveraging standard frameworks and commercially available component libraries.

The architecture reflects the organization of a software system in terms of its structural elements and the interfaces through which their behavior is exhibited. Using these elements as building blocks, progressively larger sub-systems can be constructed, where the components collaborate to provide a particular service or defined functionality.

Develop software iteratively

Iterative development and incremental development both involve continuous discovery, creation, and implementation of software in a predictable and repeatable fashion. Agile software development enables risks to be identified early, and also facilitates the early detection of inconsistencies among software requirements, designs, and implementations. The work, divided into iterations, focuses effort on the critical and most valuable pieces of functionality, and evenly distributes testing across the entire lifecycle. Each iteration is effectively a packaged release; this encourages rapid feedback and delivers regular concrete evidence of progress. As lessons are learned during one iteration, they can be leveraged in the next, continually improving the process.

Continuously verify software quality

Verifying (and validating) a system's functional and non-functional characteristics involves creating an extensive collection of test cases and scripts, where each combination targets the specific behavior of a piece of functionality in a defined scenario. Testing should begin with the areas of highest risk and then descend to provide a suitable level of coverage. A program of functional and non-functional testing performed at multiple levels, within and around the software development iterations, can continuously and quantitatively assess the quality of an implementation. This approach helps expose inconsistencies in requirements, designs and implementations, and helps to identify defects early.

Tools providing test automation are ideal for repetitive functional tests and non-functional testing such as performance and load testing. Using these tools to schedule tests to run overnight, at the end of development integration periods, provides regular feedback and makes maximum use of the time available.

Control changes to software

Repeatable, lightweight processes are essential for efficiently managing changes to software across iterations. As a tested baseline of software, an iteration should maintain full traceability among its elements, so that propagation of change is controlled, and co-ordination of change can be extended to multiple and parallel releases of software. Effective change control enables a better allocation of resources based on the priorities and risks, and documented change requests facilitate clear communications regarding the change.

Back to top ^^

This page is valid XHTML 1.0 This page uses valid CSS

Best Practices | Agile Methods

Methodologies | Project Management | Analysis & modeling | Development | Testing | Quality Assurance

Home | Services | Contact Us