<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>bitquabit</title><link>http://blog.bitquabit.com/</link><description>Opinionated Rants on Life and Software</description><language>en-us</language><lastBuildDate>Wed, 10 Feb 2010 11:37:39 -0500</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/bitquabit" /><feedburner:info uri="bitquabit" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>The fighting&amp;#39;s been fun and all, but it&amp;#39;s time to shut up and get along</title><link>http://feedproxy.google.com/~r/bitquabit/~3/SauadDT_1qI/</link><description>&lt;p&gt;About once a week, I get an email in my mailbox that reads like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hey, Kiln looks neat, but Git is totally the bee&amp;#8217;s knees, so why the fuck are you using Mercurial?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that these emails are rarely (if ever) actually interested in why Kiln chose Mercurial; what they&amp;#8217;re instead interested in is trying to piss me off enough that I get into a flamewar about why Mercurial is going to bring about Nirvana while Git causes people to eat babies using nothing but A1 sauce and a spork.&lt;/p&gt;

&lt;p&gt;This is stupid.&lt;/p&gt;

&lt;p&gt;Mercurial and Git are both DAG-based DVCSes.  They use the same patch format.  They both handle directories implicitly.  They both can autodetect file deletions and renames.  They both run on just about every platform I can think of.  They both do a bunch of &amp;#8220;cool&amp;#8221; stuff, like rebasing, editing history, signing changesets, and serving as the inspiration for Ferris Bueller.  They both have nearly identical performance characteristics, they both have social code sharing sites, they both are used by really big projects, they both have really good documentation, and &lt;a href="http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/"&gt;they both got compared to James Bond or MacGyver&lt;/a&gt; or something like that in an analogy I didn&amp;#8217;t really follow.&lt;/p&gt;

&lt;p&gt;So why is there so much hating?  I think what&amp;#8217;s going on is that people are coming to these tools from Subversion or CVS, have their massive epiphany on &lt;em&gt;how totally awesome DVCSes are&lt;/em&gt;, and then assume that &lt;em&gt;only their tool can have this level of awesome&lt;/em&gt;, so they begin evangelizing.  The problem, of course, is that the other guy feels the same way, and is also evangelizing, so the Git and the Mercurial guy end up in a locker-room-style temper-tantrum over whose tool has the best performance or whatnot, instead of how much more awesome their tools are than the competition.&lt;/p&gt;

&lt;p&gt;This has to stop.&lt;/p&gt;

&lt;p&gt;Mercurial&amp;#8217;s enemy is not Git.  Git&amp;#8217;s enemy is not Mercurial.&lt;/p&gt;

&lt;p&gt;Their enemy is Subversion.&lt;/p&gt;

&lt;p&gt;For example, take a look at &lt;a href="http://subversion.wandisco.com/component/content/article/1/40.html"&gt;this tripe&lt;/a&gt;.  Anyone who has seriously used Mercurial or Git for any length of time is going to spend most of the video alternating between laughing, peeing their pants, and trying to explain that they merely spilled a bunch of water on their crotch, honest.  While there&amp;#8217;s some truth to the video&amp;#8212;a lot of people do ditch Subversion for off-line commits or for shelving or the like&amp;#8212;the video also totally misses why people love and stay with DVCSes, which is that they make branching and merging &lt;em&gt;actually work like they&amp;#8217;re supposed to&lt;/em&gt;, and make source control so fast and seamless that you find you&amp;#8217;re suddenly using it for everything.&lt;/p&gt;

&lt;p&gt;But if you show that video to a Subversion user, they&amp;#8217;re going to nod.  And there&amp;#8217;s really no reason for them not to: if you don&amp;#8217;t grok what the DAG gives you, if you&amp;#8217;ve never kicked an entire branch back-and-forth across a LAN, if you&amp;#8217;ve never used a site like Bitbucket or GitHub, then the only &lt;em&gt;tangible&lt;/em&gt; benefits you see from DVCSes are&amp;#8230;well, partial commits, and the fact that their &amp;#8220;checkouts&amp;#8221; aren&amp;#8217;t littered with &lt;code&gt;.svn&lt;/code&gt; directories all over the place.  And these are problems that Subversion&amp;#8217;s upcoming versions actually &lt;em&gt;might&lt;/em&gt; solve.&lt;/p&gt;

