<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title type="text">bitquabit - Personal</title>
  <id>http://bitquabit.com/feeds-noredirect/atom/personal/</id>
  <updated>2011-10-07T15:34:16Z</updated>
  <link href="http://bitquabit.com/" />
  
  <subtitle type="text">Opinionated Rants on Life and Software - Articles in Personal</subtitle>
  <generator>Werkzeug</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bitquabit-personal" /><feedburner:info uri="bitquabit-personal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Why how is boring and how why is awesome</title>
    <id>/post/why-how-is-boring-and-how-why-is-awesome/</id>
    <updated>2011-04-28T11:48:18Z</updated>
    <published>2011-04-28T11:48:18Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/d7ME_c4pzlo/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;Last fall, Joel came to me and said, &amp;#8220;Congratulations! We&amp;#8217;re doing another World Tour. Also, we want to teach distributed version control. That&amp;#8217;s your job. Make it happen.&amp;#8221;&lt;/p&gt;

&lt;p&gt;This sounded totally awesome. Not only would I get to one-up George Clooney in flight time; I was &lt;em&gt;made&lt;/em&gt; for doing something like this. In high school, I was in the NFL, which, sadly, means the National Forensics League, which means the National People Who Talk Good &lt;a href="http://en.wikipedia.org/wiki/Zoolander"&gt;and Wanna Learn To Do Other Stuff Good Too&lt;/a&gt;, and not the National Football League. My specialty was original oratory, where you give an original speech you&amp;#8217;ve rehearsed ahead of time. Add in there that I love to teach, and that I&amp;#8217;m the one who introduced Fog Creek to Mercurial in the first place, and I should be the perfect person to do this.&lt;/p&gt;

&lt;p&gt;I of course said yes, went back to my office, and fired up Emacs, ready to &lt;em&gt;go!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And then promptly suffered through two weeks of intermittent writer&amp;#8217;s block.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the problem: yes, I love using distributed version control. Yes, I love teaching. And yes, &lt;a href="http://blog.bitquabit.com/2011/03/14/have-a-mission/"&gt;I believe I have a mission to teach people about DVCS&lt;/a&gt;. But the talk I had to give, by definition, was an introduction to the &lt;em&gt;basics&lt;/em&gt; of distributed version control.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been using distributed version control for over half a decade, first as &lt;a href="http://en.wikipedia.org/wiki/GNU_arch"&gt;arch&lt;/a&gt; and &lt;a href="http://wiresong.ca/monticello/"&gt;Monticello&lt;/a&gt;, then &lt;a href="http://darcs.net/"&gt;Darcs&lt;/a&gt;, then super-early versions of Mercurial. The basics of &lt;em&gt;how do you do this?&lt;/em&gt; were super old-hat to me, and, well, &lt;em&gt;boring.&lt;/em&gt; There was nothing exciting to me about how to commit a file, or do an elementary merge, but I &lt;em&gt;had&lt;/em&gt; to cover that material.&lt;/p&gt;

&lt;p&gt;Further, if you only cover the basics, you can&amp;#8217;t possibly demonstrate &lt;em&gt;why you want to use a DVCS&lt;/em&gt;. There are minor benefits you can note&amp;#8212;hey, you can work offline!, or: hey, things are actually fast now!&amp;#8212;but you don&amp;#8217;t really get to any of the actual &lt;em&gt;meat&lt;/em&gt;, the things that teach you &lt;em&gt;why do you want to make this transition.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After two weeks of running in circles, I sat down with my friend &lt;a href="http://shipordie.com/"&gt;Jason&lt;/a&gt; (who now works for the &lt;a href="http://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt;, named after Genghis Khan, who invaded the Enterprise in Star Wars II to teach Captain Kirk calculus), and asked him how to get out of this mess. Over half an hour of conversation, I realized that I already had the answer.&lt;/p&gt;

