Design Doc

HTCondor Design Documents

If your change is an enhancement (new feature) or large bug fix, you will need to author and attach a design document to the ticket page for architecture review and get it approved before code contributions will be accepted. It is typical for a design document to go through several revisions. Although they are generally pithy and to the point (2 or 3 pages is typical), the generation and review of a well thought-out design document can be a time-consuming undertaking. But we feel it is necessary to ensure the architectural integrity and correctness of the code base, and ultimately the time spent writing a design document is time well-spent.

Two to four pages is typical, but could be more or less depending on the situation.

As of July, 2013, new design documents should be Google Drive documents to ensure they are self-contained, have revision tracking, and reduce the risk of version skew. See GoogleDriveWisdom for details on usage.

Older design documents are .docx files (either Microsoft Word or Open Office/Libre Office) to ensure they are self-contained and to leverage revision tracking as they are passed around for review and refinement.

Outline of a Design Document

A design document has three major sections; each is outlined below. While you can assume that the reader is familiar with pre-existing design and implementation of the code, this is not an email or wiki post - the document itself should be self-contained and able to "make sense" on its own. This is part of the reason we require a separate document outside of the ticket itself. A developer five years from now, who was not involved in a recent string of email discussions or lacks access to pages of ticket remarks, should be able to read the document on its own and gain insight and understanding.

Section One - Overview

Start out by providing information about the motivation - what is the problem, why is it important to solve the problem, what is the general approach? What insights led us to the problem, what new understanding is characterized in how we will solve it? Try to identify the requirements of the new enhancement, and how were these requirements gathered/identified? If the problem is related to a specific usage scenario or environment, include as salient details about the motivating scenario/environment. Try to keep the implementation details to a bare minimum when answering these questions. Instead, think about what the reader will have learned after reading your overview about the problem itself and the tradeoffs involved in finding a solution.

Section Two - Architecture of Proposed Solution

The body of the document will describe the general architecture of the proposed solution : What components are involved? What is the responsibility of each component? How will the components interact? What will the final result look like to the end-user? It is good to talk about some implementation details here, especially if it enables deeper understanding by an informed reader (i.e. "communication will occur via a daemonCore command socket" tells a lot to a reader familiar with this class). Think about fault tolerance, verification, maintainability, ease of use, ease of implementation, backwards-compatibility, code/component re-use.

Section Three - Development Plan

At the end of the document should be a list of development Milestones in chronological order. Each milestone should include a best-guess effort estimate; resolution of each milestone should be on the order of 1 to 10 days. If specialized knowledge is required and/or it is not clear that a specific individual(s) will perform the work, you are encouraged to explicitly list that and/or give multiple effort estimates (e.g. "3 days for someone familiar with DAGMan internals such as Kent or Nathan, or 9 days for a different member of the HTCondor core development team, or 20 days for someone unfamiliar with the code-base").

Examples

To help you get a feel for the sort of scope we are looking for, here are a few design document examples: