<?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 - Programming</title>
  <id>http://bitquabit.com/feeds-noredirect/atom/programming/</id>
  <updated>2011-06-28T08:23:08Z</updated>
  <link href="http://bitquabit.com/" />
  
  <subtitle type="text">Opinionated Rants on Life and Software - Articles in Programming</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-programming" /><feedburner:info uri="bitquabit-programming" /><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/programming/">
    <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-programming/~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-programming/~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/programming/">
    <title type="text">Finding Literate Programmers</title>
    <id>/post/finding-literate-programmers/</id>
    <updated>2011-04-14T08:39:17Z</updated>
    <published>2011-04-14T08:39:17Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/mdRr16hCCJM/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;So &lt;a href="http://blog.bitquabit.com/2011/04/13/drowning-in-a-c-of-interviews/"&gt;we&amp;#8217;re making candidates nervous by using C, and we&amp;#8217;re not gaining anything by using C&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But are we &lt;em&gt;losing&lt;/em&gt; anything by using C?&lt;/p&gt;

&lt;p&gt;Yes. We&amp;#8217;re losing any ability to test for literacy.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385"&gt;&amp;#8220;Smart and gets things done&amp;#8221;&lt;/a&gt; is a famous mantra, and one that I agree with and believe has served us very well. But even at Fog Creek, we don&amp;#8217;t go &lt;em&gt;entirely&lt;/em&gt; by &amp;#8220;smart and gets things done&amp;#8221; when it comes to developers. If we did, we&amp;#8217;d happily hire anthropology majors who had gotten a few papers published. After all, they&amp;#8217;re smart and get things done, right? But we care, at a bare minimum, about one other thing, which is passion for software development. Intern candidates especially may not be the best coders we&amp;#8217;ve ever seen, but we expect them to demonstrate at least some proficiency in basic programming tasks &lt;em&gt;in addition to&lt;/em&gt; being smart and getting things done. The threshold may not be super-high, but it&amp;#8217;s there.&lt;/p&gt;

&lt;p&gt;What does this have to do with interviewing in C? Software development, like a few other fields such as mathematics, English, and art, is something you can practice as a hobby even at a very young age. The best coders have to practically &lt;em&gt;fight&lt;/em&gt; not to code in their spare time. My girlfriend routinely asks me to get the hell off the computer, I am not kidding, why are you still coding even though work&amp;#8217;s over, dammit why does this computer keep working even after I&amp;#8217;ve deliberately poured a bucket of water on it, what do you mean you can waterproof things like this because you said you couldn&amp;#8217;t when it was my camera, I am leaving you and taking the cats with me, and so on. You pretty much have to pry the machine away from our fingers.&lt;/p&gt;

&lt;p&gt;So even young coders, coders with very little experience who make piles of &amp;#8220;dumb&amp;#8221; errors, have generally written at least a smattering of little hobby projects. They may not be that interesting, and they may be duplicating something that already exists, but they&amp;#8217;re there.&lt;/p&gt;

&lt;p&gt;As they program more, something magical happens: they start to really &lt;em&gt;get&lt;/em&gt; a language. They start to learn the common parts of its libraries, the common idioms used when writing in it. It&amp;#8217;s like learning to write English well: you start with the basics, but then begin building an ever-better lexicon as you need to make more nuanced distinctions between concepts. You begin making allusions to other works you&amp;#8217;ve read that made an impression. Your writing just becomes more refined, and, eventually, &lt;em&gt;good.&lt;/em&gt; Part of your oeuvre.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s what I meant by &amp;#8220;we aren&amp;#8217;t testing for literacy.&amp;#8221; If you&amp;#8217;re trying to solve problems, especially if you&amp;#8217;re a new programmer, you almost &lt;em&gt;have&lt;/em&gt; to pick up at least the basics of the library of the language you&amp;#8217;re working in. &lt;em&gt;Especially&lt;/em&gt; if you&amp;#8217;re a college kid, because, let&amp;#8217;s face it, college kids are &lt;em&gt;lazy&lt;/em&gt;. Any line you don&amp;#8217;t have to write is one you can&amp;#8217;t have points deducted for, so you&amp;#8217;ll lean on that standard library as heavily as you possibly can. You build up a vocabulary of functions and classes and methods that allow you to get more done with less code. You become literate in the language.&lt;/p&gt;

&lt;p&gt;If I let you program in the language of your choice, you have an opportunity to demonstrate that literacy. And, because the better you understand the language, the more you can accomplish in a short period of time, the more interesting and complex my interview question can be, too. No longer am I restricted to abstract data-types, like I am in C or some hypothetical Minimal Language You Learn For The Interview. Suddenly, asking a student to sketch an outline of a 6502 emulator becomes a totally legitimate request for a 60-minute session.&lt;/p&gt;

&lt;p&gt;Let me take a break here and make clear what I am not advocating: I do not think candidates should have to know their language libraries inside and out. Someone really enthusiastic about programming, but who&amp;#8217;s only just getting started, may not understand &lt;code&gt;strcmp&lt;/code&gt; even if they&amp;#8217;re destined to hack on the Linux kernel for fun, and the next &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;_why the lucky stiff&lt;/a&gt; may not yet understand how to make a method take a block. You have to recognize that you&amp;#8217;ve got a diamond in the rough there, and evaluate them in other ways.&lt;/p&gt;

&lt;p&gt;But for those few who come in and who &lt;em&gt;are&lt;/em&gt; super-literate at a language? It&amp;#8217;s so &lt;em&gt;fun&lt;/em&gt; to do those interviews all of a sudden! I get a chance to be totally blown away by how well you know your craft, you have a chance to be totally creative, and we both get out of the yet-another-data-structure interview question hell (or its lovely variant, how-do-I-get-three-beings-across-a-bridge-in-a-limited-amount-of-time-when-they-all-want-to-eat-and/or-kill-one-another question). Forcing everyone into a language they&amp;#8217;re equally (un)familiar with may be &amp;#8220;fair,&amp;#8221; but it also needlessly penalizes some of the best craftsmen you&amp;#8217;ll see.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not abandoning &amp;#8220;smart and gets things done&amp;#8221; for &amp;#8220;smart and gets things done and writes goodish.&amp;#8221; But I&amp;#8217;d like to abandon it for &amp;#8220;smart and gets things done, &lt;em&gt;and is optionally simply awesome.&lt;/em&gt;&amp;#8221; It&amp;#8217;s hard to do that if you restrict your interviews to a single language that most candidates won&amp;#8217;t even have used before.&lt;/p&gt;

&lt;p&gt;But if you let everyone use their native tongue?&lt;/p&gt;

&lt;p&gt;You might be surprised what you&amp;#8217;ll find.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/mdRr16hCCJM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/finding-literate-programmers/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">Drowning in a C of Interviews</title>
    <id>/post/drowning-in-a-c-of-interviews/</id>
    <updated>2011-04-13T08:12:59Z</updated>
    <published>2011-04-13T08:12:59Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/InPd8Mf7W2o/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html"&gt;The Guerrilla Guide&lt;/a&gt;. It is the be-all, end-all of how to look for candidates.&lt;/p&gt;

&lt;p&gt;Except for one paragraph.&lt;/p&gt;

&lt;p&gt;And I&amp;#8217;ve come to realize that I agree with that paragraph; just not Fog Creek&amp;#8217;s implementation of it.&lt;/p&gt;