&lt;p&gt;Yes, I needed to cover the basics. No, those would not be super-interesting. But I could keep that as short as humanly possible, and as soon as I&amp;#8217;d done that, I could spend the rest of the talk discussing &lt;em&gt;why you should care.&lt;/em&gt; We could cover workflows that it took lots of trial and error to discover. We could show merge scenarios that caused traditional tools to barf. We could show how Mercurial made it really easy for us to ship lots of versions of FogBugz without dropping bug fixes. In other words: spend half the talk with the basics of basics, just enough to understand how things worked, but then jump straight ahead to answering the question of what did distributed version control ever do for you.&lt;/p&gt;

&lt;p&gt;I went back to Emacs, and quickly identified what I thought were two of DVCS&amp;#8217; killer scenarios: maintaining multiple versions of a product without dropping bug fixes, and being able to reliably develop new features of a product while always being ready to ship a bugfix in a heartbeat. I built the talk so that the audience would start with nothing, and build up to understanding how to realize those two workflows.&lt;/p&gt;

&lt;p&gt;The result? Distributed Version Control System University, or: &lt;a href="http://www.fogcreek.com/kiln/worldtour2010-dvcsu.html?fccmp=bqb-howteach"&gt;how do I actually use distributed version control in a meaningful way&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m actually really happy with how everything turned out. Even though the code I ended up using was silly, audiences responded well, and understood the potential power and flexibility that distributed version control provides. They asked intelligent questions, they were engaged, and a lot of them signed up for Kiln trial accounts and decided to start playing with Mercurial.&lt;/p&gt;

&lt;p&gt;One of my goals in the future is to try to beef up &lt;a href="http://hginit.com/"&gt;hg init&lt;/a&gt; with some of the workflow examples in my talk. I also want to take some time to go into more detail about how we do workflow here at Fog Creek. But if you or a coworker has been wondering what the big deal is about distributed version control, watch the video. I think it provides a great overview in a way that any dev can immediately relate to and get excited about.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/d7ME_c4pzlo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/why-how-is-boring-and-how-why-is-awesome/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Supporting the Giants</title>
    <id>/post/supporting-giants/</id>
    <updated>2011-04-05T08:32:00Z</updated>
    <published>2011-04-05T08:32:00Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/nXCTCVMubBc/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;One of the things that I love about Fog Creek is that we give back. Kiln can only exist because of the amazing foundation provided by &lt;a href="http://mercurial.selenic.com/"&gt;the Mercurial distributed version control system&lt;/a&gt;, so we try to help them out whenever we can. In the past, we&amp;#8217;ve done that by &lt;a href="http://mercurial.selenic.com/sponsors/"&gt;making Fog Creek one of the top Mercurial sponsors&lt;/a&gt;. Given how small Fog Creek is, I can&amp;#8217;t tell you how proud I am to see that we&amp;#8217;re placing up there amongst Google and Microsoft for supporting open-source software.&lt;/p&gt;

&lt;p&gt;This year, we&amp;#8217;ve decided to help contribute in an even more hands-on way: by devoting developer resources. Not only will Fog Creek be helping to sponsor the upcoming Mercurial 1.9 code sprint; we&amp;#8217;re also sending one of our awesome Kiln developers, &lt;a href="http://kevingessner.com/"&gt;Kevin Gessner&lt;/a&gt;, to help contribute. And, in the weeks leading up to the sprint, we&amp;#8217;ll be using Kiln team developers to help contribute bug fixes and features to the Mercurial project. In other words, we&amp;#8217;ll be supporting Mercurial both financially and with developer resources.&lt;/p&gt;

&lt;p&gt;Kiln stands on the shoulders of giants, so I&amp;#8217;m happy to support those giants in return.&lt;/p&gt;

&lt;p&gt;After all, the higher the giant gets, the taller Kiln stands.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/nXCTCVMubBc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/supporting-giants/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Approved for Abusiveness</title>
    <id>/post/approved-abusiveness/</id>
    <updated>2011-02-23T08:40:15Z</updated>
    <published>2011-02-23T08:40:15Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/XinwvuRP554/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;Speaking of fascinating user experiences, I had to crack a smile when going through Disqus today and approving a pile of comments that got locked in the queue for some reason. On every single one, after clicking on the &lt;key&gt;Approve&lt;/key&gt; button, I was greeted with:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2011/02/approvedabusiveness.png" alt="This comment has been Approved for possible abusiveness" /&gt;&lt;/p&gt;