&lt;p&gt;So it&amp;#8217;s time to focus on the real enemy: the holdouts still using centralized systems.  The way I see it, there are three parts to this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Git and Mercurial need to do a better job handling one thing that Subversion is still better at: binary files.&lt;/strong&gt;  I know there are Git projects that are working on improving the transfer and storage of binary files within Git&amp;#8217;s existing repository format, such as &lt;a href="http://caca.zoy.org/wiki/git-bigfiles"&gt;git-bigfiles&lt;/a&gt;.  Mercurial is taking a slightly different tack through projects such as &lt;a href="http://mercurial.selenic.com/wiki/BfilesExtension"&gt;bfiles&lt;/a&gt;, which aim to deliberately move large binaries out of the store.  We need to improve these workflows so that &amp;#8220;DVCSes are totally better, unless&amp;#8221; becomes simply &amp;#8220;DVCSes are totally better.&amp;#8221;  (For our part, Fog Creek is helping fund development of bfiles via &lt;a href="http://ucosp.wordpress.com/"&gt;UCOSP&lt;/a&gt;, a semester-long student project.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git and Mercurial advocates need to remember that they need to be converting Subversion, CVS, and Perforce users, not each other.&lt;/strong&gt;  The fundamental evil here is centralized, branchless version control systems that effectively encourage all development to occur in trunk, and which make propagating bug fixes and features properly borderline impossible for all but the most disciplined shops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git and Mercurial advocates need to remember that anyone going to either system is a win for the both communities.&lt;/strong&gt; It&amp;#8217;s easy, in the yin/yang of Hacker News and proggit, to forget that &lt;em&gt;most developers are not even aware of what DVCSes are or what they do&lt;/em&gt;.  Yeah.  Sounds crazy, I know, but trust me on this.  The goal right now, if you honestly believe that the DVCS workflow is better&amp;#8212;and I do&amp;#8212;should be to get the mindset out there, to make more people aware of what DVCSes have to offer and why they should be using them.  I for one definitely do not care whether you end up deciding that Mercurial is better than Git for you or not (well, I kind of do, because I want you to use &lt;a href="http://fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt;, but otherwise&amp;#8230;), but I get a warm fuzzy feeling knowing that, if I ever have to work with your code, I&amp;#8217;ll be able to use a sane version control tool.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So let&amp;#8217;s do it.  No more fighting.  Git, I hereby acknowledge you rock.  And Mercurial, you rock so much &lt;a href="http://fogcreek.com/kiln/"&gt;I helped build an entire product around you&lt;/a&gt;.  You&amp;#8217;re both awesome.  So you two shake hands&amp;#8230;very nice.  Now, see that other dude over there?  The one with no real tagging or branching support?&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s get him.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/SauadDT_1qI" height="1" width="1"/&gt;</description><pubDate>Wed, 10 Feb 2010 11:37:39 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2010/02/10/fightings-been-fun-and-all-its-time-shut-and-get-along/</guid><feedburner:origLink>http://blog.bitquabit.com/2010/02/10/fightings-been-fun-and-all-its-time-shut-and-get-along/</feedburner:origLink></item><item><title>Kiln&amp;#39;s Evolution, Part 2: From Prototype to Beta</title><link>http://feedproxy.google.com/~r/bitquabit/~3/rwD4fH0dtYQ/</link><description>&lt;p&gt;&lt;em&gt;This article is a continuation of &lt;a href="http://blog.bitquabit.com/2009/11/10/dvcs-as-code-review/"&gt;Kiln&amp;#8217;s Evolution, Part 1: DVCS as Code Review&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the fall of 2008, Joel was getting increasingly adamant that FogBugz needed source control integration, and most people in the company seemed to think Subversion would probably be the best SCM to make that happen.  &lt;a href="http://hicks-wright.net"&gt;Tyler&lt;/a&gt; and  I disagreed, believing strongly that we should use a DVCS instead, and that our code review tool gave a really compelling example of &lt;em&gt;why&lt;/em&gt; DVCS was better that any software shop would instantly &amp;#8220;get.&amp;#8221;  But to convince the rest of the company, we&amp;#8217;d have to show them a version of our tool that was more polished and usable than what we&amp;#8217;d submitted to Django Dash.&lt;/p&gt;

&lt;p&gt;And so we began a skunkworks project.&lt;/p&gt;

&lt;p&gt;Unable to use time at work on much besides Copilot, I instead used my week of Thanksgiving vacation cleaning up the prototype&amp;#8217;s user interface and functionality, named the result Kiln, and gave it its first logo.  Tyler spent evenings in December making Kiln a proper, pluggable Django application, made the UI actually usable, and fixed a pile of bugs that would have blown up in our face if we&amp;#8217;d tried showing Kiln to anyone else.  By January, 2009, Kiln was ready to demo.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://media.bitquabit.com/blog/2010/02/cowbell.png"&gt;&lt;img src="http://media.bitquabit.com/blog/2010/02/cowbell-thumb.png" alt="Kiln's review interface circa January, 2008" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;em&gt;Kiln&amp;#8217;s interface, directly after the winter skunkworks changes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After lunch on a cold winter day, Tyler and I dragged everyone out into the kitchen and demoed the current state of Kiln.  We showed repository management and the FogBugz-inspired code review workflow, and then made the case that this, or something very similar, should be FogBugz&amp;#8217; source control system.&lt;/p&gt;

