summaryrefslogtreecommitdiff
path: root/.html/dev/trackers-from-first-principles.html
diff options
context:
space:
mode:
Diffstat (limited to '.html/dev/trackers-from-first-principles.html')
-rw-r--r--.html/dev/trackers-from-first-principles.html297
1 files changed, 0 insertions, 297 deletions
diff --git a/.html/dev/trackers-from-first-principles.html b/.html/dev/trackers-from-first-principles.html
deleted file mode 100644
index 13ddac4..0000000
--- a/.html/dev/trackers-from-first-principles.html
+++ /dev/null
@@ -1,297 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>
- The Codex »
- Bugs, Tasks, and Tickets from First Principles
- </title>
-
- <link
- rel='stylesheet'
- type='text/css'
- href='http://fonts.googleapis.com/css?family=Buenard:400,700&amp;subset=latin,latin-ext'>
- <link
- rel="stylesheet"
- type="text/css"
- href="../media/css/reset.css">
- <link
- rel="stylesheet"
- type="text/css"
- href="../media/css/grimoire.css">
-</head>
-<body>
-
-<div id="shell">
-
- <ol id="breadcrumbs">
-
- <li class="crumb-0 not-last">
-
- <a href="../">index</a>
-
- </li>
-
- <li class="crumb-1 not-last">
-
- <a href="./">dev</a>
-
- </li>
-
- <li class="crumb-2 last">
-
- trackers-from-first-principles
-
- </li>
-
- </ol>
-
-
-
- <div id="article">
- <h1 id="bugs-tasks-and-tickets-from-first-principles">Bugs, Tasks, and Tickets from First Principles</h1>
-<p>Why do we track tasks?</p>
-<ul>
-<li>To communicate about what should, will, has, and will not be done.<ul>
-<li>Consequently, to either build consensus on what to do next or to dictate
- it.</li>
-</ul>
-</li>
-<li>To measure and communicate progress.</li>
-<li>To preserve information for future use.<ul>
-<li>Otherwise we'd just remember it in our heads.</li>
-<li>Wishlist tasks are not a bad thing!</li>
-</ul>
-</li>
-</ul>
-<p>Bugs/defects are a kind of task but not the only kind. Most teams have a “bug
-tracker” that contains a lot more than bugs. Let's not let bugs dictate the
-system.</p>
-<ul>
-<li>Therefore, “steps to reproduce” should not be a required datum.</li>
-</ul>
-<p>Bugs are an <em>important</em> kind of task.</p>
-<p>Tasks can be related to software development artifacts: commits, versions,
-builds, releases.</p>
-<ul>
-<li>A task may only be complete as of certain commits/releases/builds.</li>
-<li>A task may only be valid after (or before) certain commits/releases/builds.</li>
-</ul>
-<p>Communication loosely implies publishing. Tracking doesn't, but may rely on
-the publishing of other facts.</p>
-<h2 id="core-data">Core Data</h2>
-<p>Tasks are only useful if they're actionable. To be actionable, they must be
-understood. Understanding requires communication and documentation.</p>
-<ul>
-<li>A protocol-agnostic <em>name</em>, for easily identifying a task in related
- conversations.<ul>
-<li>These names need to be <em>short</em> since they're used conversationally. Long
- issue names will be shortened by convention whether the tracker supports
- it or not.</li>
-</ul>
-</li>
-<li>An actionable <em>description</em> of the task.<ul>
-<li>Frequently, a short <em>summary</em> of the task, to ease bulk task
- manipulation. Think of the difference between an email subject and an
- email body.</li>
-</ul>
-</li>
-<li>A <em>discussion</em>, consisting of <em>remarks</em> or <em>comments</em>, to track the evolving
- understanding alongside the task.</li>
-</ul>
-<p>See <a href="#speciation">speciation</a>, below.</p>
-<h2 id="responsibility-and-ownership">Responsibility and Ownership</h2>
-<p>Regardless of whether your team operates with a top-down, command-oriented
-management structure or with a more self-directed and anarchistic process, for
-every task, there is notionally one person currently responsible for ensuring
-that the task is completed.</p>
-<p>That relationship can change over time; how it does so is probably
-team-specific.</p>
-<p>There may be other people <em>involved</em> in a task that are not <em>responsible</em> for
-a task, in a number of roles. Just because I developed the code for a feature
-does not mean I am necessarily responsible for the feature any more, but it
-might be useful to have a “developed by” list for the feature's task.</p>
-<p>Ways of identifying people:</p>
-<ul>
-<li>Natural-language names (“Gianna Grady”)</li>
-<li>Email addresses</li>
-<li>Login names</li>
-<li>Distinguished names in some directory</li>
-<li>URLs</li>
-</ul>
-<p>Task responsibility relationships reflect real-world responsibility, and help
-communicate it, but do not normally define it.</p>
-<h2 id="workflow">Workflow</h2>
-<p>“Workflow” describes both the implications of the states a task can be in and
-the implications of the transitions between states. Most task trackers are, at
-their core, workflow engines of varying sophistication.</p>
-<p>Why:</p>
-<ul>
-<li>Improve shared understanding of how tracked tasks are performed.</li>
-<li>Provide clear hand-off points when responsibility shifts.</li>
-<li>Provide insight into which tasks need what kinds of attention.</li>
-<li>Integration points for other behaviour.</li>
-</ul>
-<p>States are implicitly time-bounded, and joined to their predecessor and
-successor states by transitions.</p>
-<p>Task state is decoupled from the real world: the task in a tracker is not the
-work it describes.</p>
-<p>Elemental states:</p>
-<ul>
-<li>“Open”: in this state, the task has not yet been completed. Work may or may
- not be ongoing.</li>
-<li>“Completed”: in this state, all work on a task has been completed.</li>
-<li>“Abandoned”: in this state, no further work on a task will be performed, but
- the task has not been completed.</li>
-</ul>
-<p>Most real-world workflows introduce some intermediate states that tie into
-process-related handoffs.</p>
-<p>For software, I see these divisions, in various combinations, frequently:</p>
-<ul>
-<li>“Open”:<ul>
-<li>“Unverified”: further work needs to be done to decide whether the task
- should be completed.</li>
-<li>“In Development”: someone is working on the code and asset changes
- necessary to complete the task. This occasionally subsumes preliminary
- work, too.</li>
-<li>“In Testing”: code and asset changes are ostensibly complete,
- but need testing to validate that the task has been completed
- satisfactorially.</li>
-</ul>
-</li>
-<li>“Completed”:<ul>
-<li>“Development Completed”: work (and possibly testing) has been completed
- but the task's results are not yet available to external users.</li>
-<li>“Released”: work has been completed, and external users can see and use
- the results.</li>
-</ul>
-</li>
-<li>“Abandoned”:<ul>
-<li>“Cannot Reproduce”: common in bug/defect tasks, to indicate that the
- task doesn't contain enough information to render the bug fixable.</li>
-<li>“Won't Complete”: the task is well-understood and theoretically
- completable, but will not be completed.</li>
-<li>“Duplicate”: the task is identical to, or closely related to, some other
- task, such that completing either would be equivalent to completing
- both.</li>
-<li>“Invalid”: the task isn't relevant, is incompletely described, doesn't
- make sense, or is otherwise not appropriate work for the team using the
- tracker.</li>
-</ul>
-</li>
-</ul>
-<p>None of these are universal.</p>
-<p>Transitions show how a task moves from state to state.</p>
-<ul>
-<li>Driven by external factors (dev work leads to tasks being marked completed)<ul>
-<li>Explicit transitions: “mark this task as completed”</li>
-<li>Implicit transitions: “This commit also completes these tasks”</li>
-</ul>
-</li>
-<li>Drive external factors (tasks marked completed are emailed to testers)</li>
-</ul>
-<p>States implicitly describe a <em>belief</em> or a <em>desire</em> about the future of the
-task, which is a human artifact and may be wrong or overly hopeful. Tasks can
-transition to “Completed” or “Abandoned” states when the work hasn't actually
-been completed or abandoned, or from “Completed” or “Abandoned” to an “Open”
-state to note that the work isn't as done as we thought it was. <em>This is a
-feature</em> and trackers that assume every transition is definitely true and
-final encourage ugly workarounds like duplicating tickets to reopen them.</p>
-<h2 id="speciation">Speciation</h2>
-<p>I mentioned above that bugs are a kind of task. The ways in which bugs are
-“different” is interesting:</p>
-<ul>
-<li>Good bugs have a well-defined reproduction case - steps you can follow to
- demonstrate and test them.</li>
-<li>Good bugs have a well-described expected behaviour.</li>
-<li>Good bugs have a well-described actual behaviour.</li>
-</ul>
-<p>Being able to support this kind of highly detailed speciation of task types
-without either bloating the tracker with extension points (JIRA) or
-shoehorning all features into every task type (Redmine) is hard, but
-necessary.</p>
-<p>Supporting structure helps if it leads to more interesting or efficient ways
-of using tasks to drive and understand work.</p>
-<p>Bugs are not the only “special” kind of task:</p>
-<ul>
-<li>“Feature” tasks show up frequently, and speciate on having room for
- describing specs and scope.</li>
-<li>“Support ticket” tasks show up in a few trackers, and speciate dramatically
- as they tend to be tasks describing the work of a single incident rather
- than tasks describing the work on some shared aspect, so they tend to pick
- up fields for relating tickets to the involved parties. (Arguably, incident
- tickets have needs so drastically different that you should use a dedicated
- incident-management tool, not a task/bug tracker.)</li>
-</ul>
-<p>Other kinds are possible, and you've probably seen them in the wild.</p>
-<p>Ideally, speciation happens to support <em>widespread</em> specialized needs. Bug
-repro is a good example; every task whose goal is to fix a defect should
-include a clear understanding of the defect, both to allow it to be fixed and
-to allow it to be tested. Adding specialized data for bugs supports that by
-encouraging clearer, more structured descriptions of the defect (with implicit
-“fix this” as the task).</p>
-<h2 id="implementation-notes">Implementation notes</h2>
-<p>If we reduce task tracking to “record changes to fields and record discussion
-comments, on a per task basis,” we can describe the current state of a ticket
-using the “most recent” values of each field and the aggregate of all recorded
-comments. This can be done ~2 ways:</p>
-<ol>
-<li>“Centralized” tracking, where each task has a single, total order of
- changes. Changes are mediated through a centralized service.</li>
-<li>“Decentralized” tracking, where each task has only a partial order over the
- history of changes. Changes are mediated by sharing sets of changes, and by
- appending “reconciliation” changes to resolve cases where two incomparable
- changes modify the same field/s. The most obvious partial order is a
- digraph.</li>
-</ol>
-<p>Centralized tracking is a well-solved problem. Decentralized tracking so far
-seems to rely heavily on DSCM tools (Git, Mercurial, Fossil) for resolving
-conflicts.</p>
-<p>The “work offline” aspect of a distributed tracker is less interesting in as
-much as task tracking is a communications tool. Certain kinds of changes
-should be published and communicated as early as possible so as to avoid
-misunderstandings or duplicated work.</p>
-<p>Being able to separate the mechanism of how changes to tasks are recorded from
-the policy of which library of tasks is “canonical” is potentially useful as
-an editorial tool and for progressive publication to wider audiences as work
-progresses.</p>
-<p>Issue tracking is considerably more amenable to append-only implementations
-than SCM is, even if you dislike history-editing SCM workflows. This suggests
-that Git is a poor choice of issue-tracking storage backends...</p>
- </div>
-
-
-
-<div id="comments">
-<div id="disqus_thread"></div>
-<script type="text/javascript">
- /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
- var disqus_shortname = 'grimoire'; // required: replace example with your forum shortname
-
- /* * * DON'T EDIT BELOW THIS LINE * * */
- (function() {
- var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
- dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
- (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
- })();
-</script>
-<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
-<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
-</div>
-
-
-
- <div id="footer">
- <p>
-
- The Codex —
-
- Powered by <a href="http://markdoc.org/">Markdoc</a>.
-
-<a href="https://bitbucket.org/ojacobson/grimoire.ca/src/master/wiki/dev/trackers-from-first-principles.md">See this page on Bitbucket</a> (<a href="https://bitbucket.org/ojacobson/grimoire.ca/history-node/master/wiki/dev/trackers-from-first-principles.md">history</a>).
-
- </p>
- </div>
-
-</div>
-</body>
-</html> \ No newline at end of file