[…] on any non-trivial project (more than about 1 week of coding or more than one programmer), if you don’t have a spec, you will always spend more time and create lower quality code. ~ Joel Spolsky

A specification is an efficient way to communicate your work with others and ensure that you have consensus on the design before progressing with its implementation.

Expected duration
2 hours per team member
Deadline
2359 on Lessons 11, 22, 31
Points
25 points

Assignment

Each team is responsible for collaborating on a single specification. Completing the specification early in the sprint (e.g., by the conclusion of the first week) is recommended to minimize the amount of rework required if substantial changes are requested. After its initial submission, each specification should be reviewed and (eventually) approved by others on the team, looking for areas of ambiguity, incompleteness, inconsistency, etc. Implicitly this means that 1-2 team members should draft the initial version of the specification and further development of the specification is handled through comments on a pull request. Following this review and any required changes, the specification serves as a “contract” for what will be implemented. Later changes must be approved as part of the requirements management process.

When you write the specification, exhaustive detail is not necessary, but someone else should be able to implement the feature if required.

You must use the provided template for the specification. Add your specification to the repository’s docs/specs directory. The specification should be written using reStructuredText (RST), which is a lightweight markup language for text documents. The file name for your specification should describe your work and use dashes between words. For example, if adding support for single sign-on using OAuth, the file name for your specification might be add-oauth-support.rst, or if refactoring existing back-end code, the file name might be refactor-database-interface.rst.

The specification template is derived from those used by OpenStack. As an open source project, the quality of OpenStack’s specifications varies, but those of the compute service are generally well-written. If struggling to understand what amount of detail to include in the specification, one approach is to review a half-dozen or so OpenStack specifications to get a feel for what is required to manage a large open source project. (Hint: More information is generally better, and although exhaustive detail is neither required nor appropriate, always trend toward including more information whenever in doubt.) A more entertaining resource is Joel Spolsky’s series “Painless Functional Specifications,” which addresses this topic humorously and pragmatically.

Use the template in the project repository for the specification.

Submission

To “submit” your specification, create a pull request in GitHub.

The pull request triggers a review of the specification so that you have feedback and the opportunity to improve the specification, ideally before you complete substantial work on the implementation. Expect to iterate on the specification, using the feedback to improve the initial version – it’s rare for any software engineering artifact to be “right” the first time.

Grading

The specification will be graded at the end of the sprint and is based on its final version (i.e., incorporating all updates from the review process). If the pull request has been merged, then you will earn full credit for the specification. Conversely, a pull request with unaddressed comments will earn a low score because there are remaining opportunities for improvement.

Your goal should be to address the feedback as thoroughly and as quickly as possible to ensure that the specification is approved and earns full credit for this assignment. Take advantage of the iterative review process – the quality bar is high precisely because that’s what expected in real software projects.

Rubric

The following grading rubric will be used for this assignment:

Superb (100%)
Pull request(s) approved / merged
Proficient (90%)
Trivial issues (e.g., formatting and clarification to wording), but no content changes required
Competent (75%)
Minor issue that requires partial revision of one section
Marginal (50%)
Major issue that requires complete revision of one section or multiple minor issues that require partial revision of multiple sections
Unsatisfactory (25%)
Multiple major issues that require complete revision of multiple sections

Resources

Painless Functional Specifications

Project sprints specification overview