&lt;p&gt;While I&amp;#8217;m still trying to puzzle out what the engineer who wrote that string had in mind, I really think I&amp;#8217;m going to have to order a pile of stickers with that message on them for liberal distribution to our interns this summer.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/XinwvuRP554" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/approved-abusiveness/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Buying VMware Fusion</title>
    <id>/post/buying-vmware-fusion/</id>
    <updated>2011-02-22T20:47:37Z</updated>
    <published>2011-02-22T20:47:37Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/v7cCfPJhiXw/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: VMware followed up with me this morning, and has done a great job getting me help and outlining how they&amp;#8217;re planning to address a lot of the complaints I&amp;#8217;ve had. We&amp;#8217;ll have to see what happens over the next few months, but so far, VMware has convinced me that they get they have a problem and are going to try to fix it. Kudos, VMware.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So about a week ago I decide to buy VMware Fusion.&lt;/p&gt;

&lt;p&gt;I &lt;em&gt;really&lt;/em&gt; like VMware.  They make awesome products, they have good support.  They&amp;#8217;re not perfect&amp;mdash;the VMware Workstation updater and the Adobe updaters can go neck-in-neck for absolute single most horrible upgrade experience, for example&amp;mdash;but in general, the products are stellar.  So when I decided to ditch Bootcamp and go the virtualization route for running Windows 7, VMware Fusion just made sense to me.  I know Parallels Desktop might be slightly faster, but my friends assured me VMware&amp;#8217;s plenty fast, it has Unity, it has 3D support, and I trust it due to using Workstation so heavily at Fog Creek. I&amp;#8217;ll stick with a solution I trust over one that&amp;#8217;s fast. So I head on over to vmware.com to make magic happen.&lt;/p&gt;

&lt;p&gt;I then go through what I can only describe as the single worst purchasing experience I have had, ever.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I begin by purchasing VMware Fusion. This part goes well, and I&amp;#8217;m out $65.&lt;/li&gt;
&lt;li&gt;I get an email confirming my order with a download link, so I start downloading. So far, so good.&lt;/li&gt;
&lt;li&gt;While I&amp;#8217;m downloading, I click the link to register Fusion.  I&amp;#8217;m taken to a page (with broken images) asking me for my license key, so I start to&amp;#8230;wait. License key?  The email I got has a customer number, which, now that I look at it, doesn&amp;#8217;t match my actual VMware customer number. And it has an order number. But I don&amp;#8217;t see any license key.
 Uh oh.&lt;/li&gt;
