diff options
Diffstat (limited to '.html/dev/trackers-from-first-principles.html')
| -rw-r--r-- | .html/dev/trackers-from-first-principles.html | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/.html/dev/trackers-from-first-principles.html b/.html/dev/trackers-from-first-principles.html new file mode 100644 index 0000000..13ddac4 --- /dev/null +++ b/.html/dev/trackers-from-first-principles.html @@ -0,0 +1,297 @@ +<!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&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 |
