<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Fog Creek Blog</title>
	
	<link>http://blog.fogcreek.com</link>
	<description>Helping the world's best developers make better software</description>
	<lastBuildDate>Mon, 07 May 2012 15:05:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/FogCreekBlog" /><feedburner:info uri="fogcreekblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Source-Control-Like Comments for Timesheet Intervals in FogBugz</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/7b6BRm5Fmt0/</link>
		<comments>http://blog.fogcreek.com/source-control-like-comments-for-timesheet-intervals-in-fogbugz/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 15:29:56 +0000</pubDate>
		<dc:creator>Adam Wishneusky</dc:creator>
				<category><![CDATA[FogBugz]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2317</guid>
		<description><![CDATA[As a support engineer here at Fog Creek, I get to play around pretending to be a programmer sometimes, mostly to help customers with Plugin and XML API codez. I recently collaborated with an intrepid FogBugz user to create this plugin which allows you to put a comment on each time interval. It adds a [comment] [...]]]></description>
			<content:encoded><![CDATA[<p>As a support engineer here at Fog Creek, I get to play around pretending to be a programmer sometimes, mostly to help customers with <a title="FogBugz Plugin development" href="https://developers.fogbugz.com/default.asp?W1">Plugin</a> and <a title="FogBugz XML API" href="http://fogbugz.stackexchange.com/fogbugz-xml-api">XML API</a> codez. I recently collaborated with an intrepid FogBugz user to create this plugin which allows you to put a comment on each time interval. It adds a <strong>[comment]</strong> link in the timesheet editor:</p>
<p><img src="http://our.fogbugz.com/default.asp?pg=pgDownload&amp;pgType=pgWikiAttachment&amp;ixAttachment=192366&amp;sFileName=timesheet%20editor.png" alt="timesheet editor" width="631" height="163" /></p>
<p>When you click it, you can enter a comment in a new dialog:</p>
<p><img src="http://our.fogbugz.com/default.asp?pg=pgDownload&amp;pgType=pgWikiAttachment&amp;ixAttachment=192365&amp;sFileName=time%20interval%20comment%20editor.png" alt="comment dialog" width="566" height="125" /></p>
<p>which then shows up in in the editor:</p>
<p><img src="http://our.fogbugz.com/default.asp?pg=pgDownload&amp;pgType=pgWikiAttachment&amp;ixAttachment=192364&amp;sFileName=timesheet%20editor%20with%20comment.png" alt="timesheet editor with new comment" width="619" height="163" /></p>
<p>The plugin uses some javascript hackery to modify the timesheet editor since there is no plugin interface to implement to change its functionality. As such, it works with FogBugz 8.7 and is not tested and approved for FogBugz On Demand. You can download the plugin to run on your own local FogBugz server, and get the source code from my post <a title="FogBugz Knowledge Exchange" href="http://fogbugz.stackexchange.com/questions/3316/feature-request-ability-to-enter-a-note-with-time-intervals-a-la-source-code-ch/3364#3364">here on the FogBugz Knowledge Exchange</a>.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/7b6BRm5Fmt0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/source-control-like-comments-for-timesheet-intervals-in-fogbugz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fsource-control-like-comments-for-timesheet-intervals-in-fogbugz%2F&amp;seed_title=Source-Control-Like+Comments+for+Timesheet+Intervals+in+FogBugz</feedburner:origLink></item>
		<item>
		<title>WebPutty: The Open Source Transmogrifier</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/u7nE8RiXbpw/</link>
		<comments>http://blog.fogcreek.com/webputty-open-source-transmogrifier/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 17:27:21 +0000</pubDate>
		<dc:creator>Dane Bertram</dc:creator>
				<category><![CDATA[WebPutty]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2293</guid>
		<description><![CDATA[We announced that we were open-sourcing WebPutty back at the end of February, and now its source is open; out there wild and free for all to see! Just check out WebPutty on GitHub, follow the instructions there, and you should have your own sparkly new copy of WebPutty up and running in a matter [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-2296" style="border: none; box-shadow: none; -mox-box-shadow: none; -webkit-box-shadow: none;" title="WebPutty + Open Source = AWESOME!" src="http://blog.fogcreek.com/wp-content/uploads/2012/04/open_source_webputty.png" alt="WebPutty + Open Source = AWESOME!" width="667" height="222" /></p>
<p>We announced that we were <a title="What's up with WebPutty?" href="http://blog.fogcreek.com/whats-up-with-webputty/">open-sourcing WebPutty</a> back at the end of February, and now its source is open; out there wild and free for all to see!</p>
<p>Just check out <a title="Fork WebPutty on GitHub" href="https://github.com/FogCreek/WebPutty/">WebPutty on GitHub</a>, follow the instructions there, and you should have your own sparkly new copy of WebPutty up and running in a matter of minutes. Sweetness!</p>
<p>Important reminders about <a title="WebPutty.net" href="http://www.webputty.net">www.webputty.net</a>:</p>
<ul>
<li>WebPutty.net (and any stylesheets hosted there) will be available until <span style="color: #ff0000;"><strong>December 31, 2012</strong></span>. Past that point, you will need to migrate to your own WebPutty installation, or find another provider.</li>
<li>You can export any of your stylesheets hosted on WebPutty.net by opening those stylesheets in WebPutty’s editor and clicking the “Export” button in the upper-right-hand corner of the editor.</li>
</ul>
<div>Thanks for all of your support with WebPutty. We&#8217;re excited to see where you all can take it!</div>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/u7nE8RiXbpw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/webputty-open-source-transmogrifier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fwebputty-open-source-transmogrifier%2F&amp;seed_title=WebPutty%3A+The+Open+Source+Transmogrifier</feedburner:origLink></item>
		<item>
		<title>Trello for Multiple Devices: Slides Edition</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/AT8YyH6QPwg/</link>
		<comments>http://blog.fogcreek.com/trello-for-multiple-devices-slides-edition/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 19:57:10 +0000</pubDate>
		<dc:creator>Bobby Grace</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2278</guid>
		<description><![CDATA[I did a talk last week for the Software Development Cluster at Purdue Research Park about implementing Trello&#8217;s responsive design. It covers a lot of the material in this post, but gives a few more examples and technical details. I cleaned up the slides and they are now ready for your viewing pleasure. View Designing [...]]]></description>
			<content:encoded><![CDATA[<p>
I did a talk last week for the Software Development Cluster at Purdue Research Park about implementing Trello&#8217;s responsive design. It covers a lot of the material in <a href="http://blog.fogcreek.com/building-trello-com-for-multiple-devices/">this post</a>, but gives a few more examples and technical details. I cleaned up the slides and they are now ready for your viewing pleasure.
</p>
<p><a href="http://www.scribd.com/doc/86367558/Designing-and-Developing-Trello-for-Multiple-Devices">View Designing and Developing Trello for Multiple Devices on Scribd</a></p>
<p><iframe id="doc_22718" src="http://www.scribd.com/embeds/86367558/content?start_page=1&amp;view_mode=slideshow&amp;access_key=key-1fixqljq3ra9t2k47wfr" frameborder="0" width="100%" height="450" data-auto-height="true" data-aspect-ratio="1.29936305732484"></iframe></p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/AT8YyH6QPwg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/trello-for-multiple-devices-slides-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Ftrello-for-multiple-devices-slides-edition%2F&amp;seed_title=Trello+for+Multiple+Devices%3A+Slides+Edition</feedburner:origLink></item>
		<item>
		<title>What’s up with WebPutty</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/TDwcqf8AktE/</link>
		<comments>http://blog.fogcreek.com/whats-up-with-webputty/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 18:18:04 +0000</pubDate>
		<dc:creator>Dane Bertram</dc:creator>
				<category><![CDATA[WebPutty]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2259</guid>
		<description><![CDATA[Update: We&#8217;ve finished open-sourcing WebPutty! First, the short version: WebPutty’s going to go open-source! If you want to host your own installation, you’re going to be able to. While the official WebPutty.net site has had a wonderful reaction from the community, we can’t justify keeping it around as a Fog Creek product. WebPutty.net (and any [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> We&#8217;ve <a title="WebPutty: The Open Source Transmogrifier" href="http://blog.fogcreek.com/webputty-open-source-transmogrifier/">finished open-sourcing WebPutty!</a></p>
<p>First, the short version:</p>
<ul>
<li>WebPutty’s going to go open-source! If you want to host your own installation, you’re going to be able to.</li>
<li>While the official <a href="http://www.webputty.net/" target="_blank">WebPutty.net</a> site has had a wonderful reaction from the community, we can’t justify keeping it around as a Fog Creek product. WebPutty.net (and any stylesheets hosted there) will continue to be available until at least December 31, 2012. Past that point, you will need to migrate to your own WebPutty installation, or find another provider.</li>
<li>If you’re concerned about any of the above, you can export any of your stylesheets hosted with WebPutty by opening those stylesheets in WebPutty&#8217;s editor and clicking the “Export” button in the upper-right-hand corner of the editor.</li>
</ul>
<p>Questions? Concerns? Interested in taking over the hosting? Please contact us at <a href="mailto:webputty@fogcreek.com">webputty@fogcreek.com</a>.</p>
<p>And now the more detailed version&#8230;</p>
<p>WebPutty has been unique for Fog Creek from day one. The initial idea for WebPutty came up during a one-off brainstorming session Tyler and I held with <a href="http://shipordie.com/" target="_blank">Jason</a>, a former Creeker (and good friend). Tyler and I had already spent a few weeks brainstorming ideas for new products with Joel and Michael, but when the idea for WebPutty (code-named “CSSFiddle” at the time) popped into our heads, we couldn’t resist getting a simple proof-of-concept version of it up and running.</p>
<p>So that’s what we did. We sat down in Tyler’s office one June day in 2011 and in just one single afternoon got the basic premise behind WebPutty, a live preview of as-you-type-it CSS, working on Google AppEngine. When we showed it to Joel and Michael, we all agreed to give WebPutty a shot. We had no idea whether it would be successful; we just knew it was awesome, and we wanted to try. On July 20th, a mere six weeks later, we launched WebPutty to the world in an <a href="http://blog.fogcreek.com/webputty-css-editing-goes-boink/" target="_blank">announcement</a> that was one of our most popular blog posts ever!</p>
<p>Needless to say, we were very happy to have received such a warm response, and after coming down from <a href="http://bjk5.com/post/3537691485/shipping-is-one-heck-of-a-drug" target="_blank">the high of shipping</a>, Tyler wrote up a more detailed summary of <a href="http://tghw.com/blog/lean-development-zero-to-launch-in-six-weeks/" target="_blank">how WebPutty came into being in just six weeks</a>.</p>
<p>Fast-forward seven months. Where is WebPutty now? Well, despite us doing effectively zero marketing for WebPutty, we’ve gotten some pretty respectable numbers:</p>
<ul>
<li>Over 25,000 people have logged in and taken a look around</li>
<li>Over 9,000 sites (collections of stylesheets) have been created</li>
<li>Millions of CSS requests have been served by our WebPutty CDN</li>
<li>Thousands of happy tweets from customers using WebPutty have graced our feeds</li>
</ul>
<p>Not bad!</p>
<p>&#8230;but also not good enough. Despite these promising numbers, WebPutty has not seen the broad user adoption we would have liked. Given Fog Creek’s current size, we do not plan to continue developing WebPutty. Instead, we&#8217;re going to open source the code and see where the community takes it.</p>
<p>But don&#8217;t worry! We will continue to host WebPutty.net until at least December 31, 2012. We&#8217;ll be blogging again with more details after we’ve had a chance to clean up the code base for public release, including providing documentation for getting your own copy of WebPutty up and running.</p>
<p>WebPutty has been a giant experiment from day one. It’s the first product we&#8217;ve come up with in this manner, the first product we&#8217;ve launched so quickly, the first free-right-off-the-bat product we’ve launched, and now will be the first complete product we&#8217;ve ever open-sourced. WebPutty&#8217;s taught us a lot, and we&#8217;re proud of how it&#8217;s been received and the things it&#8217;s helped others question when it comes to making website design and development easier. Did it change the world? Not quite. But did we have a blast working on it and make the lives of others at least a little easier in the process? You bet we did.</p>
<p>We appreciate everyone who&#8217;s taken a look at WebPutty and hope that at least some of those same people will consider contributing to WebPutty&#8217;s code base once it&#8217;s been open sourced. We’re excited to see where the ideas behind WebPutty can be taken once a broader audience of people are able to contribute to it.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/TDwcqf8AktE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/whats-up-with-webputty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fwhats-up-with-webputty%2F&amp;seed_title=What%26%238217%3Bs+up+with+WebPutty</feedburner:origLink></item>
		<item>
		<title>Better BugzScout Error Reporting</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/rTj34m9ZB6s/</link>
		<comments>http://blog.fogcreek.com/better-bugzscout-error-reporting/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 21:31:01 +0000</pubDate>
		<dc:creator>Jude Allred</dc:creator>
				<category><![CDATA[FogBugz]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2194</guid>
		<description><![CDATA[Prelude and a pain point. One of the many ways to spawn cases in FogBugz is via a mechanism we call BugzScout. BugzScout is a simple interface for collecting crash reports from your software in the wild. For example, you might add an exception handler to your product which hooks into BugzScout so that when [...]]]></description>
			<content:encoded><![CDATA[<h2 style="margin-top: 0px;">Prelude and a pain point.</h2>
<p>One of the many ways to spawn cases in FogBugz is via a mechanism we call <a href="http://fogbugz.stackexchange.com/questions/315/bugzscout-to-capture-errors" title="Using BugzScout to capture errors" target="_blank">BugzScout</a>. BugzScout is a simple interface for collecting crash reports from your software in the wild. For example, you might add an exception handler to your product which hooks into BugzScout so that when your customers encounter errors, you receive a case in FogBugz with details about the problem. Unlike the FogBugz XML API, which can also be used to serve this use case, BugzScout doesn&#8217;t require that you embed any type of FogBugz security token in your deployed application, and BugzScout will automatically collate all of the bug reports into cases based on titles of the reports.</p>
<p>We use BugzScout extensively throughout our own infrastructure &#8212; when FogBugz accounts misbehave, if an unparseable email gets stuck in an account&#8217;s mail queue, if an account&#8217;s full-text search index gets corrupted, etc., we receive cases in our FogBugz environment detailing the problem and often including key diagnostic information such as stack traces and assorted report-specific meta-data.</p>
<p>BugzScout has been around for a while, long enough to get a little crufty, and we&#8217;ve felt some BugzScout pain as we&#8217;ve scaled up.  Pain can lead to cases:</p>
<p><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/BugzScout-might-not-be-ideal.png"><img src="http://blog.fogcreek.com/wp-content/uploads/2012/01/BugzScout-might-not-be-ideal.png" alt="" title="BugzScout might not be ideal" width="820" height="721" class="alignnone size-full wp-image-2222" /></a></p>
<p>We generally agreed with these suggestions, and we&#8217;ve definitely known the frustration of some small process misbehaving and sending literally thousands of BugzScout reports our way.</p>
<h2> Better. </h2>
<p>The first thing we came up with was what we all thought would be a completely amazing BugzScout-esque product which could solve the BugzScout use case perfectly.  But we didn&#8217;t build that&#8230; its scope was slightly larger than the part-of-a-week we wanted to spend on it.  Plus, building a new product wouldn&#8217;t have solved our immediate problems fast enough.  Our driving force behind the improvements became the following insight:</p>
<p>Sometimes you get a human-readable number of BugzScout reports.  In these cases, you absolutely want the full error text from each occurrence, and it&#8217;s reasonable to route the event through all of the standard notification hooks.  If someone doesn&#8217;t want to hear more about this error, they can direct BugzScout to stop reporting via editing the case. </p>
<p>Other times, you get so many reports that no human will read them.  The case is spammed with stack traces and error notifications.   After some point,  additional stack traces are of no use &#8212; you&#8217;re not going to read through them anyway, they just make the case cumbersome.  At this scale, you need BugzScout to do a few things:</p>
<ol>
<li><em>Shut up and let me fix it</em>.  You&#8217;ve already gotten a bunch of emails about the problem-  one additional email per occurrence is of no use to anyone, but can legitimately hinder your efforts to actually deal with the problem.</li>
<li><em>Help me know I&#8217;ve fixed it</em>.  It&#8217;s always been possible to determine if more reports are coming in by either watching the occurrence count of the BugzScout case or by monitoring when the case was last modified by BugzScout.  Unfortunately, if you wanted to accomplish #1 by setting BugzScout to &#8216;Stop Reporting&#8217;, you&#8217;d also stop getting updated timestamps from when new reports came in.</li>
</ol>
<p>We decided that reconciling #1 and #2 would be a great improvement for BugzScout and would be well within the scope of a few days of development.  We felt confident that this type of change would solve our pain point, but before we went any further we wanted to make sure we weren&#8217;t operating in a no-fact zone. We reached out to our SaaS platform and gathered some anonymous data on how people were using BugzScout.  The data confirmed our guess:  Our use cases are valid and a significant amount of people are using BugzScout-based error reporting.  </p>
<p>We settled on:</p>
<ul>
<li> BugzScout will now automatically place itself into &#8220;Stop Reporting&#8221; mode after 50 occurrences of a report. </li>
<li> Last Occurrence is a new case field which is stored alongside all BugzScout cases and is fully searchable, filterable, etc.  Last Occurrence is the timestamp of the most recent BugzScout report,  regardless of whether that report was recorded as a case event.</li>
</ul>
<p>Resulting in:</p>
<ul>
<li> Human-readable amounts of BugzScout reports should be unaffected.</li>
<li> Human-<strong>un</strong>readable amounts BugzScout reports will automatically cut off after 50.  This means that the bloody tide of email will be curbed; BugzScout cases are limited to having a workable number of events in them.</li>
<li> If it comes time to collect more reports,  you can do this by editing the case and instructing Scout to &#8216;Continue Reporting&#8217;. </li>
<li> Last Occurrence is a new and useful filterable value. </li>
</ul>
<h2> Shipped. </h2>
<p>We&#8217;ve been dogfooding the new BugzScout in our FogBugz environment for the last month and have been quite happy with the improvements.  We&#8217;ve found that the automatic shutoff of case event generation after 50 reports has allowed us to function much better when dealing with issues at scale.</p>
<p>Here&#8217;s an example of how our team likes to monitor the incoming BugzScout reports using the new Last Occurrence column:</p>
<p><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/Filtering-by-BugzScout1.png"><img src="http://blog.fogcreek.com/wp-content/uploads/2012/01/Filtering-by-BugzScout1.png" alt="" title="Filtering by BugzScout" width="1262" height="506" class="alignnone size-full wp-image-2247" /></a></p>
<p>This isn&#8217;t the only way we triage our BugzScout reports, but this simple filter lets us quickly spot any issues that are happening <em>right now</em> and know if they&#8217;ve happened with enough frequency to warrant immediate attention.</p>
<p>These changes went <a href="http://status.fogcreek.com/2012/01/fogbugz-and-kiln-on-demand-upgrade-on-sunday-2012-01-29-at-0300-gmt.html" title="We shipped! Click for details." target="_blank">live to FogBugz On Demand two days ago</a>, so we hope that you&#8217;ve found them useful.  Licensed FogBugz customers will get these changes in our next licensed release.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/rTj34m9ZB6s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/better-bugzscout-error-reporting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fbetter-bugzscout-error-reporting%2F&amp;seed_title=Better+BugzScout+Error+Reporting</feedburner:origLink></item>
		<item>
		<title>Building trello.com for multiple devices</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/MM1Ss_7KCxA/</link>
		<comments>http://blog.fogcreek.com/building-trello-com-for-multiple-devices/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 18:00:27 +0000</pubDate>
		<dc:creator>Bobby Grace</dc:creator>
				<category><![CDATA[Trello]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2133</guid>
		<description><![CDATA[We built Trello from the ground up to work on just about any device. It&#8217;s not a simplified version with limited features, either. Trello responds to your device&#8217;s screen size and capabilities. It&#8217;s the same exact site and the same exact code; a consistent experience that looks, feels, and works the same everywhere. But we [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-sizes_v.png"><img class="alignright size-full wp-image-2147" style="margin-top: 0px; margin-right: 0px; margin-bottom: 12px; margin-left: 16px; float: right;" title="trello-sizes_v" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-sizes_v.png" alt="Trello at various sizes on multiple devices" width="300" height="449" /></a>We built <a title="Trello" href="https://trello.com" target="_blank">Trello</a> from the ground up to work on just about any device. It&#8217;s not a simplified version with limited features, either. Trello responds to your device&#8217;s screen size and capabilities. It&#8217;s the same exact site and the same exact code; a consistent experience that looks, feels, and works the same everywhere.</p>
<p>But we also have an iPhone app. It&#8217;s pretty great if I may say so. If you are a Trello user with an iPhone, you should <a title="Trello in the App Store" href="http://itunes.com/apps/trello" target="_blank">download it now</a>. It&#8217;s free. Now that there is a great app, why would we still focus on a mobile web app? One reason is that focusing on mobile makes Trello better as a whole.</p>
<p><strong>Everything we do for mobile translates back to a better desktop experience.</strong> This wasn&#8217;t the first reason we wanted to implement a responsive design, but it turned out to be the most important. Keeping mobile in mind focuses us on creating a fast and easy-to-use interface. Trello gets data super fast, but the page must also render quickly. That stops us from using complex interactions and some of the more whiz-bang CSS features. This translates back to rendering speed on your desktop, which isn&#8217;t likely to be an overclocked gaming rig with 32GB of RAM.</p>
<p>All the interface elements are mobile-friendly, which means they are also more desktop-friendly. Buttons and menus have big, friendly hit targets. Interactions are straight-forward. We don&#8217;t rely on hidden hover effects and if we&#8217;ve got a complex interaction, it will have a fallback for touch devices.</p>
<p><strong>There are no redirects.</strong> Let&#8217;s say you&#8217;re on your phone and somebody links to trello.com from Twitter. You&#8217;re able to watch the video, read the pitch, sign up, and try it out. You are left with a good impression, no nonsense. No screaming &#8220;DOWNLOAD THE APP!&#8221; page, no switching out of whatever app your using, and you won&#8217;t be redirected five times and land on the m.trello.com homepage. You just get the information and it works.</p>
<p><strong>Scaling, zooming, and resizing work seamlessly.</strong> Sometimes you want to use a small browser window on a desktop. Maybe you&#8217;ve got a side monitor with a Trello board and your mail app open while your text editor or photo editor are up on your main screen. The horizontal board view won&#8217;t work at smaller window sizes, but Trello will adapt to a view that does. If you need bigger or smaller text, you can zoom in (or out) as much as you need and Trello will use a view that works. Got a huge monitor and want to project your Trello board for all to see? Trello will work for that as well. Is it way far back in the office? Just zoom in and text will be readable.</p>
<p><strong>We can deliver updates to all devices seamlessly.</strong> We have a single codebase and one place to deploy, which means updates are easy. We don&#8217;t have to retro-fit new features to a separate codebase, worry about new workflows or interactions, or think about how some URL is going to work. This lets us develop and ship features faster.</p>
<h2>So how does it all work?</h2>
<p>Here are some of the tools and tricks that made developing a responsive interface much easier.</p>
<p><strong>Use a limited library of mobile-optimized, reusable components.</strong> Each component can be collapsed into a single column or otherwise adjusts for smaller screen sizes. The same layout elements used for the back of cards are used in the organization profile and a bunch of other pages. Our context menus (those small pop-ups used to do things like assign members and select labels) are narrow enough that they will fit on any screen. We have some one-offs like the landing page and the board, but they are few and far between. For the most part, we don&#8217;t have to ask how a new feature is going to work on mobile because any component we use will already be mobile-optimized.</p>
<p><strong><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/card-menu.png"><img class="alignright size-medium wp-image-2148" style="float: right; margin: 0 0 12px 16px;" title="card-menu" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/card-menu-300x266.png" alt="Card menu on card detail" width="300" height="266" /></a>Think twice about navigation.</strong> The card sidebar typically has navigation and buttons for voting, assigning, and the like. It collapses below the main column with a smaller window, which means you would have to scroll and scroll to get to that vote button you were looking for. We added a card menu to the header on the back of cards that lets you easily vote, add due dates, assign members, and everything else without wearing out your thumb.</p>
<p style="clear: both;"><strong>Use a vector-based image editor like Illustrator to produce icons.</strong> We wanted to make sure icons looked sharp on devices with a higher pixel ratio like the the iPhone 4. We use a CSS sprite sheet that has every icon used on the site. We can easily export a higher resolution version using Illustrator, and serve it to capable devices using some simple CSS media queries.</p>
<p><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;"><img class="alignnone size-full wp-image-2149" style="clear: both; margin: 8px 0; display: block;" title="trello-icons" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-icons.png" alt="Trello icon sprite sheet" width="690" height="144" /></span></p>
<h2>That being said&#8230;</h2>
<p>We&#8217;re developing for the browsers and devices of today and tomorrow. We don&#8217;t have spare development time, so we can&#8217;t spend any on browsers and devices that won&#8217;t be around in two to three years. Trello won&#8217;t work on the RAZR, for instance. It also doesn&#8217;t work on every &#8216;smart&#8217; device. Internet Explorer 8 doesn&#8217;t have the technical capabilities to run Trello. The Windows Phone 7.0 browser is based off of IE8, so it won&#8217;t work either. But it will work on Android 2.3+, iOS 4.0+, Windows Phone 7.5 (Mango), and others. Are we neglecting would-be happy users? Perhaps. But we can provide more value to more people by shipping features faster and that&#8217;s better in the long run.</p>
<p>And we still love native apps! Apps provide things we can&#8217;t get out of the web: better speed, offline support, smooth animations, push notifications, and a native look and feel. Native apps will provide a better experience to a broader reach. We just don&#8217;t think the mobile web should be ignored because of them.</p>
<p>Designing for multiple devices has deeply influenced our design decisions and made for a better, faster, and easier-to-use product. There are plenty of improvements to be made, but we&#8217;re happy with the foundation we&#8217;ve set. <a title="Sign up for Trello" href="http://trello.com/signup" target="_blank">Sign up now</a> and check it out for yourself.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/MM1Ss_7KCxA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/building-trello-com-for-multiple-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fbuilding-trello-com-for-multiple-devices%2F&amp;seed_title=Building+trello.com+for+multiple+devices</feedburner:origLink></item>
		<item>
		<title>The Trello Tech Stack</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/LA5PWsDxvYY/</link>
		<comments>http://blog.fogcreek.com/the-trello-tech-stack/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 16:17:32 +0000</pubDate>
		<dc:creator>Brett Kiefer</dc:creator>
				<category><![CDATA[Trello]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2097</guid>
		<description><![CDATA[Trello started as an HTML mockup that Justin and Bobby, the Trello design team, put together in a week. I was floored by how cool it looked and felt. Since Daniel and I joined the project to prototype and build Trello, the challenge for the team has been to keep the snappy feeling of the [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Trello" href="http://trello.com">Trello</a> started as an HTML mockup that <a title="Justin on Trello" href="https://trello.com/justin" target="_blank">Justin</a> and <a title="Bobby on Trello" href="https://trello.com/bobbygrace" target="_blank">Bobby</a>, the Trello design team, put together in a week. I was floored by how cool it looked and felt. Since <a title="Daniel on Trello" href="https://trello.com/daniel" target="_blank">Daniel</a> and <a title="Brett on Trello" href="http://trello.com/brett" target="_blank">I</a> joined the project to prototype and build Trello, the challenge for the team has been to keep the snappy feeling of the initial mockups while creating a solid server and a maintainable client.</p>
<div id="attachment_2098" class="wp-caption alignnone" style="width: 610px"><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-v0.png"><img class="size-medium wp-image-2098" title="trello-v0" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-v0.png" alt="The Initial Trello Mockup" width="600" height="285" /></a><p class="wp-caption-text">The Initial Trello Mockup</p></div>
<p>That led us toward a single-page app that would generate its UI on the client and accept data updates from a push channel. This is pretty far from any of the work we’ve done before at Fog Creek, so from a technical perspective Trello has been an adventure.</p>
<p>Initially, we were wondering how interesting and far-out the stack could be before management got nervous, but our concerns were addressed in an early meeting with <a title="Joel on Software" href="http://joelonsoftware.com" target="_blank">Joel</a>, when he said “Use things that are going to work great in two years.”</p>
<p>So we did. We have consistently opted for promising (and often troublesome) new technologies that would deliver an awesome experience over more mature alternatives. We’re about a year in, and it&#8217;s been a lot of fun.</p>
<h2>CoffeeScript</h2>
<p>Trello started out as a pure JavaScript project on both client and server, and stayed that way until May, when we experimentally ported a couple of files to <a title="CoffeeScript Home" href="http://coffeescript.org" target="_blank">CoffeeScript</a> to see how we liked it. We loved it, and soon converted the rest of the code over and started coding CoffeeScript exclusively.</p>
<p>CoffeeScript is a language that compiles to <em>readable</em> JavaScript. It existed when we started Trello, but I was worried about the added complexity of having to debug compiled code rather than directly debug the source. When we tried, it, though, the conversion was so clean that mapping the target code to the source when debugging in Chrome required little mental effort, and the gains in code brevity and readability from CoffeeScript were obvious and compelling.</p>
<p>JavaScript is a really cool language. Well-written CoffeeScript smooths out and shortens JavaScript, while maintaining the same semantics, and does not introduce a substantial debugging indirection problem.</p>
<h2>The Client</h2>
<ul>
<li><a title="Backbone.js" href="http://documentcloud.github.com/backbone/" target="_blank">Backbone.js</a> (client-side MVC)</li>
<li><a title="HTML5 Apis" href="http://dev.w3.org/html5/html4-differences/#apis" target="_blank">HTML5</a> pushState</li>
<li><a title="Mustache" href="http://mustache.github.com/" target="_blank">Mustache</a> (templating language)</li>
</ul>
<p>The Trello servers serve virtually no HTML. In fact, they don’t serve much client-side code at all. A Trello page is a thin (2k) shell that pulls down the Trello client-side app in the form of a single minified and compressed JS file (including our third-party libraries and our compiled CoffeeScript and Mustache templates) and a CSS file (compiled from our LESS source and including inlined images). All of that comes in under 250k, and we serve it from Amazon’s <a href="http://aws.amazon.com/cloudfront/" target="_blank">CloudFront</a> CDN, so we get very low-latency loads in most locations. In reasonably high-bandwidth cases, we have the app up and running in the browser window in about half a second. After that, we have the benefit of caching, so subsequent visits to Trello can skip that part.</p>
<p>In parallel, we kick off an AJAX data load for the first page’s data content and try to establish a <a title="WebSockets on Wikipedia" href="http://en.wikipedia.org/wiki/WebSocket" target="_blank">WebSocket </a>connection to the server.</p>
<h3>BACKBONE.JS</h3>
<p>When the data request returns, Backbone.js gets busy. The idea with Backbone is that we render each Model that comes down from the server with a View, and then Backbone provides an easy way to:</p>
<ol>
<li>Watch for DOM events within the HTML generated by the View and tie those to methods on the corresponding Model, which re-syncs with the server</li>
<li>Watch the model for changes, and re-render the model’s HTML block to reflect them</li>
</ol>
<p>Neat! Using that general approach, we get a fairly regular, comprehensible, and maintainable client. We custom-built a client-side Model cache to handle updates and simplify client-side Model reuse.</p>
<h3>PUSHSTATE</h3>
<p>Now that we have the entire client app loaded in the browser window, we don’t want to waste any time with page transitions. We use HTML5 pushState for moving between pages; that way we can give proper and consistent links in the location bar, and just load data and hand off to the appropriate Backbone-based controller on transition.</p>
<h3>MUSTACHE</h3>
<p>We use Mustache, a logic-less templating language, to represent our models as HTML. While ‘harnessing the full power of [INSERT YOUR FAVORITE LANGUAGE HERE] in your templates’ sounds like a good idea, it seems that in practice it requires a lot of developer discipline to maintain comprehensible code. We’ve been very happy with the ‘less is more’ approach of Mustache, which allows us to re-use template code without encouraging us to mingle it with our client logic and make a mess of things.</p>
<h2>Pushing and Polling</h2>
<p>Realtime updates are not a new thing, but they’re an important part of making a collaborative tool, so we have spent some time on that layer of Trello.</p>
<h3>SOCKET.IO AND WEBSOCKETS</h3>
<p>Where we have browser support (recent Chrome, Firefox, and Safari), we make a WebSocket connection so that the server can push changes made by other people down to browsers listening on the appropriate channels. We use a modified version<strong><a href="#asterisk">*</a></strong> of the <a title="Socket.io" href="http://socket.io/" target="_blank">Socket.io</a> client and server libraries that allows us to keep many thousands of open WebSockets on each of our servers at very little cost in terms of CPU or memory usage. So when anything happens to a board you’re watching, that action is published to our server processes and propagated to your watching browser with very minimal latency, usually well under a second.</p>
<h3>AJAX POLLING</h3>
<p>It ain&#8217;t fancy, but it works.</p>
<div id="attachment_2099" class="wp-caption alignright" style="width: 298px"><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-freehand.jpg"><img class="size-full wp-image-2099 " title="trello-freehand" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-freehand.jpg" alt="Early Architecture Drawing" width="288" height="420" /></a><p class="wp-caption-text">Early Architecture Drawing</p></div>
<p>When the client browser doesn’t support WebSockets (I’m lookin’ at you, Internet Explorer), we just make tiny AJAX requests for updates every couple of seconds while a user is active, and back off to polling every ten seconds when the user goes idle. Because our server setup allows us to serve HTTPS requests with very little overhead and keep TCP connections open, we can afford to provide a decent experience over plain polling when necessary.</p>
<p>We tried Comet, via the downlevel transports for Socket.io, and all of them were (at the time) shaky in one way or another. Also, Comet and WebSockets seemed to be a risky basis for a major feature of the app, and we wanted to be able to fall back on the most simple and well-established technologies if we hit a problem.</p>
<p>We hit a problem right after launch. Our WebSocket server implementation started behaving very strangely under the sudden and heavy real-world usage of <a href="http://techcrunch.com/2011/09/13/joel-spolskys-trello-is-a-simple-workflow-and-list-manager-for-groups/" target="_blank">launching at TechCrunch disrupt</a>, and we were glad to be able to revert to plain polling and tune server performance by adjusting the active and idle polling intervals. It allowed us to degrade gracefully as we increased from 300 to 50,000 users in under a week. We’re back on WebSockets now, but having a working short-polling system still seems like a very prudent fallback.</p>
<h2>The Server</h2>
<ul>
<li>node.js</li>
<li>HAProxy</li>
<li>Redis</li>
<li>MongoDB</li>
</ul>
<h3>NODE.JS</h3>
<p>The server side of Trello is built in <a title="Node.js" href="http://nodejs.org" target="_blank">Node.js</a>. We knew we wanted instant propagation of updates, which meant that we needed to be able to hold a <em>lot</em> of open connections, so an event-driven, non-blocking server seemed like a good choice. Node also turned out to be an amazing prototyping tool for a single-page app. The prototype version of the Trello server was really just a library of functions that operated on arrays of Models in the memory of a single Node.js process, and the client simply invoked those functions through a very thin wrapper over a WebSocket. This was a very fast way for us to get started trying things out with Trello and making sure that the design was headed in the right direction. We used the prototype version to manage the development of Trello and other internal projects at Fog Creek.</p>
<p>By the time we had finished the prototype, we were good and comfortable in Node and excited about its capabilities and performance, so we stuck with it and made our Pinocchio proto-Trello a real boy; we gave it:</p>
<ul>
<li>a real DB and Schema (<a title="node-mongodb-native" href="https://github.com/christkv/node-mongodb-native" target="_blank">node-mongodb-native</a> and <a title="mongoose" href="https://github.com/LearnBoost/mongoose" target="_blank">Mongoose</a>)</li>
<li>basic web tech like routes and cookies (<a title="Express" href="http://expressjs.com" target="_blank">Express</a> and <a title="Connect" href="http://www.senchalabs.org/connect/" target="_blank">Connect</a>)</li>
<li>multiple server processes with zero-downtime restarts (<a title="Cluster" href="http://learnboost.github.com/cluster/" target="_blank">Cluster</a>)</li>
<li>inter-process pubsub and structured data sharing via Redis (<a title="node_redis" href="https://github.com/mranney/node_redis" target="_blank">node_redis</a>)</li>
</ul>
<div>Node is great, and getting better all of the time as its active developer community churns out new and useful libraries. The huge amount of continuation passing that you have to do is an issue at first, and it takes a couple of weeks to get used to it. We use a really excellent <a href="https://github.com/caolan/async" title="Async">async library</a> (and the increased code brevity of CoffeeScript) to keep our code under control. There are more sophisticated approaches that add features to JavaScript to automate continuations, but we’re more comfortable with just using an async library whose behavior we understand thoroughly.</div>
<p>&nbsp;</p>
<h3>HAPROXY</h3>
<p>We use <a title="HAProxy" href="http://haproxy.1wt.eu/" target="_blank">HAProxy</a> to load balance between our webservers. It balances TCP between the machines round robin and leaves everything else to Node.js, leaving the connections open with a reasonably long time to live to support WebSockets and re-use of a TCP connection for AJAX polling.</p>
<h3>REDIS</h3>
<p>Trello uses <a title="Redis" href="http://redis.io/" target="_blank">Redis</a> for ephemeral data that needs to be shared between server processes but not persisted to disk. Things like the activity level of a session or a temporary OpenID key are stored in Redis, and the application is built to recover gracefully if any of these (or all of them) are lost. We run with <a title="Redis as LRU cache" href="http://antirez.com/post/redis-as-LRU-cache.html" target="_blank">allkeys-lru</a> enabled and about five times as much space as its actual working set needs, so Redis automatically discards data that hasn’t been accessed lately, and reconstructs it when necessary.</p>
<p>Our most interesting use of Redis is in our short-polling fallback for sending changes to Models down to browser clients. When an object is changed on the server, we send a JSON message down all of the appropriate WebSockets to notify those clients, and store the same message in a fixed-length list for the affected model, noting how many messages have been added to that list over all time. Then, when a client that is on AJAX polling pings the server to see if any changes have been made to an object since its last poll, we can get the entire server-side response down to a permissions check and a check of a single Redis value in most situations. Redis is so crazy-fast that it can handle thousands of these checks per second without making a substantial dent into a single CPU.</p>
<p>Redis is also our pub/sub server, and we use it to propagate object change messages from the server process making the initiating request to all of the other server processes. Once you have a Redis server in place, you start using it for all sorts of things.</p>
<h3>MONGODB</h3>
<p><a title="MongoDB" href="http://www.mongodb.org/" target="_blank">MongoDB</a> fills our more traditional database needs. We knew we wanted Trello to be blisteringly fast. One of the coolest and most performance-obsessed teams we know is our next-door neighbor and sister company StackExchange. Talking to their dev lead David at lunch one day, I learned that even though they use SQL Server for data storage, they actually primarily store a lot of their data in a denormalized format for performance, and normalize only when they need to.</p>
<div id="attachment_2100" class="wp-caption alignright" style="width: 410px"><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-today.png"><img class="size-full wp-image-2100" title="trello-today" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/trello-today.png" alt="" width="400" height="264" /></a><p class="wp-caption-text">Trello Today</p></div>
<p>In MongoDB, we give up relational DB features (e.g. arbitrary joins) for very fast writes, generally faster reads, and better denormalization support — we can store a card’s data in a single document in the database and still have the ability to query into (and index) subfields of the document. As we’ve grown quickly, having a database that can take a fair amount of abuse in terms of read and write capacity has been a very good thing. Also, MongoDB is really easy to replicate, back up, and restore (the <a title="Foursquare outage post mortem" href="http://groups.google.com/group/mongodb-user/browse_thread/thread/528a94f287e9d77e" target="_blank">Foursquare debacle</a> notwithstanding).</p>
<p>Another neat side benefit of using a loose document store is how easy it is to run different versions of the Trello code against the same database without fooling around with DB schema migrations. This has a lot of benefits when we push a new version of Trello; there is seldom (if ever) a need to stop access to the app while we do a DB update or backfill.<br />
This is also really cool for development: when you’re using hg (or git-) bisect and a relational test DB to search for the source of a bug, the additional step of up- or downgrading a test db (or creating a new one with the properties you need) can really slow things down.</p>
<h2>So we like it?</h2>
<p>We like our tech stack. As <a title="How Trello is Different" href="http://joelonsoftware.com/items/2012/01/06.html" target="_blank">Joel observes</a>, we’ve bled all over it, but I’ve never seen a team make an interesting app without tool- and component-related bloodshed, and not everyone can say that they really like what they’ve ended up with. As is true of most applications, no component or implementation detail is necessary to its nature; however, we think that this excellent set of open-source projects has sped up our development, left us with a solid and maintainable code base that we’re eager to move forward with, and made Trello a more responsive and beautiful app. Thanks to everyone who has contributed to them; it&#8217;s a great time to be a programmer.</p>
<p>Sound neat? <a title="Trello" href="http://trello.com">Try Trello!</a> It&#8217;s free.</p>
<p>Just can&#8217;t get enough tech stack talk? <a title="Trello Architecture Prezi" href="http://prezi.com/skunatcrkp5m/trello-architecture/" target="_blank">Here&#8217;s a Prezi I made</a> for a recent talk on Trello.</p>
<p><em><strong><a id="asterisk">*</a></strong> The Socket.io server currently has some problems with scaling up to more than 10K simultaneous client connections when using multiple processes and the Redis store, and the client has some issues that can cause it to open multiple connections to the same server, or not know that its connection has been severed. There are some issues with submitting our fixes (hacks!) back to the project – in many cases they only work with WebSockets (the only Socket.io transport we use). We are working to get those changes which are fit for general consumption ready to submit back to the project.</em></p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/LA5PWsDxvYY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/the-trello-tech-stack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fthe-trello-tech-stack%2F&amp;seed_title=The+Trello+Tech+Stack</feedburner:origLink></item>
		<item>
		<title>The State of the Kiln</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/8vgcAPXVI6A/</link>
		<comments>http://blog.fogcreek.com/the-state-of-the-kiln/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 16:17:43 +0000</pubDate>
		<dc:creator>Benjamin Pollack</dc:creator>
				<category><![CDATA[Kiln]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2022</guid>
		<description><![CDATA[As the new year opens, I thought it was high time to look back at the last year of Kiln and see what we&#8217;ve accomplished, then turn forward and discuss what we&#8217;re working on for the next twelve months. Hold onto your hats. There&#8217;s a lot to like. The Year in Review We had a [...]]]></description>
			<content:encoded><![CDATA[<p>As the new year opens, I thought it was high time to look back at the last year of Kiln and see what we&#8217;ve accomplished, then turn forward and discuss what we&#8217;re working on for the next twelve months.</p>
<p>Hold onto your hats. There&#8217;s a lot to like.</p>
<h2>The Year in Review</h2>
<p><img style="float: right; border: none; box-shadow: none;" title="Dodos love to party. Especially at Christmastime." src="http://blog.fogcreek.com/wp-content/uploads/2011/12/Party-Dodo.png" alt="The Kiln Dodo enjoying a party" width="212" height="300" />We had a tough act to follow last year. In 2010, we launched Kiln On Demand and Kiln for Your Server, shipped piles of new features, and found ourselves home to tens of thousands of users&#8217; source code. But Kiln was new at the time; most of those of you who came to us were already familiar with distributed source control in one way or another. Kiln&#8217;s mission is to <a href="http://bitquabit.com/post/have-a-mission/">bring distributed version control to as many people as possible</a>, and that means appealing to more than just early adopters.</p>
<p>To make that happen, we made a giant list of what was keeping people from jumping to Kiln, and we spent nine months fixing every issue one by one. We rewrote the review system to be more user-friendly (by <a href="http://blog.fogcreek.com/release-cycles-of-the-fast-and-the-furious/">overhauling the UI and making it easier to make cases</a> and <a href="http://blog.fogcreek.com/rethinking-reviews/">turning reviews into multiparty discussions instead of one-on-one chats</a>). We helped <a href="http://blog.fogcreek.com/kiln-now-with-pre-baked-web-hooks-for-your-enjoyment/">Kiln integrate tightly with lots of other services</a> so you could keep your existing infrastructure. We allowed configurable diffs, we taught Kiln how to display images in your repositories, we beefed up the API, we contributed <tt>largefiles</tt> (based on <tt>kbfiles</tt>, our extension that makes it trivial to have large binary files in Mercurial) back to the main Mercurial project, and we added a full-blown groups permission system so you can have large Kiln installs without getting lost in a quagmire of user management.</p>
<p>The result? Kiln 2.7, which we think gets even those who don&#8217;t have a lot of experience with DVCS easily <em>using</em> distributed version control, rather than getting lost in a muddle of tool arcana.</p>
<h2>What&#8217;s to Come</h2>
<p><em>“First nine months,”</em> I hear you say. <em>“Fascinating. That might be an impressive list. But the year is twelve months long, so what have you done for us </em>lately<em>?”</em></p>
<p>We have a strong rule against publishing road-maps for products, for a simple reason: we don&#8217;t like to disappoint you. We hate promising you&#8217;ll have some awesome new feature in Kiln 45.7, like telekinetic abilities, and then smashing your hopes most excellently by announcing we&#8217;ve had to delay them until 45.8. Instead, we prefer to surprise you each release with piles of new goodies. A kind of monthly Christmas for Kiln, if you will.</p>
<p>Of course, the flip-side is that we know you can feel abandoned when we go dark for awhile, even if we&#8217;ve got a <em>really</em> good reason for doing that. And I think we&#8217;ve been too quiet lately, so some of you are wondering if we&#8217;ve been run over by a bus.</p>
<p>Good news: we&#8217;re still <em>very much</em> here! And we&#8217;re still working hard. Unfortunately, our current projects are harder than our old ones, so we haven&#8217;t had much to show for it for a few months.</p>
<p>To fix that, I want to welcome you behind the curtain, and introduce you to three features coming your way in the next few months: the Kiln Client for Mac OS X; SSH support; and vastly improved search and general performance across the entire app.</p>
<h3>Kiln Client for OS X</h3>
<p>I admit it: Kiln may run on Windows, and I may love writing code for .NET, but at home, everything I own runs OS X. So it frustrates me that the Kiln Client is only available for Windows.</p>
<p>That&#8217;ll be changing shortly. Coming soon to a Mac near you: Kiln Client for OS X.</p>
<div style="align: center"><a href="http://blog.fogcreek.com/wp-content/uploads/2011/12/tortoisemac.png"><img style="border: none; box-shadow: none" title="TortoiseHg now runs on the Mac" src="http://blog.fogcreek.com/wp-content/uploads/2011/12/tortoisemac-300x204.png" alt="A screenshot of TortoiseHg for OS X" width="300" height="204" /></a></div>
<p>While it looks and works similarly to the Windows client, since both are based on the excellent TortoiseHg, we&#8217;ve taken the time to make it work like a real Mac app. You install it by drag-and-drop, and it takes care of the rest. It&#8217;ll automatically put Mercurial on your path, it&#8217;ll automatically update itself when there are changes, and otherwise behave just like a good Mac citizen.</p>
<h3>SSH Support</h3>
<p>While we love Mercurial over HTTP, the simple truth is that it&#8217;s not perfect for everyone. HTTP-based pushes put you into HTTP timeout hell, where you have to make sure your timeouts are correct at every level of your network (load balancer, web server, web site in IIS, and so on). For Kiln On Demand, that&#8217;s okay, because we control the full infrastructure. For our licensed customers, this can be a serious problem.</p>
<p>Good news: SSH suffers none of these issues, and Kiln is adding SSH support. And not just for On Demand; it&#8217;ll be available for licensed customers as well, as a single, easy-to-use, turnkey solution.</p>
<h3>Improved General Search</h3>
<p>Search in Kiln is a big deal, and we love it and we know you love it, but we want to be <em>even faster</em>, and we want it to be better with non-Windows-compatible file names.</p>
<p>So we&#8217;re rebuilding Kiln&#8217;s search story around <a href="http://www.elasticsearch.org/">Elastic Search</a>, an excellent NoSQL search solution. We&#8217;re currently still heavily in the development stage, but already, our search times are down from a second or two for very large Kiln installations to just a couple of milliseconds. We think this will be a big deal for our licensed customers, and a <em>huge</em> deal for our On Demand customers.</p>
<p>We&#8217;ll have this work on Kiln On Demand in a couple of months, and for Kiln licensed customers about a month later.</p>
<p>So we believe there&#8217;s a <em>lot</em> to love in the coming months for Kiln. And we hope that this roadmap of what we&#8217;re doing, and the rough timeline we plan to do it in, will get you as excited as we are.</p>
<p>In the meantime, happy Kilning.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/8vgcAPXVI6A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/the-state-of-the-kiln/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fthe-state-of-the-kiln%2F&amp;seed_title=The+State+of+the+Kiln</feedburner:origLink></item>
		<item>
		<title>Why do we pay sales commissions?</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/RvoTrZnGCB4/</link>
		<comments>http://blog.fogcreek.com/why-do-we-pay-sales-commissions/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 18:54:09 +0000</pubDate>
		<dc:creator>Dan Ostlund</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2034</guid>
		<description><![CDATA[Among our many cherished verities and assumed assumptions is the widespread belief—nearly universal practice actually—that salespeople are to be paid commissions. It’s the way things are done. Stop signs are red. Salespeople get commissions. But why? This is a practice so deeply ingrained that almost everyone assumes that commissions are an unalloyed good, and that [...]]]></description>
			<content:encoded><![CDATA[<p>Among our many cherished verities and assumed assumptions is the widespread belief—nearly universal practice actually—that salespeople are to be paid commissions. It’s the way things are done. Stop signs are red. Salespeople get commissions.</p>
<p>But why?</p>
<p>This is a practice so deeply ingrained that almost everyone assumes that commissions are an unalloyed good, and that salespeople won’t work without them. I’ll return to that notion about work shortly, but it’s somewhat amazing that commissions are so widely lauded when they come laden with so many recurring problems. These issues pop up with distressing regularity.</p>
<p>There are all kinds of problems with commissions, for example, high turnover as salespeople shop jobs to get a slightly more lucrative commission system. Always attempting to maximize personal benefit which results in system gaming like making fake phone calls to hit call numbers, sandbagging deals into the next quarter, sniping new leads, and so on (the list here is actually endless).</p>
<p>The problems include infighting over who gets credit for accounts and sales. They include constantly comparing territories and account value to determine fairness between salespeople. They include an enormous amount of overhead as each salesperson sedulously tracks every transaction no matter how minute to make sure they get paid on it (by the way, they hate having to do this, and it&#8217;s a staggering waste of time. It&#8217;s also a place where weak salespeople like to hide out).</p>
<p>All of this is organizational dysfunction, and it’s a recipe for resentment and distrust among your team.</p>
<p>Management then tries to correct for these problems. They constantly drop or add ballast. They have to carefully structure the pay plan, the territories, the lead assignments. They have to referee disputes, tweak the various systems, and try to keep everyone happy. It&#8217;s like a spinning top and every time it starts to wobble, management has to try to nudge it back. It’s a large amount of effort spent propping up a system that <strong><em>we have all just assumed</em></strong> is necessary.</p>
<p>But it gets even worse.</p>
<p>In research by Dan Ariely and others it appears that higher incentives, actually <em>reduce</em> performance. That&#8217;s a perverse and counter-intuitive result, but in several different kinds of experiments, groups that were promised the largest amount of money as a reward for doing a task performed that task more slowly, and completed the tasks less often.</p>
<p>And yet the paladins defending commissions are everywhere.</p>
<p>They say that commission-based pay maximizes autonomy. Assume there are ten “units” of pay which, of course, can be divided up in all kinds of ways; eight units of salary and two units of commission, or one unit of salary and nine units of commission. How best to do this is the source of several different kinds of holy war.</p>
<p>This means, they say, that for every unit of base salary that gets added to the pay mixture in place of commission there is an increase in employer control, or put the other way round, a reduction in autonomy. More salary in the mix destroys the space for independence and kills the morale of the worker. It turns motivated independent free-agent sales people into wage slaves.</p>
<p>But it gets even worse, according to the defenders of commissions, and here is the crux of their argument.</p>
<p>They say that without the potential to make extra money for your efforts—that is without a one-for-one relationship between a piece of work and the resultant money—that there is no real motivation to work, or, god forbid, to do any extra work. How do you keep salespeople hungry if you don’t pay them commissions? This is the great inscrutable puzzle in sales pay. Too much salary and not only do salespeople lose their independence they become slugs on top of it.</p>
<p><a href="http://blog.fogcreek.com/wp-content/uploads/2012/01/iStock_000015267790Small1.jpg"><img class="aligncenter size-full wp-image-2045" title="Sleeping On The Couch" src="http://blog.fogcreek.com/wp-content/uploads/2012/01/iStock_000015267790Small1.jpg" alt="" width="849" height="565" /></a></p>
<p>But hang on a second. Isn’t all this deeply insulting to salespeople? Doesn’t it presuppose that salespeople are lazy and greedy and unethical and that it is only the sweet smell of more lucre that gets them to shed their pajamas each morning?</p>
<p>According to this view sales people are only motivated by a specific type of pay—the commission, and the magic is in finding, like Goldilocks, that place that&#8217;s just so perfectly just right.  Because of this we regard all the pathologies commissions create as just part of the price.</p>
<p>But could it be possible that we’ve got cause and effect reversed here? Is it possible that the stereotype of the slimy salesperson, and the derangement of the culture they so often get blamed for, are actually the result of the way they are paid instead of the kind of people they are? Could commissions, rather than the people, be the primary cause of dysfunctional sales cultures?</p>
<p>Think for a second: we don’t insist that other kinds of workers be paid on commissions. Only an amazing idiot pays a programmer by lines of code. We don’t assume that programmers will dog it if they are paid only salary. Actually, we think just the opposite; they will work hard because they care about the work they’re doing, and they won’t need lashings, or thumbscrews, or other popular forms of motivation. We assume they are internally motivated. This is one of the hallmarks of the enlightened software industry. Development isn’t (usually) conveyor belt work. It doesn’t (usually) suck the soul out of you. It’s creative, it’s mind work and it operates on an entirely different rhythm from traditional kinds of labor, so heavy external control tends to be counter-productive.</p>
<p>And this is true of other workers today—designers and writers and interaction experts, for example. They work on this different rhythm, and are trusted to do so, not coerced by the style of pay they receive, and in good work places, not too often by a manager either. A writer may impose a rigid schedule on herself, but any manager who attempts to impose a similar sort of external authoritarian control is suffering from a kind of insanity given how out of synch such management is with the demands of a lot of today’s work. And so it is with<a href="http://www.businessweek.com/careers/managementiq/archives/2009/08/dan_ariely_on_bonuses_and_motivation.html" target="_blank"> attempts to control with pay</a>.</p>
<p>The different pay systems, then, leave us with two kinds of workers; the lazy salesperson who needs to be coerced with direct rewards, and programmers who can be trusted to go about their day and get good work done. It’s just weird when you think about it.</p>
<p>But, these are actually two different <em>views</em> of workers, not necessarily two <em>kinds</em> of workers.</p>
<p>The tension between these views of workers was described in the 1960s by Douglas MacGregor in his book <a href="http://www.amazon.com/Human-Side-Enterprise-Annotated/dp/0071462228/ref=sr_1_1?ie=UTF8&amp;qid=1325694254&amp;sr=8-1" target="_blank">The Human Side of Enterprise</a>. He suggested that managers had two views of motivation, and that a manager’s theory of motivation determined company culture. The first view he called Theory X which assumes that people are lazy, want to avoid work and need to be controlled, coerced, punished, and lavishly rewarded in order to perform. Sounds like some sort of S&amp;M dungeon to me. Theory X demands a lot of managerial control and tends to demotivate, generate hostility, and generally make people into sour pusses.</p>
<p>The second he called Theory Y which assumes that people are self-motivated, derive satisfaction from their work, are creative, and thrive when given autonomy.</p>
<p>With these two views in hand, we now have a way to describe why sales commissions create so much dysfunction. Commissions assume a Theory X world. It assumes salespeople are lazy. They need external motivation to shake off the moss. If you pay them on salary, they just won’t get things done. The commissions view then makes the mistake of presuming that this can be fixed with either larger overall commissions or a greater percentage of total pay coming from commissions.</p>
<p>But if Theory X doesn&#8217;t fit and is a degrading way to treat employees, then doing more of it gets you nothing but more degradation and misery, right?</p>
<p>The Theory X way of doing sales compensation, I now think, has habituated us into accepting deranged and dysfunctional sales behavior as if it’s just the cost of doing business.</p>
<h2><strong>We Get Rid of Commissions</strong></h2>
<p>So we got rid of commissions.</p>
<p>We thought about for a long time before we did it, but we finally switched about a year ago.</p>
<p>We did it because we were having a lot of the problems with commissions described above even though all of our salespeople are ethical and decent. Commissions just encourage certain kinds of behavior; dysfunction is built into the logic of the system.</p>
<p>The different kinds of  pay created divisions at Fog Creek. It was the fundamental thing that separated sales from everyone else. Divisions like that can be exceptionally corrosive to morale, and that’s something Joel and Michael (the founders) specifically set out to avoid when they designed the <a href="http://www.joelonsoftware.com/articles/fog0000000038.html" target="_blank">Fog Creek compensation system</a>. Fairness was one of their main concerns, just as it was in the newer <a href="http://blog.stackoverflow.com/wp-content/uploads/Stack-Exchange-Developer-Compensation.pdf" target="_blank">StackExchange comp system</a>, and they felt that commissions just didn&#8217;t fit.</p>
<p>I’ll admit that I was skeptical about ending commissions mainly because commissions are such an established way of paying salespeople. I worried that we wouldn’t be able to hire anyone. I worried that some of our sales people might quit. I worried, good Theory Y votary that I was notwithstanding, that the salespeople would coast. I worried when my friends in sales management said this would never work.</p>
<p>To my great surprise, our salespeople really liked the idea. They especially liked being on the same salary plan as the rest of the company.</p>
<p>So we did it, and no catastrophes struck us. No earthquakes. No plagues, and no one quit. In the year since we dropped the commission system our sales have gone up. In fact, four of the last five months have been record months. We can&#8217;t reasonably say that our record sales were caused by this change, but <strong><em>we can</em></strong> reasonably say it didn’t hurt, and that’s worth having a hard think about in your own company. There is no guarantee that this will work for everyone, but it’s unlikely to be a disaster either.</p>
<p>Our salespeople all estimated that they were spending about 20% of their time just keeping track of what money was due them. There was constant horse trading. And, most worrying, we created a heavy disincentive to do all the service stuff that makes customer service shine. Why would you want a system that sets up after-sales service as competition against new sales, especially if you have a small sales team? Reputation and retention, after all, are both paths to revenue.</p>
<p>Removing commissions has changed the sales team. It has taken their focus off their compensation. They have all that administration time back for more useful things. They take a longer view of the value of a prospect, and are less worried about who is going to buy <em>right now</em>. They feel less stress about taking vacation. They don’t quibble among themselves over accounts. And best of all, they feel more integrated with the company.</p>
<p>As John, one of our salespeople said, “It’s made the team better. It’s removed the ‘me, me, me’ mentality. Now I want to share information with everyone on the team, and everyone is willing to pitch in because it doesn’t hurt me to help my colleagues.”</p>
<p>Getting rid of commissions lets us forget about policing the wobble. Now, it is not necessarily the case that commissions are always bad, or always fail, or are wrong for you. It&#8217;s just that they come with real problems, and you need to carefully weigh both your desired company culture, and the costs of policing your commissions system against the expected increase in performance, which is a very hard calculation to make.</p>
<p>For us, it’s been a great success, and at least from that perspective it might be time we punch the Theory X, commissions-based sales culture right in the nose. Real redemption might lie in removing the source of the derangement and treating sales people like we treat programmers and other workers that we implicitly trust.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/RvoTrZnGCB4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/why-do-we-pay-sales-commissions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Fwhy-do-we-pay-sales-commissions%2F&amp;seed_title=Why+do+we+pay+sales+commissions%3F</feedburner:origLink></item>
		<item>
		<title>FogBugz gets Fresh</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/8TCoAYovIK8/</link>
		<comments>http://blog.fogcreek.com/fogbugz-gets-fresh/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 19:41:16 +0000</pubDate>
		<dc:creator>Dan Ostlund</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=2002</guid>
		<description><![CDATA[We think the FogBugz interface is getting a little long in the tooth. The problem is that we’ve been working on features and speed and, and, and… There is always something that feels more pressing. Always some technical debt to pay down. Always a bug in some super wonky edge case, But It’s Happening To [...]]]></description>
			<content:encoded><![CDATA[<p>We think the <a href="http://www.fogcreek.com/fogbugz/" target="_blank">FogBugz</a> interface is getting a little long in the tooth. The problem is that we’ve been working on features and speed and, and, and…</p>
<p>There is always something that feels more pressing. Always some technical debt to pay down. Always a bug in some super wonky edge case, But It’s Happening To A Very Important Customer, and needs to get fixed. In short, we always can find a very reasonable and important reason to put off the design changes that pretty much everyone here wants to make.</p>
<p>But as everyone who has been near the internet or heard of Steve Jobs will tell you, design is just as important as features—possibly more so in some cases. In the same way that we’ve come to <a href="http://blog.fogcreek.com/our-marketing-is-up-fog-creek-and-what-we-did-about-it/" target="_blank">regard our website as a product</a>, we also know that design is a feature that deserves equal billing with more pedestrian features. It’s not that we didn’t know this—we’ve always cared a great deal about it, and in fact, <a href="http://www.amazon.com/User-Interface-Design-Programmers-Spolsky/dp/1893115941/ref=sr_1_8?ie=UTF8&amp;qid=1321643130&amp;sr=8-8" target="_blank">Joel wrote a book about it</a>—it’s just that we haven’t had the time or the resources to devote to it in some time.</p>
<p>Tastes change. Technologies change. Sometimes even established practices and affordances change. It’s entirely possible to build up what we might call design debt in the same way that software can accumulate technical debt. And FogBugz has some design debt to pay down at this point. It&#8217;s time to scrape some of the mold off the bread.</p>
<p>But design changes are tricky. They alienate power users.  If things are mysteriously moved you have to be sent to a Microsoft re-education camp (to learn where all of your commonly used administration tools absconded to…again). You’re just as likely to make things worse as you are to make them better, especially if you’re doing a lot of guessing about what people want and how they behave with your software.</p>
<p>So this weekend we’re rolling out some design changes to FogBugz. We’ve tried to balance updating the look without requiring the cumbersome re-training camps. There are some very subtle changes on the gridview page but these are mainly making menu items a bit bigger, making fonts more consistent, and some color changes. You probably won’t even notice these changes.</p>
<p>The more interesting changes are on the case view page.</p>
<p>Here is a pic of the current (soon to be old) case view.</p>
<p><a href="http://blog.fogcreek.com/wp-content/uploads/2011/11/Old_case_look_FogBugz.png"><img class="aligncenter size-full wp-image-2006" title="Old_case_look_FogBugz" src="http://blog.fogcreek.com/wp-content/uploads/2011/11/Old_case_look_FogBugz.png" alt="" width="762" height="784" /></a></p>
<p>&nbsp;</p>
<p>Here is a pic of the new case view.</p>
<p><a href="http://blog.fogcreek.com/wp-content/uploads/2011/11/New_Case_Look_FogBugz.png"><img class="aligncenter size-full wp-image-2003" title="New_Case_Look_FogBugz" src="http://blog.fogcreek.com/wp-content/uploads/2011/11/New_Case_Look_FogBugz.png" alt="" width="760" height="857" /></a></p>
<p>&nbsp;</p>
<p>There were a couple of things we tried to do. First, we just wanted to make it look a bit fresher and more modern, so we changed the icons, using some of the icons from the very beautiful<a href="http://p.yusukekamiyamane.com/" target="_blank"> Fugue Icon Pack</a>.</p>
<p>Next, we felt it was important to make certain kinds of information stand out better. You might occasionally want to know when a case was assigned to someone, but more often the content of the case is much more important. Given that, we de-emphasized the information around administrative minutiae and tried to make the comments of a case more apparent.</p>
<p>If you send an email or have a case that comes in via email (in other words, the case has a correspondent), you’ll notice a nice little air mail bar along the top of that portion of the case. That makes it clear that you are dealing with or sending an email and distinguishes it from some other normal case edit. You’ll never accidentally send an email from FogBugz again. This one deserves a little more comment. At the risk of indiscreetly tooting our own trumpet, I’ll say that this was one of those occasional moments of perfect design inspiration. I didn’t even know it was going to be there, but the first time I saw it I understood instantly what it meant. Without the need for a text label, or an explanation, or some other heavy-handed means the function is totally clear. It’s an “I could have had a V-8” moment. Seems so obvious after the fact.</p>
<p>Cases have always contained status information, but you had to read text to know what it was. That’s OK, but we wondered if it would be better to give a visual cue so that this information could be absorbed at a glance. Now the status of a case is given a color in addition to the text. Green is active, blue is resolved, and gray is closed.</p>
<p>We’ve also done some odds and ends with color and more consistent font choices and the like.</p>
<p>Overall we’re pretty pleased with the balance we struck between freshness on one hand and consistency on the other.</p>
<p>We were able to do this because we moved a talented support tech over to the design team, and he made these changes over the course of a couple of weeks. But, alas, the commute was making life with his new child hard to manage and he left Fog Creek. Everyone on the FogBugz team was thrilled to have him, and we’re committed to making more changes to the FogBugz interface to make it more modern and responsive and generally more pleasing.</p>
<p>So this post ends with a request. If you’re a good designer, or know one who wants to work at a great software company in New York City, please send them our way. Check the <a href="http://www.fogcreek.com/Jobs/Design.html" target="_blank">Fog Creek careers page</a> for the job posting.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/8TCoAYovIK8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/fogbugz-gets-fresh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.fogcreek.com/feeder/?FeederAction=clicked&amp;feed=Fog+Creek+Blog&amp;seed=http%3A%2F%2Fblog.fogcreek.com%2Ffogbugz-gets-fresh%2F&amp;seed_title=FogBugz+gets+Fresh</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.332 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-05-14 10:36:50 -->

