<?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, 30 Jan 2012 21:37:33 +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>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>

		<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>

		<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>
		<item>
		<title>Let Them Have Cake … And Ice Cream Too!</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/5JRUmMhfCN8/</link>
		<comments>http://blog.fogcreek.com/let-them-have-cake/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 17:39:22 +0000</pubDate>
		<dc:creator>Rock Hymas</dc:creator>
				<category><![CDATA[Fog Creek]]></category>
		<category><![CDATA[FogBugz]]></category>
		<category><![CDATA[Trello]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=1944</guid>
		<description><![CDATA[Consider a cake shop owner in a small town in Siberia. He sells the best cake around. Whenever someone wants a treat after dinner they stroll down to the cake shop and get a nice big slice of cake. But along comes a new treat: ice cream. Our cake shop owner ridicules his neighbor for [...]]]></description>
			<content:encoded><![CDATA[<p>Consider a cake shop owner in a small town in Siberia. He sells the best cake around. Whenever someone wants a treat after dinner they stroll down to the cake shop and get a nice big slice of cake. But along comes a new treat: ice cream. Our cake shop owner ridicules his neighbor for starting an ice cream stand, saying no one will buy it because it&#8217;s cold. This is Siberia, after all. But rather than running an oven all the time, she can just keep her ice cream outside in the freezing cold, so it sells for less. Suddenly a whole bunch of people who could never afford cake are stopping at the ice cream stand after both lunch and dinner. It&#8217;s cheap, it tastes good, and the teenagers are having contests to see how much they can eat before passing out from brain freeze. It seems the whole town is there, and some of the cake shop customers start getting ice cream just because they want to hang out with their friends at the ice cream stand. All of a sudden the neighbor is rolling in the dough and she wants to buy out the cake shop since they have a great location.</p>
<p>Now suppose the owner of the cake shop recognizes that lots of his customers will like the ice cream (even in Siberia) because it&#8217;s so much cheaper. So he sets up an ice cream stand and hires his neighbor to start selling it as fast as possible. He notices that some of his regular cake shop customers are going to the ice cream stand instead, because it&#8217;s cheaper. So cake sales are down a little. Rather than shutting down the ice cream stand though, he brings it into the cake shop, adds a special &#8220;cake&#8221; flavored ice cream, and becomes the town hero. Not only has he saved his business, but he&#8217;s also been able to meet the dessert needs of more of his fellow townspeople. Cake is selling even better than before, ice cream is selling even better than that, and the cake-fanatics and ice cream groupies all get to hang out together.</p>
<p>Clayton Christensen&#8217;s <a href="http://www.businessofsoftware.org/speakers.aspx#christensen">talk</a> at this year&#8217;s Business of Software was all about how companies disrupt, and are disrupted by, other companies. In building a product, you (or those who came before you) made decisions that are really hard to change after the fact. That&#8217;s fine; those &#8220;stakes in the ground&#8221; are what made the product successful. But it also limits the viable lifetime of the product. At some point disruption happens.</p>
<h2 style="text-align: center;"><span style="color: #888888;">Disruption =</span></h2>
<h2 style="text-align: center;"><span style="color: #888888; font-weight: bold;">Larger Market + </span><span class="Apple-style-span" style="color: #888888;">Lower Price + </span><span class="Apple-style-span" style="color: #888888;">Different Measure</span></h2>
<p>&nbsp;</p>
<p>Professor Christensen pointed out that disruption occurs when a company solves a given problem for a larger audience at a lower price point with a different measuring stick for comparing value. Companies that successfully avoid being disrupted are usually able to do so only by disrupting themselves. Few companies are able to pull that trick off, and it typically involves having a different team or business unit set up in order to avoid all the baggage that the last-generation products carry with them.</p>
<p>What does this have to do with Fog Creek? Well, I&#8217;ll admit that I was a little skeptical when Fog Creek launched <a href="https://trello.com">Trello</a>. My worries pretty much lined up with those outlined in <a href="http://deli.aggiebradley.com/2011/09/17/the-second-way-to-skin-a-cat/">this post</a> from a FogBugz customer. Though it&#8217;s taken some time, I&#8217;m starting to see how important it is for Fog Creek to prepare for the disruption of its flagship product, <a href="http://www.fogcreek.com/fogbugz/">FogBugz</a>.  By doing so, we can make sure FogBugz will keep solving our customers problems and keep making us money.</p>
<p>Trello fits the model for disrupting Fogbugz. It solves the problem of planning the work on a project for a larger audience than just software companies, at a lower price point than a FogBugz or a Jira, with a different measuring stick: putting Trello and FogBugz next to each other on a feature comparison chart doesn&#8217;t make any sense.</p>
<p>Trello&#8217;s target market is much larger than that of FogBugz. Where FogBugz targeted software development teams with features like bug tracking, automated crash reporting, and evidence-based scheduling, Trello can provide value to any group of two or more people working together on something that can be broken down into steps. Even though any group of people could use FogBugz to do the same thing, using FogBugz doesn&#8217;t really make sense when you&#8217;re in HR doing hiring, or in law working through cases, or in a studio vetting country bands. Using Trello does.</p>
<p>Additionally, Trello has a lower price point: free. Everything currently offered by Trello is free, and will remain so going forward. Yes, there will probably be value-added features and services that Fog Creek will charge for at some point. Compared to free, though, FogBugz is expensive at $25 per user per month. When you just want something simple to plan your wedding, that doesn&#8217;t make any sense. But if you&#8217;re managing software projects for reasonably complex products, then FogBugz easily adds that much value, and our customers make that clear by coming back again and again.</p>
<p>Trello also has a different measuring stick. And that&#8217;s the real reason it will eventually overtake FogBugz, even for software projects. Or rather, it will take over some of the roles that FogBugz fills in a software development company. We already use it here at Fog Creek to manage our work at a coarse-grained level. It provides a potentially public view into product development, which is <a href="https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c">cool</a> to <a href="https://trello.com/board/exercises/4d87e664967a0775082939ab">see</a>.</p>
<p>The real key, though, is that Trello, like FogBugz, is opinionated&#8211;but it has very different opinions. Rather than seeing work on a project as a large set of small items that need to be tracked individually, it sees project work as a small set of somewhat larger tasks that fit into a bigger whole, a workflow defined by the team. If FogBugz tried to create some kind of dashboard view of your bugs to compete with Trello, you’d be so overwhelmed by minutia that you’d give up and walk away. No one wants that kind of view when they&#8217;re dealing with hundreds or thousands of individuals cases. But Trello redefines the way we see our project work and that fundamentally changes the game.</p>
<p>Wait a sec! I&#8217;m on the FogBugz team. What am I saying?! Am I just making a Steve Yegge <a href="https://plus.google.com/u/0/110981030061712822816/posts/bwJ7kAELRnf">&#8220;TMI&#8221; mistake</a> by posting this publicly? Am I talking myself out of a job?</p>
<p>&nbsp;</p>
<h1 style="text-align: center;"><span style="color: #888888;">TMI?</span></h1>
<p>&nbsp;</p>
<p>I don&#8217;t think so. And here&#8217;s why.</p>
<p>The same legacy that prevents it from winning in the larger Trello market gives it a competitive advantage in the market for software development teams. FogBugz will continue to make money, and it is still growing at a nice pace. It needs investment, but not the kind of investment that would attempt to turn it into Trello. Rather, the kind of investment that will take advantage of disrupting products like Trello while preserving it&#8217;s usefulness in the niche of software development teams.</p>
<p>And our customers, for the most part, aren&#8217;t going to jump ship for Trello anytime soon. Currently, Trello can replace only a very small part of what FogBugz provides. One customer <a href="http://garythegary.com/2011/11/10/why-trello-doesnt-work-for-bug-tracking/">pointed out</a> that it cannot handle bulk editing, screenshot captures are painful, and categorization and search aren’t designed for the situation where you have lots of items. Additionally, FogBugz supports <a href="http://www.fogcreek.com/fogbugz/features/customer-support.html">incoming and outgoing email</a>, <a href="http://fogbugz.stackexchange.com/questions/315/bugzscout-capture-crashes-from-the-field">automated crash reports</a>, and <a href="http://www.fogcreek.com/fogbugz/features/project-management.html#features-content">deep hierarchies of work</a>. You can install it within your network and use it completely internally. It’s also got awesome source control integration with <a href="http://www.fogcreek.com/kiln/">Kiln</a>. These are all things that software development teams care about, often passionately. Trello, and other products like it, may eventually meet some of these needs, or integrate with other tools that do, but that <a href="http://www.joelonsoftware.com/articles/fog0000000017.html">will take time</a>. Time that will allow FogBugz to further differentiate itself.</p>
<p>Besides, learning new ways of working is hard. Anecdote time! We spent some time over the last few months rethinking the UI for FogBugz. As the team lead, I made the call to focus on that, and did what I could to protect the team through the process. Unfortunately, when it was done, Joel pointed out that it wouldn&#8217;t fly with our customers. Why? Because we &#8220;moved the cheese&#8221; in too many ways. It would have required our customers to learn new ways of working, and human nature doesn&#8217;t like to do that. Though that does limit what we can do with FogBugz going forward, it also strengthens the ties that our current customers have with the product. They know where to click, which <a href="http://fogbugz.stackexchange.com/questions/4310/keyboard-shortcuts">keyboard shortcuts</a> to use, and they know what to expect. That helps them work faster, get in the flow, and keep the boss happy.</p>
<p>Finally, and related to the last point, FogBugz has an ecosystem of supporting technology around it. When our customers start using FogBugz and Kiln, they often integrate with a set of tools and technology. This is one reason it&#8217;s harder to innovate on those products, because our customers don&#8217;t just rely on not having to learn new ways of working, they also rely on their custom plugins not breaking, on their random Python scripts still working, and on third-party tools continuing to integrate well with FogBugz. Each of those is a barrier to entry &#8211; they make it harder for a competing product to win our customers away from us (yep, even if the competitor is made by us as well) because they also add value for the customer.</p>
<p>In short, for almost all of FogBugz existing customers, and most of the larger market of customers using a competing bug tracker, using Trello instead is not the right business decision. And within that market FogBugz can make sure that business decision doesn&#8217;t change by doing the right kinds of investment. Investment that will keep FogBugz relevant and growing into the future is core-competency investment, not more features or chasing faster competitors in a race decided by a radically different &#8220;finish line&#8221;.</p>
<p>And there are tons of things we can do in the core of FogBugz: reduce the complexity of the product both for our users and for our developers; make it faster; phase out old features that aren&#8217;t being used by anyone; fix the backlog of bugs; improve our up-time; integrate with Trello and other apps. That last point is probably the most salient. As Trello grows and becomes a better fit for certain kinds of project management work, FogBugz can increasingly integrate with and offload those areas to Trello. At the same time, it can target specific problems that software development teams face, and provide value by solving them well.</p>
<p>In the end our customers will be able to have their cake … and their ice cream too.</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/5JRUmMhfCN8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/let-them-have-cake/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%2Flet-them-have-cake%2F&amp;seed_title=Let+Them+Have+Cake+%E2%80%A6+And+Ice+Cream+Too%21</feedburner:origLink></item>
		<item>
		<title>Longer, More Formal Closings Invite Fewer Thank-you Replies</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/IT5ab2ASuzE/</link>
		<comments>http://blog.fogcreek.com/longer-more-formal-closings-invite-fewer-thank-you-replies/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 15:38:10 +0000</pubDate>
		<dc:creator>Rich Armstrong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=1937</guid>
		<description><![CDATA[Since we are entering the season of giving thanks, I thought I&#8217;d drop a little note about those useless little thank-you emails you sometimes get when you help a customer through FogBugz (or, really, any other system). We get the occasional customer request asking us to implement some sort of auto-ignore feature that won&#8217;t re-open [...]]]></description>
			<content:encoded><![CDATA[<p>Since we are entering the season of giving thanks, I thought I&#8217;d drop a little note about those useless little thank-you emails you sometimes get when you help a customer through FogBugz (or, really, any other system).</p>
<p><img class="aligncenter" title="Thank you note" src="http://distilleryimage1.instagram.com/9d3790280bb111e1a87612313804ec91_7.jpg" alt="A thank you note" width="612" height="612" /></p>
<p>We get the occasional customer request asking us to implement some sort of auto-ignore feature that won&#8217;t re-open a case when the person just responds with &#8220;Thanks!&#8221;  Now, as the person responsible for customer happiness at Fog Creek, the very idea of something that &#8220;auto-ignores&#8221; any customer communication sends up all sorts of red flags.</p>
<p>We&#8217;ve looked at this from all different angles and have just never come up with an automated method that doesn&#8217;t suffer from both false positives and false negatives. In the end, the false positives (closing cases that did need more work) are far more destructive than the small time savings garnered by closing these cases automatically.</p>
<p>The problem really is not the person responding, but <em>your</em> response to them.  If you send a response like this, you&#8217;re basically leaving something unconfirmed and basic human decency will prompt some portion of the population to provide you with closure on your interaction.</p>
<blockquote><p>Hi Bill,</p>
<p>Please reboot your computer.</p>
<p>Rich</p></blockquote>
<p>Since this is basically a social issue, not a technical one, it calls for a social hack, not a technical hack. Through experimentation, we find that the longer and more formal your closing, the fewer thank-you emails you get in response.</p>
<p>You can use <a href="http://fogbugz.stackexchange.com/questions/8945/snippets-for-fast-responses-and-templating">snippets</a> to craft a closing that does not invite response. Here&#8217;s a good example that has worked very well for us:</p>
<blockquote><p>Hi Bill,</p>
<p>This can easily be solved by rebooting your computer.</p>
<p>Let me know if I can be of further assistance, if indeed this was helpful, or if this raises any other questions.</p>
<p>All the best,</p>
<p>Rich</p></blockquote>
<p>This closing doesn&#8217;t have any hubris in it. We don&#8217;t assume that we solved your issue. In fact, we don&#8217;t assume that we&#8217;ve helped at all, or closed the conversation at all. Paradoxically, by inviting dissent or further conversation, we invite only the constructive responses.</p>
<p>Thanks!</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/IT5ab2ASuzE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/longer-more-formal-closings-invite-fewer-thank-you-replies/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%2Flonger-more-formal-closings-invite-fewer-thank-you-replies%2F&amp;seed_title=Longer%2C+More+Formal+Closings+Invite+Fewer+Thank-you+Replies</feedburner:origLink></item>
		<item>
		<title>Friday Linkparty</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/bbM2XQrmxNA/</link>
		<comments>http://blog.fogcreek.com/friday-linkparty-5/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 16:03:00 +0000</pubDate>
		<dc:creator>Dan Ostlund</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=1929</guid>
		<description><![CDATA[Read on! A Starcraft AI that&#8217;s more like a human player: This implementation faces many of the obstacles that human players face, like only having a single viewport, and being able to issue one command at a time. Still, 2000 APM is crazy! Tuning TCP for more vroom vroom: Adjusting initcwnd for better performance. Operations [...]]]></description>
			<content:encoded><![CDATA[<p>Read on!</p>
<blockquote><p><a href="http://graphics.stanford.edu/~mdfisher/GameAIs.html" target="_blank">A Starcraft AI that&#8217;s more like a human player</a>: This implementation faces many of the obstacles that human players face, like only having a single viewport, and being able to issue one command at a time. Still, 2000 APM is crazy!</p>
<p><a href="http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/" target="_blank">Tuning TCP for more vroom vroom</a>: Adjusting initcwnd for better performance.</p>
<p><a href="http://www.businessweek.com/magazine/apples-supplychain-secret-hoard-lasers-11032011.html" target="_blank">Operations efficiency is one of your possible competitive advantages</a>: And Apple, of course, excels at it. &#8220;The decision to focus on a few product lines, and to do little in the way of customization, is a huge advantage.&#8221;</p>
<p><a href="http://www.popsci.com/technology/article/2011-11/data-derbies-how-companies-crowdsource-algorithms" target="_blank">Crowd sourcing algorithms</a>: Big prizes</p>
<p>Some musings on patents. <a href="http://andrewsullivan.thedailybeast.com/2011/10/a-defense-of-copying-ctd.html" target="_blank">On Andrew Sullivan&#8217;s blog</a>. There is also the always excellent <a href="http://www.lewishyde.com/" target="_blank">Lewis Hyde</a>, who has <a href="http://www.amazon.com/Common-Air-Revolution-Art-Ownership/dp/B005M49WNA/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1320421521&amp;sr=1-1" target="_blank">a fantastic book on patents and copyright</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p></blockquote>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/bbM2XQrmxNA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/friday-linkparty-5/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%2Ffriday-linkparty-5%2F&amp;seed_title=Friday+Linkparty</feedburner:origLink></item>
		<item>
		<title>FogBugz and Kiln Build and Release Report Card</title>
		<link>http://feedproxy.google.com/~r/FogCreekBlog/~3/cCLq-8fVNHE/</link>
		<comments>http://blog.fogcreek.com/build-and-release-report-card/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 16:29:11 +0000</pubDate>
		<dc:creator>Rock Hymas</dc:creator>
				<category><![CDATA[FogBugz]]></category>
		<category><![CDATA[Kiln]]></category>

		<guid isPermaLink="false">http://blog.fogcreek.com/?p=1893</guid>
		<description><![CDATA[My wife and I are a couple months into our first year of homeschooling, and we&#8217;ve been discussing how the kids are doing with it, and the challenges we&#8217;ve faced as their teachers and parents. Those discussions have led us to make some important changes, in the same way that a school report card can [...]]]></description>
			<content:encoded><![CDATA[<p>My wife and I are a couple months into our first year of homeschooling, and we&#8217;ve been discussing how the kids are doing with it, and the challenges we&#8217;ve faced as their teachers and parents. Those discussions have led us to make some important changes, in the same way that a school report card can get parents and children to make changes that lead to more learning and happier kids. In that spirit, I offer here a report card on the build and release management work we&#8217;ve been doing on FogBugz and Kiln [1] over the last 12-18 months.</p>
<p>About a year ago, I was in the middle of writing a <a href="http://thoughts.rockhymas.com/post/12014744973/build-and-release-management-series" rel="nofollow">series of posts</a> about the practices of build and release management. Many of those practices came from looking at what we were doing with FogBugz and Kiln and identifying what worked, and what didn&#8217;t. Others came from what I saw and experienced while working within the Microsoft Office organization, and still more came from discussions within our team at the Creek. Though in some areas we were doing things right, most of the posts were a description of what our existing build and release (non-)system was doing utterly wrong and what I hoped we could change to fix it. So the series was often written in a spirit of hope that we would one day live up to the ideal.</p>
<p>In fact, you could take many of the posts I wrote last fall and read them as the opposite of how things existed at Fog Creek in the summer of 2010. So, in the spirit of Jason Cohen&#8217;s recent BoS <a href="http://businessofsoftware.org/speakers.aspx#jcohen" rel="nofollow">talk about honesty</a>, I&#8217;m going to be brutally honest about how we were doing and how we are now doing.</p>
<p>First, how we were doing. Here&#8217;s the report card for June of 2010, divided into subjects, of course.</p>
<div>
<table border="2" cellspacing="0" cellpadding="0">
<tbody style="border-left: 1px solid #B3B3B3; border-bottom: 1px solid #B3B3B3;">
<tr>
<td colspan="2"><strong>Report Card for June 2010</strong></td>
</tr>
<tr>
<td><strong>Subject</strong></td>
<td><strong>Grade</strong></td>
</tr>
<tr>
<td>Fast builds/deploys</p>
<p style="padding-left: 30px;">Deploying upgrades to <a href="http://www.fogcreek.com/" rel="nofollow">www.fogcreek.com</a> takes over an hour</p>
<p style="padding-left: 30px;">Other builds and deployments often take much longer than they need to</p>
<p style="padding-left: 30px;">Upgrades to FogBugz or Kiln often involve downtime of a few seconds to half an hour or more</p>
</td>
<td style="text-align: center;">D</td>
</tr>
<tr>
<td>No hard dependencies</p>
<p style="padding-left: 30px;"><a href="http://thoughts.rockhymas.com/post/938040895/where-do-developers-keep-their-checked-out-source-code" rel="nofollow">Checked out source code</a> is tied to absolute paths in some cases</p>
<p style="padding-left: 30px;">The build and deployment scripts are full of <a href="http://thoughts.rockhymas.com/post/942491472/how-do-i-eliminate-absolute-paths-from-my-code-and" rel="nofollow">hard coded paths</a> and other <a href="http://thoughts.rockhymas.com/post/947094911/do-your-builds-have-other-hard-dependencies" rel="nofollow">hard dependencies</a></p>
</td>
<td style="text-align: center;">F</td>
</tr>
<tr>
<td>Single commands (automate, automate, automate)</p>
<p style="padding-left: 30px;">We can&#8217;t run most builds with a <a href="http://thoughts.rockhymas.com/post/931921833/can-you-build-your-product-with-one-command" rel="nofollow">single command</a></p>
<p style="padding-left: 30px;">Many of the build and deployment scripts <a href="http://thoughts.rockhymas.com/post/1121349192/why-should-my-build-and-deployment-scripts-be-separate" rel="nofollow">are combined</a></p>
<p style="padding-left: 30px;">Deploying a new version takes <a href="http://thoughts.rockhymas.com/post/1093701227/can-you-deploy-your-product-with-one-command" rel="nofollow">multiple steps</a></p>
<p style="padding-left: 30px;">Different scripts are used for <a href="http://thoughts.rockhymas.com/post/2624391100/do-you-have-different-build-scripts-for-official-builds" rel="nofollow">dev builds vs official builds</a></p>
<p style="padding-left: 30px;">Different configurations of the build <a href="http://thoughts.rockhymas.com/post/1553192919/do-you-have-different-build-scripts-for-different" rel="nofollow">use different build scripts</a></p>
<p style="padding-left: 30px;">There is no tooling to make it easy to <a href="http://thoughts.rockhymas.com/post/1011476205/what-should-you-include-in-machine-setup-scripts-for" rel="nofollow">setup your dev system</a></p>
<p style="padding-left: 30px;">There are no scripts to configure a new server for our hosted environment, or a new dev box for development</p>
</td>
<td style="text-align: center;">D</td>
</tr>
<tr>
<td>Staging Environment</p>
<p style="padding-left: 30px;">We have no staging environment for our hosted FogBugz and Kiln products</p>
</td>
<td style="text-align: center;">F</td>
</tr>
<tr>
<td>Continuous Integration</p>
<p style="padding-left: 30px;">There is no continuous integration builds or tests running</p>
</td>
<td style="text-align: center;">F</td>
</tr>
<tr>
<td>Scripts @ production quality</p>
<p style="padding-left: 30px;">The scripts are old, unmaintained, with <a href="http://thoughts.rockhymas.com/post/1098426283/are-your-build-scripts-crusty-and-old" rel="nofollow">lots of cruft</a></p>
<p style="padding-left: 30px;">Many <a href="http://thoughts.rockhymas.com/post/1210746386/do-you-store-built-binaries-in-your-vcs" rel="nofollow">built binaries are stored</a> directly in the VCS</p>
</td>
<td style="text-align: center;">D</td>
</tr>
<tr>
<td>Onboarding new developers</p>
<p style="padding-left: 30px;">There is no easy way for devs to build installers</p>
<p style="padding-left: 30px;">There are no build scripts that do incremental builds</p>
</td>
<td style="text-align: center;">D</td>
</tr>
<tr>
<td>Insight into builds and releases</p>
<p style="padding-left: 30px;">Old builds <a href="http://thoughts.rockhymas.com/post/1167543667/do-you-save-your-old-builds" rel="nofollow">are not saved</a> for most official configurations</p>
<p style="padding-left: 30px;">We aren&#8217;t tracking build statistics like failures, build quality, etc.</p>
<p style="padding-left: 30px;">Logs of builds are not systematically kept and stored anywhere</p>
<p style="padding-left: 30px;">Build failures do not automatically notify anyone, nor do successful builds</p>
<p style="padding-left: 30px;">There are three different types of version numbers for our three different deployment targets</p>
</td>
<td style="text-align: center;">F</td>
</tr>
</tbody>
</table>
</div>
<p>All in all, things were a mess. &#8221;Good grief!&#8221;, I hear you cry. &#8220;So what have you done about these issues? Anything? What are you planning to do?&#8221; I&#8217;m glad you asked.</p>
<p>My initial goal in the role of build and release manager was to eliminate the position. I wanted to get things running smoothly, and spread the knowledge and ownership of the problems through the team, so that I could go back to doing product development. As such, a decent amount of the progress described here was done by other great developers here at the Creek. Back in January (when I joined FogBugz as the team lead), I thought I&#8217;d gotten about halfway through the work required for that to happen. But, of course, new ideas come up constantly, so maybe it never ends.</p>
<p>Since January, I haven&#8217;t been able to do as much. In addition to my small efforts, other great Creekers have picked up some of the slack. Here&#8217;s our report card for October 2011.</p>
<div style="margin-left: 5px;">
<table border="1" cellspacing="0" cellpadding="0">
<tbody style="border-left: 1px solid #B3B3B3; border-bottom: 1px solid #B3B3B3;">
<tr>
<td colspan="2"><strong>Report card for October 2011</strong></td>
</tr>
<tr>
<td><strong>Subject</strong></td>
<td><strong>Grade</strong></td>
</tr>
<tr>
<td>Fast builds/deploys</p>
<p style="padding-left: 30px;">A new, fast build machine</p>
<p style="padding-left: 30px;">Reduced web site deployments from taking ~80 minutes to taking ~8 minutes</p>
<p style="padding-left: 30px;">FogBugz and Kiln deployments now faster, because they don&#8217;t also rebuild the product</p>
<p style="padding-left: 30px;">Upgrades to FogBugz or Kiln still involve downtime of a few seconds to half an hour or more</p>
</td>
<td style="text-align: center;">C+</td>
</tr>
<tr>
<td>No hard dependencies</p>
<p style="padding-left: 30px;">Removed all the absolute paths</p>
<p style="padding-left: 30px;">Removed many other hard dependencies</p>
<p style="padding-left: 30px;">Removed some remaining hard dependencies that occasionally caused build failures</p>
</td>
<td style="text-align: center;">B</td>
</tr>
<tr>
<td>Single commands (automate, automate, automate)</p>
<p style="padding-left: 30px;">Mortar, an internal website for kicking off builds and deployments</p>
<p style="padding-left: 30px;">Lots of help on this one from Benjamin at <a href="http://bitquabit.com/" rel="nofollow">bitquabit</a></p>
<p style="padding-left: 30px;">Separated build and deploy scripts for hosted builds</p>
<p style="padding-left: 30px;">Some of the build and deployment scripts are still combined</p>
<p style="padding-left: 30px;">Deploying a new version takes multiple steps</p>
<p style="padding-left: 30px;">Different scripts are still used for dev builds vs official builds</p>
<p style="padding-left: 30px;">Different configurations of the build still use different build scripts, but some combining work has been done</p>
<p style="padding-left: 30px;">There is still no tooling to make it easy to setup your dev system</p>
<p style="padding-left: 30px;">There are still no scripts to configure a new server for our hosted environment, or a new dev box for development</p>
</td>
<td style="text-align: center;">C+</td>
</tr>
<tr>
<td>Staging Environment</p>
<p style="padding-left: 30px;">Still no progress on the staging environment</p>
</td>
<td style="text-align: center;">F</td>
</tr>
<tr>
<td>Continuous Integration</p>
<p style="padding-left: 30px;">Continuous integration builds exist, mostly just building the products</p>
<p style="padding-left: 30px;">Basic tests have been added to some continuous integration builds</p>
</td>
<td style="text-align: center;">B</td>
</tr>
<tr>
<td>Scripts @ production quality</p>
<p style="padding-left: 30px;">Removed many checked in binaries, building them instead</p>
<p style="padding-left: 30px;">Many scripts converted from FinalBuilder to Python, but a few still remain</p>
</td>
<td style="text-align: center;">B-</td>
</tr>
<tr>
<td>Onboarding new developers</p>
<p style="padding-left: 30px;">Branch builds, for any branch a dev wants to setup</p>
<p style="padding-left: 30px;">bf, a better tool for building FogBugz incrementally on dev machines</p>
<p style="padding-left: 30px;">Aaron kick-started this and continues to be the driving force</p>
<p style="padding-left: 30px;">There is still no easy way for devs to build installers</p>
</td>
<td style="text-align: center;">D</td>
</tr>
<tr>
<td>Insight into builds and releases</p>
<p style="padding-left: 30px;">Saving old hosted builds</p>
<p style="padding-left: 30px;">Moved to a single type of version number no matter the config</p>
<p style="padding-left: 30px;">Build logs for all official builds</p>
<p style="padding-left: 30px;">Cases filed on build failure</p>
<p style="padding-left: 30px;">Notifying build owners when builds complete, successfully or not</p>
<p style="padding-left: 30px;">We aren&#8217;t tracking build statistics like failures, build quality, etc.</p>
</td>
<td style="text-align: center;">B-</td>
</tr>
</tbody>
</table>
</div>
<p>As you can see, there is still plenty of work to do. The glaring failure in both report cards is our lack of a staging environment. We&#8217;re now working on making that a reality, with high hopes that it will help us start catching a new class of bugs before they make it into our customers hands. As part of that work, we&#8217;ll also be able to work on:</p>
<ul type="disc">
<li>Scripts for configuring our servers, by type</li>
<li>No-downtime upgrades</li>
<li>Move our internal dogfooding to the staging environment, for better consolidation and testing of deployment scripts</li>
</ul>
<p>Other possibilities for further work should be pretty clear from the report card, but the staging environment is the key focus when it comes to improving our builds and releases.</p>
<p>One note about the culture for both FogBugz and Kiln. We&#8217;ve learned a ton in the last couple years by seeing at close range what can be done in greenfield development on products like Trello, or teams that actively maintain and improve their processes for builds and releases, like StackOverflow. Obviously, when working with a legacy product like FogBugz, the costs of implementing certain practices may vary a lot, and we have to take that into consideration, but the inspiration that comes from seeing what is possible keeps us working to make things better.</p>
<p>When I look at this report card, I feel like my oldest son a little bit. He&#8217;s our perfectionist, always expecting to get everything right the first time through, and pretty disappointed when that doesn&#8217;t happen. We&#8217;re hoping that some of the changes we make in our homeschooling will help him relax a bit so he can learn more freely. And yes, it&#8217;s somewhat humbling to look at our build and release report card and admit how far we have to go. But I have high hopes that in another six months we&#8217;ll have improved our grades again.</p>
<p>&nbsp;</p>
<p><span style="color: #808080;">[1] What about Trello?</span></p>
<p><span style="color: #808080;">Trello has the awesome advantage of being greenfield development. As such, they&#8217;ve really started from the ground up by doing the right things when it comes to builds and releases. They frequently release midday with no downtime, they have a nice staging environment, their releases take almost no time at all. They have run into some interesting load challenges with updating their clients after an upgrade, but I&#8217;ll let the <a href="http://blog.trello.com/" rel="nofollow"><span style="color: #808080;">Trello team</span></a> talk about that in their own sweet time.</span></p>
<img src="http://feeds.feedburner.com/~r/FogCreekBlog/~4/cCLq-8fVNHE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.fogcreek.com/build-and-release-report-card/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%2Fbuild-and-release-report-card%2F&amp;seed_title=FogBugz+and+Kiln+Build+and+Release+Report+Card</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.645 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-04 21:55:02 -->

