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!