&lt;p&gt;And an amazing thing happened: somehow, everybody basically agreed.  Sure, some people thought Kiln should be in C# or Wasabi instead of Django, no one could agree on whether Kiln should be a direct part of FogBugz or be an independent product, and Tyler and I argued strongly for Kiln as a hosted-only solution to a bunch of people who knew their bread-and-butter came from licensed applications, but everyone agreed that the basic of idea of a Mercurial-powered SCM with DVCS-backed code review made for a compelling product.  And so Kiln was born.&lt;/p&gt;

&lt;p&gt;For Kiln to develop into an adult, though, we had to assemble a Kiln team.  Tyler and I were still working on Copilot, and the newly appointed team lead, &lt;a href="http://benkamens.com/"&gt;Ben Kamens&lt;/a&gt;, was busy with the FogBugz 7 release. Even if all three of us started work immediately, we couldn&amp;#8217;t possibly turn the project from prototype to beta by our target date of August 2009, and starting immediately seemed&amp;#8230;well, optimistic, at best.&lt;/p&gt;

&lt;p&gt;But we work at Fog Creek, and if there&amp;#8217;s one thing Fog Creek knows how to do, it&amp;#8217;s how to help interns churn out awesome products over the course of a single summer.  After all, &lt;a href="http://www.projectaardvark.com/"&gt;Tyler and I started at Fog Creek by developing all of Copilot in the summer of 2005&lt;/a&gt;; why not go for broke and try for a repeat?  What we therefore decided to do was to bet the farm and put &lt;em&gt;all&lt;/em&gt; of our summer interns on Kiln.  The three of us would try to wrap up the work we had to do on our current projects as quickly as possible, and, as we transitioned off, we&amp;#8217;d focus purely on building up enough Kiln infrastructure that the interns could immediately be productive when they arrived.  Meanwhile, until the three of us could start work on Kiln, we&amp;#8217;d have our project managers figure out the details of the user experience so that, once we finally &lt;em&gt;could&lt;/em&gt; work on Kiln, we&amp;#8217;d be able to focus as much as possible on coding instead of decision-making meetings.&lt;/p&gt;

&lt;p&gt;As we moved ever closer to June, we made several key decisions about the design of the product:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kiln could launch hosted-only, but we&amp;#8217;d need to ensure that its design was amenable to on-site installation.&lt;/li&gt;
&lt;li&gt;Kiln would depend on FogBugz for user management and bug-tracking integration, but would otherwise be its own code base.&lt;/li&gt;
&lt;li&gt;Kiln&amp;#8217;s website would be written in C# and ASP.NET MVC, completely freeing it from the FogBugz legacy code base.&lt;/li&gt;
&lt;li&gt;The part of Kiln that needed to talk directly to the DVCS would be a separate component so that we target different (or even multiple) SCMs without changing the website.&lt;/li&gt;
&lt;li&gt;Code reviews on branches would be eliminated in favor of arbitrary discussions on files and changesets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the time the first interns arrived, we had a beautiful set of specs with lovely &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq Mockups&lt;/a&gt; put together by &lt;a href="http://www.jasonr.org/"&gt;Jason&lt;/a&gt; and Dan, and we&amp;#8217;d managed to cobble together a basic framework that supported repository hosting and FogBugz integration, and that learned as much as possible from our best example of a known-good ASP.NET MVC code base, &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our plan paid off &lt;em&gt;ridiculously&lt;/em&gt; quickly.  A week into the internship, the interns had already managed to get key pieces of Kiln limping along.  By the end of the second week, they had enough ownership they were starting to challenge us when they felt the user specs or the engineering didn&amp;#8217;t make sense.  Their strong focus on core Kiln freed Tyler, Ben and me to focus on performance, billing, On Demand integration, and all the other things that absolutely must get done for a real product, but that no one would otherwise ever do.&lt;/p&gt;

&lt;p&gt;Just over a month into the summer, Kiln might not win any speed or beauty awards, but nearly all of its features were working in one way or another, and it was usable for its intended purpose.  In other words, we&amp;#8217;d hit pre-alpha.  With great fanfare, we decided that Kiln was ready for dogfooding, and Kiln development moved to Kiln itself.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a slightly unfortunate thing about dogfooding, though: features that looked great on paper, and even &lt;em&gt;worked&lt;/em&gt; perfectly in the prototype, end up not being what you want in the real product.  Some interfaces end up not scaling the way you want.  Some end up too complicated, or end up solving one particular problem at the expense of all others.  It&amp;#8217;s a testament to our PMs that we had comparably few of these occur, but sometimes the difference between the prototype and what we ended up shipping was massive.  For example, compare the Balsamiq mockup of the code review system, which was actually used by the pre-alpha:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2010/02/reviews.png" alt="The Balsamiq Mockup of the Coventi-inspired code review system" /&gt;&lt;/p&gt;