&lt;li&gt;I check the &amp;#8220;Manage Licenses&amp;#8221; part of the &lt;code&gt;vmware.com&lt;/code&gt; site, since I know that&amp;#8217;s where I find licenses for the copies of VMware Workstation we have at work. But it&amp;#8217;s empty. After about 23958 clicks, I find that this is a common problem that&amp;#8217;s usually resolved in &amp;#8220;several hours.&amp;#8221; I grit my teeth and hope that this does not mean what I think it means.&lt;/li&gt;
&lt;li&gt;I try to install Fusion. It installs fine. So far, so good. But then Fusion launches..and wants a license key. D&amp;#8217;oh!&lt;/li&gt;
&lt;li&gt;About half an hour passes, most of which is filled with me getting absolutely livid as I try to figure out how the holy hell to get a license key and debating preemptively challenging the purchase out of spite.&lt;/li&gt;
&lt;li&gt;Just before I do in fact challenge the purchase, I get an email from VMware telling me that my license key is ready. Why the badingo it took half an hour, I have no idea, but at least it&amp;#8217;s there!&lt;/li&gt;
&lt;li&gt;But wait! It&amp;#8217;s telling me that to get my license code, I need to go to&amp;#8230;&lt;a href="http://findmyorder.com"&gt;findmyorder.com&lt;/a&gt;?  The hey?&lt;/li&gt;
&lt;li&gt;I know better than to do this, but I go to &lt;code&gt;findmyorder.com&lt;/code&gt;, and am greeted by something that looks like it was cobbled together by the best that ColdFusion and MS Paint have to offer.&lt;/li&gt;
&lt;li&gt;There are two ways to get my order: my order number, or the last five digits of my credit card, which, if you know anything about how credit cards work, are probably the five most valuable digits on the card (you can frequently guess most of the rest based on just the picture on the card). Needless to say, entering my order number fails, meaning my credit card is the only option. On top of everything else, this probably means that VMware kept my card on file somewhere. Not impressive.&lt;/li&gt;
&lt;li&gt;I google around to learn about &lt;code&gt;findmyorder.com&lt;/code&gt;, read some stuff in a French forum, take a look at their SSL cert chain, and a few other things, and conclude that, while web design may not be their strong suit, they &lt;em&gt;might&lt;/em&gt; actually be legitimate.&lt;/li&gt;
&lt;li&gt;Breath held, I enter the last five digits of my credit card and my email address&amp;#8230;and amazingly, am in fact, really and truly, actually given my VMware Fusion license key, on a fully VMware-branded page! Most amazingly of all, I enter the license key into Fusion, and amazingly, it works! This seems so unlikely an outcome at this point that I have a beer in celebration.&lt;/li&gt;
&lt;li&gt;I click the &amp;#8220;Contact Us&amp;#8221; link on the bottom of the VMware-branded page&amp;#8230;and &lt;a href="https://www.findmyorder.com/company/contact.html"&gt;am given a good indication how much they want to be contacted&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;After looking around, I realize that it&amp;#8217;s not that the contact page is down; it&amp;#8217;s that the VMware lookalike page was made by copying the actual VMware home page and redoing all the content area, so all the links go to places that would be valid on &lt;code&gt;vmware.com&lt;/code&gt;, but are invalid on &lt;code&gt;findmyorder.com&lt;/code&gt;.  I give up telling VMware how much they suck at this point and decide to just focus on using Fusion, if that&amp;#8217;s even possible.&lt;/li&gt;
&lt;li&gt;Now that I &lt;em&gt;have&lt;/em&gt; a registration key, I try to go register it on &lt;code&gt;vmware.com&lt;/code&gt;&amp;#8230;and am told it&amp;#8217;s invalid. I now find myself drifting back to the &amp;#8220;it&amp;#8217;s a scam&amp;#8221; hypothesis. The license key is unsurprisingly rejected by the license manager, too.  Oh well.  At least Fusion took it.  Maybe that&amp;#8217;s good enough for me.&lt;/li&gt;
&lt;li&gt;A week later, in a fit of pique, I try to register VMware Fusion again. This time, it works! Not only that; the license manager decides to accept the key, too! Huzzah!&lt;/li&gt;
&lt;li&gt;Armed with this new knowledge that the license key is, in fact, really truly kosher, I decide to attempt to recover &lt;a href="http://www.rebates-vmware.com/f3fusionrebate/"&gt;the $30 rebate that VMware Fusion has going right now&lt;/a&gt; that I was promised, why not.  So I start that process, and&amp;#8230;they want the email that has the license key in it.  &lt;strong&gt;There is no such email you farking morans.&lt;/strong&gt;  Are you guys even reading this blog post, do you&amp;mdash;er, right, I hadn&amp;#8217;t written this yet. My bad.&lt;/li&gt;
&lt;li&gt;But by now, I&amp;#8217;ve figured out how to handle &lt;em&gt;this&lt;/em&gt; problem: I go back to my trusty &lt;code&gt;findmyorder.co.hk&lt;/code&gt;, enter in various random personal identifying numbers, and, sure enough, the faux VMware page has the license key on it, so I print that to PDF and send it off to VMware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, to recap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I bought a product that I couldn&amp;#8217;t use out-of-the-box;&lt;/li&gt;
&lt;li&gt;in order to use it, I was sent to a site I had never dealt with before;&lt;/li&gt;
&lt;li&gt;the site requires me to enter part of my credit card to use it;&lt;/li&gt;
&lt;li&gt;it then takes me to a totally broken page, which, thankfully, has a license key;&lt;/li&gt;
&lt;li&gt;that license key is rejected for some indeterminate amount of time by &lt;code&gt;vmware.com&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;once it&amp;#8217;s finally not rejected, vmware.com still merrily asks me to give it an email that it knows damn well it didn&amp;#8217;t give me.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VMware: if you were trying to convince me that you have absolutely no clue whatsoever how to interact with consumers, you win.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/v7cCfPJhiXw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/buying-vmware-fusion/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Enslaving your interns for evil and profit</title>
    <id>/post/enslaving-your-interns-for-evil-and-profit/</id>
    <updated>2011-10-07T15:34:16Z</updated>
    <published>2011-10-07T15:34:16Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/090mGMvnUKw/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;I should be in the middle of an interview right now.  About fifteen minutes into it, in fact.  About the part of my interview where we stop talking about awesome stuff the candidate has worked on in the past and start diving into writing some actual code.  A stack with O(1) data access that also always knows its maximum, for example.  Or perhaps a rudimentary mark-and-sweep garbage collector.  It&amp;#8217;s usually my favorite part of the interview: I get to see how the candidate thinks, how they process information, how they problem solve, and how they code.  The best candidates even teach me something in the process.&lt;/p&gt;