&lt;p&gt;In The Paragraph In Question, Joel writes:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I&amp;#8217;ve come to realize that understanding pointers in C is not a skill, it&amp;#8217;s an aptitude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The paragraph goes on. But for Fog Creek, it stops right there. In fact, it stops even earlier. The version that Fog Creek has implemented, in practice, reads:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I&amp;#8217;ve come to realize that understanding C is not a skill, it&amp;#8217;s an aptitude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since literally before I&amp;#8217;ve joined, Fog Creek has conducted all coding interviews in C. Period. If you want to work at Fog Creek writing nothing but pure JavaScript apps using Node.js, you will do your interview in C, and you will &lt;em&gt;like&lt;/em&gt; it. In this one little sense, I became a heretic a few months ago. I quit giving my interviews in C.&lt;/p&gt;

&lt;p&gt;And you know what?&lt;/p&gt;

&lt;p&gt;Nothing changed.&lt;/p&gt;

&lt;p&gt;Well, that&amp;#8217;s not true. Candidates were a lot more relaxed, and asked a lot fewer nervous questions about how strict I was going to be about syntax. But my confidence that I could tell whether they would be good programmers, and more importantly, my acceptance rate, didn&amp;#8217;t change whatsoever. I certainly didn&amp;#8217;t feel like I was losing any data by not conducting my interview in C.&lt;/p&gt;

&lt;p&gt;How is that possible?  Let&amp;#8217;s read through what Joel actually wrote after that introductory sentence:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In first year computer science classes, there are always about 200 kids at the beginning of the semester, all of whom wrote complex adventure games in BASIC for their PCs when they were 4 years old. They are having a good ol&amp;#8217; time learning C or Pascal in college, until one day the professor introduces pointers, and suddenly, they don&amp;#8217;t get it. They just don&amp;#8217;t understand anything any more. 90% of the class goes off and becomes Political Science majors, then they tell their friends that there weren&amp;#8217;t enough good looking members of the appropriate sex in their CompSci classes, that&amp;#8217;s why they switched. For some reason most people seem to be born without the part of the brain that understands pointers. Pointers require a complex form of doubly-indirected thinking that some people just can&amp;#8217;t do, and it&amp;#8217;s pretty crucial to good programming. A lot of the &amp;#8220;script jocks&amp;#8221; who started programming by copying JavaScript snippets into their web pages and went on to learn Perl never learned about pointers, and they can never quite produce code of the quality you need.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you read the whole thing, you realize that Joel&amp;#8217;s not advocating the idea that a candidate must know C; rather, he&amp;#8217;s advocating the idea that &lt;em&gt;C forces you to understand concepts that you may not otherwise understand&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Inventing questions that force candidates to understand pointers without using C isn&amp;#8217;t too hard. Nearly any question that forces candidates to invent a data structure (e.g., a hashtable, an AVL tree, or the like) will test how they handle indirection, the idea that &lt;em&gt;having a thing&lt;/em&gt; is different from &lt;em&gt;having a pointer to that thing&lt;/em&gt;. So I&amp;#8217;ve picked a question that forces candidates to design a data structure. And, sure enough, I see candidates who have a lot of programming experience, but who don&amp;#8217;t &amp;#8220;get it&amp;#8221;, completely bomb out in my interview.&lt;/p&gt;

&lt;p&gt;I think there&amp;#8217;s a tremendous amount of value in Joel&amp;#8217;s original point. Understanding indirection, and pointers in particular, seems to be innate. But doing interviews in C doesn&amp;#8217;t really test for that; it tests for the candidates&amp;#8217; understanding of C. And I think, in our dogged pursuit of that, we&amp;#8217;ve probably erred. We&amp;#8217;re making candidates nervous about how well they know C, and focusing too much on how well they understand C&amp;#8217;s semantics, but not really getting any meaningful indicators back in return.&lt;/p&gt;

&lt;p&gt;For the moment, I&amp;#8217;ll continue conducting my interviews in the language of the candidate&amp;#8217;s choice as an experiment, but I think it&amp;#8217;s inevitable that the Wall of C will fall.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/InPd8Mf7W2o" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/drowning-in-a-c-of-interviews/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <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-programming/~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-programming/~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/programming/">
    <title type="text">Have a mission</title>
    <id>/post/have-a-mission/</id>
    <updated>2011-03-14T08:23:36Z</updated>
    <published>2011-03-14T08:23:36Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/NOwdeVvL6bc/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;You know why I love working on &lt;a href="http://www.fogcreek.com/kiln/"&gt;Kiln&lt;/a&gt; every day?&lt;/p&gt;

&lt;p&gt;Because we&amp;#8217;ve got a &lt;em&gt;mission&lt;/em&gt;, dammit.&lt;/p&gt;

&lt;p&gt;Mission, not mission statement. The Kiln team doesn&amp;#8217;t have a mission statement, and I&amp;#8217;ll fight to keep it that way. Mission statements, no matter how well intentioned, become these trite little soundbites that you parrot indefinitely until they just become a meaningless jumble of syllables&amp;#8212;kind of like what happens if you just say the word &amp;#8220;marmalade&amp;#8221; about 40 times in a row.&lt;/p&gt;

&lt;p&gt;But that&amp;#8217;s totally different from &lt;em&gt;having a mission&lt;/em&gt;. Everyone who works on Kiln knows what we&amp;#8217;re trying to accomplish. They&amp;#8217;ll phrase it in their own way, but no matter who you talk to on my team, we&amp;#8217;ll all tell you why Kiln exists: we believe that distributed version control is so much more awesome than old-school centralized crap that we have an &lt;em&gt;obligation&lt;/em&gt; to bring that awesomeness to as many developers as possible. Every time I write a line of code, I have in my head that I&amp;#8217;m trying to further that goal.&lt;/p&gt;

&lt;p&gt;Distributed version control is having trouble making inroads at companies, you say? Fine. We&amp;#8217;ve make Kiln an awesome system for companies: we&amp;#8217;ve made a kickass project-centric workflow, given teams a way of handling large numbers of repositories, added asset management, permissions models, code reviews, rich APIs, and piles more. People having trouble leaving their old system behind? No problem: we&amp;#8217;ll draft Joel into &lt;a href="http://hginit.com"&gt;writing awesome tutorials&lt;/a&gt;, &lt;a href="http://worldtour.fogcreek.com/"&gt;we&amp;#8217;ll give talks on distributed version control all over the world&lt;/a&gt;, &lt;a href="http://www.fogcreek.com/fogbugz/training/"&gt;we&amp;#8217;ll provide training services&lt;/a&gt; to help bring people up to speed, and we&amp;#8217;ll make an importer to help you get your existing code moved over. We&amp;#8217;ll even &lt;a href="http://kiln.stackexchange.com/"&gt;create a StackExchange&lt;/a&gt; just for helping people figure out Mercurial, Kiln, and distributed version control, so that there&amp;#8217;s a good, central location to get answers about tools, workflows, and everything else. These things probably all help Kiln, but we&amp;#8217;re not doing them because of that; we&amp;#8217;re doing them because &lt;em&gt;we have to do them to achieve what we believe we need to do&lt;/em&gt;. The rest is a footnote.&lt;/p&gt;

&lt;p&gt;I feel like I can tell you any good product&amp;#8217;s mission really easily for similar reasons. iPhone? Make using a smartphone fun. The App Store, iBooks, and so on are just fall-out.&lt;/p&gt;

&lt;p&gt;Kindle? Make digital books completely pervasive. And you know that&amp;#8217;s the goal, because you can read Kindle books on practically &lt;em&gt;any&lt;/em&gt; device in wonderful, intuitive applications.&lt;/p&gt;

&lt;p&gt;Google? Make it possible to find good, relevant data, quickly.&lt;/p&gt;