&lt;p&gt;with the version that we ended up actually shipping:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2010/02/reviews-current.png" alt="The current review system used by Kiln" /&gt;&lt;/p&gt;

&lt;p&gt;Or take a look at the original specification for the Kiln Dashboard:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2010/02/dashboard-prototype.png" alt="The mockup of Kiln's original developer dashboard" /&gt;&lt;/p&gt;

&lt;p&gt;compared to the shipping equivalent, the Activity Feed:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2010/02/activity.png" alt="The mockup of Kiln's original developer dashboard" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;(I apologize about using the mockups, rather than screenshots, for the earlier versions; trying to get Kiln circa June 2009 running at this point proved a royal pain in the butt, and I don&amp;#8217;t honestly think that it makes a big difference.)&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s not obvious in these two screenshots is that the change from the pre-alpha interface to the shipping interface frequently happened over the course of just a couple of weeks.  Everyone was very vocal about what they liked and didn&amp;#8217;t like, and the interns were happy to go through several iterations rapid-fire to find one that everyone liked.  In that way, the weakest parts of Kiln ended up getting the most attention, and rapidly matured into some of its strongest features.&lt;/p&gt;

&lt;p&gt;In a massive code sprint at the end of the summer, Kiln matured into something resembling a fully grown product.  One of our interns made a beautiful JavaScript renderer for Kiln&amp;#8217;s DAG, the novel repository management our PMs designed fully matured into beautiful JavaScripty goodness, our FogBugz/Kiln workflow became increasingly seamless, and we further loosened review requirements so that you could review arbitrary discontiguous changesets.  We transitioned Copilot and FogBugz to be hosted on Kiln as well, got mostly positive feedback from the rest of the team, and worked on swiftly addressing their complaints.  Despite these feature additions, Kiln&amp;#8217;s performance went from tolerable, to better, to fast.  We knew we had a winner on our hands.  We prepared the FogBugz On Demand environment to become Kiln On Demand, made our first deployment, and turned the switch for our first batch of beta users.&lt;/p&gt;

