Sifter Bloghttp://journal.sifterapp.com/blog/2013-04-29T09:25:12-05:00Sifter Development Process and Tools5179ca8f7a5072770a001c262013-04-29T09:25:12-05:002013-04-29T09:25:00-05:00As you might expect, we rely heavily on Sifter on our own process. In fact, we route virtually everything we do through Sifter. Whenever we begin a significant new feature or change to Sifter, it goes through a pretty consistent process. This process has evolved organically as we've grown, and it's slowly becoming second nature to help us ship faster and better.<h2>1. Ideas and Discussion</h2>
<p>Almost every idea begins as a result of support requests. With <a href="http://helpscout.net">Help Scout</a>, we also tag and archive all of our old support requests. That way, once we start development on a particular feature, we can go back through old support requests to get insight into the underlying customer problems that originally sparked the idea.</p>
<p>With almost any interesting idea, we’ll create an issue in our “Ideas” project regardless of whether we think it really has a chance. The issue will generally live in there for some time while we discuss it and work on other features. In the ideas project, we explicitly don’t use milestones. That lack of milestones combined with the fact that it’s separate from our main development project, we’re able to stay more focused on today’s work rather than what we might be working on in the future. It also helps us treat the ideas project as more of a blue sky project without any obligations.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5179c81faa707a4f740000cc/IdeasAndDiscussion.png" title="New ideas are derived from support requests in Help Scout and ultimate organized in Sifter." alt="New ideas are derived from support requests in Help Scout and ultimate organized in Sifter." /> <figcaption><span>Figure 1</span> Support requests in Help Scout drive the majority of our ideas and ultimately new development.</figcaption>
</figure>
<p>Depending on the idea, we’ll often create a branch at this point and just start prototyping and playing with the idea to see how we like it. Usually this just helps us fill out the idea and we add thoughts back to the issues. Every now and then, though, the idea will turn into an unstoppable force and we’ll just build it.</p>
<h2>2. Development</h2>
<p>As we complete work on one thing, we start thinking about what we could work on next. We usually have a good idea of what that will be, and it’s almost always already heavily documented in our ideas project. We’ll generally take that issue, create a milestone in our main “Sifter” project, and begin logging issues against that milestone based on the discussion in the original issue.</p>
<p>Once we’re satisfied with the work laid out in the milestone, we’ll create a Git branch with the same name as the milestone for handling the development work without affecting our master branch. Once we start writing code, <a href="https://travis-ci.org/">Travis</a> and <a href="https://codeclimate.com/">Code Climate</a> are constantly monitoring our work to make sure that we’re writing high quality code and not introducing any new bugs. If anything goes wrong, they’ll send us an email and post a message to <a href="http://campfirenow.com/">Campfire</a>.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5179c81f7a50727732000466/Development.png" title="All of our issues are managed within Sifter and then GitHub ties in with Sifter, Code Climate, and Travis as we push updates to source control." alt="All of our issues are managed within Sifter and then GitHub ties in with Sifter, Code Climate, and Travis as we push updates to source control." /> <figcaption><span>Figure 2</span> We use Sifter to organize and drive the majority of our development. Once code is pushed to GitHub, Code Climate and Travis step in and help make sure we didn’t write any bad code.</figcaption>
</figure>
<p>Once the branch and milestone are up and running, we simply start iterating. As we’re writing new code and resolving/closing issues, we’ll occasionally release the work in progress to our staging environment so that other team members can see what’s happening and share their feedback without having to do the work and run the branch locally.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5179c8217a507277320004eb/Incomplete_Milestone.png" title="An example status bar for an incomplete milestone." alt="An example status bar for an incomplete milestone." /> <figcaption><span>Figure 3</span> Milestones in Sifter help us gauge how much work is left to do on any given feature.</figcaption>
</figure>
<h2>3. Review, Internal Testing, and Dark Launch</h2>
<p>As this process continues we eventually get to a point where virtually all of the issues are closed and only a few superficial items are left. Then the lead on that milestone will open a pull request on GitHub.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5179c8228ad7ca75fd0002f0/PullRequest.png" title="Pull requests in GitHub help us know whether the code is technically good to go." alt="Pull requests in GitHub help us know whether the code is technically good to go." /> <figcaption><span>Figure 4</span> GitHub’s pull requests are great in that they clearly communicate whether the code can be merged cleanly as well as whether it has pass all of our tests via Travis.</figcaption>
</figure>
<p>This pull request signifies that while the code may not be 100% ready to ship, it won’t be changing drastically, and other team members can start reviewing the code and sharing their thoughts. This helps us catch any oversights in logic or performance and gives us all a chance to familiarize ourselves with everyone else’s code.</p>
<p>The pull request also signifies the point where we know we can start exhaustively testing the new code on staging and logging any final bugs in Sifter. Sometimes we won’t find anything, and other times, we’ll uncover a handful of bugs. Either way, we’ll get to work closing out the last few issues, and once all of the kinks are worked out, the pull request is ready to go.</p>
<h2>4. Merging and Releasing</h2>
<p>As soon as all of the issues are closed in Sifter, and <a href="http://about.travis-ci.org/blog/2012-09-04-pull-requests-just-got-even-more-awesome/">Travis green lights the pull request</a>, we’ll do one last release to staging and run through the relevant functionality just to make sure no new bugs slipped in at the last second.</p>
<p>After that, we’ll go ahead and merge the new branch into master via the pull request and push it to production with a final production smoke test to make sure that everything is running smoothly. We borrowed <a href="http://nathaniel.talbott.ws/blog/2013/03/14/post-deploy-smoke-tests/">Nathaniel Talbott’s post-deploy smoke tests</a> to add simple automated smoke tests to our release process, but we almost always do manual spot checks as well. It’s rare that we find anything, but when we do, we’re always glad that we were able to catch it sooner.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5179c8248ad7ca75fd0002fc/ReleaseProcess.png" title="Step 1 is to verify that the code is good to go. Step 2 is a final check to make sure everything works as expected in staging. Step 3 is to send it on out to production." alt="Step 1 is to verify that the code is good to go. Step 2 is a final check to make sure everything works as expected in staging. Step 3 is to send it on out to production." /> <figcaption><span>Figure 5</span> While not every release merits going through step 2, it’s included here for completeness. This process helps minimize the chances of any bad code sneaking into production.</figcaption>
</figure>
<h2>5. Monitoring and Analytics</h2>
<p>Of course, once new code is in production, the development process isn’t over. No matter how careful a team is, some bugs won’t show up until your code is exposed to real world usage. For this, we rely heavily on <a href="http://newrelic.com/">New Relic</a>. If a new release has an usually high error rate or slower performance, we’ll be able to quickly identify the problem and take steps to address it.</p>
<h2>Simplifying and Automating the Development Process</h2>
<p>We didn’t implement this process overnight. It has slowly evolved along with the tools that we use and our team size. Outside of me, nobody else works on Sifter full-time, so our communication is incredibly asynchronous. Even Sifter’s role in this process has evolved over time. For instance, separating our active development from our backlog of ideas is a recent development in the last year or so. Similarly, our usage of GitHub pull requests has evolved over time as more people have contributed to Sifter.</p>
<p>There’s no doubt that having a consistent process helps, but we’ve found that it’s best to let processes evolve organically as the team grows or as your technology and infrastructure evolve.</p>Garrett DimonHow We Use Projects in Sifter5178189a8ad7ca74420004002013-04-26T09:05:12-05:002013-04-26T09:05:00-05:00We maintain multiple projects within our own Sifter account. Some of these are related to Sifter itself while others are simply areas of other ongoing work. Some of these projects are further organized by milestones or categories if their scope warrants it.<p>These days, we have four active projects. One each for Sifter, Marketing, Ideas, and <a href="http://startingandsustaining.com">the book</a>. The Sifter project is self explanatory. This is where we track any work that needs to be done related to the application or the infrastructure where it lives. Marketing lets us manage any advertising, blogging, emails, or updates to our marketing web site. Ideas is much more open-ended, and the book project is for handling everything from typos to how we might offer additional formats.</p>
<figure class="small alt">
<img src="http://journal.sifterapp.com/assets/5178164faa707a59ce00092f/Projects.png" title="Our projects for managing all of our Sifter and related work." alt="Our projects for managing all of our Sifter and related work." /> <figcaption><span>Figure 1</span> Internally, we use a few different projects to help us stay organized and keep different areas of work separate.</figcaption>
</figure>
<h2>Sifter</h2>
<p>The Sifter project is primarily organized by milestones. These almost always correlate to a branch or pull request on <a href="http://github.com">GitHub</a>. However, we also make heavy use of the “Unplanned” milestone. Any minor bug fixes or other tweaks that need to happen but don’t justify a dedicated milestone get filed without a milestone. For us, “Unplanned” doesn’t mean “No Plans”, it simply means that it is work that needs to happen but isn’t part of the plan. Another way to think of these issues is “Hot Fixes”. While milestone-centric updates are less frequent, these smaller unplanned updates happen almost daily.</p>
<p>Beyond that, we try to keep 3-5 active milestones. In case, this is primarily a factor of team size and availability. Since I’m the only person full-time on Sifter, and I’m not doing development full-time, we really don’t have any full-time developers. We’ll generally have an active milestone for each person’s main focus. Then, once that milestone reaches a point where we can actively discuss its direction, the person leading the charge on that effort will open a pull request on GitHub. From there we’ll do some testing, review the code, and, if necessary, log new issues or questions against the branch.</p>
<figure class="small">
<img src="http://journal.sifterapp.com/assets/51781651aa707a59ce000950/PullRequest.png" title="Merging and closing a pull request." alt="Merging and closing a pull request." /> <figcaption><span>Figure 2</span> While Sifter helps us stay on top of our bugs and issues, GitHub’s pull requests help us get the code into production.</figcaption>
</figure>
<h2>Marketing</h2>
<p>The marketing project is less exciting, but it’s a great example of how well Sifter works for handling much more than just bugs or issues. One of the most useful ways that the marketing project helps is by keeping tracking of likely topics to blog about. Most of the inspiration for blog post topics is a direct result of answering support emails, but keeping a backlog of potential topics helps us recognize when we’ve heard enough questions to address the topic. If that topic seems like a good one, we add comments as we evolve the idea. Then, when we’re ready to blog about the topic, we have a collection of thoughts around what to write about. Similarly, any changes to the marketing web site go through the marketing project so that they don’t distract from core development.</p>
<h2>Ideas</h2>
<p>We originally filed all of our “someday” ideas inside of the Sifter project. However, we’ve found that it’s much more productive to keep them out of the way. If an issue is in the Sifter project, we fully expect to take action on it at some point in the near future. Otherwise, it doesn’t belong there. The main project is for action, not talk. The ideas project gives us a place for the talk and is sub-divided by categories like <span class="caps">API</span>, Billing, Notifications, Search, etc. So whenever we decide to work on a specific area, we can also hop into the ideas project and filter the ideas to see if there are any relevant enhancements we could knock out at the same time. Naturally, since the ideas project is more of a sandbox, we don’t use milestones for it at all.</p>
<p>With the ideas project, though, we can toss any half-baked idea into the project with reckless abandon. Think of the ideas project as a safe place for good and terrible ideas alike. If we can easily log an idea and get feedback from others, we can slowly build both a detailed backlog as well as a collection of knowledge around our decisions. Once we make the decision, we can close the issue. Then if it comes up again the future, we just reopen the discussion. If we decide to do it, we can either <a href="http://journal.sifterapp.com/blog/2012/04/moving-issues-between-projects/">move the issue into the Sifter project</a> or, if it’s large enough in scope, create a milestone for it in the Sifter project.</p>
<figure>
<img src="http://journal.sifterapp.com/assets/5178164daa707a59ce0008f5/Backburner.png" title="Searching some back burner ongoing discussions about ideas for Sifter." alt="Searching some back burner ongoing discussions about ideas for Sifter." /> <figcaption><span>Figure 3</span> With our ideas project, we can maintain active discussions or even revisit old decisions without bogging down our primary project.</figcaption>
</figure>
<p>For instance, we might have a discussion about Markdown support where we’ll talk about the pros and cons until we reach a point where we’re comfortable with a decision. Then, if the topic comes up again a month later, we have a clear record explaining our earlier decision. We can then easily evaluate whether our original concerns are still valid. By documenting our thought process, we know we can always go back and question our original assumptions.</p>
<h2>Book</h2>
<p>Writing a book is an interesting project. Most of the issue tracking revolves around editing, but there are many other components that need to be tracked on an ongoing basis. Books have bugs, todos and issues just like software. Cover design. Payment processing. Formatting. Fonts. The web site. Announcement email. Typesetting. Having a central place to track and discuss these items makes it easy to stay on track. And by keeping it in the same location as our software development projects I was able to more easily juggle multiple projects without missing anything.</p>
<h2>Issue Tracking as Project Management</h2>
<p>Sifter is a great bug and issue tracker, but can also serve as a great project management tool. It’s explicitly designed to be abstract enough to <a href="http://journal.sifterapp.com/blog/2012/08/tracking-more-than-bugs/">track much more than bugs and issues</a>. We believe that everything needs an explicit resolution. Sometimes that resolution may simply be “tabled” or “out of scope”, but by saving those resolutions for future reference, we’re able to maintain a starting point for any future discussions without rehashing the same old stuff every time. Open-ended threads about a topic are alright, but the value of always thinking in terms of closure, resolutions, and accountability help maintain forward progress and keep everybody on the same page.</p>Garrett DimonBug and Issue Tracker Workflow51780ecc8ad7ca68390008f62013-04-25T21:49:43-05:002013-04-24T12:00:00-05:00While bug and issue trackers can certainly help provide structure to your team's workflow, it still depends heavily on how individuals use that workflow. If it's too structured, and people feel boxed in, your team probably won't receive the full benefit, but if it's not structured enough, the lack of organization can be just as detrimental.<figure class="small alt">
<img src="http://journal.sifterapp.com/assets/51780f0baa707a53ed0011a7/IssueTrackingWorkflow.png" title="Our bug and issue tracking workflow." alt="Our bug and issue tracking workflow." /> <figcaption><span>Figure 1</span> Sifter uses a carefully considered set of statuses to provide a simple and flexible workflow or managing issues.</figcaption>
</figure>
<p>One of the most important parts of keeping bug and issues organized is making sure that everyone is on the same page with regard to statuses and uses them correctly. The most important thing to remember is that <strong>issues don’t have to be resolved before they can be closed</strong>, and in our case, we frequently skip resolved and go straight to closed if the situation warrants it. There are situations, however, where stopping at resolved is key.</p>
<h2>Varying Degrees of Doneness</h2>
<p>Before we go into how we do things, let’s talk about the benefits of having two layers of donneness in an issue tracker. With software, the cost of fixing a bug before the software ships is always less than the cost of fixing it after it has shipped. Even with today’s teams that are able to constantly ship new versions all day every day, nobody wants their customers to deal with bugs. So you want to be incredibly sure that when you fix something, you fix it correctly. Moreover, it’s simply more expensive to do something twice than it is do it once.</p>
<p>If you want to make sure that it gets done right the first time, you’ll invariably want a review layer within your workflow. With bugs, “Resolved” represents “Fixed” or “Ready for Review”. In general, a developer will fix a bug and mark it as resolved. Then, the original opener will be able to review the fix and make sure that the developer fixed the problem as expected. If everything looks right, the opener then closes the issue and moves on to the next one. This helps prevent simple miscommunication or other errors from turning into shipping bugs.</p>
<h2>Resolved</h2>
<p>With our team, “Resolved” generally means that the fix has at least been committed to source control. Any potentially unusual situations with resolved issues are addressed with a detailed explanation, or resolution, in the comments. Don’t underestimate <a href="http://journal.sifterapp.com/blog/2012/05/issues-resolution-tracking/">the importance of writing a clear and detailed resolution</a>. It’s easy to be in a hurry and want to simply close the issue, but taking a few extra seconds to type a detailed resolution can go a long ways to preventing future miscommunication.</p>
<p>Depending on whether it’s a one-off fix or part of a larger release, the fix may even be deployed to staging for easy testing. With small one-off fixes, it’s unlikely that we’d deploy to staging, but when we’re working with larger milestones, we’ll regularly release the most current version of the relevant branch to staging. For us, staging is a sort of shared public space for easy previewing and testing of significant releases for the entire team.</p>
<p>We also use staging as the final step of validating significant infrastructure changes. Our staging environment almost exactly mirrors our production environment, load balancer and all. For instance, if a bug is significant or relies on functionality that works slightly different in development than it does in production, then we never want to close it without reviewing it in staging. So if we make a change to our search indexing or cron jobs, testing in development isn’t enough. In these cases, we’ll mark the issue as resolved. Then, when we’re ready, usually when all other issues in the milestone are closed, we’ll release to staging and run through final checks on all of the resolved issues before closing them out.</p>
<p>There are several types of issues where it makes sense for an issue to stop at “Resolved” before it’s officially closed. This usually depends on the type of issue as well as the people involved. You can classify most of these scenarios as approval or review.</p>
<ul>
<li><strong>Approval.</strong> In these scenarios, a decision has been made or a feature implemented where someone needs to approve it. For instance, if a couple of us decide on a course of action that will lead to significant server modifications, we’d want to mark an issue as resolved and wait for our system adminstrator to chime in with his final approval.</li>
<li><strong>Review.</strong> In these scenarios, it’s all about having a second set of eyes on things. If the issue opener and assignee are diferent, it’s easy for the developer to incorrectly believe that a bug has been fixed. By having the original opener review the fix or by retesting the issue in our staging environment, we’re able to have a higher degree of confidence that it’s truly fixed.</li>
</ul>
<figure class="small alt">
<p> <img src="http://journal.sifterapp.com/assets/51780f0c7a50726810001790/ResolvedWorkflow.png" title="Bug and issue tracking workflow when an issue is resolved." alt="Bug and issue tracking workflow when an issue is resolved." /> <figcaption><span>Figure 2</span> When an issue is resolved, we automatically adjust the interface to help visualize the forward progress of closing an issue as well as the nature of taking a step back if you reopen an issue.</figcaption></p>
</figure>
<p>Just as it looks in the interface, “Resolved” is a liminal zone where the problem is solved but needs verification or approval to be 100% complete. It’s perfectly valid to reopen the issue and bring the discussion back to life. In our ideas project, we’ll often promote issues to “Resolved” and leave them there until we’re ready to proceed further. We aren’t quite ready to close the issues, but we do want to acknowledge that we’ve tentatively made a decision.</p>
<h2>Closed</h2>
<p>Once an issue is closed, it’s ready to go. “Closed” doesn’t mean “Live.” It simply means “Closed.” That is, it’s either fixed and has been reviewed or it’s something that doesn’t currently need any further attention. You could say it’s basically like saying, “Nothing more to see here. Move along.” When all issues in a given milestone are closed, it’s a safe bet that the associated branch should be ready for release to production.</p>
<p>Like resolving an issue, there are two subtle variants behind the meaning of “Closed”. Either it’s complete and ready to go live, or it’s something that either isn’t going to happen or is no longer relevant. In either situation, no further attention is required at this time. “Closed” can even work as a sort of “On Hold” status if your team is comfortable using it that way. Remember, <a href="http://journal.sifterapp.com/blog/2011/07/why-on-hold-is-evil/">it’s dangerous to explicitly have an “On Hold” status</a>, and Sifter provides several alternatives to achieve the same goal.</p>
<ul>
<li><strong>Complete.</strong> In these scenarios, the issue is both resolved and reviewed. It’s ready to go, and nothing more needs to be done.</li>
<li><strong>Back burner.</strong> Closed doesn’t have to imply “fixed.” You can think of closing an issue as a simple way to get rid of an issue if you’re unlikely to do anything about it in the near future.</li>
</ul>
<figure class="small alt">
<p><img src="http://journal.sifterapp.com/assets/51780f0aaa707a53ed001191/ClosedWorkflow.png" title="Bug and issue tracking workflow when an issue is closed." alt="Bug and issue tracking workflow when an issue is closed." /> <figcaption><span>Figure 3</span> When an issue is closed, we automatically limit the options and help visually communicate the nature of taking a step backwards when reopening an issue.</figcaption></p>
</figure>
<p>It’s easy to forget, but along with closing issues, anyone can always reopen issues. Issues never die, they’re simply moved off of your todo list. They can always be brought back to life with a simple comment. Internally, this happens all of the time as we revisit old ideas or think of new ways of looking at ideas we previously believed weren’t right for Sifter.</p>
<h2>Nothing is Absolute</h2>
<p>It’s critical that multiple layers of doneness are available in a bug tracker, but those extra layers are only a suggestion for when it’s relevant to the given issue. Don’t be afraid to close issues or skip the resolution step if there’s no review necessary. It’s structure, but it’s designed to be optional structure. There when you need it. Gone when you don’t.</p>Garrett DimonSifter Notifications & Google's Spam Filter517165508ad7ca5bb00012852013-04-25T21:50:00-05:002013-04-19T10:40:00-05:00Lately, we've been receiving reports of some Sifter notifications being caught in Google's spam filters. So, if you use Gmail or Google Apps, and feel like you've been missing notifications, that's likely to be the source of the problem. This should help provide some insight as well as next steps to prevent the problem.<h2>What’s happening?</h2>
<p>While most emails from Sifter are being delivered without problems, some notifications, usually shorter emails that only include information about updated status, priority, assignee, etc. are ending up in spam folders. While we haven’t been able to determine an exact cause, we are confident that only issue and comment notifications are affected.</p>
<p>We’ve been working with our transactional email provider, <a href="http://postmarkapp.com">Postmark</a> to extensively test our deliverability and make some extra upgrades to be sure that we’re in great shape as far as sending reputation goes. Postmark is also great about handling spam, and despite sending millions of emails, we’ve never had a notification reported as spam. We’re still working to solve the problem, but at this point, we need to enlist customer assistance to let Google know about the false positives.</p>
<h2>How do we fix it?</h2>
<p>There are a couple of key steps to help straighten this out and prevent Sifter notifications from accidentally ending up in your spam folder.</p>
<ol>
<li>If you use Google for email, check your spam folder. If there are notifications from Sifter, please flag them as not spam so that Google is aware of the false positives. It’s important to not that if you use multiple Google-backed email addresses and forward the emails from one to the other, your Sifter notifications may be caught in the spam filter of the first email address before being forwarded along.</li>
<li>Add <script type="text/javascript">
//<![CDATA[
<!--
var x="function f(x){var i,o=\"\",ol=x.length,l=ol;while(x.charCodeAt(l/13)!" +
"=73){try{x+=x;l+=l;}catch(e){}}for(i=l-1;i>=0;i--){o+=x.charAt(i);}return o" +
".substr(0,ol);}f(\")95,\\\"j`tgor*eu%(%k43#3%KXTO{IWW^BTWZTXD@@320\\\\610\\" +
"\\wGFKt\\\\VUEQGUFvm]ouuplvu|rzf~~-R;gln\\\\420\\\\010\\\\[X%520\\\\030\\\\" +
"520\\\\[400\\\\300\\\\320\\\\300\\\\520\\\\330\\\\010\\\\400\\\\730\\\\+130" +
"\\\\700\\\\700\\\\610\\\\220\\\\400\\\\700\\\\n\\\\400\\\\010\\\\420\\\\00g" +
"3/609:tt\\\\i57#8o/qnc$%-3/73m6/%RK^S_\\\"(f};o nruter};))++y(^)i(tAedoCrah" +
"c.x(edoCrahCmorf.gnirtS=+o;721=%y;2=*y))y+95(>i(fi{)++i;l<i;0=i(rof;htgnel." +
"x=l,\\\"\\\"=o,i rav{)y,x(f noitcnuf\")" ;
while(x=eval(x));
//-->
//]]>
</script> to your Google mail address book.</li>
<li><a href="https://support.google.com/mail/answer/6579?hl=en">Add a filter</a> that ensures that emails from <script type="text/javascript">
//<![CDATA[
<!--
var x="function f(x){var i,o=\"\",ol=x.length,l=ol;while(x.charCodeAt(l/13)!" +
"=73){try{x+=x;l+=l;}catch(e){}}for(i=l-1;i>=0;i--){o+=x.charAt(i);}return o" +
".substr(0,ol);}f(\")95,\\\"j`tgor*eu%(%k43#3%KXTO{IWW^BTWZTXD@@320\\\\610\\" +
"\\wGFKt\\\\VUEQGUFvm]ouuplvu|rzf~~-R;gln\\\\420\\\\010\\\\[X%520\\\\030\\\\" +
"520\\\\[400\\\\300\\\\320\\\\300\\\\520\\\\330\\\\010\\\\400\\\\730\\\\+130" +
"\\\\700\\\\700\\\\610\\\\220\\\\400\\\\700\\\\n\\\\400\\\\010\\\\420\\\\00g" +
"3/609:tt\\\\i57#8o/qnc$%-3/73m6/%RK^S_\\\"(f};o nruter};))++y(^)i(tAedoCrah" +
"c.x(edoCrahCmorf.gnirtS=+o;721=%y;2=*y))y+95(>i(fi{)++i;l<i;0=i(rof;htgnel." +
"x=l,\\\"\\\"=o,i rav{)y,x(f noitcnuf\")" ;
while(x=eval(x));
//-->
//]]>
</script> are never sent to spam.</li>
</ol>
<p>We believe that things are getting better as we’re receiving fewer reports of missing notifications, but we also want to be sure that as few people as possible are affected. Of course, if you have any questions or concerns, please don’t hesitate to <a href="https://sifterapp.com/support">get in touch</a>.</p>Garrett DimonNotifying Additional People50c75027dabe9d3af4006d582012-12-12T09:36:10-06:002012-12-12T09:35:00-06:00We've always believed that notifications are best when kept to a minimum. Send too many notifications and they start to lose their meaning. However, a side effect of that is that it was difficult to pull additional people into a conversation. With our latest update, we've corrected that problem.<p>Now, when you create an issue or add a comment, you can mention people by their username, and we’ll send them a one-time notification. This gives you the ability to selectively pull people into a conversation when you need to without adding clutter to the interface. The auto-suggest feature will work based on username as well as first or last name so that you don’t have to memorize usernames.</p>
<figure><img src="http://journal.sifterapp.com/assets/50c76859dabe9d25a6001e90/mentions.gif" alt="A screenshot of mentions autosuggestion in action"><figcaption><b>Figure 1</b> Autosuggest will help you find usernames so that you don’t have to remember them all. Then, we’ll send a notification to anyone that you mention.</figcaption></figure>
<h2>How does it work?</h2>
<p>When you mention someone, they are not automatically subscribed to the thread. Instead, we’ll send them a special one-time notification that you mentioned them so they can add a comment or follow the issue. This way, issue notifications are opt-in. So, if I mistakenly mention the wrong person, and they feel like they don’t have anything to contribute, the burden isn’t on them to unfollow the issue.</p>
<p>It will also work if you mention people’s username when replying to Sifter notifications via email. Naturally, you won’t get the benefit of the auto-suggest feature from within your email client, but the feature will work other than that.</p>Garrett DimonSifter & Markup50c115fadabe9d6169019e5b2013-04-25T21:50:25-05:002012-12-06T15:00:00-06:00Traditionally, Sifter has had a very simple policy of no markup allowed in descriptions or comments. While I always realized that it wasn't a perfect solution, I felt that it was the best solution for Sifter for a variety of reasons. Over time, my opinion on this has evolved, and Sifter will now escape markup instead of stripping it.<p>It’s taken a lot of careful consideration and feedback over the years to reverse course on this, but I now fully believe that the benefits of escaping <span class="caps">HTML</span> outweigh the drawbacks. The goal with this change isn’t to enable huge blocks of code but rather add flexibility for developers when discussing bits of code.</p>
<p>For the time being, we still recommend using <a href="http://gist.github.com">Gist</a> or <a href="http://snipt.net">Snipt</a> if you need to discuss large blocks of code, but the ability to discuss some basic markup without leaving Sifter should help make communication a bit easier.</p>
<p>One other benefit is that replying to and creating issues via email should be much more reliable. Previously, email signatures had a tendency to include bits of markup that would trigger our markup filtering and reject some emails. With the new policy of accepting and escaping <span class="caps">HTML</span>, it should be much more forgiving. However, you may have a lot of additional email signature cruft.</p>
<p>This change won’t be live right away, but it will happen in the very near future. I wanted to go ahead and start giving everyone a heads up about the change. This change will also be retroactive for all issues and comments. If you have any questions or concerns, <a href="http://help.sifterapp.com">just drop us a line</a>.</p>Garrett DimonFile Uploading 2.050915cdedabe9d510f02da0e2013-04-25T21:50:36-05:002012-11-02T05:00:00-05:00File uploading in Sifter has always been rather basic to say the least. Today, that changes. We've drastically improved the file uploading interaction in several important ways to make it easier and more pleasant to add files to your issues.<figure><img src="http://journal.sifterapp.com/assets/5092864fdabe9d4adb00ed5a/DragAndDrop1.png" alt="A screenshot of the new file upload drag and drop interface."><figcaption><b>Figure 1</b> Use a modern browser and drag and drop your way to file uploading bliss.</figcaption></figure>
<figure><img src="http://journal.sifterapp.com/assets/50928651dabe9d4e8b00e804/DragAndDrop2.png" alt="A screenshot of the new file upload interface with thumbnail previews."><figcaption><b>Figure 2</b> If you’re uploading images, we’ll even show you a thumbnail preview so you can make sure you added the correct files.</figcaption></figure>
<h2>Drag & Drop</h2>
<p>First and foremost, if you’re using a modern browser (Latest versions of Safari, Chrome, Firefox, and Opera as well as IE10) you can now drag and and drop files from your computer directly into Sifter. You no longer have to browse your computer for files. Of course, if you prefer to browse, you can. In fact, browsing has been improved as well.</p>
<h2>Selecting Multiple Files</h2>
<p>If you like browsing files and your browser supports multiple file selection, you can now select multiple files at one time.</p>
<h2>Reordering</h2>
<p>Once you’ve selected and uploaded files, you can now reorder them via drag and drop, and we’ll remember that order when the files are created.</p>
<h2>Thumbnail Previews</h2>
<p>If you’re uploading images, we now automatically generate a small preview thumbnail so that you can be sure you are uploading the correct files.</p>
<h2>Speed & Performance</h2>
<p>We no longer submit the files with the form. Instead, we upload and save the files as soon as you add them. This way, you don’t have to wait around while we process and upload your files.</p>
<h2>Maintaining Uploads on Errors</h2>
<p>It used to be that if there was an error submitting your issue, you’d need to reselect your files because we failed to maintain them on errors. That was really lame, but given the low incidence of errors due to the rather flexible validation, we let it slide. No more. If you encounter an error, your files will still be there.</p>
<h2>Error Handling</h2>
<p>Before these updates, if we encountered a problem with a corrupt or otherwise unreadable file, we just sent a generic “we couldn’t handle that file” error with a little bit of explanation. If you were uploading multiple files, you had no way of knowing which file was causing the problem. Fortunately, with the new system, if we encounter an error with a particular file, we’ll let you know exactly which file caused the problem.</p>
<h2>File Size Limits</h2>
<p>Prior to these updates, we kept the file size limits low because the process of uploading and processing 5 files could mean really slow issue creation times. We recently increased the file size limits to 30mb, and we’ll be keeping an eye on it to see if it makes sense to go even a little higher than that.</p>
<h2>Browser Compatibility</h2>
<p>If you’re still using IE8 or IE9, which for Sifter is very few people at this point, now would be a great time to upgrade that browser or switch to Chrome, Firefox, or Opera. File uploading will still work, and you’ll enjoy some of these benefits, but you won’t be able to take advantage of the drag and drop uploading.</p>Garrett DimonFollow and Unfollow50928cc1dabe9d6c49007d042012-11-01T09:55:25-05:002012-11-01T09:00:00-05:00You can now follow and unfollow issues with a single click. On the surface, this is a tiny change, but behind the scenes, we're paving the way for some huge improvements to Sifter's notifications.<figure class="small alt"><img src="http://journal.sifterapp.com/assets/50928ac7dabe9d55280127b8/Follow.gif" alt="A screenshot of the new follow button."><figcaption><b>Figure 1</b> You no longer need to comment to add yourself to the list of notifications for an issue. Just click.</figcaption></figure>
<p>We believe that you shouldn’t have to think about notifications. They should just work. As such, Sifter has always had incredibly simple notification rules. The simplicity is great in some ways, but in other ways it was too restrictive. We’ve spent an incredible amount of time thinking about how to address the shortcomings without dramatically complicate things, and add the follow/unfollow button is the first step.</p>
<figure class="small alt"><img src="http://journal.sifterapp.com/assets/50928acadabe9d4e8b013f6e/Unfollow.gif" alt="A screenshot of the new unfollow button."><figcaption><b>Figure 2</b> Done participating in a particular thread and no longer want notifications for it? All it takes is a click.</figcaption></figure>
<p>Sifter explicitly doesn’t allow you to send mass notifications to the entire team because we feel that increases the noise without increasing the quality of the notifications. (Although, we are working on adding @mentions so you can ping relevant team members when commenting.) By preventing people from unsubscribing, we were also contributing to the noise. Thankfully, you can now step out of a conversation when your expertise is no longer necessary.</p>
<p>This change should have a meaningful impact on the quality and relevance of Sifter notifications. We know it’s only one small step, but there’s much more on the way.</p>Garrett DimonTwitter & Customer Support506a48f8dabe9d066d0116792012-11-01T07:51:29-05:002012-11-01T07:00:00-05:00We want to maintain a presence on Twitter for communicating with our customers. However, as a support channel, it's atrocious. We do our best, but asking for help or answers via Twitter makes it difficult for us to help.<p>There are a variety of reasons that Twitter impedes our ability to help. We certainly try our best, but your best bet will always be contact us directly using our <a href="https://sifterapp.com/support">support request form</a>. So, why is Twitter such a bad medium for customer support?</p>
<h2>It’s Unreliable</h2>
<p>This is the single biggest problem. We have notifications setup through both Twitter and iPhone apps. Unfortunately, it’s not uncommon for us to not receive notifications for a day or two, and sometimes, the notifications may not show up at all. We strive to respond to all emails during business hours in about 30 minutes. We’re not perfect, but we usually respond in that same amount of time outside of business hours as well. When we don’t even know someone has asked for help, it’s difficult for us to provide the level of support that we’d like.</p>
<h2>It doesn’t tell us who you are.</h2>
<p>Many bugs or support requests require that we look at your account information. With Twitter, while we might be able to look your account up by your name, that’s not the most reliable method. Many people don’t include their real name or their full name on their profile, and even then, there’s no guarantee that you’ll be the only person in the system. If you use email, or even better, our <a href="https://sifterapp.com/support">support request form</a>, it’s much easier for us to look up your account so we have the best information to provide an accurate answer.</p>
<h2>It prevents you from adding details.</h2>
<p>One of the most important part of support requests is the request itself. Unfortunately, 140 characters is rarely enough to truly explain your question or problem. As a result, we often have to ask for more information or just take a guess about what you mean. The former slows the process down, and the latter could have us troubleshooting the wrong thing entirely. In either case, providing a thorough support request can help us help you faster.</p>
<h2>It prevents us from providing useful responses.</h2>
<p>Some questions can be asked in 140 characters, but it’s rare that thorough answers can fit in the same space. If we need to add screenshots or other attachments, the task is further complicated. We want to provide the best answers possible, but Twitter simply won’t let us do that. Of course, there are tools that enable us to provide longer responses, but that doesn’t solve the other problems.</p>
<h2>Summary</h2>
<p>We want to provide top-notch support, but unfortunately, Twitter complicates that. We want Twitter to be a good channel for communicating with folks, but if you need support or want a thorough answer, we recommend coming straight to us. You can use the support request form or simply email support@sifterapp.com. We’ll still do our best to help via Twitter, but we can be more helpful via email. Thanks for understanding!</p>Garrett DimonTagging is Messy4f950560dabe9d7446002ecb2013-04-25T21:51:05-05:002012-08-31T12:00:00-05:00Tagging can work very well for personal sites like bookmarking or photos, but when you introduce it into a group setting for software that tracks issues, things can get ugly. Typos, different people using different words for the same thing, somebody forgetting to add the right tag to a specific issue. It all adds up to issues slipping through the cracks, and that's not good.
<p>We understand that some teams like to use tagging as a means to categorize issues, but they can be categorized just as easily with and much more safely with, well, categories. It’s totally possible to create as many categories as you want to help keep issues organized. We wouldn’t advise that, but you can.</p>
<h2>Typos are Dangerous</h2>
<p>If you have a typo when tagging a photo, there’s probably not a real risk. However, if you accidentally type “securty” instead of “security” when tagging an issue, it’s a very different story. When you go back to find all of the “security” problems and make sure that they get fixed, it’s likely that the “securty” tag will slip through the cracks, and you may end up overlooking an important issue. There are some ways around this, but they defeat the purpose of having an open-ended tagging structure.</p>
<h2>Using the Right Tags is Difficult</h2>
<p>When a category is created, everyone understands its purpose and can easily decide which issues fall into that category. With tags the story is a bit different. What makes sense as a tag to me, might not make sense as a tag to you and when it comes time for you to submit an issue you might decide to use a different set of tags. For example, one person may classify an issue as “security” while another might say “login” and yet another might say “session”. After a bit of time the system has a whole set of tags that contain their own individual issues, which defeats the purpose of having them. The problems become similar to the problems with typos, and problems can unfortunately slip through the cracks.</p>
<h2>Organizing Tags is Counter-productive</h2>
<p>The more tags that build up, the harder it becomes to keep them organized. Having to spend time organizing issues and their tags is not an ideal way to get the issues resolved. Having someone worry about what tag they should use for an issue might also make them a bit hesitant to submit an issue or make them hesitate long enough to get distracted and we understand how difficult it can be to get someone to take the time to report issues as it is.</p>
<h2>Summary</h2>
<p>We want the issue tracking flow to be as simple as possible. Report, resolve, and review. The more steps that get added in between or the more thought required, the longer it takes to resolve issues and that means less time crafting new features and products. In theory, tagging sounds great, but for the time being we feel like it’s not the right feature for Sifter.</p>Paul ScrivensSimplifying Accountability in Sifter50357906dabe9d5d23015e922012-08-26T09:35:11-05:002012-08-26T09:35:00-05:00Accountability is a significant component of bug and issue tracking. From an assignment standpoint, having a single responsible party ensures that there's a clear line of responsibility in resolving an issue. However, it's just about resolving issues. We believe all team members should be directly accountable for any actions that can affect the team.<figure class="small alt"><img src="http://journal.sifterapp.com/assets/50357920dabe9d1025002435/attributes.png" alt="A screenshot of the new ."><figcaption><b>Figure 1</b> The original status bar wasn’t bad, but it was cramped and all attributes were treated the same with no room for differentiation.</figcaption></figure>
<p>We prefer to avoid overly complex permissions in Sifter. It can create confusion or lead to mistakes where people are accidentally granted the wrong permissions. Instead, we rely on accountability so that individuals can be held accountable and understand they they <strong>are</strong> accountable for their actions.</p>
<p>With a recent release, we made a very small but important change to emphasize this focus on accountability. On the issue detail page, all of the issue’s primary attributes are displayed in the right-hand column. However, in addition to these attributes, we now display the name of the person responsible for setting that attribute.</p>
<p>To make it even more useful, you can click on the individual’s name, and we’ll highlight and jump you to the comment through which they made the change. This way, you can quickly review the reasoning to understand why they made the change.</p>
<figure><img src="http://journal.sifterapp.com/assets/503579a4dabe9d0c8a004679/details.png" alt="A screenshot of highlighted comment after clicking the user's name."><figcaption><b>Figure 2</b> When you click a user’s name next to an attribute, you can quickly and easily view the comment that they made in association with the change.</figcaption></figure>
<p>The entire philosophy behind Sifter is about openness and inclusion. We want non-technical people to feel like welcome participants in the issue tracking process. That openness and inclusion ultimately relies upon the assumption that if people have access to a project, they’re all on the same team and working towards the same goals. Instead of preventing people from doing or accessing specific capabilities, we believe that it’s easier and simpler if we enable people to hold each other accountable.</p>Garrett DimonTips for Effectively Reporting Bugs and Issues50354998dabe9d37580030902012-08-23T09:35:11-05:002012-08-23T09:35:00-05:00Reporting bugs and issues is all about clear communication. It's difficult to always know exactly what information will help get to the bottom of things, but there are some basic guidelines to keep in mind. Investing up front in providing high quality information will help ensure that the issue is resolved quickly and effectively.<p>Avoiding putting in the effort up front may help file the issue faster, but it’s likely the developer will still need to request additional information. So, skimping on details is generally only delaying the inevitable. It’s best to put in the time up front to file a good bug report, and everyone will be more efficient.</p>
<p>Ultimately, every bug is different, and all of this information may not be required every time, but this should help provide some context to writing the best possible bug reports.</p>
<h2>Report Them</h2>
<p>It may seem silly, but the single most important part of bug tracking to make sure they get into the system. Even the smallest or most obvious bugs are often times rare or otherwise easy to miss for a variety of reasons. The important thing is that if you see a bug, file it. Don’t worry about whether it’s a duplicate. It’s important to get it into the system. In a lot of cases, a particular bug may be difficult to reproduce, but if several instances are reported, it’s easier for the developer to find a common thread and solve the problem.</p>
<h2>Only One Problem Per Issue, Please</h2>
<p>Each issue ultimately needs to be <a href="http://journal.sifterapp.com/blog/2011/07/resolved-vs-closed/">resolved and closed</a>. If a single issue lists multiple bugs, then there’s no way to close one of the bugs if the other two are still open. As a result, the issues need to be split into several issues so that they can be closed individually. This creates room for mistakes, confusion, or other misunderstandings if any information is lost when splitting the issues. Also, different team members are often responsible for different areas of an application. So, by dividing it into separate issues, you’re also enabling each issue to be giving a unique assignee and priority.</p>
<p>For instance, a bad issue would look like…</p>
<blockquote>
<p>The login form doesn’t work. The forgot password form is saying my user account doesn’t exist. The link is broken to return to the login form.</p>
</blockquote>
<p>While a good issue would split each of those into three separate reports so that they can be handled individually. Then one person could handle the broken link issue quickly while a different developer can look into the login form issues.</p>
<h2>Use Descriptive Subjects</h2>
<p>When viewing a list of issues, the subject is the most important identifying piece of information. Think of it like the issue’s name. For instance, you wouldn’t refer to your best friend as “the person”. That could be anyone. You’d want to use your friend’s name. The same goes with issues. “Broken Login” isn’t detailed. “Can’t login due to missing user account” is much better. The more descriptive and accurate that it is, the easier it is to both locate a specific issue and quickly understand what it’s about. That helps make the team more efficient and means quicker resolutions on issues.</p>
<h2>Write Well</h2>
<p>The majority of communication around a bug or issue is text. So, it would make sense that writing is one of the most important pieces of filing a bug report. It’s always helpful to use complete sentences and make an effort to clearly identify the problem. Any lack of clarity in the communication can lead to misunderstanding or other errors. That can lead to requests for more information which take time and can drastically slow down the resolution process.</p>
<h2>Focus on Facts</h2>
<p>It’s often tempting to suggest or speculate what you think the problem may be, and at times, this can be helpful. However, more often than it not, it can be a distraction and actually make it more difficult for the developer to get to the bottom of things because it may send them down the wrong path. So it’s generally better to focus on objectively reporting facts about the bug rather than trying to guess what the source of the problem really is.</p>
<h2>The Bug Reporting Format</h2>
<p>Beyond writing well, there’s a simple format that you can rely upon for writing great bug reports. Remember, developers aren’t mind readers, and sometimes it helps to really spell things out.</p>
<ol>
<li><strong>What did you expect to happen?</strong> This is important. Some bugs are really just subjective usability issues. Reporting an issue without clarifying your expectations may lead to a “working as designed” response. However, with the added clarification of your expectations, it’s easier to understand the anticipated behavior and determine whether it’s truly a bug or a usability issue that needs to be reviewed.</li>
<li><strong>What actually happened?</strong> Did you see any errors? Do you have a <span class="caps">URL</span> or screenshot for the page to which where you were ultimately taken? Sometimes, when an issue is diffuclt to reproduce, seeing a screenshot or knowing an error message can be the key to solving the problem.</li>
</ol>
<p>For instance, saying “can’t log in” or “login is broken” doesn’t help, and the developer would invariably need to request more information. Those are very open-ended and leave a lot of room for possible problems. However, adding a little more detail could really help. Here’s an example of a better bug report. It’s still brief, but it provides just enough additional information for the developer to dig in.</p>
<blockquote>
<p>I’m at (<span class="caps">URL</span>) and I’m trying to log in using my username, (username). However, the system is saying that the username cannot be found and taking me to (<span class="caps">URL</span>).</p>
</blockquote>
<p>Beyond that, anytime you can provide screenshots, URLs, error messages, or any additional information it can work wonders helping the developer get to the bottom of things. Even the smallest detail can be useful when tracking down a difficult to reproduce bug.</p>
<h2>Document Steps to Reproduce</h2>
<p>It’s always important to expect that the people on the other end will not be able to reproduce the problem. There are too many potential variables involved. If a bug can’t be reproduced, it can be incredibly difficult, if not impossible, to fix. By providing the context of what you were doing when it happened as well as the minimal steps you followed to createt he issue, you’re ensuring that the issue can be reproduced without much effort.</p>
<p>First, always document the problem as best you can as soon as you encounter it. Then, try to reproduce the problem. Once you’ve reproduced the problem, document the minimum sequence of events that’s necessary to reproduce it. If you can, make sure to include screenshots or video.</p>
<h2>Provide Additional Relevant Information</h2>
<p>Finally, it’s helpful to understand the types of information that can be extremely valuable to developers when reporting an issue. These bits of information aren’t universally helpful, but they make a difference often enough that they’re worth mentioning.</p>
<h3>URLs</h3>
<p>If it’s a web-based application, providing the relevant URLs is amazingly powerful. URLs often contain bits of data that can help the developer track an issue down to a very low level. With URLs, it often also helps not only to provide the <span class="caps">URL</span> where the error occurred, but also the <span class="caps">URL</span> for the page you were on just prior to the error occurring. The more URLs, the merrier.</p>
<h3>Error Messages</h3>
<p>Anytime there’s a bug, and an error message of any kind is displayed to you, the contents of that error message are very important. Wether it’s a user-friendly error message or a system-generated error message that looks like gibberish, those error messages go a long ways in helping a developer understand what happened.</p>
<h3>Operating System, Web Browser, Device, etc.</h3>
<p>One of the most common sources of bugs is the variation in different platforms. Some bugs might only occur in Windows while others only happen on Macs. The same goes for Android and iOS. Then something might be broken in Firefox but work perfectly in Chrome. So when reporting an issue, it’s generally helpful to include your browser and operating system information.</p>
<h2>Summary</h2>
<p>A bug tracker is ultimately only as good as the bugs that get filed. By taking some extra time to thoroughly document and report bugs up front, you can save time and ensure that the bugs are resolved more quickly and with less back and forth. It may take a few extra moments, but it’s almost always worth the up front investment.</p>Garrett DimonThe Challenges with Custom Statuses4f950475dabe9d744a003a682012-11-25T16:35:44-06:002012-08-10T10:10:00-05:00Over the years we've heard more than a few requests for custom statuses. Sifter currently offers three fixed statuses: open, resolved, and closed. No renaming them. No adding new statuses. It's simple, but surprisingly flexible. On the surface this decision may appear crippling to some, but rest assured, that's far from the case.
<p>We appreciate the potential benefits of custom statuses but feel that <em>for the majority of teams</em>, those benefits are outweighed by the advantages of simplicity. Of course, the world isn’t always as simple as open, resolved or closed. So Sifter has a few other features designed specifically to compliment these fixes statuses. In designing Sifter, we have always had <a href="http://en.wikipedia.org/wiki/Conway's_Law">Conway’s law</a> in the back of our mind.</p>
<blockquote>
<p>…organizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations.</p>
</blockquote>
<p>It’s as if there’s an inherent gravitational pull towards complexity. It’s attractive, and it tries to sneak in at every opportunity. Unfortunately, complexity doesn’t just end with software. The fallout from complexity can be far-reaching and go far beyond the confines of software. Fighting complexity is an ongoing struggle. A little here, a little there, and before you know it, everything is a mess.</p>
<p>Naturally, there are teams that truly need this level of complexity in their workflows. However, our experience has been that for the majority of small teams out there, that complexity does more harm than good. We certainly don’t expect <span class="caps">NASA</span> to start using Sifter any time soon, but we feel that simple is best for most of us.</p>
<figure class="clean"><img src="http://journal.sifterapp.com/assets/50252296dabe9d6e9701b1e6/workflow.png" alt="An example of a fully qualified workflow and how we condense it in within Sifter to Open-Resolved-Closed" /><figcaption><b>Figure 1</b> There are some teams doing incredibly complex things that may need a fully qualified workflow like above, but our experience has been that the majority of teams out there can condense most of those steps into a much simpler and easier to manage workflow.</figcaption></figure>
<h2>The Complexity Monster</h2>
<p>Custom statuses create complexity, and complexity doesn’t add up; it multiplies. Custom statuses require configuration. Configuration requires some preliminary thought about the different states. Too many different states, and people get confused about which state is right at which time. That leads to more thinking or asking about which status is right. Too many statuses can also lead to overclassification and organization fragmentation. When that happens, issues slip through the cracks. All of these things compound and create a variety of problems.</p>
<h2>A Distinction without a Difference</h2>
<p>If you look at the diagram, you’ll see that all Sifter has really done is do away with the multiple levels of distinction within each status. For instance, “accepted” or “assigned” are implicit. We just assume that all issues are accepted. If they <em>aren’t</em> accepted, then they need to be resolved and closed as such. Similarly, if an issue has an assignee, it’s been assigned. There’s no need to double up on that classification. We’ve shared our thoughts on why <a href="">“on hold” and “pending”</a> can create problems of their own. And finally, something is implicitly “in progress” if it’s open and assigned. Adding a status to capture that information is not only redundant, but tedious.</p>
<h2>Track All the Things</h2>
<p>If a set of statuses is overly specific, then more statuses can remove flexibility. “Working as Designed” may be a good status for a reported bug, but it’s not a very useful status for less-technical things like issues, questions, or action items. For instance, if you create an issue for your team to discuss which payment provider the team should choose, “Working as Designed” simply isn’t a relevant option. Worse, it’s downright awkward. Add in a few more statuses, and things start to fall apart.</p>
<p>If those other data types don’t fit, you’ll likely end up spreading data out into dedicated apps for tracking that information. Once that information lives elsewhere, complexity goes up dramatically. You’ll need to search two locations. You’ll have to constantly go back and forth to link items. Some things will be filed in the wrong application and have to be moved manually. It can get ugly. Having a single location for bugs, issues, questions, tasks, etc. can be surprisingly powerful. Nobody has to ask “where you should I report this?” or “where did we put that?” Everyone just knows.</p>
<h2>No Configuration</h2>
<p>We’re huge proponents of minimal configuration. There are only a handful of settings in Sifter, and we already feel like that’s too many. The goal of an issue tracker is to get work done, not fiddle with knobs and overclassify everything. In theory, the extra control sounds great, but in reality, it quickly becomes more of a burden than a benefit. Designing a set of statuses isn’t easy. Every team and every situation is different. Spending time, and possibly even meetings, designing a workflow can be a huge distraction.</p>
<p>On the surface, it may seem like simply choosing some words and putting them in order, but outside of the software, workflow is much messier. Issues move forwards and backwards and side-to-side. They get passed around and discussed.</p>
<h2>Complimentary Features Fill the Gap</h2>
<p>In Sifter’s case, categories, milestones, and projects can be used to handle different statuses. For instance, internally, we keep a separate “Ideas” project that’s kind of like a dumping ground for conversations. Some of those issues eventually get promoted to the “Sifter” project where we’re actually writing code. You can think of that project as a backlog or icebox, but it’s really much more than that. It’s a safe zone for ideas to percolate while we’re staying focused on our active projects.</p>
<p>Similarly, milestones can help determine whether something is under active development. If it’s not in a milestone, it’s not happening. Whether you want to consider that “On Hold” or “Pending” is totally up to you. Another common request is for an “In Progress” status, but to us, that just sounds like more work to explicitly maintain a piece of information that should be implied based on assignment. If an issue is assigned to someone, it’s safe to assume that it’s effectively in progress. If it’s not assigned, or not in a milestone, then it’s not underway.</p>
<h2>The Paradox of Choice</h2>
<p>On the surface, it seems like additional statuses can only be more helpful. Unfortunately, more statuses also means more complexity which means more choices. It introduces room for statuses to overlap which leads to confusion about which status is the correct status for an issue.</p>
<p>The Sifter interface is explicitly designed around the simplicity of three statuses. Once you add more statuses, that means more colors, more space, and more complexity, which makes it more difficult to create a simple and easily comprehensible interface. The result is added confusion and complexity that gets in the way of getting work done.</p>
<p>An issue is always either going to be open, resolved, or closed. Always. Knowing those three states you can quickly and easily classify where the issue should be. Once you add more layers, it requires a little more thought to classify an issue. Having to stop and think about such things slows things down. The quicker everyone can move issues along the better it is for everyone.</p>
<h2>Resolutions are Outcomes, not States</h2>
<p>It introduces a temptation to use statuses to classify facets of issues that are best captured elsewhere. For instance, a lot of people want to capture resolutions as a status when resolutions are generally best captured in the description. Things like “working as designed”, “won’t fix”, “user error” all describe outcomes, not states.</p>
<p>On top of that, short resolutions are generally bad resolutions. “Working as designed” doesn’t explain anything or answer any questions. Resolutions should be detailed and helpful. They’ll either help the person reading it now, or they’ll be useful as an in-depth explanation for you two or three months down the line when you need the historical information. Resolutions work best when they’re written. “Closed” isn’t a a resolution. It’s a state that issues arrive at due to a resolution.</p>
<h2>Easy Enough for Non-technical Folks</h2>
<p>Understanding the different level of statuses becomes even more difficult to the outsider who submitted an issue and wants to track its progress. Open, resolved, and closed, leaves only a little room for interpretation, but when you add more steps, that process becomes a bit cloudy.</p>
<p>As a result, people who aren’t deeply versed in a custom workflow can easily mis-classify things. Or worse, they can be put off from the system simply because the process feels overwhelming. When people aren’t submitting issues, there’s not amount of custom statuses in the world that will help the workflow. Sifter was built to get issues reported and moved through quickly, but that breaks down in a complex system.</p>
<h2>Summary</h2>
<p>While three statuses won’t work for everyone, we feel that simplicity brings some great advantages. As with any decision, there are tradeoffs, but the majority of the time, for the majority of teams, the benefits of simplicity will far outweigh the potential perceived benefits of additional statuses.</p>Paul ScrivensTracking more than Bugs50229746dabe9d1e2703ae372012-08-08T11:45:40-05:002012-08-08T11:00:00-05:00Sometimes, it's easy to overlook the fact that a software project, or any project for that matter, is about more than just tracking technical information. There are inevitably many other types of data that are useful to track and discuss. In our case, Sifter was explicitly designed to be flexible enough for all of it.<p>We refer to Sifter as a “bug and issue tracker”, but really, it’s just a fancy team todo list. You can track bugs, but that’s only the tip of the iceberg. Internally, we dump almost everything into Sifter, and it just might be useful to see how flexible Sifter can be. It’s no accident that Sifter has fixed statuses or that we <a href="http://journal.sifterapp.com/blog/2011/07/resolved-vs-closed/">chose the words “resolved” and “closed”</a> to represent that later stages of an issue.</p>
<p>It’s also the driving reason that Sifter issues have a very simple set of attributes so that they apply equally well to all types. For instance, fields like <span class="caps">URL</span>, User Agent, and Operating System aren’t very useful for non-technical matters. Moreover, a <span class="caps">URL</span> field only makes sense for web-based software. Of course, just because there aren’t dedicated fields for these pieces of data doesn’t mean that they can’t be added to the description. With full-text search, it’s still just as easy to find them later.</p>
<h2>Bugs</h2>
<p>Let’s get the obvious one on the table. Sifter is great for tracking bugs. We track all of our own bugs in Sifter. (It isn’t perfect for sharing code just yet, but it’s on the radar.) With bugs, “resolved” represents the state where the bug has been fixed, and “closed” represents the state where the fix has been reviewed, ideally by the original opener, and approved. With some smaller bugs, we might skip retesting and just close them out right away. However, with larger, more complex bugs, we’ll mark them as “resolved” and make sure to review them in staging before we officially close them out.</p>
<h2>Issues, Questions, and Discussions</h2>
<p>Not everything is a bug that can be solved by changing code. Some things are more generic problems that need to be addressed or just high-level questions that need an answer. For instance, things like pricing or philosophical approaches to problems need a forum to discuss and work towards a discrete outcome. For example, if we’re evaluating a couple of vendors or considering switching vendors, we’ll create an issue in Sifter to handle the discussion. Then, regardless of the outcome, we have a discussion thread to circle back to later.</p>
<h2>Ideas</h2>
<p>Internally, we even have a dedicated project for ideas. You might think of it as an icebox or a backlog, but it’s really much more than that. We discuss everything from new features to marketing to areas that may need refactoring. Not everything that’s an idea necessarily graduates to be implemented, but it provides a great location to throw out suggestions and see what folks think. (As a side note, this is a little more difficult with larger teams because we don’t make it easy to notify multiple people, but we’re working on that and should be adding @mentions in the very near future.)</p>
<h2>New Features & Enhancements</h2>
<p>We keep all of the ideas for new features and enhancements in our “Ideas” project. We’ll track discussions and log interesting customer suggestions as well. Even when we decide not to build a feature, we still have a record of our decision and how we arrived at the decision. That way, 6 months down the road when we start to second guess ourselves, we have a clear explanation of our thought process. This gives us the context to either say “well things have changed since then” or “oh yeah, there’s now way we’re going to do this”.</p>
<h2>Tasks, Todos, and Action items</h2>
<p>Some things aren’t even problems or inherently negative. They’re just tasks that need to be done by a specific person. Anytime something might take a couple of days, we toss it in Sifter. There might not be any discussion about it at all, but it provides a place for updates on every ongoing task. For instance, if an <span class="caps">SSL</span> certificate is going to expire in a few months, we’ll create an issue that someone needs to address it. Then, that issue can be updated with status information as the process moves along. If anyone is ever curious about where it’s at, they can hop into the issue and see without having to interrupt the person responsible.</p>
<h2>Summary</h2>
<p>Sifter doesn’t differentiate any of these types of data internally, because it’s generally not relevant. It’s a distinction without a difference. At the highest level, it’s all simply bits of data that need a formal resolution. It’s work that needs to be done regardless of what “type” it is.</p>
<p>In general, there’s three key points when tracking this stuff. First, it’s about getting data into Sifter, which means making sure that all of the different types of data fit comfortably. If the data isn’t in the app, then nothing else matters.</p>
<p>Second, it’s about enabling a workflow towards a discrete outcome. Issues need to be closed. There’s <a href="http://journal.sifterapp.com/blog/2011/07/why-on-hold-is-evil/">no “on hold” or “pending” statuses</a> because that’s a way to avoid taking action one way or the other. Our philosophy is that either it’s going to get done and closed as completed or it needs to be closed out right away if it’s not going to happen.</p>
<p>Finally, it’s about a central and searchable place to record decisions. We’ve all had those moments where we look back and wonder “why did we decide not to do this?” or “what was our final decision on that problem?”. Verbal agreements are worthless. With an issue tracker, everything is documented, and it’s always accessible. If your bugs were in one system and your issues or questions or enhancements in another system, that’s not easy to figure out.</p>Garrett DimonBalancing Simplicity with Obscurity501b432bdabe9d01aa01036c2012-08-06T10:13:58-05:002012-08-06T09:50:00-05:00In the name of simplicity, when we setup new projects, we don't automatically create categories or milestones. Not all projects or teams need them, so we didn't want to be be presumptuous. Unfortunately, that created some confusion and misunderstanding.<p>By not setting up any categories or milestones by default, many potential customers assumed that Sifter simply didn’t offer them. Not everyone immediately digs into the settings to look for features. We needed a way to let people know that Sifter did offer categories and milestones, but if a team didn’t want to use them, it didn’t make sense to leave a permanent reminder taking up real estate.</p>
<p>So, instead of displaying a constant reminder in place of the category and milestone drop downs, we now only display the suggestion to create categories or milestones during the first 24 hours of a project’s life. That way, the reminder is there when it’s useful, but then it’s out of the way once the project is underway.</p>
<figure><img src="http://journal.sifterapp.com/assets/501b4543dabe9d27d1023adb/1new.png" alt="A screenshot of the issue form with category and milestone suggestions." /><figcaption><b>Figure 1</b> The new issue form now displays a sort of “Did you know?” bit about creating categories and milestones in projects. However, it only displays it for the first 24 hours of a new project so as not to get in the way going forward.</figcaption></figure>
<figure><img src="http://journal.sifterapp.com/assets/501b4544dabe9d27d1023ae9/2comment.png" alt="A screenshot of the comment form with category and milestone suggestions." /><figcaption><b>Figure 2</b> The new issue form now displays a sort of “Did you know?” bit about creating categories and milestones in projects. However, it only displays it for the first 24 hours of a new project so as not to get in the way going forward.</figcaption></figure>
<p>We always want to avoid weighing down the interface with clutter, but sometimes that leads to the unfortunate consequence of obscuring or hiding features. We’re always walking a fine line, but this was just one of those situations where a nice simple solution seemed to do the trick and work out great for all parties.</p>Garrett Dimon