Introduction to Ballparker

Ballparker is a tool for structuring and creating ballpark estimates.

An “estimate” is just a recursive structure of Task objects, for which there is an embedded domain-specific language available in this package: see ballparker.dsl. The main export/viewing functionality is a configurable conversion to Markdown: see as_markdown().

Ballpark Process

Start with just a project() with a list of strings, one for each main high-level task. The project() call creates a top-level “task” in the Ballparker model.

Share this out (as source and/or Markdown, depending on audience) and get feedback.

Then, assign each one a “t-shirt size”: XS, S, M, L, or XL. With Ballparker, you do this by turning each string into a (string, size) tuple. Any tasks that are not given a size are considered UNKNOWN and can be handled by all functionality, including adding “uncertainty” (in the form of an inequality) to parent task point estimates.

Share this out and get feedback.

Then, subdivide (at least) any tasks that are L or XL. In Ballparker’s DSL, you replace them with a grouping() (that is, grouping("task description", ...)) with the sub-tasks enumerated. Ballparker will automatically sum up the story points of sub-tasks.

Any uncertainty (leaf tasks with no size mentioned) will be maintained as the sizes are summed, by reporting the parent’s size as “>” the known size.

Ballpark Template

This is available in the Ballparker source tree as ballpark_template.py, or may be downloaded here: ../ballpark_template.py.

# SPDX-License-Identifier: CC0-1.0
# SPDX-FileCopyrightText: 2020 Collabora, Ltd. and the Ballparker contributors
#
# To the extent possible under law, the person who associated CC0 with this work
# has waived all copyright and related or neighboring rights to this work. This
# work is published from: United States.

from ballparker.dsl import *

ESTIMATE = project(
    # List your main high-level tasks here
)

if __name__ == "__main__":
    # This will print a Markdown-formatted version of your ballpark,
    # useful for internal discussion.
    print(ESTIMATE.as_markdown(size_first=True, tshirt_sizes=True))

    # This will print a less detailed, story-point-centric Markdown-formatted version
    # of your ballpark for customers.
    print(ESTIMATE.as_markdown(tshirt_sizes=False,
                               size_first=True,
                               size_levels=2))

    # This will print your estimate as formatted in the Ballparker :mod:`~ballparker.dsl`
    # domain-specific language: you can use this for formatting or for updating your source
    # after programmatic manipulation
    print(ESTIMATE.to_dsl())

    # This will write a Markdown-formatted file with your estimate,
    # as well as show it to screen (standard output) and show an overall duration.
    process_estimate(ESTIMATE)

    # IMPORTANT: Do not forget to add project management overhead (often a fixed percentage) to the estimates
    # developed using Ballparker!