&lt;p&gt;But I&amp;#8217;m not in the middle of an interview right now.  I&amp;#8217;m in Emacs.  And instead of being excited about watching someone solve an interesting problem, I&amp;#8217;m upset and full of righteous indignation on behalf of the now-former job candidate.&lt;/p&gt;

&lt;p&gt;&lt;div style="float: right"&gt;&lt;img src="http://media.bitquabit.com/blog/2011/10/dracula.png" alt="The Kiln Dodo monitors your success with gusto" /&gt;&lt;/div&gt;You see, the candidate works for a company that is &lt;em&gt;very scared&lt;/em&gt;.&lt;sup class="footnote-ref" id="fnref-1"&gt;&lt;a href="#fn-1"&gt;1&lt;/a&gt;&lt;/sup&gt;  I know this because they made the candidate&amp;mdash;let&amp;#8217;s call him Bob&amp;mdash;they made Bob sign a non-compete contract.&lt;/p&gt;

&lt;p&gt;Non-competes are annoying, but not the end of the world.  I can understand why, say, Apple, might be legitimately angry to have a senior iPhone manufacturing executive jump ship to HTC: a large part of the candidate&amp;#8217;s value to HTC would be his knowledge of the internals of Apple&amp;#8217;s manufacturing process.  But &lt;em&gt;very few&lt;/em&gt; jobs work like that.  And even there, most companies don&amp;#8217;t forbid you from working &lt;em&gt;at all&lt;/em&gt; for a competitor; they forbid you from working in the same area of expertise.  So, for example, maybe the iPhone executive couldn&amp;#8217;t work on HTC&amp;#8217;s manufacturing operations, but he could still head a software development team.&lt;/p&gt;

&lt;p&gt;But Bob&amp;#8217;s company decided that, nope, Bob couldn&amp;#8217;t come work for us, because the existence of Joel on Software&amp;#8217;s &lt;a href="http://careers.joelonsoftware.com/jobs"&gt;careers board&lt;/a&gt; made us a direct competitor with them.&lt;/p&gt;

&lt;p&gt;Let me tell you something about the Joel on Software careers board: Fog Creek doesn&amp;#8217;t even make it.  We outsource the whole thing to a little-known company called StackOverflow.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s true.  The lie exposed.  If you&amp;#8217;re in doubt, take a look and notice the admittedly subtle similarities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://careers.joelonsoftware.com/jobs"&gt;Joel on Software Careers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://careers.stackoverflow.com/jobs/"&gt;StackOverflow Careers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shocking, I&amp;#8217;m sure.&lt;/p&gt;

