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>
@@ -0,0 +1,170 @@
<!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 to Meet Your Next Cofounder</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-to-meet-your-next-cofounder">How to Meet Your Next Cofounder</h1>
<p class="meta">3 Nov 2008 - San Francisco</p>
<p>Over the last few months Ive seen a number of people looking for cofounders on
Hacker News or via their own personal blogs. I think this is, at best, a highly
inefficient way to find a cofounder and, at worst, a way to fool yourself into
finding the <em>wrong</em> cofounder. In any case, its a naive approach to finding the
person that will need to stand by your side in the coming storm that we call
“running a startup.”</p>
<p>Dont get me wrong, the internet is an amazing tool for meeting people. The
wider the net you cast, the more likely you are to find the perfect match. But
the internet has its limitations. Ive had internet friends that were engaging,
witty, and brilliant online, but in person felt awkward and boring. Conversely,
I know people that are volatile and inflammatory online, but present an attitude
of friendliness and caring in person. This phenomenon makes it difficult to
gauge an individuals personality from online interaction alone.</p>
<p>A far better use of the internet is to find groups of people that share your
interests. Track down the local users group for your language or technology of
choice. The simple fact that members of these groups take time out of their day
to show up means that theyre more motivated and driven than the average person.
Even if its a bit of a commute to get to the meetings, start showing up
regularly. Prepare a few presentations on topics that youre passionate about.
Bonus points if you present on ideas related to your potential startup. Dont
worry about revealing your game-changing secrets; stealth mode is bullshit. Talk
to everyone. Steer the conversation toward your interests and if someone there
is excited about the same things, it will be clear.</p>
<p>It may take weeks or months, but in a good group youll find a handful of people
that you really like. If at all possible, go out drinking with these people
after the meetups. This is one of the easiest ways to go from “acquaintance” to
“friend” and gives you free license to bring up your craziest of ideas without
sounding like too much of a nutjob.</p>
<p>Of the people that you like, several may make excellent candidates for
cofounders. Do a little research on these individuals. What does their code look
like? Have they done much open source? Do they demonstrate an entrepreneurial
spirit? Can they stick with a single project for a long time? Have they been
loyal to their friends and companies in the past? A good cofounder should be
someone with whom you feel privileged to work. And they should feel privileged
to work with you. The two of you should be on very solid ground before you begin
your startup adventure, because once you do, the impact of every argument is
going to feel like its been multiplied by a thousand.</p>
<p>This all sounds like a lot of hard work. Maybe youre wondering if it would be
better to just go solo. I did that with Gravatar, and, in retrospect, its
painfully obvious that I made a lot of stupid mistakes. When its just you and
your thoughts it becomes too easy to pick the first thing that pops into your
head. Were programmed to think all of our ideas are good, but reality tells a
different story. Truly good decisions are forged from the furnace of argument,
not plucked like daisies from the pasture of a peaceful mind. A good cofounder
tells you when your ideas are half-baked and ensures that your good ideas
actually get implemented.</p>
<p>The second biggest danger with going solo is the loss of motivation. Solipsism
might make you feel important at first, but the constant lack of feedback and
the absence of support during tough times can easily lead to a premature end to
your adventure. Cofounders are like workout buddies. Just when you think theres
no possible way you can do another rep, there they are, rooting you on toward an
achievement that wouldnt be possible without them.</p>
<p>Your choice of cofounder will affect everything you do in your startup. Theyll
share every defeat with you and celebrate every success. Theyll help you
understand your own ideas better by offering a different perspective. Theyll be
the single most important decision you make during the tenure of your startup,
so choose wisely and with extreme care.</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,220 @@
<!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>Blogging Like a Hacker</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="blogging-like-a-hacker">Blogging Like a Hacker</h1>
<p class="meta">17 Nov 2008 - San Francisco</p>
<p>Back in 2000, when I thought I was going to be a professional writer, I spent
hours a day on LiveJournal doing writing practice with other aspiring poets and
authors. Since then Ive blogged at three different domains about web standards,
print design, photography, Flash, illustration, information architecture,
ColdFusion, package management, PHP, CSS, advertising, Ruby, Rails, and Erlang.</p>
<p>I love writing. I get a kick out of sharing my thoughts with others. The act of
transforming ideas into words is an amazingly efficient way to solidify and
refine your thoughts about a given topic. But as much as I enjoy blogging, I
seem to be stuck in a cycle of quitting and starting over. Before starting the
current iteration, I resolved to do some introspection to determine the factors
that were leading to this destructive pattern.</p>
<p>I already knew a lot about what I <em>didnt</em> want. I was tired of complicated
blogging engines like WordPress and Mephisto. I wanted to write great posts, not
style a zillion template pages, moderate comments all day long, and constantly
lag behind the latest software release. Something like Posterous looked
attractive, but I wanted to style my blog, and it needed to be hosted at the
domain of my choosing. For the same reason, other hosted sites (wordpress.com,
blogger.com) were disqualified. There are a few people directly using GitHub as
a blog (which is very cool), but thats a bit too much of an impedance mismatch
for my tastes.</p>
<p>On Sunday, October 19th, I sat down in my San Francisco apartment with a glass
of apple cider and a clear mind. After a period of reflection, I had an idea.
While Im not specifically trained as an author of prose, I <em>am</em> trained as an
author of code. What would happen if I approached blogging from a software
development perspective? What would that look like?</p>
<p>First, all my writing would be stored in a Git repository. This would ensure
that I could try out different ideas and explore a variety of posts all from the
comfort of my preferred editor and the command line. Id be able to publish a
post via a simple deploy script or post-commit hook. Complexity would be kept to
an absolute minimum, so a static site would be preferable to a dynamic site that
required ongoing maintenance. My blog would need to be easily customizable;
coming from a graphic design background means Ill always be tweaking the sites
appearance and layout.</p>
<p>Over the last month Ive brought these concepts to fruition and Im pleased to
announce <a href="http://github.com/mojombo/jekyll">Jekyll</a>. Jekyll is a simple, blog
aware, static site generator. It takes a template directory (representing the
raw form of a website), runs it through Textile and Liquid converters, and spits
out a complete, static website suitable for serving with Apache or your favorite
web server. If youre reading this on the website
(http://tom.preston-werner.com), youre seeing a Jekyll generated blog!</p>
<p>To understand how this all works, open up my <a href="http://github.com/mojombo/tpw">TPW</a>
repo in a new browser window. Ill be referencing the code there.</p>
<p>Take a look at
<a href="http://github.com/mojombo/tpw/tree/master/index.html">index.html</a>. This file
represents the homepage of the site. At the top of the file is a chunk of YAML
that contains metadata about the file. This data tells Jekyll what layout to
give the file, what the pages title should be, etc. In this case, I specify
that the “default” template should be used. You can find the layout files in the
<a href="http://github.com/mojombo/tpw/tree/master/_layouts">_layouts</a> directory. If you
open
<a href="http://github.com/mojombo/tpw/tree/master/_layouts/default.html">default.html</a>
you can see that the homepage is constructed by wrapping index.html with this
layout.</p>
<p>Youll also notice Liquid templating code in these files.
<a href="http://www.liquidmarkup.org/">Liquid</a> is a simple, extensible templating
language that makes it easy to embed data in your templates. For my homepage I
wanted to have a list of all my blog posts. Jekyll hands me a Hash containing
various data about my site. A reverse chronological list of all my blog posts
can be found in <code>site.posts</code>. Each post, in turn, contains various
fields such as <code>title</code> and <code>date</code>.</p>
<p>Jekyll gets the list of blog posts by parsing the files in the
<a href="http://github.com/mojombo/tpw/tree/master/_posts">_posts</a> directory. Each posts
filename contains the publishing date and slug (what shows up in the URL) that
the final HTML file should have. Open up the file corresponding to this blog
post:
<a href="http://github.com/mojombo/tpw/tree/master/_posts/2008-11-17-blogging-like-a-hacker.textile">2008-11-17-blogging-like-a-hacker.textile</a>.
GitHub renders textile files by default, so to better understand the file, click
on the
<a href="http://github.com/mojombo/tpw/tree/master/_posts/2008-11-17-blogging-like-a-hacker.textile?raw=true">raw</a>
view to see the original file. Here Ive specified the <code>post</code> layout.
If you look at that file youll see an example of a nested layout. Layouts can
contain other layouts allowing you a great deal of flexibility in how pages are
assembled. In my case I use a nested layout in order to show related posts for
each blog entry. The YAML also specifies the posts title which is then embedded
in the posts body via Liquid.</p>
<p>Posts are handled in a special way by Jekyll. The date you specify in the
filename is used to construct the URL in the generated site. This post, for
instance, ends up at
<code>http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html</code>.</p>
<p>Files that do not reside in directories prefixed with an underscore are mirrored
into a corresponding directory structure in the generated site. If a file does
not have a YAML preface, it is not run through the Liquid interpreter. Binary
files are copied over unmodified.</p>
<p>In order to convert your raw site into the finished version, you simply run:</p>
<pre class="terminal"><code>$ jekyll /path/to/raw/site
/path/to/place/generated/site</code></pre>
<p>Jekyll is still a very young project. Ive only developed the exact
functionality that Ive needed. As time goes on Id like to see the project
mature and support additional features. If you end up using Jekyll for your own
blog, drop me a line and let me know what youd like to see in future versions.
Better yet, fork the project over at GitHub and hack in the features yourself!</p>
<p>Ive been living with Jekyll for just over a month now. I love it. Driving the
development of Jekyll based on the needs of my blog has been very rewarding. I
can edit my posts in TextMate, giving me automatic and competent spell checking.
I have immediate and first class access to the CSS and page templates.
Everything is backed up on GitHub. I feel a lightness now when Im writing a
post. The system is simple enough that I can keep the entire conversion process
in my head. The distance from my brain to my blog has shrunk, and, in the end, I
think that will make me a better author.</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>