Add expected outputs for existing tests

This commit is contained in:
Jess Bees
2022-02-02 11:59:50 -05:00
parent 3386346410
commit 2788dc5c6e
62 changed files with 7424 additions and 0 deletions
@@ -0,0 +1,204 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub</title>
<meta name="author" content="Tom Preston-Werner" />
<link href="http://feeds.feedburner.com/tom-preston-werner" rel="alternate" title="Tom Preston-Werner" type="application/atom+xml" />
<meta name="readability-verification" content="QCzSs992GxmRYRKVpPeZ6LE2tS8aYKxsSSQKV8YM"/>
<!-- syntax highlighting CSS -->
<link rel="stylesheet" href="/css/syntax.css" type="text/css" />
<!-- Homepage CSS -->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen, projection" />
<!-- Typekit -->
<script type="text/javascript" src="http://use.typekit.com/jpd0pfm.js"></script>
<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
</head>
<body>
<!-- ClickTale Top part -->
<script type="text/javascript">
var WRInitTime=(new Date()).getTime();
</script>
<!-- ClickTale end of Top part -->
<div class="site">
<div class="title">
<a href="/">Tom Preston-Werner</a>
<a class="extra" href="/">home</a>
</div>
<div id="post">
<h1 id="how-i-turned-down-300000-from-microsoft-to-go-full-time-on-github">How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub</h1>
<p class="meta">18 Oct 2008 - San Francisco</p>
<p>2008 is a leap year. That means that three hundred and sixty six days ago,
almost to the minute, I was sitting alone in a booth at Zekes Sports Bar and
Grill on 3rd Street in San Francisco. I wouldnt normally hang out at a sports
bar, let alone a sports bar in SOMA, but back then Thursday was “I Can Has Ruby”
night. I guess back then “I can has <strong>__</strong>_” was also a reasonable moniker to
attach to pretty much anything. ICHR was a semi-private meeting of like minded
Ruby Hackers that generally and willingly devolved into late night drinking
sessions. Normally these nights would fade away like my hangover the next
morning, but this night was different. This was the night that
<a href="http://github.com/">GitHub</a> was born.</p>
<p>I think I was sitting at the booth alone because Id just ordered a fresh Fat
Tire and needed a short break from the socializing that was happening over at
the long tables in the dimly lit aft portion of the bar. On the fifth or sixth
sip, Chris Wanstrath walked in. I have trouble remembering now if Id even
classify Chris and I as “friends” at the time. We knew each other through Ruby
meetups and conferences, but only casually. Like a mutual “hey, I think your
code is awesome” kind of thing. Im not sure what made me do it, but I gestured
him over to the booth and said “dude, check this out.” About a week earlier Id
started work on a project called <a href="http://github.com/mojombo/grit">Grit</a> that
allowed me to access Git repositories in an object oriented manner via Ruby
code. Chris was one of only a handful of Rubyists at the time that was starting
to become serious about Git. He sat down and I started showing him what I had.
It wasnt much, but it was enough to see that it had sparked something in Chris.
Sensing this, I launched into my half-baked idea for some sort of website that
acted as hub for coders to share their Git repositories. I even had a name:
GitHub. I may be paraphrasing, but his response was along the lines of a very
emphatic “Im in. Lets do it!”</p>
<p>The next night, Friday, October 19, 2007 at 10:24pm Chris made the first commit
to the GitHub repository and sealed in digital stone the beginning of our joint
venture. There were, so far, no agreements of any kind regarding how things
would proceed. Just two guys that decided to hack together on something that
sounded cool.</p>
<p>Remember those amazing few minutes in Karate Kid where Daniel is training to
become a martial arts expert? Remember the music? Well, you should probably go
buy and listen to <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=260417864&amp;id=260417040&amp;s=143441">Youre The
Best</a>
by Joe Esposito in iTunes because Im about to hit you with a montage.</p>
<p>For the next three months Chris and I spent ridiculous hours planning and coding
GitHub. I kept going with Grit and designed the UI. Chris built out the Rails
app. We met in person every Saturday to make design decisions and try to figure
out what the hell our pricing plan would look like. I remember one very rainy
day we talked for a good two hours about various pricing strategies over some of
the best Vietnamese egg rolls in the city. All of this we did while holding
other engagements. I, for one, was employed full time at Powerset as a tools
developer for the Ranking and Relevance team.</p>
<p>In mid January, after three months of nights and weekends, we launched into
private beta mode, sending invites to our friends. In mid February PJ Hyett
joined in and made us three-strong. We publicly launched the site on April 10th.
TechCrunch was not invited. At this point it was still just three 20-somethings
without a single penny of outside investment.</p>
<p>I was still working full time at Powerset on July 1, 2008 when we learned that
Powerset had just been acquired by Microsoft for around $100 million. This was
interesting timing. With the acquisition, I was going to be faced with a choice
sooner than I had anticipated. I could either sign on as a Microsoft employee or
quit and go GitHub full time. At 29 years old, I was the oldest of the three
GitHubbers, and had accumulated a proportionally larger amount of debt and
monthly expenditure. I was used to my six digit lifestyle. Further confounding
the issue was the imminent return of my wife, Theresa, from her PhD fieldwork in
Costa Rica. I would soon be transitioning from make-believe bachelor back to
married man.</p>
<p>To muddy the waters of decision even more, the Microsoft employment offer was
juicy. Salary + $300k over three years juicy. Thats enough money to make
anybody think twice about anything. So I was faced with this: a safe job with
lots of guaranteed money as a Microsoft man or a risky job with
unknown amounts of money as an entrepreneur. I knew things with the other GitHub
guys would become extremely strained if I stayed on at Powerset much longer.
Having saved up some money and become freelancers some time ago, they had both
started dedicating full time effort to GitHub. It was do or die time. Either
pick GitHub and go for it, or make the safe choice and quit GitHub to make
wheelbarrows full of cash at Microsoft.</p>
<p>If you want a recipe for restless sleep, I can give you one. Add one part “what
will my wife think” with 3,000 parts Benjamin Franklin; stir in a “beer anytime
you damn well please” and top with a chance at financial independence.</p>
<p>Ive become pretty good at giving my employers the bad news that Im leaving the
company to go do something cooler. I broke the news to my boss at Powerset on
the day the employment offer was due. I told him I was quitting to go work full
time on GitHub. Like any great boss, he was bummed, but understanding. He didnt
try to tempt me with a bigger bonus or anything. I think deep down he knew I was
going to leave. I may have even received a larger incentive to stay than others,
on account of my being a flight risk. Those Microsoft managers are crafty, I
tell you. Theyve got retention bonuses down to a science. Well, except when you
throw an entrepreneur, the singularity of the business world, into the mix.
Everything goes wacky when youve got one of those around.</p>
<p>In the end, just as Indiana Jones could never turn down the opportunity to
search for the Holy Grail, I could no less turn down the chance to work for
myself on something I truly love, no matter how safe the alternative might be.
When Im old and dying, I plan to look back on my life and say “wow, that was an
adventure,” not “wow, I sure felt safe.”</p>
</div>
<div id="related">
<h2>Related Posts</h2>
<ul class="posts">
<li><span>10 Nov 2016</span> &raquo; <a href="/2016/11/10/snyk.html">Snyk - Automatically Scan and Fix Ruby and Nodejs Vulnerabilities</a></li>
<li><span>19 Jun 2015</span> &raquo; <a href="/2015/06/19/replicated.html">Replicated - An Easier Path from SaaS to Enterprise</a></li>
<li><span>21 Apr 2014</span> &raquo; <a href="/2014/04/21/farewell-github-hello-immersive-computing.html">Farewell GitHub, Hello Immersive Computing</a></li>
</ul>
</div>
<div class="footer">
<div class="contact">
<p>
Tom Preston-Werner
<br />
Cofounder of
<a href="https://codestarter.org/">Codestarter</a>,
<a href="https://github.com/">GitHub</a>
<br />
[email protected]
</p>
</div>
<div class="contact">
<p>
<a href="http://github.com/mojombo/">github.com/mojombo</a><br />
<a href="http://twitter.com/mojombo/">twitter.com/mojombo</a><br />
</p>
</div>
<div class="rss">
<a href="http://feeds.feedburner.com/tom-preston-werner">
<img src="/images/rss.png" alt="Subscribe to RSS Feed" />
</a>
</div>
</div>
</div>
<a href="http://github.com/mojombo"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub" /></a>
<!-- ClickTale Bottom part -->
<div id="ClickTaleDiv" style="display: none;"></div>
<script type="text/javascript">
if(document.location.protocol!='https:')
document.write(unescape("%3Cscript%20src='http://s.clicktale.net/WRb.js'%20type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
if(typeof ClickTale=='function') ClickTale(206,0.3,"www03");
</script>
<!-- ClickTale end of Bottom part -->
<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-6016902-1");
pageTracker._trackPageview();
</script>
<!-- Google Analytics end -->
</body>
</html>
@@ -0,0 +1,269 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Looking back on Selling Gravatar to Automattic</title>
<meta name="author" content="Tom Preston-Werner" />
<link href="http://feeds.feedburner.com/tom-preston-werner" rel="alternate" title="Tom Preston-Werner" type="application/atom+xml" />
<meta name="readability-verification" content="QCzSs992GxmRYRKVpPeZ6LE2tS8aYKxsSSQKV8YM"/>
<!-- syntax highlighting CSS -->
<link rel="stylesheet" href="/css/syntax.css" type="text/css" />
<!-- Homepage CSS -->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen, projection" />
<!-- Typekit -->
<script type="text/javascript" src="http://use.typekit.com/jpd0pfm.js"></script>
<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
</head>
<body>
<!-- ClickTale Top part -->
<script type="text/javascript">
var WRInitTime=(new Date()).getTime();
</script>
<!-- ClickTale end of Top part -->
<div class="site">
<div class="title">
<a href="/">Tom Preston-Werner</a>
<a class="extra" href="/">home</a>
</div>
<div id="post">
<h1 id="looking-back-on-selling-gravatar-to-automattic">Looking back on Selling Gravatar to Automattic</h1>
<p class="meta">23 Oct 2008 - San Francisco</p>
<p>For an entrepreneur, the line between horrible mistake and runaway success can
be so thin that even Kate Moss would be envious. I lived with
<a href="http://gravatar.com/">Gravatar</a> for nearly four years before that line even
became thick enough to measure.</p>
<p>As its become one of my favorite parables, Ill save the details of how I came
up with the idea for Gravatar for a future post. Whats important to know is
that the idea was spawned not from a business perspective, but from a desperate
desire to create something new in the world of blogging.</p>
<p>Spin the clock back four years and youll find me sitting at my Windows desktop
machine in my underwear with a box of Life cereal to my left and a day old Coke
to my right. Since Id been laid off from my job as a Java developer some months
earlier, Id decided to take the entrepreneurial plunge doing what I knew best:
web design. Working in a cone of isolation, Id become accustomed to waking up
late, swinging my legs over the right side of the bed, and in one fluid movement
sliding over to the ratty chair I stole from my old college dorm room. Id spend
most of the day working on client projects in ColdFusion or PHP. It was hard
work and could become a bit tiresome. I needed an outlet, something that didnt
have a suit on the other end of a telephone telling me how blue was the wrong
color and things would be so much better if only the photo had a slightly bigger
border. Gravatar would become that outlet for me.</p>
<p>I was really big into web standards at the time, having recently read Zeldmans
seminal work, and became a true believer. Eric Meyers, Dan Cederholm, and Jon
Hicks became like gods to me. I worked very hard at making relevant and witty
comments around the right kinds of blogs. Being a part of that movement became a
significant goal for me. My Movable Type weblog rarely went more than two days
days without a post on design or standards.</p>
<p>Two weeks after I had the idea for Gravatar the first version was written and
deployed. Every request hit the database and dynamically generated a properly
sized gravatar via PHPs gd2 api. Premature optimization and all that, right?
The first thing I did after getting the system to a workable state was email all
the bloggers I looked up to (and that had no idea who I was). Blog comments at
the time were a pretty dreary affair and I guess Cederholm was intrigued enough
by my idea that he linked to it in a sidebar micro-post on simplebits.com.</p>
<p>That single mention kicked off a slow but steady trickle of interest in the
system. A few blogs here and there installed the plugin and the world started
seeing avatars that mysteriously followed them around. At the same time, just as
people must have thought Cheez Whiz was a stupid idea when it first came out,
some bloggers started railing against Gravatar, calling it frivolous,
inefficient, and “an abomination.” This was my first nibble at the smorgasbord
of what was to become the “horrible mistake” aspect of Gravatar.</p>
<p>Due to the inherently self-advertising nature of gravatars (the “what the hell
is that and how do I get one?” brand of advertising), Gravatar adoption
increased at a rapid rate. Having crafted the idea for Gravatar without any
semblance of business model or growth projection or build-out strategy, things
took a rather dramatic dive away from “runaway success” as my server (yes,
singular) buckled under the pressure of tens of requests per second! As it turns
out, regenerating a gravatar on every request is not very CPU efficient.
Gravatars worldwide suddenly turned into little red Xs. Then, in what has become
known as the Twitter Effect, a barrage of emails hit me complaining about how
the free service on which they had come to depend was down, and how this would
adversely impact my well-being.</p>
<p>I fixed the code. Gravatar came back online with caching. All the while Id had
the bright idea that gravatars would be rated for content, MPAA-style. Because
users clearly were not fit to rate their own images, I was manually rating 400
or more avatars each day. If I missed a day, Id have damn near a thousand
waiting for me the next day. In addition to the angry mob, I was very fortunate
to have an amazingly supportive group of users that volunteered to help me rate
images. I owe them my sanity, and it freed up enough time for me to work on the
next iteration of the site.</p>
<p>G2, as I called it, would be written in Rails and use lighttpd plus a convoluted
directory structure of symlinks to enable me to pre-render every gravatar (1x1
up to 80x80) and serve only static images. I did this to avoid having to rent or
buy the kind of hardware necessary to hook up a properly scaled system. Up until
the end I ran Gravatar on a maximum of two rented commodity servers that set me
back a mere $300/month, a pittance for the kind of traffic I was serving. I say
it was a pittance, but thats not really true. Donations didnt even come close
to covering that cost.</p>
<p>At some point early in the development of G2, Toni Schneider, the CEO of
Automattic (the company behind WordPress.com and Akismet) contacted me after
hearing my <a href="http://blog.gravatar.com/2007/10/18/automattic-gravatar/">interview about the future of
Gravatar</a> on the
WordPress podcast. This was exciting news! How perfect a fit would it be for
Gravatar to be bought by Automattic? I was already planning a trip up to San
Francisco to meet with the Powerset guys, so the timing worked out perfectly for
me to meet in person with Toni. I ended up having lunch with Toni and Matt
Mullenweg at 21st Ammendment on 2nd Street. It was a bit intimidating to come to
the mecca of tech startups to meet with such huge players in the blogging
community. Turned out that both Matt and Toni are great guys and so we had
drinks for about two hours, talking about my ideas for Gravatar and how we might
be able to work together. Everything seemed great—I was jazzed and they
seemed excited—but a few weeks later Toni let me know that the timing was
wrong and they couldnt make a play at that time. He suggested I proceed with G2
and theyd proceed with their own avatar system. I was pretty bummed about the
outcome, but I took their advice and kept going.</p>
<p>A few weeks before G2 was finished, the site imploded in a big way. One machine.
Hundreds of requests per second. That poor CPU must have thought it was the End
Times. Instead of wasting time on getting the existing system back up, I put on
my headphones, turned it up to eleven, and got back to work on G2.</p>
<p>Im not sure if youve ever had to work on a project while your users are
publicly skewering you on your blog for allowing the service to go down, but
its as close to depression as Ive ever come. If Id had less pride, I would
have popped everyone a huge middle finger and let the service die, but instead I
waded through the hundreds of comments and deleted the ones with threats,
hatred, or my favorite, the words “fuck you” repeated 600 times. It wasnt fair,
I told myself, that I should be sitting here with high blood pressure trying to
raise Gravatar from the dead while the unappreciative masses do what they do
best on the internet. The only thing that kept me going was never being able to
tell which side of the mistake/success boundary I was sitting on. It was hard to
think of the situation as anything but a huge failure, but the shitstorm the
downtime was causing indicated that people found the service valuable. I want to
say that Twitter went through the same thing, but they suffered their downtime
with millions of dollars in the bank. The only thing I had was a full time job
unrelated to Gravatar and a credit card that reminded me every month of my bad
judgment.</p>
<p>Finally G2 was done, deployed, and fully operational. I have no idea how many
users I lost due to the several weeks of downtime, but I dont think it was very
many. There seems to be a corollary to the Twitter Effect that Id call the
Forgiveness Effect. It dictates that if a user enjoys a free service and that
service is currently up, all past atrocities will be easily and quickly
forgiven. With the site running again, things looked to be shifting back towards
a success.</p>
<p>Things were not all rainbows and unicorns though. My Rube Goldbergian
architecture had a few quirks that needed to be dealt with. The site still had
some elusive bugs from the overly-rapid development cycle. And just like new
lanes on freeways always fill up immediately, the two new servers I was running
started causing expensive bandwidth overages. I had taken a job at Powerset at
this point and the combined pressures of these two commitments started to weigh
me down. Once again I started feeling like all the effort I put into Gravatar
was for nothing. Like I would never benefit from any of it.</p>
<p>In a last ditch effort to save Gravatar from final doom, I emailed Toni and
pitched him again on Gravatar. I figured it was a long shot, but what the hell,
couldnt hurt. Things must have changed in the prior 6 months because Toni was
very receptive to the idea. We met again, at 21st Ammendment, and hashed out a
tentative deal over drinks. Id never sold anything like this before, so my
technique was probably very amateurish. Im almost certain I could have gotten a
better deal out of it, but I had the smell of desperation about me and I really
did want to see Gravatar end up in Automattics hands.</p>
<p>Four days later, Automattic made their official offer. On September 21st, 2007
we inked the deal and Gravatar became both the first company that I ever sold
and the first company that Automattic ever acquired.</p>
<p>I am quite satisfied with the sale to Automattic. Some will say that I should
have pursued VC funding. Indeed, I was contacted by several firms but never
travelled very far down that road. I always felt like Gravatar was a feature,
and I wasnt comfortable building a company on such a tiny foundation.
Reinforcing this decision, no viable business model ever coalesced during the
time I was building the site. It was also made clear by Toni that Automattic
would maintain Gravatar as a separate brand and continue its evolution (instead
of just absorbing it into WordPress). This appealed to my ego. Most companies
kill or maim everything they acquire, but here was a chance for Gravatar to
carry forward with all of Automattics resources behind it (instead of two
measly servers). Part of me just wanted to see what Gravatar could become with
time, money, and man-power moving it forward.</p>
<p>Things always seem so clear in retrospect. But it was pride and persistence that
kept me in the game long enough to have anything to look back on at all. While
the line between horrible mistake and runaway success may be difficult to see,
you can still find it if you look hard enough.</p>
</div>
<div id="related">
<h2>Related Posts</h2>
<ul class="posts">
<li><span>10 Nov 2016</span> &raquo; <a href="/2016/11/10/snyk.html">Snyk - Automatically Scan and Fix Ruby and Nodejs Vulnerabilities</a></li>
<li><span>19 Jun 2015</span> &raquo; <a href="/2015/06/19/replicated.html">Replicated - An Easier Path from SaaS to Enterprise</a></li>
<li><span>21 Apr 2014</span> &raquo; <a href="/2014/04/21/farewell-github-hello-immersive-computing.html">Farewell GitHub, Hello Immersive Computing</a></li>
</ul>
</div>
<div class="footer">
<div class="contact">
<p>
Tom Preston-Werner
<br />
Cofounder of
<a href="https://codestarter.org/">Codestarter</a>,
<a href="https://github.com/">GitHub</a>
<br />
[email protected]
</p>
</div>
<div class="contact">
<p>
<a href="http://github.com/mojombo/">github.com/mojombo</a><br />
<a href="http://twitter.com/mojombo/">twitter.com/mojombo</a><br />
</p>
</div>
<div class="rss">
<a href="http://feeds.feedburner.com/tom-preston-werner">
<img src="/images/rss.png" alt="Subscribe to RSS Feed" />
</a>
</div>
</div>
</div>
<a href="http://github.com/mojombo"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub" /></a>
<!-- ClickTale Bottom part -->
<div id="ClickTaleDiv" style="display: none;"></div>
<script type="text/javascript">
if(document.location.protocol!='https:')
document.write(unescape("%3Cscript%20src='http://s.clicktale.net/WRb.js'%20type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
if(typeof ClickTale=='function') ClickTale(206,0.3,"www03");
</script>
<!-- ClickTale end of Bottom part -->
<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-6016902-1");
pageTracker._trackPageview();
</script>
<!-- Google Analytics end -->
</body>
</html>