&lt;p&gt;Yet based on this, Bob&amp;#8217;s company told him that Fog Creek and his firm were direct competitors, and therefore he couldn&amp;#8217;t even come to work with us on, say, Kiln.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the thing: &lt;strong&gt;Bob&amp;#8217;s a junior in college, and the company doing this to him is one he merely interned at.&lt;/strong&gt;  There is no way that Bob has inside knowledge of how a job board runs that could help us.  And even if he somehow &lt;em&gt;did&lt;/em&gt; have that knowledge, &lt;em&gt;we don&amp;#8217;t even run the job board!&lt;/em&gt;  There&amp;#8217;s no way he could actually give us anything that would help us!  But Bob&amp;#8217;s company made him turn us down, before we could even interview him, because they were absolutely, utterly &lt;em&gt;terrified&lt;/em&gt; that their intern, who is still in college, was so amazing that his coming to work for us could crash their entire company.&lt;/p&gt;

&lt;p&gt;I actually feel really bad for Bob&amp;#8217;s company.  They&amp;#8217;re so unsure of their own ideas, so negative on their own potential,  that they believe a former intern being physically near a company with an outsourced jobs board would be enough for that company to absolutely crush them.  I don&amp;#8217;t want to imagine what it feels like to get up every day and face that world.  But that&amp;#8217;s no reason to inflict such a morose world view on your interns.&lt;/p&gt;

&lt;p&gt;So I&amp;#8217;m upset on Bob&amp;#8217;s behalf.  Bob got shafted by a company he interned at.  A company that has so little confidence that they&amp;#8217;ve decided the best route to their success is to limit Bob&amp;#8217;s choices.  Limits that mean we miss out on an awesome candidate, and Bob misses out on an awesome job.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve got two real points to make, at the end of the day:&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re an intern, &lt;strong&gt;don&amp;#8217;t sign a non-compete contract.&lt;/strong&gt;  You have absolutely no idea where your life is going to take you, and you don&amp;#8217;t want your direction being shaped by one crappy employer.  And, trust me on this: no reputable software company I know of (Google, Microsoft, or Fog Creek) makes their interns sign non-compete contracts.  You can find a job that won&amp;#8217;t make you do that.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re a company, &lt;strong&gt;don&amp;#8217;t be a vampire.&lt;/strong&gt;  If you&amp;#8217;re so scared of everyone else that you believe that you have to give your interns a non-compete contract in order to stay competitive, then guess what?  You&amp;#8217;re not competitive.  Get a better idea.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;
&lt;p&gt;And based on the quality of their homepage, probably with good reason, but that&amp;#8217;s neither here nor there.&amp;nbsp;&lt;a href="#fnref-1" class="footnoteBackLink" title="Jump back to footnote 1 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/090mGMvnUKw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/enslaving-your-interns-for-evil-and-profit/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Kiln's Evolution, Part 1: DVCS as Code Review</title>
    <id>/post/dvcs-as-code-review/</id>
    <updated>2009-11-10T08:41:19Z</updated>
    <published>2009-11-10T08:41:19Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/c71gzDiPoXs/" />
    <author>
      <name />
    </author>
    <content type="html">&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-personal/~4/c71gzDiPoXs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/dvcs-as-code-review/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">The Launch of a Secret Product</title>
    <id>/post/launch-secret-product/</id>
    <updated>2009-10-14T09:12:34Z</updated>
    <published>2009-10-14T09:12:34Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/_okEfARZvEY/" />
    <author>
      <name />
    </author>
    <content type="html">&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-personal/~4/_okEfARZvEY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/launch-secret-product/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Adam Savage on Obsession</title>
    <id>/post/adam-savage-obsession/</id>
    <updated>2008-12-21T23:28:56Z</updated>
    <published>2008-12-21T23:28:56Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/J8Aveb6dVlY/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;I normally avoid reposting news I find on other news aggregators, but sometimes I come across an item sufficiently singular and unique that I feel I have no choice. In this case, Adam Savage of &lt;a href="http://dsc.discovery.com/fansites/mythbusters/mythbusters.html"&gt;&lt;em&gt;MythBusters&lt;/em&gt;&lt;/a&gt; recounts &lt;a href="http://fora.tv/2008/12/12/MythBusters_Co-Host_Adam_Savage_on_Obsession"&gt;his attempt to sculpt a perfect recreation of the Maltese Falcon&lt;/a&gt; as a way to explore the nature of obsession. The talk is at once highly entertaining and deeply moving. In a way I never fully grokked when watching &lt;em&gt;MythBusters&lt;/em&gt;, Adam is a true geek.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/J8Aveb6dVlY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/adam-savage-obsession/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Secret Santas at Fog Creek</title>
    <id>/post/secret-santas-fog-creek/</id>
    <updated>2008-12-19T13:34:22Z</updated>
    <published>2008-12-19T13:34:22Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/G0Ycjdp8XRE/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;You know you&amp;#8217;re getting too casual with your coworkers when your Secret Santa leaves this on your desk:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2008/12/how-to-talk-to-girls.jpg" alt="How to Talk to Girls" /&gt;&lt;/p&gt;