&lt;p&gt;Facebook? Keep people from losing touch.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a common theme here: in all of these cases, the mission isn&amp;#8217;t about the product as such. The mission is &amp;#8220;just&amp;#8221; something that, if you&amp;#8217;re really serious about, &lt;em&gt;requires&lt;/em&gt; that the product become absolutely amazing, so you make that happen. If you prefer: these missions are all the answer to, &lt;strong&gt;&lt;em&gt;why&lt;/strong&gt; did we just add that new feature?&lt;/em&gt;, not, &lt;strong&gt;&lt;em&gt;what&lt;/strong&gt; new feature are we adding&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;What the hell is Windows&amp;#8217; mission in life? The best I can come up with, at this point, is to keep Windows from getting too dated, but not breaking backwards compatibility, so that Microsoft can make money while they find something that actually sticks. That&amp;#8217;s&amp;#8230;pretty pathetic. Not to single out Microsoft here; I&amp;#8217;m not really convinced the OS X team has a terribly coherent mission right now, either. They have a clear &lt;em&gt;goal&lt;/em&gt;&amp;#8212;they want to bring the experience of the iPhone and iPad to OS X&amp;#8212;but I don&amp;#8217;t quite grok &lt;em&gt;why&lt;/em&gt; they&amp;#8217;re doing it, and I would argue that the somewhat haphazard mishmash of app UIs in the Lion previews (compare Address Book with the new Mail, for example) is a pretty good indication that &lt;em&gt;they&lt;/em&gt; don&amp;#8217;t quite know, either.&lt;/p&gt;

&lt;p&gt;When you don&amp;#8217;t really know &lt;em&gt;why&lt;/em&gt; you&amp;#8217;re doing something&amp;#8212;when it&amp;#8217;s just a goal that you&amp;#8217;ve got and you&amp;#8217;ve lost track of your original motivation&amp;#8212;it&amp;#8217;s really tough to have a good product, or to be excited when you come into work every day. Yes, &lt;em&gt;someone&lt;/em&gt; has to fix Windows. But why me? Why can&amp;#8217;t I be making something awesome? So you&amp;#8217;ll do the minimal amount necessary to achieve your best understanding of the goal, rather than everything required to maximize your chance of actually achieving your mission in life.&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t just latch onto something because it&amp;#8217;s neat. Latch onto it because you really fucking &lt;em&gt;believe&lt;/em&gt; that you have something to accomplish here, and since no one else is going to do it, it&amp;#8217;s going to have to be you. That&amp;#8217;s your mission.&lt;/p&gt;

&lt;p&gt;Make it happen.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/NOwdeVvL6bc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/have-a-mission/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">When things go well</title>
    <id>/post/when-things-go-well/</id>
    <updated>2011-03-10T11:07:13Z</updated>
    <published>2011-03-10T11:07:13Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/vbqBKVOC0_s/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;It was a lot of fun to vet dirty laundry in &lt;a href="http://blog.bitquabit.com/2011/03/08/midnight-deploys-are-for-idiots/"&gt;my last post on how one of our deployments went really wrong&lt;/a&gt;. But part of why that incident stuck out so strongly in my mind is that things so rarely go wrong.&lt;/p&gt;

&lt;p&gt;Why is that? I think it&amp;#8217;s because we do a lot right: we make it extremely easy for ourselves to keep features from going out to customers until we&amp;#8217;re ready, and we give ourselves a lot of time to bang on the exact same version of the software, on the exact servers, that we&amp;#8217;ll be pushing out to all of our customers.&lt;/p&gt;