&lt;p&gt;And while you might expect this part of the story to be about everything going haywire and all hell breaking loose, what actually happened is that, against all odds, everything basically worked.  The beta was quite boring: while there were a lot of bugs to fix at first, and some of them were extremely tough (for example, supporting very large repositories, or making history views faster, or legitimately supporting Internet Explorer) or really ticked off our customers (Kiln at once point let you rename and move repositories without breaking URLs, which sounded like an absolutely great idea when I helped hammer it through the design committee, but which completely blew up in one of our client&amp;#8217;s faces a few weeks later), everything basically worked.  Our beta testers seemed increasingly excited about the product.  All of our gambles seemed to have paid off as we readied Kiln 1.0 for its November launch date.&lt;/p&gt;

&lt;p&gt;Except, of course, that Kiln did not ship in November, 2009.  That&amp;#8217;s because, just a week or two before it was supposed to ship, we went to the Business of Software conference in San Francisco.&lt;/p&gt;

&lt;p&gt;You see, that was where we realized we were doing it all wrong.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To be continued&amp;#8230;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/rwD4fH0dtYQ" height="1" width="1"/&gt;</description><pubDate>Wed, 10 Feb 2010 08:12:56 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2010/02/10/from-prototype-to-beta/</guid><feedburner:origLink>http://blog.bitquabit.com/2010/02/10/from-prototype-to-beta/</feedburner:origLink></item><item><title>Firing Up Kiln</title><link>http://feedproxy.google.com/~r/bitquabit/~3/0MxGuIGh4QI/</link><description>&lt;p&gt;As &lt;a href="http://www.fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt; draws ever closer to release, I realized that we have long since passed the point where I should move all of my personal projects to it.&lt;/p&gt;

&lt;p&gt;So as of today, I have.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in grabbing the most recent version of &lt;a href="http://blog.bitquabit.com/2009/06/03/introducing-fogbugzmiddleware/"&gt;FogBugz Middleware&lt;/a&gt;, my fork of &lt;a href="http://kiln.stackexchange.com/questions/179/offsite-backups"&gt;Kiln Backup&lt;/a&gt;, or any of my other public projects, they&amp;#8217;re now all at &lt;a href="https://bqb.kilnhg.com"&gt;https://bqb.kilnhg.com&lt;/a&gt;.  Log-in with the user &lt;strong&gt;guest&lt;/strong&gt; and the password &lt;strong&gt;anonymous&lt;/strong&gt;, and you&amp;#8217;ll have full read-only access to the entire site.&lt;/p&gt;

&lt;p&gt;Even if you&amp;#8217;re not that interested in the stuff I&amp;#8217;ve written, you still may be interested in checking out the site: by enabling read-only guest logins on my FogBugz account, I&amp;#8217;ve made it &lt;em&gt;very&lt;/em&gt; easy for you to take a look around a real, active Kiln and FogBugz install, without setting things up or filling out any annoying forms.  If you just wanted to a get a quick feel for what Kiln looked and felt like, now&amp;#8217;s your chance.&lt;/p&gt;

&lt;p&gt;So go ahead and check it out.  Feel free to post question or comments here, or (if appropriate) over at &lt;a href="http://kiln.stackexchange.com"&gt;the Kiln StackExchange&lt;/a&gt;, and I&amp;#8217;ll be happy to answer them.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/0MxGuIGh4QI" height="1" width="1"/&gt;</description><pubDate>Wed, 13 Jan 2010 08:48:36 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2010/01/13/firing-up-kiln/</guid><feedburner:origLink>http://blog.bitquabit.com/2010/01/13/firing-up-kiln/</feedburner:origLink></item><item><title>On Being Good</title><link>http://feedproxy.google.com/~r/bitquabit/~3/0lOo6Em7CiM/</link><description>&lt;p&gt;Google&amp;#8217;s motto is, &amp;#8220;Don&amp;#8217;t be evil.&amp;#8221;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve always found that motto disturbing for two reasons.  First, a company that can differentiate itself&amp;mdash;successfully, no less&amp;mdash;from its competitors merely by promising not to be evil implies that the average company is ridiculously corrupt. A person who announced, &amp;#8220;My motto is, &amp;#8216;don&amp;#8217;t shoot people&amp;#8217;&amp;#8221; would be notable because no one thinks you should shoot people, making the promise weird and redundant&amp;mdash;not because the promise represented some great sacrifice.  Yet Google&amp;#8217;s promise to do no evil somehow hits people, especially those in the tech industry with fresh memories of Microsoft in the 90s and the specter of Oracle in the 2000s, as a breath of fresh air. Great for Google, but pathetic for our industry.&lt;/p&gt;

&lt;p&gt;But the second reason, and the more important one for me, is that &amp;#8220;Don&amp;#8217;t be evil&amp;#8221; is not the same as &amp;#8220;Do the right thing.&amp;#8221;  A person who watches idly while a bully beats someone up isn&amp;#8217;t being evil, but they are being a coward, and they are not doing the right thing. Their interference could save a poor victim a world of pain and suffering, probably at minimal risk. Instead, they simply watch the bully, knowing that they themselves would not do the same thing. This may not be doing evil, but it&amp;#8217;s also not the moral high ground. Knowing you would never beat someone up is not the same as protecting those weaker than you.&lt;/p&gt;

&lt;p&gt;Google chose its motto carefully; if its motto were instead, &amp;#8220;Do the right thing,&amp;#8221; then it would have no presence in China. For all the corruption that people accuse our government of perpetrating, our government does not censor the Internet, does not shoot and incarcerate those who disagree with it, does not deny its citizens the right to vote, and does not persecute religious minorities as a matter of state policy. China does. And until today, while Google may not have been evil in China, they certainly enabled evil to go about its business by running a censored search engine there. They were unequivocally better than Yahoo, &lt;a href="http://www.pcworld.com/article/129837/yahoo_cleared_in_chinese_dissident_case.html"&gt;who handed over the names and email addresses of dissidents&lt;/a&gt;, but they weren&amp;#8217;t doing the right thing, either. They weren&amp;#8217;t standing up to an autocratic, dictatorial regime.&lt;/p&gt;

&lt;p&gt;As of today, that has changed. &lt;a href="http://googleblog.blogspot.com/2010/01/new-approach-to-china.html"&gt;Google has announced that they will no longer censor their Chinese search results&lt;/a&gt;.  While you could argue that Google&amp;#8217;s doing this out of anger that their resources have been hacked, rather than out of a genuine desire to protect its users, their result of their actions is beyond dispute: &lt;em&gt;they are taking the moral high ground&lt;/em&gt;. And potentially at great cost: while China has certainly failed to materialize as the unstoppable threat to the West that pundits were claiming it would become two decades ago, it&amp;#8217;s nevertheless home for nearly a billion people, and shows no sign of stopping its economic growth in the near future. For Google to make a move that will almost certainly sacrifice any chance they have of winning the Chinese market is an economically painful move.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But it&amp;#8217;s the &lt;strong&gt;right&lt;/strong&gt; move.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, at least for today, at least this once, look at Google as a company which is not merely avoiding perpetrating evil. Google is doing the right thing, at great cost. And they deserve to be lauded for that.&lt;/p&gt;

&lt;p&gt;Microsoft and Yahoo: this is your turn to follow in Google&amp;#8217;s footsteps. Do the right thing. It won&amp;#8217;t make you money. In fact, it&amp;#8217;ll cost you. But it&amp;#8217;s the right thing to do.&lt;/p&gt;

&lt;p&gt;Google: where it&amp;#8217;s not don&amp;#8217;t be evil.  It&amp;#8217;s, &amp;#8220;Do the right thing.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/0lOo6Em7CiM" height="1" width="1"/&gt;</description><pubDate>Tue, 12 Jan 2010 21:42:29 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2010/01/12/on-being-good/</guid><feedburner:origLink>http://blog.bitquabit.com/2010/01/12/on-being-good/</feedburner:origLink></item><item><title>The Amazing Spammable Marketplace</title><link>http://feedproxy.google.com/~r/bitquabit/~3/LOnMLlCWaWk/</link><description>&lt;p&gt;Whenever I browse the Android Marketplace, I&amp;#8217;m utterly amazed by how many &amp;#8220;app reviews&amp;#8221; are nothing but spam.  The problem is so pandemic that I have to conclude that Google has thus far done absolutely nothing to combat the problem.  Shopping in the Marketplace ends up feeling like going through a dirty bazaar, surrounded by panhandlers and con artists looking to make a cheap buck.  I don&amp;#8217;t care how good the deals may be; if shopping ends up being an annoying experience that makes me feel dirty, I&amp;#8217;m unlikely to bother going in the first place.  In the Marketplace, that translates to finding nothing but crap reviews, making shopping for any given application basically a crap shoot.  Plus, the apps themselves end up looking like schlock you&amp;#8217;d find on a spyware site.&lt;/p&gt;

&lt;p&gt;If Google&amp;#8217;s serious about trying to compete with the iPhone App Store, they need to get off their feet and fix this problem right now.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/LOnMLlCWaWk" height="1" width="1"/&gt;</description><pubDate>Thu, 07 Jan 2010 16:05:22 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2010/01/07/amazing-spammable-market-place/</guid><feedburner:origLink>http://blog.bitquabit.com/2010/01/07/amazing-spammable-market-place/</feedburner:origLink></item><item><title>Droid Update Makes Droid Not Suck</title><link>http://feedproxy.google.com/~r/bitquabit/~3/EzwgDnyaa0Y/</link><description>&lt;p&gt;Well.  At least it makes it suck &lt;em&gt;less&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I bought a Droid the day it came out.  While it was a &lt;em&gt;tremendous&lt;/em&gt; improvement over my BlackBerry, I&amp;#8217;ve been disappointed with the phone overall.  The battery cover &lt;a href="http://www.jangro.com/gadgets/droid/droid-battery-cover-problem-update/"&gt;comes off constantly&lt;/a&gt; (&lt;a href="https://supportforums.motorola.com/message/72567;jsessionid=AF8B1B142C276C5646FB42D384694390.node0"&gt;[2]&lt;/a&gt;, &lt;a href="http://droidie.com/2009/11/20/the-droid-battery-cover-problem/"&gt;[3]&lt;/a&gt;), the phone&amp;#8217;s proximity sensor was extraordinarily finicky (usually resulting in me hitting the &amp;#8220;mute&amp;#8221; button with my cheek in the middle of a call), the camera was all but useless, and, for reasons I did not really understand, my Android developer phone running Android 1.6 provided a much smoother user experience than the vastly-more-powerful-on-paper Droid.  In other words, the Droid was a solid upgrade from what I had, but still disappointing.  I have to agree with Dave Winer&amp;#8217;s now-famous rant on &lt;a href="http://droidie.com/2009/11/30/zealotry-sucks-and-so-does-the-droid/"&gt;why the Droid sucks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Last night, Motorola and Google unleashed Android 2.0.1 as an over-the-air update.  While the update does little about the battery cover, it &lt;em&gt;seems&lt;/em&gt;, at least so far, to resolve nearly all of the software issues.  The proximity sensor&amp;#8217;s logic seems improved, though not perfect; many operations are visually smoother (although oddly still not universally as smooth as the G1); the camera&amp;#8217;s usable taking pictures, rather than mocking the incompetence of Motorola&amp;#8217;s engineers; and there have even been some very nice visual refinements to fonts and color schemes.  Best of all, and unusual for the first update to a new device, &lt;em&gt;nothing broke&lt;/em&gt;: sudoku, SpacePhysics, Twidroid, TripIt, and other applications seem to still be working just fine.&lt;/p&gt;

&lt;p&gt;So if you were previously hesitant about buying a Droid for software reasons, and don&amp;#8217;t really have a problem using $2 double-sided tape to compensate for Motorola&amp;#8217;s QA team having the same skill as an inebriated eight-year-old, I think you&amp;#8217;ll be much happier with your purchase now than you&amp;#8217;d have been a month ago.  Otherwise, you might want to wait for the next Android-powered phone on Verizon and see if it works better.  It&amp;#8217;s certainly unlikely to be worse.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/EzwgDnyaa0Y" height="1" width="1"/&gt;</description><pubDate>Fri, 11 Dec 2009 11:07:59 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2009/12/11/droid-update-makes-droid-not-suck/</guid><feedburner:origLink>http://blog.bitquabit.com/2009/12/11/droid-update-makes-droid-not-suck/</feedburner:origLink></item><item><title>Kiln&amp;#39;s Evolution, Part 1: DVCS as Code Review</title><link>http://feedproxy.google.com/~r/bitquabit/~3/3PXjU8KUrr8/</link><description>&lt;p&gt;One of the things that really sucks about doing online code reviews is that, in all the systems I know, your code reviews do not integrate with your source control.  If the code reviews are versioned at all&amp;mdash;and they&amp;#8217;re frequently not&amp;mdash;then they&amp;#8217;re in an entirely different system than your real VCS.  For larger reviews, where you&amp;#8217;re talking about a major piece of functionality, that means that your source control system will end up lacking the history of how a feature came to be.  In other words, the more you use code reviews, the less actual history you have in your VCS.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s totally broken.  You&amp;#8217;re being punished for doing the right thing.&lt;/p&gt;

&lt;p&gt;A little over a year a year ago, &lt;a href="http://hicks-wright.net"&gt;Tyler&lt;/a&gt; came to me and asked me to join him in the &lt;a href="http://alt.djangodash.com/"&gt;Django Dash&lt;/a&gt;, a weekend code sprint.  Tyler and I had been talking about the code review problem, and had been thinking of writing our own that lacked these issues.  Django Dash seemed like the perfect time to try to actually do that.&lt;/p&gt;

&lt;p&gt;That opened up a question: how do you actually achieve better code review?  If you accept that a huge part of the problem is that the code review history is out-of-stream with your VCS, then it follows that you have to somehow store the in-process code in the VCS.&lt;/p&gt;

&lt;p&gt;In most systems, that means using branches.  But branches in almost any system &lt;em&gt;suck.&lt;/em&gt;  Everyone has a horror story about trying to do a merge in Subversion, or CVS, or Perforce&amp;mdash;and these are usually not meaningfully large merges; just small feature branches.  Trying to use branches for long-running code reviews in these systems simply isn&amp;#8217;t viable.&lt;/p&gt;

&lt;p&gt;But DVCSes are &lt;em&gt;great&lt;/em&gt; at handling this kind of problem.  To be distributed, they have to have extremely robust branching and merging systems.  Because their systems are so good, it&amp;#8217;s very common in DVCSes to do quick experiments and features in their own branch, then merge when complete.&lt;/p&gt;

&lt;p&gt;Tyler and I were both big fans of Mercurial (in fact, we convinced all of Fog Creek to switch to Mercurial from Subversion), so using Mercurial as our DVCS base seemed like the best bet.  After some discussion of the technical details for making the system work, we got a good night&amp;#8217;s sleep, woke up early, threw a nice breakfast on the table, and started coding.&lt;/p&gt;

&lt;p&gt;Forty-eight hours later, we had our first prototype.  When users wanted to contribute code to a repository, they would fork the repository, push all of their changes to the fork, and then request a review on the fork.  Users would see the exact diff of what they would be approving to the repository; no more, no less.  Code could not be approved unless it had already merged in the trunk, ensuring that the user who wrote the code had taken care of the merge.  When the review was approved, it&amp;#8217;d be seamlessly merged into trunk (guaranteed seamlessly, due to the previous rule), with full history.&lt;/p&gt;

&lt;p&gt;The design was inflexible and unintuitive, and would have had serious issues in a shipping project, but we achieved what we set out to do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Approving a code review was the same as pushing it&lt;/li&gt;
&lt;li&gt;Which meant that we could fully separate the concepts of code author and code approver&lt;/li&gt;
&lt;li&gt;And which meant that the full history of reviewed code was completely preserved&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="http://media.bitquabit.com/blog/2009/10/originalkiln.png"&gt;&lt;img src="http://media.bitquabit.com/blog/2009/10/originalkiln_thumbnail.png" alt="The original Kiln code review" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A screenshot of the prototype that would later become Kiln&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Even in its nascent form, the tool was already impressive enough, and unique enough, that we won the Django Code Dash.&lt;/p&gt;

&lt;p&gt;Tyler and I talked of making our code review tool into a real product, but we were knee-deep in Copilot work, so it had to wait.  But we had proved, if only to ourselves, that using a DVCS, even in a centralized model, provided some very unique capabilities that simply were not possible in other systems.&lt;/p&gt;

&lt;p&gt;When Joel announced a few months later that FogBugz needed a source control system, we&amp;#8217;d be ready.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/3PXjU8KUrr8" height="1" width="1"/&gt;</description><pubDate>Tue, 10 Nov 2009 08:41:19 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2009/11/10/dvcs-as-code-review/</guid><feedburner:origLink>http://blog.bitquabit.com/2009/11/10/dvcs-as-code-review/</feedburner:origLink></item><item><title>A Typographer&amp;#39;s Captcha</title><link>http://feedproxy.google.com/~r/bitquabit/~3/WWy2We56bQA/</link><description>&lt;p&gt;I&amp;#8217;m not entirely sure that this qualifies as a reasonable captcha for mere mortals.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2009/10/ohcomeon.png" alt="Ah yes, 3¼ tubbs, of course" /&gt;&lt;/p&gt;

&lt;p&gt;Perhaps on a typographer&amp;#8217;s site&amp;#8230;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/WWy2We56bQA" height="1" width="1"/&gt;</description><pubDate>Thu, 15 Oct 2009 18:07:23 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2009/10/15/typographers-captcha/</guid><feedburner:origLink>http://blog.bitquabit.com/2009/10/15/typographers-captcha/</feedburner:origLink></item><item><title>The Launch of a Secret Product</title><link>http://feedproxy.google.com/~r/bitquabit/~3/t1WGPpbbWT4/</link><description>&lt;p&gt;For the past year, an odd thing has happened, if you&amp;#8217;ve followed my doings.  My work on &lt;a href="https://www.copilot.com/"&gt;Fog Creek Copilot&lt;/a&gt; seemed to dwindle, I became tight-lipped about what I was working on, and I started getting really excited about an upcoming product release.  Also around this time, my knowledge of Mercurial, Python, C#, and ASP.NET MVC all seemed to dramatically increase, even though my free-time code output shrank to nothing.  What was going on?&lt;/p&gt;

&lt;p&gt;Oh, the usual.  I was working on &lt;a href="http://fogcreek.com/kiln/"&gt;a top-secret brand-new project&lt;/a&gt;.  And now, &lt;a href="https://shop.fogcreek.com/beta-kiln/"&gt;it&amp;#8217;s released to closed beta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2009/10/kilndag.png" alt="Kiln, the modern take on DVCS" /&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d like to introduce to you &lt;a href="http://fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt;, a brand-new source code hosting and code review tool from &lt;a href="http://fogcreek.com/"&gt;Fog Creek&lt;/a&gt;.  Kiln introduces what I believe is a truly novel take on code reviews that integrates the strengths of Mercurial and FogBugz to provide rejectable code review after commit.  We also have some unique takes on Mercurial features, such as the ability to preview what will go into a merge beforehand, really awesome branch management, the most beautiful DAG view I&amp;#8217;ve seen in any DVCS product, and lots more.&lt;/p&gt;

&lt;p&gt;Over the next few days, I&amp;#8217;ll be providing a couple of blog posts detailing how Kiln was developed.  In the meantime, go &lt;a href="http://fogcreek.com/kiln/"&gt;check out Kiln&lt;/a&gt; and &lt;a href="https://shop.fogcreek.com/beta-kiln/"&gt;sign up for the beta&lt;/a&gt;.  We&amp;#8217;re approving new people for the beta on a regular basis, so if you don&amp;#8217;t get an invite immediately, don&amp;#8217;t worry; we&amp;#8217;ll get to you sooner rather than later.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/t1WGPpbbWT4" height="1" width="1"/&gt;</description><pubDate>Wed, 14 Oct 2009 09:12:34 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2009/10/14/launch-secret-product/</guid><feedburner:origLink>http://blog.bitquabit.com/2009/10/14/launch-secret-product/</feedburner:origLink></item><item><title>hg log -R tips_and_tricks</title><link>http://feedproxy.google.com/~r/bitquabit/~3/G2C-X5YIeYU/</link><description>&lt;p&gt;I was delighted to find that &lt;a href="http://stevelosh.com/"&gt;Steve Losh&lt;/a&gt; has begun making a website called &lt;a href="http://hgtip.com/"&gt;hg tip&lt;/a&gt;&amp;mdash;a site updated on a regular basis with Mercurial tips for both beginner and expert users.  The site&amp;#8217;s beautifully designed and a pleasure to read.  If you use Mercurial, do yourself a favor and &lt;a href="http://hgtip.com/"&gt;go take a look&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(My favorite tip, incidentally, is definitely &lt;a href="http://hgtip.com/tips/advanced/2009-09-28-nudge-a-gentler-push/"&gt;the tutorial on making a command called &lt;code&gt;nudge&lt;/code&gt;&lt;/a&gt;, which allows you to push only the current head by default, rather than all of them.  I&amp;#8217;ve been using a variant of that, combined with &lt;a href="http://mercurial.selenic.com/wiki/BookmarksExtension"&gt;bookmarks&lt;/a&gt;, to have Git-style lightweight branching in my Mercurial work when appropriate.)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bitquabit/~4/G2C-X5YIeYU" height="1" width="1"/&gt;</description><pubDate>Fri, 09 Oct 2009 07:54:32 -0500</pubDate><guid isPermaLink="false">http://blog.bitquabit.com/2009/10/09/mercurial-tips/</guid><feedburner:origLink>http://blog.bitquabit.com/2009/10/09/mercurial-tips/</feedburner:origLink></item></channel></rss>