&lt;p&gt;(Thanks to &lt;a href="http://hicks-wright.net"&gt;Tyler&lt;/a&gt; for the picture.)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/G0Ycjdp8XRE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/secret-santas-fog-creek/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/personal/">
    <title type="text">Lies of the New York MTA</title>
    <id>/post/lies-new-york-mta/</id>
    <updated>2008-12-13T19:44:57Z</updated>
    <published>2008-12-13T19:44:57Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-personal/~3/8G6hA3bNqK4/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;This morning, on the 6 train, I saw the following advertisement:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Believe it or not.&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;In 1986, the subway and bus fare was $1. That&amp;#8217;s $1.89 in 2008 dollars. Today 30-day Unlimited Ride MetroCard brings the fare down to $1.17. Believe it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have a better idea: I&amp;#8217;ll accuse the MTA of engaging in false and deceptive advertising practices.&lt;/p&gt;

&lt;p&gt;The ad makes a completely bogus comparison.  There were no Unlimited Ride MetroCards in 1986.  Hell, there were no &lt;em&gt;MetroCards&lt;/em&gt; in 1986.  There were single-ride tokens.  The equivalent of a single-ride token today is a single-use MetroCard, which retails for $2.00.  This is a 6% &lt;em&gt;increase&lt;/em&gt; in fare since 1986.&lt;/p&gt;

&lt;p&gt;But, just for fun, let&amp;#8217;s check their bogus comparison.  Where does the $1.17 come from?  Well, a 30-day Unlimited Ride MetroCard is $81. Even if we assume you ride the train twice a day, every day, for a total of 60 times over the life of the card, that means you&amp;#8217;re spending $1.35 per ride&amp;#8212;still higher than their $1.17.  Indeed, you have to ride the train 70 times in 30 days to get down to their $1.17 price point.  Where&amp;#8217;d they get that number?  Who knows.  They could just as easily have decided that New Yorkers ride the train fifteen times a day, and claimed a 30-day unlimited card drops your fare to 18¢.  The beauty of unlimited v. limited comparisons is I can make up whatever numbers I want.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s so stupid is that there&amp;#8217;s a comparison that the MTA &lt;em&gt;could&lt;/em&gt; have made that would have been valid, and &lt;em&gt;does&lt;/em&gt; translate to a real fare drop.  When the MTA introduced MetroCards, they instituted a discount program: for every $x you put on the card (currently $7), you get a free ride.  As long as you&amp;#8217;re buying rides in bulk, the cost of a ride has dropped to $1.75&amp;#8212;which is indeed a solid 7.5% drop from the 1986 price.&lt;/p&gt;

&lt;p&gt;But that&amp;#8217;s not what the ad claims.  The ad makes a bogus comparison, and should be called out for the tripe it is.&lt;/p&gt;

&lt;p&gt;Believe it?  No thanks.  I&amp;#8217;ll stick to the truth.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-personal/~4/8G6hA3bNqK4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/lies-new-york-mta/</feedburner:origLink></entry>
</feed>