&lt;p&gt;How do we do that? Let&amp;#8217;s say that I decide that Kiln totally needs an awesome WebGL flyover view of the &lt;a href="http://kiln.stackexchange.com/questions/2181/how-do-i-use-the-electric-dag"&gt;Electric DAG&lt;/a&gt;. I code it up over lunch in about 15 minutes. Now what?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, as bad-ass as my new feature is, I recognize that (unlikely as this is) I just maybe have a bug or two. So rather than pushing it directly to all my other teammates, I push it to a feature branch called &lt;code&gt;flitesim&lt;/code&gt; or the like. If the feature totally stinks (who the feh doesn&amp;#8217;t like flyovers? I mean come on!), it&amp;#8217;ll never make it out of the branch, and never end up in the main code base. No one except devs working directly on the feature need to care about it at this point.&lt;/li&gt;
&lt;li&gt;I don&amp;#8217;t know OpenGL from an ice cream sundae and coded the feature up mostly via &lt;a href="http://nehe.gamedev.net/"&gt;NeHe&lt;/a&gt; copypasta, so next up, I&amp;#8217;ll use Kiln&amp;#8217;s code reviews to ask my team members to review what I wrote. They&amp;#8217;ll look for XSS exploits, check for sane coding conventions, check for possible performance bottlenecks or threading errors, and ask me what on Earth I was drinking when I invented this feature. Minus the last bit, it&amp;#8217;s kind of like having a friend read over your essay before you hand it in.
  (Actually, with the last bit, it&amp;#8217;s still like having a friend read over your essay before you hand it in.)&lt;/li&gt;
&lt;li&gt;At the same time this is going on, I&amp;#8217;ll use a feature of our continuous integration system, Mortar, to cut builds off the &lt;code&gt;flitesim&lt;/code&gt; branch for the QA team. About five minutes later, they get a licensed (i.e., install-on-your-local-machine) version of Kiln with my spiffy flight sim feature that they can bludgeon the crap out of, develop tests for, and so on.  Because they&amp;#8217;re licensed copies, they can install on VMware snapshots, which makes diagnosing schema migration issues and the like ridiculously trivial, and nearly guarantees we can get good repros when things go wrong.&lt;/li&gt;
&lt;li&gt;At some point, my team approves the code reviews (I hope), and QA agrees the feature is working to specification (weird specification though that may be). Kiln will be getting its own little DAG-oriented flight sim! Take that, &lt;code&gt;$COMPETITOR&lt;/code&gt;! So at this point, I merge it into our &lt;code&gt;devel&lt;/code&gt; branch, which we use for integration testing. Features merged into &lt;code&gt;devel&lt;/code&gt; are destined for eventual deployment, and the &lt;code&gt;devel&lt;/code&gt; branch is the one that all developers grab at the beginning of the day to base their work on. So as of now, the rest of my team will see my badassery, and begin playing with it and fixing bugs as they notice them.&lt;/li&gt;
&lt;li&gt;On Tuesday morning, provided that the developers feel good about everything that&amp;#8217;s currently in the &lt;code&gt;devel&lt;/code&gt; branch, we merge &lt;code&gt;devel&lt;/code&gt; into &lt;code&gt;dogfood&lt;/code&gt;, and, again using Mortar, deploy this version of Kiln to our own servers.  At this point, the entire company is hitting on Kiln and flying all over our source code in amazing 3D-accelerated goodness, and probably reporting bugs. Meanwhile, the QA team begins hammering Kiln with their full test suite to make sure everything looks okay and we don&amp;#8217;t have any regressions.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once we&amp;#8217;ve stabilized the couple of bugs that inevitably appear at this point (e.g., &amp;#8220;I flew before the beginning of time, halp?&amp;#8221;), and developed tests to make sure they don&amp;#8217;t reappear, we begin deploying to Fog Creek On Demand. This goes in several phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the first phase, we leak only to so-called &amp;#8220;test&amp;#8221; accounts, which are purely for QA. If something went horribly wrong, we could always just nuke these accounts.&lt;/li&gt;
&lt;li&gt;In the second phase, we leak to alpha accounts. Alpha account holders are exclusively current and former Fog Creek employees who understand the risks.&lt;/li&gt;
&lt;li&gt;If things go well there, we can optionally leak to beta customers, who are very nice clients of ours who have agreed to test versions before they go live so that they get new features first.&lt;/li&gt;
&lt;li&gt;Finally, provided that everything has been stable for a whole week, we push the leak up to 100%. &lt;a href="https://mirrors.kilnhg.com/Repo/Mirrors/From-Git/Git"&gt;Fly the rainbow&lt;/a&gt;!&amp;trade;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A couple of things that I think work really well with this system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Features are &lt;em&gt;incredibly&lt;/em&gt; heavily tested before they reach customers.&lt;/strong&gt; They&amp;#8217;ve already been tested in isolation, again at integration, again on our corporate Kiln install, and &lt;em&gt;again&lt;/em&gt; on our exact On Demand infrastructure. The exact point release that eventually goes out has already been live for days by the time our customers get it, on the exact servers that our customers use.  All we&amp;#8217;re toggling is who can see the new version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Our deployment process is fully automated.&lt;/strong&gt; It takes one button-click in Mortar to tag a build, and another click to deploy to our own servers. Deploying to On Demand is slightly more involved, since Mortar doesn&amp;#8217;t currently allow arbitrary input and we want to be able to specify &lt;em&gt;which&lt;/em&gt; accounts to upgrade. But at the end of the day, it&amp;#8217;s still just a single script invocation that takes a list of accounts and a generation to deploy them to, and takes care of the rest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Any individual customer can be upgraded (or downgraded) at will.&lt;/strong&gt; One of the features that we can do with Fog Creek On Demand that is comparatively rare in other systems I&amp;#8217;ve seen is that we can upgrade any individual customer to any version of Kiln and FogBugz that is currently hot (i.e., a valid deployment target). Many other systems I&amp;#8217;ve seen can only upgrade at server-level granularity, which can be problematic if you&amp;#8217;re trying to help a single customer out with a bug fix that you&amp;#8217;re not ready to deploy to your entire user base.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The process isn&amp;#8217;t perfect, but it&amp;#8217;s one I&amp;#8217;m very happy with, and one I&amp;#8217;d like to emulate on other projects.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/vbqBKVOC0_s" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/when-things-go-well/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">Midnight deploys are for idiots, and other revelations at 12:30 AM Monday morning</title>
    <id>/post/midnight-deploys-are-for-idiots/</id>
    <updated>2011-03-08T07:59:09Z</updated>
    <published>2011-03-08T07:59:09Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/YrmO947o9DI/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;Every once and awhile, you have an idea that you totally think is the bee&amp;#8217;s knees but which ends up being the bee&amp;#8217;s ass.&lt;/p&gt;

&lt;p&gt;When Kiln and FogBugz went to a weekly release cycle a few weeks ago, we had what we thought, if not a brilliant idea, was a pretty good one: we&amp;#8217;d upgrade Fog Creek On Demand at midnight on Saturday, when all the normal people were asleep.  It&amp;#8217;s pretty common practice, it minimizes customer impact, overall a good thing.  Right?&lt;/p&gt;

&lt;p&gt;By 12:30 AM on Monday, I had developed a very different opinion of the whole matter.  In particular, I think the idea of doing a midnight deploy on the weekend has got to be the absolute dumbest thing I&amp;#8217;ve ever heard of, right up there with Capris and the Nintendo Power Glove.  Because, you see, you know how no one &lt;em&gt;else&lt;/em&gt; works on the weekend?  You know how that&amp;#8217;s why it seems so alluring?  Well, that applies to you, too.  So, for the same reason that your customers are less likely to be hitting your website, &lt;em&gt;you have a drastically decreased ability to handle things if something actually &lt;strong&gt;does&lt;/strong&gt; go wrong&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This got drilled into my head very painfully this past weekend.  Our build manager &lt;a href="http://rockhymas.com/"&gt;Rock&lt;/a&gt; did the deploy to production at 10 PM on Saturday, checked out that everything looked good, and then enjoyed his weekend.  At about the same time, I checked my test account, saw the update had gone out, and verified that all seemed in order.  So we both decided the deployment had been a great success, and had wonderful evenings, during which I may possibly have made a total ass of myself in front of a Kinect playing Dance Central, but that&amp;#8217;s for another post.&lt;/p&gt;

&lt;p&gt;But while we enjoying ourselves, Fog Creek On Demand had a deep, dark secret:&lt;/p&gt;

&lt;p&gt;The deployment had failed.&lt;/p&gt;

&lt;p&gt;You see, Kiln actually has three components: Kiln itself (what you hit when you go to e.g. &lt;a href="https://mirrors.kilnhg.com"&gt;https://mirrors.kilnhg.com/&lt;/a&gt;); FogBugz (which is used for a variety of purposes even if you don&amp;#8217;t actually use FogBugz in your On Demand account); and a plugin for FogBugz which allows the two to communicate.  Unbeknownst to us, but beknownst to the servers, the version of the Kiln Plugin we deployed &lt;em&gt;did not actually work&lt;/em&gt;, in a very subtle way: all the APIs were valid except one, and that one call would fail.  The real kicker, though, was that we anticipated that FogBugz might drop out for a moment when we originally designed the system, so we programmed Kiln to ignore being unable to communicate with FogBugz as long as possible.  The failed API call turns out to be one that&amp;#8217;s trivially cached for a very long time, and so is one that Kiln would allow to fail without actually dying.  So even though everything &lt;em&gt;looked&lt;/em&gt; just fine, and would work just fine for &lt;em&gt;awhile&lt;/em&gt;, and you could even use Kiln and FogBugz and not notice a problem, Kiln accounts were doomed to start flicking off as they finally had to invalidate their cache and would be forced to disable themselves until FogBugz came back online.&lt;/p&gt;

&lt;p&gt;The first people to discover this were exactly the people you&amp;#8217;d expect, given our logo: &lt;a href="http://en.wikipedia.org/wiki/New_Zealand"&gt;Kiwis&lt;/a&gt;, since, due to the all-powerful Theory of Relativity, or perhaps merely Magic, they have managed to have their Monday mornings at about 7 PM on Sunday evening.  So one of our Kiwi customers went to go hit their Kiln install, and were greeted by an infinite redirect loop, as a very lonely Kiln installation desperately attempted to find any FogBugz installation out in the world who would talk to it, and, finding none, simply tried again indefinitely.  Tim called &lt;a href="http://hicks-wright.net/"&gt;Tyler&lt;/a&gt; and me, who in turn called Rock, and just for good measure another FogBugz developer, and we all got the problem taken care of, so everything was perfectly fine.&lt;/p&gt;

&lt;p&gt;No, wait! That&amp;#8217;s not what happened at all!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Because it was Sunday, it took Tim about half an hour or so to actually get in touch with Tyler and me, during which our customers were stuck on a busy weekday, and Tim could make no forward progress on resolving the issue.&lt;/li&gt;
&lt;li&gt;Once he did finally get in touch with us, it took us a long time to spin up on solving the problem, since we were forced to get to our apartments, fire up wimpy laptops, and get into our office computers via slow RDC-via-VPN connections.&lt;/li&gt;
&lt;li&gt;Once we finally figured out the problem, we realized that, even though we knew &lt;em&gt;exactly&lt;/em&gt; what was wrong, we had absolutely no idea how to fix it, because the issue was in the bowels of how FogBugz On Demand deploys its plugins.  I therefore called Rock, who, in addition to being our build manager, also does an amazing job running FogBugz in his spare time.  Rock unfortunately told me he couldn&amp;#8217;t be available for half an hour, but if I wanted to take a stab at fixing things, I just needed to 齰蝌齰蜡.  I said thank-you and then cried a little inside after he hung up.&lt;/li&gt;
&lt;li&gt;I then tried to find a FogBugz developer to explain to me how exactly one did&amp;#8230;whatever it was I was told to do.  So I started calling FogBugz developers at random.  The first one I tried to call was the plugin guru, but he was busy.  So then I called our Canadian guru, Dane, who understood how to do the thingie, which ended up roughly translating to &amp;#8220;load random assemblies into a running AppDomain.&amp;#8221;  This idea ends up not working, so let&amp;#8217;s skip ahead.&lt;/li&gt;
&lt;li&gt;About an hour later, Rock was able to join us, and we are finally able to try to cut new builds.  Because the QA team does not generally work Sunday evenings, we were forced to do a minimal very minimal amount of QA before just opting to pull the trigger and deploy to all Fog Creek On Demand customers.  By this point, it&amp;#8217;s already about 11:30.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, for those keeping score: it took half an hour to reach &lt;em&gt;anybody&lt;/em&gt; who could fix the problem; it took more than an hour before we were actually in a position to properly debug it; and it took another couple of hours to actually get in touch with everyone required to fix the problem.  Further, throughout the whole evening, everything happened in slow motion: people would step away from their computer and miss a &lt;a href="https://www.hipchat.com/"&gt;HipChat&lt;/a&gt; notification, they&amp;#8217;d need to put kids to bed, they&amp;#8217;d need to take dogs for walks, they&amp;#8217;d need to outrun the cops, and so on.  Even when everyone was fully on-deck, I think conservatively that things happened at half the speed as normal at best.&lt;/p&gt;

&lt;p&gt;Conversely, if we had simply deployed first thing on a workday, and things had gone wrong, we&amp;#8217;d have had everyone right there ready to take care of it immediately.  We&amp;#8217;d have had a real QA team to make sure the build was high-quality before we unleashed it.  We&amp;#8217;d have been able to pile into a single office to discuss the problem in a very high-bandwidth maneuver, and I think we literally might have been able to fix the problem in 30 minutes, rather than five and a half hours.  And despite our midnight Saturday deploy, customers were &lt;em&gt;still&lt;/em&gt; adversely affected, and so ended up negatively impacting customers, and then being &lt;em&gt;extremely&lt;/em&gt; slow to respond, compared to what we&amp;#8217;d have been capable of with a midweek deploy.&lt;/p&gt;

&lt;p&gt;Well, screw that.&lt;/p&gt;

&lt;p&gt;New policy: Kiln and FogBugz will deploy midweek.  We&amp;#8217;ll still do it late at night, but in the middle of the week, we&amp;#8217;ll have everyone on-deck first thing in the morning in case anything blows up, and our chance of being able to reach people on a Wednesday is &lt;em&gt;dramatically&lt;/em&gt; higher than on a Sunday night even if things &lt;em&gt;do&lt;/em&gt; have an immediate negative impact.&lt;/p&gt;

&lt;p&gt;Weekend deployments are for chumps.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;If you want the full post mortem, plus some more details on what went wrong, please &lt;a href="http://status.fogcreek.com/2011/03/sunday-night-kiln-outage-for-some-customers.html"&gt;visit my write-up on the Fog Creek status blog&lt;/a&gt;.  I&amp;#8217;ve also spelled out how we&amp;#8217;ll be avoiding getting into this situation in the future, Wednesday deploys or no.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/YrmO947o9DI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/midnight-deploys-are-for-idiots/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">Making Your Interns Addicts: a How-To Guide</title>
    <id>/post/making-your-interns-addicts-howto/</id>
    <updated>2011-05-27T08:22:15Z</updated>
    <published>2011-05-27T08:22:15Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/q4NZXHdU2vI/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;I was thinking back last week on why I started working at Fog Creek.  If you don&amp;#8217;t know, I got started on this thing called &lt;a href="http://projectaardvark.com/"&gt;Project Aardvark&lt;/a&gt;, which eventually ended up becoming &lt;a href="https://www.copilot.com/"&gt;Copilot&lt;/a&gt;, the project I worked on for my first couple of years at Fog Creek.  I don&amp;#8217;t generally reminisce much about that time, simply because that was a very different point in my life, back before I found fashion, yet after I figured out how to end up in front of cameras constantly.&lt;/p&gt;

&lt;p&gt;&lt;div style="display: float; float: right"&gt;&lt;img src="http://media.bitquabit.com/blog/2011/05/jumpjumpjumparound.png" alt="Jump, jump, jump around..." /&gt;&lt;/div&gt; So my friends are usually quite good at reminiscing about that time on my behalf, which is &lt;em&gt;plenty&lt;/em&gt;.  But with this summer&amp;#8217;s batch of new Fog Creek interns arriving in just over a week, I&amp;#8217;ve been thinking about it a lot.  What was good, what was bad, what about the experience made me need to stay at Fog Creek.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve realized there are quite a few parallels between what got me into Fog Creek and what gets people hooked on hard-core drugs.&lt;/p&gt;

&lt;p&gt;Not in the bad way, mind you. I have yet to see an intern maniacally chase source code into a dirty toilet, for example.&lt;sup class="footnote-ref" id="fnref-ts"&gt;&lt;a href="#fn-ts"&gt;1&lt;/a&gt;&lt;/sup&gt;  What I mean is, I almost feel like our internship is custom-tailored to pound the crap out our interns&amp;#8217; sense of awesome so that they just &lt;em&gt;have&lt;/em&gt; to come back for more. Just, unlike with drugs, the effect is that they have a great summer, &lt;em&gt;and&lt;/em&gt; they want to work for us, &lt;em&gt;and&lt;/em&gt; I honestly feel they end up being way more productive in the process. What I find remarkable is that while nearly every part of Fog Creek has changed since my initial internship, the actual way we run our internships continues almost unedited.&lt;/p&gt;

&lt;p&gt;I really want all the interns in the world to come work for us, but I also want all the interns in the world to have amazing summers, and the best way to do that is to tell you what we&amp;#8217;re doing to get our interns hooked.  So without further ado, I&amp;#8217;m happy to begin my first and last guide to deliberately getting someone addicted. &lt;/p&gt;

&lt;h4&gt;Step 1: Get Them Excited&lt;/h4&gt;

&lt;p&gt;The first thing that matters is getting them psyched just to be there.  When I was an Aardvark, that was easy: we knew we were going to be in a movie.  Being in a movie is &lt;em&gt;exciting&lt;/em&gt;.  It&amp;#8217;s even more exciting when the film-maker comes to your house before the summer starts just to interview you and film you doing a really botched version of a Chopin nocturne that he manages to edit so you sound competent.  I mean, who could say no to that?&lt;/p&gt;

&lt;p&gt;Our interns this year may not be excited because they&amp;#8217;ll be in a movie, but they can be excited for a different reason: they&amp;#8217;re going to be working on a young project that still has thousands of customers and manages over half a terabyte of data across nearly 25,000 active repositories.  They&amp;#8217;ll get a chance to be making a difference.&lt;/p&gt;

&lt;p&gt;Find something that you yourself are excited about, and get your interns excited in that.  Or, if you don&amp;#8217;t have anything at your job that excites you, &lt;a href="http://www.fogcreek.com/Careers.html"&gt;find another job&lt;/a&gt;.  We&amp;#8217;re hiring, after all.&lt;/p&gt;

&lt;h4&gt;Step 2: Get Them Doing Real Work&lt;/h4&gt;

&lt;p&gt;Of course, if the thing you&amp;#8217;re getting your interns excited about is playing with a widely used application, it &lt;em&gt;does&lt;/em&gt; require you let them, you know, &lt;em&gt;touch the code&lt;/em&gt;.  My first coding internship, at a company that shall remain nameless,&lt;sup class="footnote-ref" id="fnref-mordor"&gt;&lt;a href="#fn-mordor"&gt;2&lt;/a&gt;&lt;/sup&gt; involved me writing a tremendous amount of Ruby code.  That could be awesome, and in a way, it was.  Except that the Ruby code I was writing were scripts to do things like automatically upload new advertisement photos to the intranet, collated by the date the photograph was taken.  Or, when I wasn&amp;#8217;t so lucky, it was to make a blog engine that could hold exactly one blog post, and then display a little red icon if the blog post it was showing at the time was Bad For The Company&amp;trade;.  Not exactly central to the product, you know?&lt;/p&gt;

&lt;p&gt;So at Fog Creek, we always make sure our interns are doing real stuff for the project they&amp;#8217;re working on.  When I was an intern on Aardvark, I wrote most of the Windows helpers.  Other intern classes have written a new wiki for FogBugz, and given Kiln its API and its large files support.  Hell, an intern class was integral to getting the first version of Kiln done in the first place.  It feels &lt;em&gt;so much better&lt;/em&gt; to actually be contributing code to something you know is going to make a real difference to the product.&lt;/p&gt;

&lt;p&gt;Or, you know, have them write a one-post blog engine or whatever.  It&amp;#8217;s cool.  Just make sure they know at the end of their internship that &lt;a href="http://www.fogcreek.com/Careers.html"&gt;we&amp;#8217;re still hiring&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Step 3: Give Them Instant Feedback&lt;/h4&gt;

&lt;p&gt;You know what sucks about automating some random task that you&amp;#8217;ve been assigned to do as an intern?  Getting absolutely no feedback on what anyone thinks about it.  Is it useful?  Does it stink?  Who knows.  It&amp;#8217;s a fricking &lt;em&gt;compilation of advertisements on a corporate intranet.&lt;/em&gt;  For all I know, no one even reads this at all.&lt;sup class="footnote-ref" id="fnref-reading"&gt;&lt;a href="#fn-reading"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;With one exception,&lt;sup class="footnote-ref" id="fnref-perfection"&gt;&lt;a href="#fn-perfection"&gt;4&lt;/a&gt;&lt;/sup&gt; Fog Creek interns always get to see Creekers using their code &lt;em&gt;immediately&lt;/em&gt;, because we code right alongside them.  We&amp;#8217;re running their changes on our development systems, and, in many cases, running that code on our &lt;a href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;dogfood systems&lt;/a&gt; just a day or two after it&amp;#8217;s written.  Not only does this generally mean that our products are better, because we&amp;#8217;re using new features heavily ourselves long before they ever reach our customer&amp;#8217;s hands; it means that our interns are getting feedback almost immediately, both from within and outside their team, on what worked and what didn&amp;#8217;t.&lt;/p&gt;

&lt;p&gt;Or you can send feedback three weeks after the internship ends.  By email.  That works, too.&lt;/p&gt;

&lt;h4&gt;Step 4: Make Them Feel Awesome&lt;/h4&gt;

&lt;p&gt;People like feeling good.  And the simple fact is, if you&amp;#8217;re using your interns&amp;#8217; code almost immediately, and giving them rapid feedback, you&amp;#8217;re going to end up having your interns produce really great stuff.  So: &lt;em&gt;tell them that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not in a fake way, mind you: some things just honestly take a lot of revisions before they&amp;#8217;re good, no matter &lt;em&gt;how&lt;/em&gt; awesome the people involved are, and your interns are going to know you&amp;#8217;re offering them bull if you tell them something&amp;#8217;s awesome that they know isn&amp;#8217;t.  But there&amp;#8217;s all those intermediate steps, the little victories, the occasional big one, where you owe it to your team to acknowledge that, yup, they did well.&lt;/p&gt;

&lt;p&gt;Saying &amp;#8220;good job&amp;#8221; is one way to show you care, but actually &lt;em&gt;getting to know your interns&lt;/em&gt; is even better.  At Fog Creek, we hang out with our interns outside of work by taking them to documentaries like &lt;em&gt;Harry Potter 7&lt;/em&gt;, to Yankees &amp;#8220;games&amp;#8221;&lt;sup class="footnote-ref" id="fnref-pummel"&gt;&lt;a href="#fn-pummel"&gt;5&lt;/a&gt;&lt;/sup&gt; at the new stadium, and, my personal favorite, to &lt;a href="http://www.bowlmor.com/"&gt;top-shelf-martini-powered bowling&lt;/a&gt;.  If you don&amp;#8217;t have these available in your town, take them to the airport so they can bond over a TSA freaky frisk-fest.  The point is, do something with your interns so you actually get to know and like them as something other than a coding automaton.&lt;/p&gt;

&lt;h4&gt;Step 5: Ship, dammit!&lt;/h4&gt;

&lt;p&gt;But all of that comes to naught if you don&amp;#8217;t &lt;em&gt;actually ship stuff.&lt;/em&gt;  Sure, maybe you worked on Kiln, and sure, maybe &lt;em&gt;Kiln&lt;/em&gt; makes a difference to the company, and sure, maybe your boss likes you.  But what about your own stuff?  Do customers care?  Does it just go into a bit bucket at the end of the summer, never to be seen again?&lt;/p&gt;

&lt;p&gt;&lt;div style="display: float; float: left"&gt;&lt;img src="http://media.bitquabit.com/blog/2011/05/party.png" alt="Celebrate the successes" /&gt;&lt;/div&gt; Our interns won&amp;#8217;t have to wonder too much about that: thanks to &lt;a href="http://blog.fogcreek.com/release-cycles-of-the-fast-and-the-furious/"&gt;Kiln&amp;#8217;s fast release schedule&lt;/a&gt;, they&amp;#8217;ll be seeing their code go out to customers multiple times this summer, get feedback from customers about their changes, and probably even do a second round or two that integrates that feedback.  So while they&amp;#8217;re busy being excited, writing production code, getting feedback, and doing fun stuff, they&amp;#8217;ll also be knowing, &lt;em&gt;even during their internship&lt;/em&gt;, exactly what a difference they&amp;#8217;re making.&lt;/p&gt;

&lt;p&gt;You see what I mean?  It&amp;#8217;s exactly like an addiction.  Just because our interns are awesome, work on great products, and make a real difference, they get this crazy positive feedback loop that means they not only have a great summer, but that they want to keep coming back, again and again.  We&amp;#8217;ve literally had freshman interns who come back every single summer because they love it here so much.  We&amp;#8217;re doing something right.&lt;/p&gt;

&lt;p&gt;And I hope that, if your interns aren&amp;#8217;t already feeling the same way, this guide can help you get there.  I remember what it was like to feel like an undervalued intern, and I remember what it was like to feel like I was king of the world.&lt;/p&gt;

&lt;p&gt;Help your interns have their own king-of-the-world moments, and everyone wins.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn-ts"&gt;
&lt;p&gt;I hate Trainspotting so hard.&amp;nbsp;&lt;a href="#fnref-ts" class="footnoteBackLink" title="Jump back to footnote 1 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn-mordor"&gt;
&lt;p&gt;The East India Company.&amp;nbsp;&lt;a href="#fnref-mordor" class="footnoteBackLink" title="Jump back to footnote 2 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn-reading"&gt;
&lt;p&gt;Actually, I know people read it, because I got bored and figured out how to use &amp;#8220;DHTML&amp;#8221; to log who was viewing the page.  But you get the point.&amp;nbsp;&lt;a href="#fnref-reading" class="footnoteBackLink" title="Jump back to footnote 3 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn-perfection"&gt;
&lt;p&gt;It turns out that, try as we might, even Fog Creek can&amp;#8217;t achieve perfection.  Just reallygoodtion, with an eye towards learningfromyourmistakesery.&amp;nbsp;&lt;a href="#fnref-perfection" class="footnoteBackLink" title="Jump back to footnote 4 in the text."&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn-pummel"&gt;
&lt;p&gt;My editor informed me that calling them &amp;#8220;Red Sox beat-downs&amp;#8221; was not appropriate if I didn&amp;#8217;t want to offend my audience.&amp;nbsp;&lt;a href="#fnref-pummel" class="footnoteBackLink" title="Jump back to footnote 5 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-programming/~4/q4NZXHdU2vI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/making-your-interns-addicts-howto/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">Cache me if you can</title>
    <id>/post/cache-me-if-you-can/</id>
    <updated>2011-06-10T12:03:12Z</updated>
    <published>2011-06-10T12:03:12Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/f__H0MyGSQQ/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;&lt;div style="float: right"&gt;&lt;img src="http://media.bitquabit.com/blog/2011/06/kiln.png" alt="The Kiln Dodo monitors your success with gusto" /&gt;&lt;/div&gt;I remember, when we first launched Kiln, that I was desperately hopeful that it&amp;#8217;d actually make a dent. I was honestly quite scared that we might end up in a situation where, after we&amp;#8217;d put in all of this effort, spent all of this time designing and coding and testing and writing really arcane and annoying crap like billing code, that no one would want Kiln, and we&amp;#8217;d be forced to close shop.&lt;/p&gt;

&lt;p&gt;Good news!  That&amp;#8217;s no longer the problem.&lt;/p&gt;

&lt;p&gt;The problem now is that we&amp;#8217;re too successful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What?!&lt;/em&gt; I hear some of you ask.  &lt;em&gt;Don&amp;#8217;t you &lt;strong&gt;want&lt;/strong&gt; to be too successful?!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I think I speak for my entire team when I say: &lt;strong&gt;hell yes!&lt;/strong&gt;  We want to keep on being too successful.  If anything, we want to be &lt;em&gt;even more too successful&lt;/em&gt; than we currently are.&lt;/p&gt;

&lt;p&gt;But success &lt;em&gt;does&lt;/em&gt; present problems.  It&amp;#8217;s awesome to have thousands of customers and terabytes of data, but then you start dealing with the boring details of questions like where do you &lt;em&gt;put&lt;/em&gt; those terabytes of data, and how do you &lt;em&gt;get&lt;/em&gt; that data to the customers in a timely manner.  And that can be a really tough cookie to crack.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to be talking about several different aspects of how we&amp;#8217;re handling scaling Kiln over the next few weeks, but today, I want to focus on one single narrow thing: caching.&lt;/p&gt;

&lt;h4&gt;The WISC Stack&lt;/h4&gt;

&lt;p&gt;The main part of Kiln that you all know and love&amp;mdash;the website&amp;mdash;is a fairly typical &lt;a href="http://www.artificialignorance.net/blog/wisc/stackoverflow-and-the-power-of-wisc/"&gt;WISC&lt;/a&gt; application.  We have a couple of web servers running IIS and the Kiln website, which talk to several SQL Server boxes.  The nice thing about well-engineered WISC stacks is that, like LAMP, you can scale the databases and the web servers independently.  This is the bread-and-butter of designing a scalable application.  So far, so good.&lt;/p&gt;

&lt;p&gt;The thing is, just adding more SQL boxes isn&amp;#8217;t always the answer.  If you have complex queries that take a long time to run, then adding another box won&amp;#8217;t help anything.  It just gives you another box to run your complex query on at the same slow speed.  Even if you&amp;#8217;re only doing simple queries, adding more database boxes isn&amp;#8217;t necessarily the answer. Good SQL boxes are expensive&amp;mdash;doubly so if you&amp;#8217;re using a big commercial DB package such as SQL Server or Oracle. While you might be &lt;em&gt;able&lt;/em&gt; to afford buy more, you don&amp;#8217;t &lt;em&gt;want&lt;/em&gt; to if you can avoid it.&lt;/p&gt;

&lt;p&gt;Instead, you should focus on just not hitting the database in the first place.&lt;/p&gt;

&lt;h4&gt;The &lt;em&gt;S&lt;/em&gt; in WISC&lt;/h4&gt;

&lt;p&gt;It turns out that there are already some mechanisms we had in place to help with this.  We prefetched certain data that we knew we needed nearly every request (like the full list of repositories), and then used that cache for any other lookups during the request.  And LINQ to SQL does a bit of its own per-request object caching in certain situations (such as querying an entity by primary key), so we already had some actual data caching going on.&lt;/p&gt;

&lt;p&gt;While that kind of stuff &lt;em&gt;can&lt;/em&gt; help, what we &lt;em&gt;really&lt;/em&gt; wanted to do was to try to avoid talking to SQL at all for common operations.  Those complex queries that Kiln does&amp;mdash;things like showing the amalgamated DAG for all related repositories&amp;mdash;take a long time to run, but the resulting data doesn&amp;#8217;t actually change that often.  This is a clear and wonderful win, if we can pull it off.&lt;/p&gt;

&lt;h4&gt;Making it Happen&lt;/h4&gt;

&lt;p&gt;There were two problems we had to solve: where do you cache the data? and how do you get it there?&lt;/p&gt;

&lt;p&gt;&lt;div style="float: right"&gt;&lt;img src="http://media.bitquabit.com/blog/2011/06/membase.png" alt="Membase" /&gt;&lt;/div&gt;The first one was pretty easy: use Memcache.  Memcache is used everywhere, is extremely well-understood, and has great implementations for both Windows and Linux.  We ended up settling on &lt;a href="http://www.couchbase.com/products-and-services/membase-server"&gt;Membase&lt;/a&gt; as the particular server implementation we liked, due to its easy-to-use administration console and trivial clustering support.  For the client, we ended up going with the &lt;a href="http://code.google.com/p/beitmemcached/"&gt;BeIT Memcached library&lt;/a&gt;, due to its easy customizability and simple design.&lt;/p&gt;

&lt;p&gt;The second part was much more difficult.  Kiln uses LINQ to SQL for its database access layer.  That meant we had a problem: LINQ to SQL is a very complex beast, where objects have a database context that in turn is aware of all the objects that it&amp;#8217;s managing.  If you just grab a random LINQ object and throw it into Memcache, then it is not going to deserialize cleanly.  Throw in that we have piles of custom logic in our LINQ-to-SQL-backed models, and you&amp;#8217;ve got a recipe for pain.&lt;/p&gt;

&lt;p&gt;We ended up solving this in two different ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We modified our models to allow for detaching and reattaching to the database context.  Before serialization, the object is detached, so it has no controlling database context.  On deserialization, we attach it to the current context.  This isn&amp;#8217;t as fast as grabbing an attached object out of a cache (such as the old per-request prefetch cache mentioned earlier), but ends up incurring minimal overhead for the common case.&lt;/li&gt;
&lt;li&gt;We also had to modify our models to know that they might not have come from the DB.  We rely heavily on signal handlers to make changes in a given model class propagate to all the parts of Kiln that need to be notified.  These were firing erroneously as the deserialization code set piles of properties.   The fix we came up with was to suppress signals for deserializing objects&amp;mdash;which, since most of our model modifications are done by &lt;a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx"&gt;T4 templates&lt;/a&gt; anyway, was very easy to do in a DRY manner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these two changes, we were able to reliably store LINQ database entities in Memcache, get them back out, and work with them.&lt;/p&gt;

&lt;p&gt;It was easy enough to verify that the number of queries was down, but would the caching code make a real difference?&lt;/p&gt;

&lt;h4&gt;The Result&lt;/h4&gt;

&lt;p&gt;I think this graph of what load looks like on one of our DB boxes, before and after the caching deployment, says more than I could in several paragraphs of text:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.bitquabit.com/blog/2011/06/sql-load.png" alt="SQL Server load dramatically decreasing" /&gt;&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ve cut the amount of data we&amp;#8217;re getting from SQL by &lt;em&gt;75%&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The benefits we&amp;#8217;re seeing are already impressive.  We have faster load times and less DB traffic.  But we can still do a lot more: now that we have the outlines of a caching framework, we can continue to profile and to move more of our expensive queries into the cache. Based on what we&amp;#8217;ve seen so far, this should yield immediate and real benefits to our Kiln On Demand customers.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/f__H0MyGSQQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/cache-me-if-you-can/</feedburner:origLink></entry>
  <entry xml:base="http://bitquabit.com/feeds-noredirect/atom/programming/">
    <title type="text">Make Love, Not Flamewars</title>
    <id>/post/make-love-not-flamewars/</id>
    <updated>2011-06-28T08:23:08Z</updated>
    <published>2011-06-28T08:23:08Z</published>
    <link href="http://feedproxy.google.com/~r/bitquabit-programming/~3/SVTxTifxOoo/" />
    <author>
      <name />
    </author>
    <content type="html">&lt;p&gt;I sincerely doubt that the statement &amp;#8220;I like Mercurial&amp;#8221; will catch anyone who reads this blog by surprise.  I brought it to Fog Creek.  I evangelized for it on the Fog Creek World Tour.  I helped build a whole product around it.  I&amp;#8217;ve gone to a Mercurial coding sprint, I&amp;#8217;ve sent a whizkid to a Mercurial coding sprint, and I&amp;#8217;ve even written a few patches (mostly trivial) for Mercurial.  So let&amp;#8217;s agree that I like Mercurial an awful lot.&lt;/p&gt;

&lt;p&gt;Reading &lt;a href="http://programmers.stackexchange.com/questions/87217/why-is-mercurial-considered-to-be-easier-than-git"&gt;crap like this&lt;/a&gt; pisses me off.&lt;/p&gt;

&lt;p&gt;The question &lt;em&gt;seems&lt;/em&gt; innocuous enough at first glance: &lt;em&gt;Why is Mercurial considered easier-to-use than Git?&lt;/em&gt;  A legitimate, simple question.  And in a sane world, perhaps, a fair one.&lt;/p&gt;

&lt;p&gt;But that&amp;#8217;s not how things work amongst us developers, because we have these utterly inane religious flamewars.  Emacs is for octopuses, Vim is for beep mode.  Ruby is a language for potheads, Python is for BDSM fetishists.  DOS is for PCP-using masochists&amp;#8230;okay, that one may be legit, but it&amp;#8217;s also kind of moot at this juncture.  Point is, there are some topics where developers just cannot have a rational discussion anymore.&lt;/p&gt;

&lt;p&gt;Mercurial versus Git is one of them.  To save you time, here is every single Mercurial v. Git discussion I&amp;#8217;ve read since 2005:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Harry&lt;/strong&gt;: Mercurial is awesome, because it is easy.&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Sally&lt;/strong&gt;: It&amp;#8217;s not easier than Git!  You&amp;#8217;re just too dumb to see the light!&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Harry&lt;/strong&gt;: Okay but like Git is written in Perl!  And it doesn&amp;#8217;t run on Windows!  And I had my changesets fucking &lt;em&gt;garbage collected&lt;/em&gt; once!  And the man pages are like 900 pages!&lt;/p&gt;
  
  &lt;p&gt;&lt;strong&gt;Sally&lt;/strong&gt;: It&amp;#8217;s not, it&amp;#8217;s written in C, and it&amp;#8217;s ninety bajillion times faster than Mercurial!  And I had to screw with its database once!  Also Git does too run on Windows, and I lost nine weeks worth of stuff in Mercurial once due to enabling the &lt;code&gt;MQ&lt;/code&gt; extension!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But don&amp;#8217;t take my word for it; you can &lt;a href="http://www.reddit.com/r/programming/comments/iaac2/why_is_mercurial_considered_to_be_easier_than_git/"&gt;go watch the internecine fanboyism play out at Reddit&lt;/a&gt;, right now!  In response to that crap question!  Again!  God!  I live in Groundhog&amp;#8217;s Day!&lt;/p&gt;

&lt;p&gt;You know what?&lt;/p&gt;

&lt;p&gt;Both sides are full of shit.&lt;/p&gt;

&lt;p&gt;Yeah, I believe that Mercurial is easier to use than Git.  But the best example anyone can provide on StackExchange is &lt;em&gt;converting the author names in a pile of commit messages&lt;/em&gt;?  Really?  Because, okay, yes, I&amp;#8217;ve done that.  Maybe twice.  And even if it &lt;em&gt;completely stank&lt;/em&gt;, I&amp;#8217;d just memorize how to do it and get on with my life.&lt;/p&gt;

&lt;p&gt;What about the &lt;em&gt;daily&lt;/em&gt; workflow?  Is that easier?  Why?  Is it fewer commands?  Is there more protection from you shooting yourself in the foot?  Does the protection come with less power?  Why do Git users swear by branching, if &amp;#8220;it&amp;#8217;s in Mercurial since &amp;lt;some low version&amp;gt;&amp;#8221;?  Why do Mercurial users swear by &lt;em&gt;their&lt;/em&gt; branching system?  Does Git have an emulation of it?  Why or why not?  What are the trade-offs here?  Do they actually end up mattering?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These questions matter&lt;/em&gt;.  And they&amp;#8217;ve been answered, very eloquently, many times.  But for whatever reason, that doesn&amp;#8217;t resonate with people.  They want to find the weak argument that they can refute, and then that gets traction specifically because it&amp;#8217;s weak, and everyone can have the fight all over again.&lt;/p&gt;

&lt;p&gt;This stops now.&lt;/p&gt;

&lt;p&gt;I have a solution.&lt;/p&gt;

&lt;p&gt;Instead of talking about &lt;em&gt;why you are better than the other guy&lt;/em&gt;, let&amp;#8217;s focus purely on &lt;em&gt;why your system of choice rocks&lt;/em&gt;.  That&amp;#8217;s it.  No &lt;code&gt;whyfooisbetterthanx.com&lt;/code&gt;.  Just &lt;code&gt;whyfooisgreat.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here, I&amp;#8217;ll get us started.  I whipped up &lt;a href="http://ilovemercurial.com"&gt;I Love Mercurial&lt;/a&gt;, a site where you can talk until you pass out about why Mercurial is awesome.  Just tweet with the &lt;code&gt;#ilovemercurial&lt;/code&gt; hashtag, and we&amp;#8217;ll pick it up and post it.&lt;/p&gt;

&lt;p&gt;Note: &lt;em&gt;why you love Mercurial&lt;/em&gt;.  Not why Mercurial is better than X.  Not why X causes brain tumors in lab rats and sterilizes your children.  Just, things that Mercurial does that you love?  Talk about &amp;rsquo;em on Twitter with the &lt;code&gt;#ilovemercurial&lt;/code&gt; hashtag.  We&amp;#8217;ll post &amp;rsquo;em.  Then, the next time, someone asks you why you like Mercurial, just point them to that site.  Or the hashtag.  I honestly don&amp;#8217;t care.  Point is, show them why Mercurial rocks, and not why the other guy sucks.&lt;/p&gt;

&lt;p&gt;And then maybe, just maybe, just &lt;em&gt;maybe&lt;/em&gt;, at least on &lt;em&gt;this one little topic&lt;/em&gt;, the flamewar can die in a pile of love on &lt;em&gt;why my tool is awesome&lt;/em&gt; instead of &lt;em&gt;the 92835 deficiencies your tool has that mine doesn&amp;#8217;t&lt;/em&gt;, and I don&amp;#8217;t have to wake up to my alarm clock playing &lt;em&gt;I Got You Babe&lt;/em&gt; ever, ever again.&lt;/p&gt;

&lt;p&gt;Please remember to update manners to &lt;code&gt;tip&lt;/code&gt; before tweeting.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bitquabit-programming/~4/SVTxTifxOoo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://bitquabit.com/post/make-love-not-flamewars/</feedburner:origLink></entry>
</feed>

